#help_index "Debugging;Cmd Line (Typically)"

I64 LinkCheckDoc(CDoc *doc, I64 *_fuf_flags)
{
        U8                      *st;
        Bool             found, unlock = DocLock(doc);
        CDoc            *old_doc;
        CDocEntry       *doc_e = doc->head.next;
        I64                      res = 0;

        while (doc_e != doc)
        {
                if (KeyScan)
                {
                        LBts(_fuf_flags, FUf_CANCEL);
                        break;
                }
                if (st = DocEntryLink(doc, doc_e))
                {
                        old_doc = DocPut;
                        DocLock(old_doc);
                        Fs->put_doc = doc;
                        found = DocLinkCheck(doc, st);
                        Fs->put_doc = old_doc;
                        DocUnlock(old_doc);
                        if (!found)
                        {
                                PutFileLink(doc->filename.name,, doc_e->y);
                                "$RED$ %04d:%s\n$FG$", doc_e->y, st;
                                res++;
                        }
                        Free(st);
                }
                else if (doc_e->type_u8 == DOCT_ERROR)
                {
                        PutFileLink(doc->filename.name,, doc_e->y);
                        "$RED$ Doc Error\n$FG$";
                        res++;
                }
                doc_e = doc_e->next;
        }
        if (unlock)
                DocUnlock(doc);

        return res;
}

I64 LinkCheckFile(U8 *filename, I64 *_fuf_flags)
{
        I64   res;
        CDoc *doc = DocRead(filename, DOCF_NO_CURSOR);

        res = LinkCheckDoc(doc, _fuf_flags);
        DocDel(doc);

        return res;
}
public I64 LinkCheck(U8 *files_find_mask="/*", U8 *fu_flags=NULL)
{//Check documents for broken file links.
        I64                      fuf_flags = 0, res = 0;
        CDirEntry       *tmpde, *tmpde1;
        U8                      *st;

        progress2_max = 1;
        FlagsScan(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), "+r+$+f+F+O");
        FlagsScan(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), fu_flags);
        tmpde = tmpde1 = FilesFind(files_find_mask, fuf_flags);
        while (tmpde && !Bt(&fuf_flags, FUf_CANCEL))
        {

                st = MStrPrint("Before %s Broke:%d", tmpde->full_name, res);
                if (StrLen(st) > PROGRESS_DESC_LEN - 1)
                        st[PROGRESS_DESC_LEN - 1] = 0;
                StrCopy(progress2_desc, st);
                Free(st);
                Yield;

                res += LinkCheckFile(tmpde->full_name, &fuf_flags);

                st = MStrPrint("After %s Broke:%d", tmpde->full_name, res);
                if (StrLen(st) > PROGRESS_DESC_LEN - 1)
                        st[PROGRESS_DESC_LEN - 1] = 0;
                StrCopy(progress2_desc, st);
                Free(st);
                Yield;

                tmpde = tmpde->next;
        }
        DirTreeDel(tmpde1);
        progress2_max = 0;

        return res;
}