#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;
}