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)