I64 MyUtilDoc(CDoc *doc, I64 fuf_flags)
{
    Bool         unlock = DocLock(doc);
    I64          res = 0;
    CDocEntry   *doc_e;

    DocRecalc(doc);
    doc_e = doc->head.next;
    while (doc_e != doc)
    {
        res++;
        doc_e = doc_e->next;
    }
    DocRecalc(doc);
    if (unlock)
        DocUnlock(doc);

    return res;
}

I64 MyUtilFile(U8 *filename, I64 fuf_flags)
{
    I64   res;
    CDoc *doc = DocRead(filename);

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

    return res;
}
I64 MyUtilList(CDirEntry *tmpde, I64 fuf_flags)
{
    I64          res = 0;
    CDirEntry   *tmpde1;

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

    return res;
}
I64 MyUtil(U8 *files_find_mask="*", U8 *fu_flags=NULL)
{
    I64 fuf_flags = 0;

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

    return MyUtilList(FilesFind(files_find_mask, fuf_flags & FUG_FILES_FIND), fuf_flags & ~FUG_FILES_FIND);
}