00001
00002
00003
00004
00005
00006
00007
00008 #include <stdlib.h>
00009 #include <stdio.h>
00010 #include <latin1utf8.h>
00011 #include <swmodule.h>
00012
00013 Latin1UTF8::Latin1UTF8() {
00014 }
00015
00016
00017 char Latin1UTF8::ProcessText(char *text, int maxlen, const SWKey *key, const SWModule *module)
00018 {
00019 unsigned char *to, *from;
00020 int len;
00021
00022 len = strlen(text) + 1;
00023 if (len == maxlen + 1)
00024 maxlen = (maxlen + 1) * FILTERPAD;
00025
00026 if (len < maxlen) {
00027 memmove(&text[maxlen - len], text, len);
00028 from = (unsigned char*)&text[maxlen - len];
00029 }
00030 else
00031 from = (unsigned char*)text;
00032
00033
00034
00035 for (to = (unsigned char*)text; *from; from++) {
00036 if (*from < 0x80) {
00037 *to++ = *from;
00038 }
00039 else if (*from < 0xc0) {
00040 switch(*from) {
00041 case 0x80:
00042 *to++ = 0xe2;
00043 *to++ = 0x82;
00044 *to++ = 0xac;
00045 break;
00046 case 0x82:
00047 *to++ = 0xe2;
00048 *to++ = 0x80;
00049 *to++ = 0x9a;
00050 break;
00051 case 0x83:
00052 *to++ = 0xc6;
00053 *to++ = 0x92;
00054 break;
00055 case 0x84:
00056 *to++ = 0xe2;
00057 *to++ = 0x80;
00058 *to++ = 0x9e;
00059 break;
00060 case 0x85:
00061 *to++ = 0xe2;
00062 *to++ = 0x80;
00063 *to++ = 0xa6;
00064 break;
00065 case 0x86:
00066 *to++ = 0xe2;
00067 *to++ = 0x80;
00068 *to++ = 0xa0;
00069 break;
00070 case 0x87:
00071 *to++ = 0xe2;
00072 *to++ = 0x80;
00073 *to++ = 0xa1;
00074 break;
00075 case 0x88:
00076 *to++ = 0xcb;
00077 *to++ = 0x86;
00078 break;
00079 case 0x89:
00080 *to++ = 0xe2;
00081 *to++ = 0x80;
00082 *to++ = 0xb0;
00083 break;
00084 case 0x8A:
00085 *to++ = 0xc5;
00086 *to++ = 0xa0;
00087 break;
00088 case 0x8B:
00089 *to++ = 0xe2;
00090 *to++ = 0x80;
00091 *to++ = 0xb9;
00092 break;
00093 case 0x8C:
00094 *to++ = 0xc5;
00095 *to++ = 0x92;
00096 break;
00097 case 0x8E:
00098 *to++ = 0xc5;
00099 *to++ = 0xbd;
00100 break;
00101 case 0x91:
00102 *to++ = 0xe2;
00103 *to++ = 0x80;
00104 *to++ = 0x98;
00105 break;
00106 case 0x92:
00107 *to++ = 0xe2;
00108 *to++ = 0x80;
00109 *to++ = 0x99;
00110 break;
00111 case 0x93:
00112 *to++ = 0xe2;
00113 *to++ = 0x80;
00114 *to++ = 0x9c;
00115 break;
00116 case 0x94:
00117 *to++ = 0xe2;
00118 *to++ = 0x80;
00119 *to++ = 0x9d;
00120 break;
00121 case 0x95:
00122 *to++ = 0xe2;
00123 *to++ = 0x80;
00124 *to++ = 0xa2;
00125 break;
00126 case 0x96:
00127 *to++ = 0xe2;
00128 *to++ = 0x80;
00129 *to++ = 0x93;
00130 break;
00131 case 0x97:
00132 *to++ = 0xe2;
00133 *to++ = 0x80;
00134 *to++ = 0x94;
00135 break;
00136 case 0x98:
00137 *to++ = 0xcb;
00138 *to++ = 0x9c;
00139 break;
00140 case 0x99:
00141 *to++ = 0xe2;
00142 *to++ = 0x84;
00143 *to++ = 0xa2;
00144 break;
00145 case 0x9A:
00146 *to++ = 0xc5;
00147 *to++ = 0xa1;
00148 break;
00149 case 0x9B:
00150 *to++ = 0xe2;
00151 *to++ = 0x80;
00152 *to++ = 0xba;
00153 break;
00154 case 0x9C:
00155 *to++ = 0xc5;
00156 *to++ = 0x93;
00157 break;
00158 case 0x9E:
00159 *to++ = 0xc5;
00160 *to++ = 0xbe;
00161 break;
00162 case 0x9F:
00163 *to++ = 0xc5;
00164 *to++ = 0xb8;
00165 break;
00166 default:
00167 *to++ = 0xC2;
00168 *to++ = *from;
00169 }
00170 }
00171 else {
00172 *to++ = 0xC3;
00173 *to++ = (*from - 0x40);
00174 }
00175 }
00176 *to++ = 0;
00177 *to = 0;
00178 return 0;
00179 }