예제 #1
0
파일: make-aliases.cpp 프로젝트: wixor/wi
int main(void)
{
    FileMapping morf("db/morfologik");
    Reader rd(morf.data(), morf.size());
    rd.assert_u32(0x46524f4d);
    int n_words = rd.read_u32();

    Writer wr;
    wr.write_u32(0x41494c41);
    wr.write_u32(n_words);

    int alcnt = 0;

    int *v = (int *)malloc(sizeof(int) * n_words);
    memset(v, -1, sizeof(int) * n_words);

    for(int i=0; i<n_words; i++)
    {
        int t = rd.read_u32();
        assert((t & 0xffffff) == i);
        int n_bases = t>>24;

        if(n_bases > 1) {
            wr.write_u32(i);
            while(n_bases--)
                rd.read_u32();
        } else {
            int base = n_bases ? rd.read_u32() : i;
            if(v[base] == -1)
                v[base] = i;
            else
                alcnt++;
            wr.write_u32(v[base]);
        }
    }

    printf("total alias count: %d\n", alcnt);
    
    FileIO aliases("db/aliases", O_WRONLY|O_CREAT|O_TRUNC);
    aliases.write_raw(wr.buffer(), wr.tell());

    return 0;
}