104 static const struct {
129 '@', 0xa3,
'$', 0xa5, 0xe8, 0xe9, 0xf9, 0xec,
130 0xf2, 0xc7, 10, 0xd8, 0xf8, 13, 0xc5, 0xe5,
131 '?',
'_',
'?',
'?',
'?',
'?',
'?',
'?',
132 '?',
'?',
'?',
' ', 0xc6, 0xe6, 0xdf, 0xc9,
133 ' ',
'!',
'"',
'#', 0xa4,
'%',
'&',
'\'',
134 '(',
')',
'*',
'+',
',',
'-',
'.',
'/',
135 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
136 '8',
'9',
':',
';',
'<',
'=',
'>',
'?',
137 0xa1,
'A',
'B',
'C',
'D',
'E',
'F',
'G',
138 'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
139 'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
140 'X',
'Y',
'Z', 0xc4, 0xd6, 0xd1, 0xdc, 0xa7,
141 0xbf,
'a',
'b',
'c',
'd',
'e',
'f',
'g',
142 'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
143 'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
144 'x',
'y',
'z', 0xe4, 0xf6, 0xf1, 0xfc, 0xe0
154 '@', 0xA3,
'$', 0xA5, 0xE8, 0xE9, 0xF9, 0xEC,
155 0xF2, 0xC7, 10, 0xd8, 0xF8, 13, 0xC5, 0xE5,
156 0x394,
'_', 0x3A6, 0x393, 0x39B, 0x3A9, 0x3A0, 0x3A8,
157 0x3A3, 0x398, 0x39E,
NRP, 0xC6, 0xE6, 0xDF, 0xC9,
158 ' ',
'!',
'"',
'#', 0xA4,
'%',
'&',
'\'',
159 '(',
')',
'*',
'+',
',',
'-',
'.',
'/',
160 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
161 '8',
'9',
':',
';',
'<',
'=',
'>',
'?',
162 0xA1,
'A',
'B',
'C',
'D',
'E',
'F',
'G',
163 'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
164 'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
165 'X',
'Y',
'Z', 0xC4, 0xD6, 0xD1, 0xDC, 0xA7,
166 0xBF,
'a',
'b',
'c',
'd',
'e',
'f',
'g',
167 'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
168 'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
169 'x',
'y',
'z', 0xE4, 0xF6, 0xF1, 0xFC, 0xE0
185 {
"CP1250",
"WIN-1250" },
186 {
"CP1250",
"WINDOWS-1250" },
187 {
"CP1251",
"WIN-1251" },
188 {
"CP1251",
"WINDOWS-1251" },
189 {
"CP1252",
"WIN-1252" },
190 {
"CP1252",
"WINDOWS-1252" },
191 {
"CP1253",
"WIN-1253" },
192 {
"CP1253",
"WINDOWS-1253" },
193 {
"CP1254",
"WIN-1254" },
194 {
"CP1254",
"WINDOWS-1254" },
195 {
"CP1257",
"WIN-1257" },
196 {
"CP1257",
"WINDOWS-1257" },
212 xmlCleanupEncodingAliases();
231 for (pos = 0; pos < len; pos++) {
236 warning(0,
"Could not convert GSM (0x%02x) to Unicode.", c);
240 if(c == 27 && pos + 1 < len) {
254 }
else if (c < 128) {
300 for (pos = 0; pos < len; pos++) {
304 if (val1 < 0 || val1 > 255) {
305 warning(0,
"Char (0x%02x) in UTF-8 string not in the range (0, 255). Skipped.", val1);
312 if ((val1 & 0xE0) == 0xC0) {
316 val1 = (((val1 & ~0xC0) << 6) | (val2 & 0x3F));
319 warning(0,
"Incomplete UTF-8 char discovered, skipped. 1");
323 }
else if ((val1 & 0xF0) == 0xE0) {
326 val1 = (((val1 & ~0xE0) << 6) | (val2 & 0x3F));
328 val1 = (val1 << 6) | (val2 & 0x3F);
331 warning(0,
"Incomplete UTF-8 char discovered, skipped. 2");
399 for (pos = 0; pos < len; pos++) {
403 if (c == 27 && pos + 1 < len) {
419 }
else if (c < 128) {
434 unsigned char esc = 27;
437 for (pos = 0; pos < len; pos++) {
467 for (pos = 0; pos < len; pos++) {
471 case 0x5b:
new = 0x5b;
break;
472 case 0x5c:
new = 0x5c;
break;
473 case 0x5e:
new = 0x5d;
break;
474 case 0x7b:
new = 0x7b;
break;
475 case 0x7c:
new = 0x7c;
break;
476 case 0x7e:
new = 0x7d;
break;
477 case 0x1e:
new = 0x7e;
break;
478 case 0x5f:
new = 0x5e;
break;
493 for (pos = 0; pos < len; pos++) {
497 case 0x5b:
new = 0x5b;
break;
498 case 0x5c:
new = 0x5c;
break;
499 case 0x5d:
new = 0x5e;
break;
500 case 0x7b:
new = 0x7b;
break;
501 case 0x7c:
new = 0x7c;
break;
502 case 0x7d:
new = 0x7e;
break;
503 case 0x7e:
new = 0x1e;
break;
504 case 0x5e:
new = 0x5f;
break;
529 xmlCharEncodingHandlerPtr
handler = NULL;
530 xmlBufferPtr frombuffer = NULL;
531 xmlBufferPtr tobuffer = NULL;
543 tobuffer = xmlBufferCreate();
544 frombuffer = xmlBufferCreate();
547 ret = xmlCharEncInFunc(
handler, tobuffer, frombuffer);
552 xmlBufferFree(tobuffer);
553 xmlBufferFree(frombuffer);
561 xmlCharEncodingHandlerPtr
handler = NULL;
562 xmlBufferPtr frombuffer = NULL;
563 xmlBufferPtr tobuffer = NULL;
570 tobuffer = xmlBufferCreate();
571 frombuffer = xmlBufferCreate();
574 ret = xmlCharEncOutFunc(
handler, tobuffer, frombuffer);
583 xmlBufferFree(tobuffer);
584 xmlBufferFree(frombuffer);
592 char *from_buf, *to_buf, *pointer;
593 size_t inbytesleft, outbytesleft, ret;
596 if (!charset_from || !charset_to || !
string)
599 if (
octstr_len(
string) < 1 || strcasecmp(charset_from, charset_to) == 0)
602 cd = iconv_open(charset_to, charset_from);
604 if (cd == (iconv_t)(-1)) {
606 error(0,
"Failed to convert string from <%s> to <%s> - probably broken type names.",
607 charset_from, charset_to);
614 outbytesleft = inbytesleft * 4;
615 pointer = to_buf = gw_malloc(outbytesleft);
618 ret = iconv(cd, (ICONV_CONST
char**) &from_buf, &inbytesleft, &pointer, &outbytesleft);
624 debug(
"charset", 0,
"outbuf to small, realloc.");
625 tmp = pointer - to_buf;
626 to_buf = gw_realloc(to_buf, tmp + inbytesleft * 4);
627 outbytesleft += inbytesleft * 4;
628 pointer = to_buf + tmp;
633 warning(0,
"Invalid/Incomplete multibyte sequence at position %d, skeep it.",
636 if (outbytesleft == 0) {
638 tmp = pointer - to_buf;
639 to_buf = gw_realloc(to_buf, tmp + inbytesleft * 4);
640 outbytesleft += inbytesleft * 4;
641 pointer = to_buf + tmp;
643 pointer[0] = from_buf[0];
652 }
while(inbytesleft && ret == 0);
661 debug(
"charset", 0,
"charset_convert did %ld non-reversible conversions", (
long) ret);
664 error(errno,
"Failed to convert string from <%s> to <%s>.", charset_from, charset_to);
666 if (errno == EILSEQ) {
667 debug(
"charset_convert", 0,
"Found an invalid multibyte sequence at position <%d>",
static const struct @55 gsm_esctouni[]
void error(int err, const char *fmt,...)
void octstr_append_data(Octstr *ostr, const char *data, long len)
gw_assert(wtls_machine->packet_to_send !=NULL)
void octstr_append(Octstr *ostr1, const Octstr *ostr2)
static const struct @54 gsm_esctolatin1[]
int charset_to_utf8(Octstr *from, Octstr **to, Octstr *charset_from)
void octstr_append_char(Octstr *ostr, int ch)
void charset_utf8_to_gsm(Octstr *ostr)
void charset_nrc_iso_21_german_to_gsm(Octstr *ostr)
void octstr_insert_data(Octstr *ostr, long pos, const char *data, long len)
#define octstr_get_cstr(ostr)
static const unsigned char gsm_to_latin1[128]
static const int latin1_to_gsm[256]
Octstr * octstr_imm(const char *cstr)
void octstr_delete(Octstr *ostr1, long pos, long len)
static const int gsm_to_unicode[128]
#define octstr_duplicate(ostr)
void warning(int err, const char *fmt,...)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
void charset_gsm_to_latin1(Octstr *ostr)
long octstr_len(const Octstr *ostr)
void charset_latin1_to_gsm(Octstr *ostr)
int charset_from_utf8(Octstr *utf8, Octstr **to, Octstr *charset_to)
void debug(const char *place, int err, const char *fmt,...)
void octstr_truncate(Octstr *ostr, int new_len)
void charset_gsm_to_nrc_iso_21_german(Octstr *ostr)
int octstr_get_char(const Octstr *ostr, long pos)
SMPP_PDU *(* handler)(ESME *, SMPP_PDU *)
void octstr_set_char(Octstr *ostr, long pos, int ch)
#define octstr_create_from_data(data, len)
int charset_gsm_truncate(Octstr *gsm, long max)
int charset_convert(Octstr *string, char *charset_from, char *charset_to)
int octstr_compare(const Octstr *ostr1, const Octstr *ostr2)
void charset_gsm_to_utf8(Octstr *ostr)