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