/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2005 Miika Pekkarinen * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ /* This tool converts the rdf file to the binary data used in the dict plugin. */ #include #include #include #include #include /* maximum word lenght, has to be the same in dict.c */ #define WORDLEN 32 /* struckt packing */ #ifdef __GNUC__ #define STRUCT_PACKED __attribute__((packed)) #else #define STRUCT_PACKED #pragma pack (push, 2) #endif struct word { char word[WORDLEN]; long offset; } STRUCT_PACKED; /* convert offsets here, not on device. */ long reverse (long N) { unsigned char B[4]; B[0] = (N & 0x000000FF) >> 0; B[1] = (N & 0x0000FF00) >> 8; B[2] = (N & 0x00FF0000) >> 16; B[3] = (N & 0xFF000000) >> 24; return ((B[0] << 24) | (B[1] << 16) | (B[2] << 8) | (B[3] << 0)); } int main() { FILE *in, *idx_out, *desc_out; struct word w; char buf[10000]; long cur_offset = 0; in = fopen("dict.preparsed", "r"); idx_out = fopen("dict.index", "wb"); desc_out = fopen("dict.desc", "wb"); if (in == NULL || idx_out == NULL || desc_out == NULL) { fprintf(stderr, "Error: Some files couldn't be opened\n"); return 1; } while (fgets(buf, sizeof buf, in) != NULL) { /* It is safe to use strtok here */ const char *word = strtok(buf, "\t"); const char *desc = strtok(NULL, "\t"); if (word == NULL || desc == NULL) { fprintf(stderr, "Parse error!\n"); fprintf(stderr, "word: %s\ndesc: %s\n", word, desc); return 2; } /* We will null-terminate the words */ strncpy(w.word, word, WORDLEN - 1); w.offset = reverse(cur_offset); fwrite(&w, sizeof(struct word), 1, idx_out); while (1) { int len = strlen(desc); cur_offset += len; fwrite(desc, len, 1, desc_out); desc = strtok(NULL, "\t"); if (desc == NULL) break ; cur_offset++; fwrite("\n", 1, 1, desc_out); } } return 0; }