00001
00002
00003
00004
00005
00006
00007 #include <stdlib.h>
00008 #include <string.h>
00009 #include <gbfrtf.h>
00010 #include <ctype.h>
00011
00012 GBFRTF::GBFRTF() {
00013 }
00014
00015
00016 char GBFRTF::ProcessText(char *text, int maxlen, const SWKey *key, const SWModule *module)
00017 {
00018 unsigned char *to, *from;
00019 char token[2048];
00020 int tokpos = 0;
00021 bool intoken = false;
00022 int len;
00023 const char *tok;
00024
00025 len = strlen(text) + 1;
00026 if (len < maxlen) {
00027 memmove(&text[maxlen - len], text, len);
00028 from = (unsigned char *)&text[maxlen - len];
00029 }
00030 else from = (unsigned char *)text;
00031 for (to = (unsigned char *)text; *from; from++) {
00032 if (*from == '<') {
00033 intoken = true;
00034 tokpos = 0;
00035 token[0] = 0;
00036 token[1] = 0;
00037 token[2] = 0;
00038 continue;
00039 }
00040 if (*from == '>') {
00041 intoken = false;
00042
00043 switch (*token) {
00044 case 'W':
00045 switch(token[1]) {
00046 case 'G':
00047 case 'H':
00048 *to++ = '{';
00049 *to++ = '\\';
00050 *to++ = 'f';
00051 *to++ = 's';
00052 *to++ = '1';
00053 *to++ = '7';
00054 *to++ = ' ';
00055 *to++ = '<';
00056 for (tok = token + 2; *tok; tok++)
00057 *to++ = *tok;
00058 *to++ = '>';
00059 *to++ = '}';
00060 continue;
00061
00062 case 'T':
00063 *to++ = '{';
00064 *to++ = '\\';
00065 *to++ = 'f';
00066 *to++ = 's';
00067 *to++ = '1';
00068 *to++ = '7';
00069 *to++ = ' ';
00070 *to++ = '(';
00071 bool separate = false;
00072 for (tok = token + 2; *tok; tok++) {
00073 if (separate) {
00074 *to++ = ';';
00075 *to++ = ' ';
00076 separate = false;
00077 }
00078 switch (*tok) {
00079 case 'G':
00080 case 'H':
00081 for (tok++; *tok; tok++) {
00082 if (isdigit(*tok)) {
00083 *to++ = *tok;
00084 separate = true;
00085 }
00086 else {
00087 tok--;
00088 break;
00089 }
00090 }
00091 break;
00092 default:
00093 for (; *tok; tok++) {
00094 *to++ = *tok;
00095 }
00096 }
00097 }
00098 *to++ = ')';
00099 *to++ = '}';
00100 continue;
00101 }
00102 break;
00103 case 'R':
00104 switch(token[1]) {
00105 case 'X':
00106 *to++ = '<';
00107 *to++ = 'a';
00108 *to++ = ' ';
00109 *to++ = 'h';
00110 *to++ = 'r';
00111 *to++ = 'e';
00112 *to++ = 'f';
00113 *to++ = '=';
00114 *to++ = '"';
00115 *to++ = '"';
00116 *to++ = '>';
00117 continue;
00118 case 'x':
00119 *to++ = '<';
00120 *to++ = '/';
00121 *to++ = 'a';
00122 *to++ = '>';
00123 continue;
00124 case 'F':
00125 *to++ = '{';
00126 *to++ = '\\';
00127 *to++ = 'i';
00128 *to++ = '1';
00129 *to++ = ' ';
00130 *to++ = '\\';
00131 *to++ = 'f';
00132 *to++ = 's';
00133 *to++ = '1';
00134 *to++ = '7';
00135 *to++ = ' ';
00136 *to++ = '(';
00137 continue;
00138 case 'f':
00139 *to++ = ')';
00140 *to++ = ' ';
00141 *to++ = '}';
00142 continue;
00143 }
00144 break;
00145 case 'F':
00146 switch(token[1]) {
00147 case 'I':
00148 *to++ = '\\';
00149 *to++ = 'i';
00150 *to++ = '1';
00151 *to++ = ' ';
00152 continue;
00153 case 'i':
00154 *to++ = '\\';
00155 *to++ = 'i';
00156 *to++ = '0';
00157 *to++ = ' ';
00158 continue;
00159 case 'B':
00160 *to++ = '\\';
00161 *to++ = 'b';
00162 *to++ = '1';
00163 *to++ = ' ';
00164 continue;
00165 case 'b':
00166 *to++ = '\\';
00167 *to++ = 'b';
00168 *to++ = '0';
00169 *to++ = ' ';
00170 continue;
00171 case 'N':
00172 *to++ = '{';
00173 if (!strnicmp(token+2, "Symbol", 6)) {
00174 *to++ = '\\';
00175 *to++ = 'f';
00176 *to++ = '7';
00177 *to++ = ' ';
00178 }
00179 continue;
00180 case 'n':
00181 *to++ = '}';
00182 continue;
00183 case 'S':
00184 *to++ = '{';
00185 *to++ = '\\';
00186 *to++ = 's';
00187 *to++ = 'u';
00188 *to++ = 'p';
00189 *to++ = 'e';
00190 *to++ = 'r';
00191 *to++ = ' ';
00192 continue;
00193 case 's':
00194 *to++ = '}';
00195 continue;
00196 case 'R':
00197 *to++ = '{';
00198 *to++ = '\\';
00199 *to++ = 'c';
00200 *to++ = 'f';
00201 *to++ = '6';
00202 *to++ = ' ';
00203 continue;
00204 case 'r':
00205 *to++ = '}';
00206 continue;
00207 }
00208 break;
00209 case 'C':
00210 switch(token[1]) {
00211 case 'A':
00212 *to++ = (char)atoi(&token[2]);
00213 continue;
00214 case 'G':
00215 *to++ = '>';
00216 continue;
00217 case 'L':
00218 *to++ = '\\';
00219 *to++ = 'l';
00220 *to++ = 'i';
00221 *to++ = 'n';
00222 *to++ = 'e';
00223 *to++ = ' ';
00224 continue;
00225 case 'M':
00226 *to++ = '\\';
00227 *to++ = 'p';
00228 *to++ = 'a';
00229 *to++ = 'r';
00230 *to++ = ' ';
00231 continue;
00232 case 'T':
00233 *to++ = '<';
00234 }
00235 break;
00236 case 'T':
00237 switch(token[1])
00238 {
00239 case 'T':
00240 *to++ = '{';
00241 *to++ = '\\';
00242 *to++ = 'f';
00243 *to++ = 's';
00244 *to++ = '2';
00245 *to++ = '2';
00246 *to++ = ' ';
00247 continue;
00248 case 't':
00249 *to++ = '}';
00250 continue;
00251 case 'S':
00252 *to++ = '\\';
00253 *to++ = 'p';
00254 *to++ = 'a';
00255 *to++ = 'r';
00256 *to++ = ' ';
00257 *to++ = '{';
00258 *to++ = '\\';
00259 *to++ = 'i';
00260 *to++ = '1';
00261 *to++ = '\\';
00262 *to++ = 'b';
00263 *to++ = '1';
00264 *to++ = ' ';
00265 continue;
00266 case 's':
00267 *to++ = '}';
00268 *to++ = '\\';
00269 *to++ = 'p';
00270 *to++ = 'a';
00271 *to++ = 'r';
00272 *to++ = ' ';
00273 continue;
00274 }
00275 break;
00276
00277 }
00278 continue;
00279 }
00280 if (intoken) {
00281 if (tokpos < 2045)
00282 token[tokpos++] = *from;
00283 token[tokpos+2] = 0;
00284 }
00285 else *to++ = *from;
00286 }
00287 *to++ = 0;
00288 *to = 0;
00289 return 0;
00290 }