Fix:Core:Fixed memory corruption bug
[navit-package] / navit / linguistics.c
1 #include <string.h>
2 #include <stdio.h>
3 #include <glib.h>
4 #include "debug.h"
5 #include "linguistics.h"
6
7 static const char *special[][3]={
8 /* Capital Diacritics */
9 /* ¨ Diaresis */
10 {"Ä","A","AE"},
11 {"Ö","O","OE"},
12 {"Ü","U","UE"},
13 /* ˝ Double Acute Accent */
14 {"Ő","O"},
15 {"Ű","U"},
16 /* ´ Acute Accent */
17 {"Á","A"},
18 {"Ć","C"},
19 {"É","E"},
20 {"Í","I"},
21 {"Ń","N"},
22 {"Ó","O"},
23 {"Ś","S"},
24 {"Ú","U"},
25 {"Ý","Y"},
26 {"Ź","Z"},
27 /* ˛ Ogonek */
28 {"Ą","A"},
29 {"Ę","E"},
30 /* ˙ Dot */
31 {"Ż","Z"},
32 /* – Stroke */
33 {"Ł","L"},
34 /* ˚ Ring */
35 {"Ů","U"},
36 /* ˇ Caron */
37 {"Č","C"},
38 {"Ď","D"},
39 {"Ě","E"},
40 {"Ň","N"},
41 {"Ř","R"},
42 {"Š","S"},
43 {"Ť","T"},
44 {"Ž","Z"},
45 /* Small Diacritics */
46 /* ¨ Diaresis */
47 {"ä","a","ae"},
48 {"ö","o","oe"},
49 {"ü","u","ue"},
50 /* ˝ Double Acute Accent */
51 {"ő","o"},
52 {"ű","u"},
53 /* ´ Acute Accent */
54 {"á","a"},
55 {"ć","c"},
56 {"é","e"},
57 {"í","i"},
58 {"ń","n"},
59 {"ó","o"},
60 {"ś","s"},
61 {"ú","u"},
62 {"ý","y"},
63 {"ź","z"},
64 /* ˛ Ogonek */
65 {"ą","a"},
66 {"ę","e"},
67 /* ˙ Dot */
68 {"ż","z"},
69 /* – Stroke */
70 {"ł","l"},
71 /* ˚ Ring */
72 {"ů","u"},
73 /* ˇ Caron */
74 {"č","c"},
75 {"ď","d"},
76 {"ě","e"},
77 {"Ň","N"},
78 {"ř","r"},
79 {"š","s"},
80 {"ť","t"},
81 {"ž","z"},
82 /* ligatures */
83 {"ß","s","ss"},
84 };
85
86 char *
87 linguistics_expand_special(char *str, int mode)
88 {
89         char *in=str;
90         char *out,*ret;
91         int found=0;
92         out=ret=g_strdup(str);
93         if (!mode) 
94                 return ret;
95         while (*in) {
96                 char *next=g_utf8_find_next_char(in, NULL);
97                 int i,len=next-in;
98                 int match=0;
99                 if (len > 1) {
100                         for (i = 0 ; i < sizeof(special)/sizeof(special[0]); i++) {
101                                 const char *search=special[i][0];
102                                 if (!strncmp(in,search,len)) {
103                                         const char *replace=special[i][mode];
104                                         if (replace) {
105                                                 int replace_len=strlen(replace);
106                                                 dbg_assert(replace_len <= len);
107                                                 dbg(1,"found %s %s %d %s %d\n",in,search,len,replace,replace_len);
108                                                 strcpy(out, replace);
109                                                 out+=replace_len;
110                                                 match=1;
111                                                 break;
112                                         }
113                                 }
114                         }
115                 }
116                 if (match) {
117                         found=1;
118                         in=next;
119                 } else {
120                         while (len-- > 0) 
121                                 *out++=*in++;
122                 }
123         }
124         *out++='\0';
125         if (!found) {
126                 g_free(ret);
127                 ret=NULL;
128         }
129         return ret;
130 }
131
132 char *
133 linguistics_next_word(char *str)
134 {
135         int len=strcspn(str, " -");
136         if (!str[len] || !str[len+1])
137                 return NULL;
138         return str+len+1;
139 }
140
141 void
142 linguistics_init(void)
143 {
144 }