/*There is no FPrintF type function and no
way to grow files. Therefore, use mem to
hold the file until you are done.  The CDoc
framework is convenient for this.
*/

U0 TreeSub(CDoc *doc, CDirEntry *tmpde)
{
        CDirEntry *tmpde1;

        while (tmpde)
        {
                tmpde1 = tmpde->next;
                if (tmpde->attr & RS_ATTR_DIR)
                {
                        DocPrint(doc, "$TR,\"\"$");
                        DocPrint(doc, "$MA,T=\"%s\",LM=\"Cd(\\\"%s\\\");Dir;\n\"$\n", tmpde->name, tmpde->full_name);
                        if (tmpde->sub)
                        {
                                DocPrint(doc, "$ID,+2$");
                                TreeSub(doc,tmpde->sub);
                                DocPrint(doc, "$ID,-2$");
                        }
                }
                else
                        DocPrint(doc, "$LK,\"%s\",A=\"FI:%s\"$\n", tmpde->name, tmpde->full_name);
                        //Note there is also a routine
                        //to delete an entire CDirEntry tree.
                        //See DirTreeDel().
                DirEntryDel(tmpde);
                tmpde = tmpde1;
        }
}

U0 FPrintFDemo(U8 *output_filename=NULL)
{
        I64   fuf_flags = 0;
        CDoc *doc = DocNew(output_filename);

        FlagsScan(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), "+r");
        DocPrint(doc, "$TR-C,\"\"$\n");
        DocPrint(doc, "$ID,+2$");
        TreeSub(doc, FilesFind("/*", fuf_flags));
        DocPrint(doc, "$ID,-2$");
        DocRecalc(doc);
        if (output_filename)
                DocWrite(doc, FALSE);
        else
                DocWrite(doc, TRUE);
        DocDel(doc);
}

FPrintFDemo;