#help_index "DolDoc/Cmd Line (Typically)"

U0 CursorRemFile(U8 *filename)
{//Remove ASCII 5 cursor from one file.
        CDoc *doc = DocRead(filename, DOCF_PLAIN_TEXT | DOCF_NO_CURSOR);

        DocWrite(doc);
        DocDel(doc);
}
public U0 CursorRemove(U8 *files_find_mask="*")
{//Remove ASCII 5 cursor.
        I64 fuf_flags = 0;

        FlagsScan(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), "+r+T+f+F+O");

        CDirEntry *tmpde = FilesFind(files_find_mask, fuf_flags), *tmpde1 = tmpde;

        while (tmpde)
        {
                CursorRemFile(tmpde->full_name);
                Touch(tmpde->full_name, "",, tmpde->datetime);
                tmpde = tmpde->next;
        }
        DirTreeDel(tmpde1);
}

U0 CollapseFile(U8 *filename, Bool collapse=TRUE)
{//Collapse DolDoc trees in one file.
        CDoc *doc = DocRead(filename, DOCF_NO_CURSOR);

        DocCollapse(collapse, doc);
        DocWrite(doc);
        DocDel(doc);
}
public U0 Collapse(U8 *files_find_mask="*", Bool collapse=TRUE, U8 *fu_flags=NULL)
{//Collapse DolDoc trees.
        I64 fuf_flags = 0;

        FlagsScan(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), "+r+f+F+$+O");
        FlagsScan(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), fu_flags);

        CDirEntry *tmpde = FilesFind(files_find_mask, fuf_flags), *tmpde1 = tmpde;

        while (tmpde && !Bt(&fuf_flags, FUf_CANCEL))
        {
                CollapseFile(tmpde->full_name, collapse);
                Touch(tmpde->full_name, "",, tmpde->datetime);
                tmpde = tmpde->next;
        }
        DirTreeDel(tmpde1);
}

I64 DocOptEntry(CDoc *,CDocEntry *doc_e)
{
        U8 **_dst;
        I64  res = 0;

        if (doc_e->de_flags & DOCEF_LINK && doc_e->de_flags & (DOCEF_AUX_STR | DOCEF_TAG))
        {
                if (doc_e->de_flags & DOCEF_AUX_STR && doc_e->de_flags & DOCEF_TAG &&
                        !MemCompare(doc_e->aux_str, "FI:", 3) &&
                        !StrCompare(doc_e->aux_str + 3, doc_e->tag))
                {
                        Free(doc_e->aux_str);
                        doc_e->aux_str  =  NULL;
                        doc_e->de_flags &= ~DOCEF_AUX_STR;
                        res++;
                }
                if (doc_e->de_flags & DOCEF_AUX_STR)
                        _dst = &doc_e->aux_str;
                else
                        _dst = &doc_e->tag;
        }

        return res;
}
I64 DocOptDoc(CDoc *doc)
{//Optimize Doc.
        Bool             unlock = DocLock(doc);
        I64                      res = 0;
        CDocEntry       *doc_e, *doc_e1, *doc_e_last;

        DocRecalc(doc);
        doc_e_last = NULL;
        doc_e = doc->head.next;
        while (doc_e != doc)
        {
                doc_e1 = doc_e->next;
                if (res += DocOptEntry(doc, doc_e))
                        res += DocOptEntry(doc, doc_e);
                if (doc_e_last && doc_e_last->type & ~0xFF00 == doc_e->type & ~0xFF00 && doc_e_last->de_flags == doc_e->de_flags &&
                        Bt(doldoc.type_flags_chk_dup, doc_e->type_u8) && doc_e_last->attr == doc_e->attr)
                {
                        DocEntryDel(doc, doc_e);
                        res++;
                }
                else
                        doc_e_last = doc_e;
                doc_e = doc_e1;
        }
        DocRecalc(doc);
        if (unlock)
                DocUnlock(doc);

        return res;
}
I64 DocOptFile(U8 *filename)
{//Optimize file.
        I64   res;
        CDoc *doc = DocRead(filename);

        if (res = DocOptDoc(doc))
        {
                "-%d:%s\n", res, doc->filename.name;
                DocWrite(doc);
        }
        DocDel(doc);

        return res;
}
I64 DocOptList(CDirEntry *tmpde)
{
        I64                      res = 0;
        CDirEntry       *tmpde1;

        while (tmpde)
        {
                tmpde1 = tmpde->next;
                if (tmpde->attr & RS_ATTR_DIR)
                {
                        if (tmpde->sub)
                        {
                                "Scanning Directory: %s\n", tmpde->full_name;
                                res += DocOptList(tmpde->sub);
                        }
                }
                else
                        res += DocOptFile(tmpde->full_name);
                DirEntryDel(tmpde);
                tmpde = tmpde1;
        }

        return res;
}
public I64 DocOpt(U8 *files_find_mask="*", U8 *fu_flags=NULL)
{//Optimize DolDoc files, eliminating aux_str's and .Z's.
//+R flag for aggressively risky.
        I64 fuf_flags = 0;

        FlagsScan(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), "+r+$");
        FlagsScan(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), fu_flags);

        return DocOptList(FilesFind(files_find_mask, fuf_flags & FUG_FILES_FIND));
}