static const char* markup_unescape(const char* in, ACL_VSTRING* out) { unsigned int n; char temp[2], buf[7]; while (*in != 0) { if (*in == '&' && *(in + 1) == '#' && (sscanf(in, "&#%u%1[;]", &n, temp) == 2 || sscanf(in, "&#x%x%1[;]", &n, temp) == 2) && n != 0) { int buflen = uni2utf8((unsigned int) n, buf, sizeof(buf)); buf[buflen] = '\0'; acl_vstring_strcat(out, buf); n = *(in + 2) == 'x' ? 3 : 2; while (isxdigit(in[n])) n++; if(in[n] == ';') n++; in += n; } else { ACL_VSTRING_ADDCH(out, (unsigned char) (*in)); in++; } } return (in); }
static const char* markup_unescape2(const char *in, char **out, size_t *size) { unsigned int n; char temp[2], buf[7]; while (*in != 0) { if (*in == '&' && *(in + 1) == '#' && (sscanf(in, "&#%u%1[;]", &n, temp) == 2 || sscanf(in, "&#x%x%1[;]", &n, temp) == 2) && n != 0) { size_t buflen = uni2utf8(n, buf, sizeof(buf)); if (copy_buf(out, size, buf, buflen) > 0) break; n = *(in + 2) == 'x' ? 3 : 2; while (isxdigit(in[n])) n++; if(in[n] == ';') n++; in += n; } else { if (*size <= 0) break; **out = *in++; *out += 1; *size -= 1; } } return in; }
EXP_OPTION void unicode2ascii(const char* uni, char* dest) { int len, i, j, k; long c; RETURN_VOID_IF_NULL(uni); RETURN_VOID_IF_NULL(dest); len = strlen(uni); memset(dest, 0, len+1); for(i = j = 0; i < len; i++) { if(uni[i] == '\\' && uni[i+1] == 'x') { if(uni[i+2] == '0' && uni[i+3] == '0') { if(uni[i+4] >= 'A' && uni[i+4] <= 'Z') { // simple char in form \x00A dest[j] = (unsigned char)uni[i+4]; i += 4; j++; continue; } else { i += 3; continue; } } if(uni[i+2] == '0' && uni[i+3] != '0') { // more complex char like \x0}1 c = 0; // first pos k = uni[i+2]; k = (((k >= '0') && (k <= '9')) ? k - '0' : k); k *= 4096; c += k; // second pos k = uni[i+3]; k = (((k >= '0') && (k <= '9')) ? k - '0' : k); k *= 256; c += k; // third pos k = uni[i+4]; k = (((k >= '0') && (k <= '9')) ? k - '0' : k); c += k; if(c >= 0 && c <= 9) c+= '0'; // get corresponding cp1252 char if(c > 256) { #ifdef WIN32 dest[j] = (unsigned char)uni2char(c); j++; #else dest[j] = uni2utf8(c, 0); j++; dest[j] = uni2utf8(c, 1); j++; #endif } else { dest[j] = (unsigned char)c; j++; } i += 4; continue; } if(uni[i+2] != '0' && uni[i+3] != '0') { // hex char code like \xC4 c = hex2char(uni[i+2]) * 16 + hex2char(uni[i+3]); if(c > 256) { #ifdef WIN32 dest[j] = (unsigned char)uni2char(c); j++; #else dest[j] = uni2utf8(c, 0); j++; dest[j] = uni2utf8(c, 1); j++; #endif } else { dest[j] = (unsigned char)c; j++; } i += 3; continue; } } else { dest[j] = uni[i]; j++; } } }