1 /* ----------------------------------------------------------------------------
2 * Licq - A ICQ Client for Unix
3 * Copyright (C) 1998 - 2009, 2012 Licq developers
4 *
5 * This program is licensed under the terms found in the LICENSE file.
6 */
7
8 #include "config.h"
9
10 #ifdef USE_HEBREW
11 /*
12 Ok.. thats an update to the Hebew-Reversing module.
13 It had a small bug in iseng()....
14 Sorry about that.
15
16 Plus! A new email all comments should be send to:
17 ^-RaveN-^ (GiladBarkai@gmail.com)
18 */
19
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <ctype.h>
24 #include <string.h>
25
26
iswhitespace(const char ch)27 static inline int iswhitespace(const char ch)
28 {
29 return (ch == ' ' || ch == 8);
30 }
31
isheb(const char ch)32 static inline int isheb(const char ch)
33 {
34 return (((unsigned char)ch) >= 0xE0 && ((unsigned char)ch) <= 0xFA);
35 }
36
iseng(const char ch)37 static inline int iseng(const char ch)
38 {
39 return ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'));
40 }
41
42
strhebpatch(char * dest,const char * src)43 char *strhebpatch(char *dest, const char *src)
44 {
45 short int mode = 0, imode;
46 const char *hmark = NULL, *lmark, *nmark, *nlmark;
47 char ch;
48 const char* srcstart = src;
49
50 if (src == NULL)
51 return NULL;
52
53 for (;;)
54 {
55 if (mode == 0)
56 {
57 if (isheb(*src))
58 {
59 hmark = src;
60 mode = 1;
61 }
62 else
63 *dest++ = *src;
64 }
65 else if (mode == 1)
66 {
67 if (*src == 0 || iseng(*src))
68 {
69 lmark = src-1;
70 while (lmark > srcstart && !isheb(*lmark) && !ispunct(*lmark))
71 lmark--;
72 src = lmark;
73 imode = 0;
74 nmark = NULL;
75
76 while (lmark >= hmark)
77 {
78 ch = *lmark;
79
80 if (imode == 0)
81 switch (ch)
82 {
83 case '(': ch = ')'; break;
84 case ')': ch = '('; break;
85 case '{': ch = '}'; break;
86 case '}': ch = '{'; break;
87 case '[': ch = ']'; break;
88 case ']': ch = '['; break;
89 }
90
91 if (imode == 0)
92 {
93 if (isdigit(ch))
94 {
95 imode = 1;
96 nmark = lmark;
97 }
98 else
99 *dest++ = ch;
100 }
101 else
102 if (imode == 1 && (isheb(ch) || iswhitespace(ch) || ispunct(ch)))
103 {
104 nlmark = lmark+1;
105 while (nlmark <= nmark)
106 *dest++ = *nlmark++;
107 imode = 0;
108 lmark++;
109 }
110 lmark--;
111 }
112
113 hmark = NULL;
114 mode = 0;
115 }
116 if (*src == '\0')
117 *dest = '\0';
118 }
119 if (!*src++)
120 break;
121 }
122 return dest;
123 }
124
hebrew(const char * pszStr)125 char *hebrew(const char *pszStr)
126 {
127 char* temp_str = NULL, *temp = NULL;
128
129 if (pszStr == NULL)
130 return NULL;
131
132 if ((temp_str = (char*) malloc(strlen(pszStr)+1)) == NULL)
133 return NULL;
134 temp = temp_str;
135
136 temp_str = strhebpatch(temp_str, pszStr);
137 return temp;
138
139 }
GetArg(const char * input,int index)140 char* GetArg(const char* input, int index)
141 {
142 char *temp=NULL, *tmp=NULL;
143 char *arg=NULL, *arg2=NULL;
144 int i=0;
145 char* saveptr = NULL;
146
147 temp = (char*) malloc(strlen(input)+1);
148 tmp = temp;
149
150 strcpy(temp, input);
151
152 arg = strtok_r(temp, "\n", &saveptr);
153 for(i = 0; (i < index) && (arg!=NULL); i++)
154 arg = strtok_r(NULL, "\n", &saveptr);
155
156 if(arg != NULL)
157 {
158 arg2 = (char*) malloc(strlen(arg)+1);
159 strcpy(arg2, arg);
160 }
161 free(tmp);
162 return arg2;
163 }
164
hebrev(const char * src)165 char* hebrev(const char* src)
166 {
167 char* temp_str = NULL;
168 char* temp = NULL;
169 char* arg = NULL;
170 int i=0;
171 int size = 0;
172 if(src == NULL)
173 return NULL;
174
175 if((temp_str = (char*)malloc(strlen(src)+1))== NULL)
176 return NULL;
177
178 arg = GetArg(src, i);
179 while(arg != NULL)
180 {
181 i++;
182 temp = hebrew(arg);
183 free(arg);
184 memcpy(temp_str + size , temp, strlen(temp));
185 size += strlen(temp) ;
186 temp_str[size++] = '\n';
187
188 free(temp);
189 temp = NULL;
190 arg = GetArg(src, i);
191 }
192 // Above loop adds a line break after last line that wasn't there in src
193 // replace it with the null terminator
194 temp_str[--size]= '\0';
195 return temp_str;
196 }
197
198 #endif // hebrew support: USE_HEBREW
199