U8 key[4][256];

U0 InitKey()
{
    I64 i, j;

    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 256; j++)
            key[i][j] = j;
        for (j = 0; j < 255; j++)
            SwapU8(&key[i][j], &key[i][j + RandU32 % (256 - j)]);
    }
}

U0 LogScrambleFile(U8 *name)
{
    CDoc        *doc = DocRead(name, DOCF_PLAIN_TEXT | DOCF_NO_CURSOR);
    CDocEntry   *doc_e = doc->head.next;
    I64          i;
    U32          num;
    U8          *st, *st2;
    "Scrambling: %s\n", name;

    while (doc_e != doc)
    {
        if (doc_e->type_u8 == DOCT_TEXT)
        {
            st = MAlloc(StrLen(doc_e->tag) + 1);
            st2 = MAlloc(StrLen(doc_e->tag) + 1);
            StrFirstRemove(doc_e->tag, " ", st);

            for (i = 3; i >= 0; i--)
            {
                StrFirstRemove(st, ".", st2);
                num.u8[i] = key[i][Str2I64(st2) & 255];
            }

            Free(st);
            Free(st2);

            st = MStrPrint("%d.%d.%d.%d %s", num.u8[3], num.u8[2], num.u8[1], num.u8[0], doc_e->tag);
            Free(doc_e->tag);
            doc_e->tag = st;
        }
        doc_e = doc_e->next;
    }
    DocWrite(doc);
    DocDel(doc);
}
U0 WebLogScramble(U8 *files_find_mask)
{
    CDirEntry *tmpde = FilesFind(files_find_mask, FUF_RECURSE|FUF_JUST_FILES), *tmpde1 = tmpde;
    InitKey;

    while (tmpde)
    {
        LogScrambleFile(tmpde->full_name);
        tmpde = tmpde->next;
    }
    DirTreeDel(tmpde1);
}

U0 LogScrambleDemo()
{
    U8 *dirname;

    Cd(__DIR__);
    dirname = DirCur;
    ST_WARN_ST "This will scramble all .log files in '%s'.\n\n", dirname;
    Free(dirname);
    if (AreYouSure)
        WebLogScramble("*.log*");
}

LogScrambleDemo;