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