Example #1
0
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);
}
Example #2
0
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;
}
Example #3
0
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++;
        }
    }
}