equal
deleted
inserted
replaced
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 } |