idx2index.c
changeset 8 09ec33061ff3
parent 0 7f37716d4f1e
equal deleted inserted replaced
7:c815840c5b65 8:09ec33061ff3
     6  *             Author: Lluís Batlle
     6  *             Author: Lluís Batlle
     7  * In order to convert a StarDict idx file to a dictd index file, pass:
     7  * In order to convert a StarDict idx file to a dictd index file, pass:
     8  * ./idx2index < file.idx | LC_ALL=POSIX sort > file.index
     8  * ./idx2index < file.idx | LC_ALL=POSIX sort > file.index
     9  * */
     9  * */
    10 
    10 
    11 static char num_to_ia5char(int n)
    11 static int get_raw_int()
    12 {
       
    13     /* From RFC 1421 */
       
    14     if (n >= 0 && n <= 25)
       
    15         return 'A' + n;
       
    16     else if (n >= 26 && n <= 51)
       
    17         return 'a' + (n - 26);
       
    18     else if (n >= 52 && n <= 61)
       
    19         return '0' + (n - 52);
       
    20     else if (n == 62)
       
    21         return '+';
       
    22     else if (n == 63)
       
    23         return '-';
       
    24     else
       
    25         return '!'; /* Error */
       
    26 }
       
    27 
       
    28 static int num_to_ia5(char *dest, int n)
       
    29 {
       
    30     char tmp[20];
       
    31 
       
    32     int i, max;
       
    33    
       
    34     for(i =0; i <= 10; ++i)
       
    35     {
       
    36         tmp[i] = num_to_ia5char(n % 64);
       
    37         if (n < 64)
       
    38             break;
       
    39         n /= 64;
       
    40     }
       
    41 
       
    42     max = i;
       
    43 
       
    44     /* reverse the number */
       
    45     for (i=0; i<=max; ++i)
       
    46         dest[i] = tmp[max-i];
       
    47 
       
    48     /* Ending '\0' */
       
    49     dest[max+1] = '\0';
       
    50     return max;
       
    51 }
       
    52 
       
    53 static int get_int()
       
    54 {
    12 {
    55     int i;
    13     int i;
    56     fread(&i, sizeof(int) , 1, stdin);
    14     fread(&i, sizeof(int) , 1, stdin);
    57     i = ntohl(i); /* Network to Host order */
    15     i = ntohl(i); /* Network to Host order */
    58     return i;
    16     return i;
    59 }
    17 }
    60 
    18 
    61 static int get_word(char * word)
    19 static int get_raw_word(char * word)
    62 {
    20 {
    63     int c;
    21     int c;
    64     int count = 0;
    22     int count = 0;
    65 
    23 
    66     do
    24     do
    82     {
    40     {
    83         int offset, length;
    41         int offset, length;
    84         int res;
    42         int res;
    85         char c_offset[20], c_length[20];
    43         char c_offset[20], c_length[20];
    86 
    44 
    87         res = get_word(word);
    45         res = get_raw_word(word);
    88         if (res == 0)
    46         if (res == 0)
    89             break;
    47             break;
    90         offset = get_int();
    48         offset = get_raw_int();
    91         num_to_ia5(c_offset, offset);
    49         num_to_ia5(c_offset, offset);
    92         length = get_int();
    50         length = get_raw_int();
    93         num_to_ia5(c_length, length);
    51         num_to_ia5(c_length, length);
    94         printf("%s\t%s\t%s\n", word, c_offset, c_length);
    52         printf("%s\t%s\t%s\n", word, c_offset, c_length);
    95     } while(1);
    53     } while(1);
    96     return 0;
    54     return 0;
    97 }
    55 }