static long check_unicode_value(char *s, boolean multiple_value) { int l = strlen(s); int i; long code; if (l == 0) return UNI_UNDEF; if (multiple_value && l % 4 != 0) return UNI_UNDEF; if (!multiple_value && !(4 <= l && l <= 6)) return UNI_UNDEF; for (i = 0; i < l; i++) { if (!isXdigit(s[i])) return UNI_UNDEF; if (multiple_value) { if (i % 4 == 3) { if (sscanf(s + i - 3, "%4lX", &code) != 1) return UNI_UNDEF; if (!((0x0000 <= code && code <= 0xD7FF) || (0xE000 <= code && code <= 0xFFFF))) return UNI_UNDEF; } } else { /* single value */ if (i == l - 1) { if (sscanf(s, "%lX", &code) != 1) return UNI_UNDEF; if (!((0x0000 <= code && code <= 0xD7FF) || (0xE000 <= code && code <= 0x10FFFF))) return UNI_UNDEF; } } } return code; }
std::string http_client::urldecode( const std::string& s ) { std::stringstream ss; for ( char const * p_read = s.c_str(), * p_end = (s.c_str() + s.size()); p_read < p_end; p_read++ ) { if ( p_read[0] == '%' && p_read+1 != p_end && p_read+2 != p_end && isXdigit(p_read[1]) && isXdigit(p_read[2]) ) { ss << static_cast<char>((( (p_read[1] & 0xf) + ((p_read[1] >= 'A') ? 9 : 0) ) << 4 ) | ( (p_read[2] & 0xf) + ((p_read[2] >= 'A') ? 9 : 0) )); p_read += 2; } else if ( p_read[0] == '+' ) { // Undo the encoding that replaces spaces with plus signs. ss << ' '; } else { ss << p_read[0]; } } return ss.str(); }
void deftounicode(strnumber glyph, strnumber unistr) { char buf[SMALL_BUF_SIZE], *p; char buf2[SMALL_BUF_SIZE], *q; int valid_unistr; /* 0: invalid; 1: unicode value; 2: string */ int i, l; glyph_unicode_entry *gu, t; void **aa; p = makecstring(glyph); assert(strlen(p) < SMALL_BUF_SIZE); strcpy(buf, p); /* copy the result to buf before next call of makecstring() */ p = makecstring(unistr); while (*p == ' ') p++; /* ignore leading spaces */ l = strlen(p); while (l > 0 && p[l - 1] == ' ') l--; /* ignore traling spaces */ valid_unistr = 1; /* a unicode value is the most common case */ for (i = 0; i < l; i++) { if (p[i] == ' ') valid_unistr = 2; /* if a space occurs we treat this entry as a string */ else if (!isXdigit(p[i])) { valid_unistr = 0; break; } } if (l == 0 || valid_unistr == 0 || strlen(buf) == 0 || strcmp(buf, notdef) == 0) { pdftex_warn("ToUnicode: invalid parameter(s): `%s' => `%s'", buf, p); return; } if (glyph_unicode_tree == NULL) { glyph_unicode_tree = avl_create(comp_glyph_unicode_entry, NULL, &avl_xallocator); assert(glyph_unicode_tree != NULL); } t.name = buf; /* allow overriding existing entries */ if ((gu = (glyph_unicode_entry *) avl_find(glyph_unicode_tree, &t)) != NULL) { if (gu->code == UNI_STRING) { assert(gu->unicode_seq != NULL); xfree(gu->unicode_seq); } } else { /* make new entry */ gu = new_glyph_unicode_entry(); gu->name = xstrdup(buf); } if (valid_unistr == 2) { /* a string with space(s) */ /* copy p to buf2, ignoring spaces */ for (q = buf2; *p != 0; p++) if (*p != ' ') *q++ = *p; *q = 0; gu->code = UNI_STRING; gu->unicode_seq = xstrdup(buf2); } else { i = sscanf(p, "%lX", &(gu->code)); assert(i == 1); } aa = avl_probe(glyph_unicode_tree, gu); assert(aa != NULL); }