1 #include "openbor.h"
2 #include "List.h"
3 #include "translation.h"
4
5 static List *transList = NULL;
6
7
__consume_str(char * buf,ptrdiff_t * pos,size_t size)8 static char *__consume_str(char *buf, ptrdiff_t *pos, size_t size)
9 {
10 int stron = 0;
11 int len = 0;
12 char *result = malloc(1000); //should be enough
13 result[0] = 0;
14 while(*pos < size)
15 {
16 if(!stron)
17 {
18 if(buf[*pos] == '\"')
19 {
20 stron = 1;
21 }
22 else if(buf[*pos] != ' ' && buf[*pos] != '\t' && buf[*pos] != '\r' && buf[*pos] != '\n')
23 {
24 --*pos;
25 break;
26 }
27 }
28 else
29 {
30 if(buf[*pos] == '\"')
31 {
32 stron = 0;
33 }
34 else if(buf[*pos] == '\\' && *pos < size - 2)
35 {
36 switch (buf[1 + *pos])
37 {
38 case 's':
39 result[len++] = ' ';
40 break;
41 case 'r':
42 result[len++] = '\r';
43 break;
44 case 'n':
45 result[len++] = '\n';
46 break;
47 case 't':
48 result[len++] = '\t';
49 break;
50 case '\"':
51 result[len++] = '\"';
52 break;
53 case '\'':
54 result[len++] = '\'';
55 break;
56 default:
57 result[len++] = '\\';
58 break;
59 }
60 ++*pos;
61 }
62 else
63 {
64 result[len++] = buf[*pos];
65 }
66 }
67
68 ++*pos;
69 }
70
71 if(stron)
72 {
73 shutdown(1, "Unterminated string in translation.txt.");
74 }
75 //TODO: free pointers
76 result[len] = 0;
77 return result;
78 }
79
ob_loadtrans()80 static int ob_loadtrans()
81 {
82 ptrdiff_t pos;
83 size_t size;
84 char *buf = NULL;
85 char *id = NULL;
86 char *str = NULL;
87 char *tmp = NULL;
88 int isid = 0;
89 // Read file
90 if(buffer_pakfile("data/translation.txt", &buf, &size) != 1)
91 {
92 return 0;
93 }
94
95 //printf("Loading translation table\n");
96
97 pos = 0;
98 while(pos < size)
99 {
100 if(buf[pos] == 'm' && starts_with(buf + pos, "msgid"))
101 {
102 isid = 1;
103 }
104 else if (buf[pos] == 'm' && starts_with(buf + pos, "msgstr"))
105 {
106 isid = 0;
107 }
108 else if(buf[pos] == '\"')
109 {
110 tmp = __consume_str(buf, &pos, size);
111 if(isid)
112 {
113 id = tmp;
114 }
115 else
116 {
117 str = tmp;
118 ob_addtrans(id, str);
119 //printf("\n%s\n%s\n", id, str);
120 if(id)
121 {
122 free(id);
123 }
124 id = NULL;
125 if(str)
126 {
127 free(str);
128 }
129 str = NULL;
130 }
131 }
132
133 pos++;
134 }
135
136 if(buf)
137 {
138 free(buf);
139 }
140 buf = NULL;
141 if(id)
142 {
143 free(id);
144 }
145 id = NULL;
146 if(str)
147 {
148 free(str);
149 }
150 str = NULL;
151
152 return 1;
153 }
154
ob_inittrans()155 void ob_inittrans()
156 {
157 transList = malloc(sizeof(List));
158 List_Init(transList);
159 if(!ob_loadtrans())
160 {
161 ob_termtrans();
162 }
163 }
164
ob_termtrans()165 void ob_termtrans()
166 {
167 int i, size;
168 if(NULL == transList)
169 {
170 return;
171 }
172 PFOREACH(
173 transList,
174 free(List_Retrieve(transList));
175 );
176 List_Clear(transList);
177 free(transList);
178 transList = NULL;
179 }
180
ob_addtrans(char * id,char * str)181 void ob_addtrans(char *id, char *str)
182 {
183 if(!id || !str)
184 {
185 return ;
186 }
187 if(!str[0])
188 {
189 return; //skip empty translation
190 }
191 List_GotoLast(transList);
192 List_InsertAfter(transList, (void *)NAME(str), id);
193 }
194
ob_gettrans(char * id)195 char *ob_gettrans(char *id)
196 {
197 static char *lastid = NULL;
198 static char *laststr = NULL;
199
200 if(lastid == id)
201 {
202 return laststr; //deal with some menu text macros
203 }
204
205 lastid = id;
206
207 if(transList && List_FindByName(transList, id))
208 {
209 return (laststr = (char *)List_Retrieve(transList));
210 }
211
212
213 return (laststr = id);
214 }
215
216
217