/* * Convert "quoted-printable" to binary. Returns number of bytes decoded. * according to RFC2045 section 6.7 */ int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) { unsigned int ch; int decoded_length = 0; int pos = 0; while (pos < sourcelen) { if (*(encoded + pos) == '=') { pos ++; if (*(encoded + pos) == '\n') { pos ++; } else if (*(encoded + pos) == '\r') { pos ++; if (*(encoded + pos) == '\n') pos++; } else { ch = _decode_hex(&encoded[pos]); pos += 2; decoded[decoded_length++] = ch; } } else { decoded[decoded_length++] = encoded[pos]; pos += 1; } } decoded[decoded_length] = 0; return(decoded_length); }
static const char *parse_string(cJSON *item,const char *str) { const char *ptr=str+1;char *ptr2;char *out;int32_t len=0;unsigned uc,uc2; if (*str!='\"') {ep=str;return 0;} /* not a string! */ while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; // Skip escaped quotes out=(char*)cJSON_malloc(len+2); /* This is how long we need for the string, roughly. */ if (!out) return 0; ptr=str+1;ptr2=out; while (*ptr!='\"' && *ptr) { if (*ptr!='\\') { if ( *ptr == '%' && is_hexstr((char *)&ptr[1],2) && isprint(_decode_hex((char *)&ptr[1])) != 0 ) *ptr2++ = _decode_hex((char *)&ptr[1]), ptr += 3; else *ptr2++ = *ptr++; } else { ptr++; switch (*ptr) { case 'b': *ptr2++='\b'; break; case 'f': *ptr2++='\f'; break; case 'n': *ptr2++='\n'; break; case 'r': *ptr2++='\r'; break; case 't': *ptr2++='\t'; break; case 'u': // transcode utf16 to utf8 uc=parse_hex4(ptr+1);ptr+=4; // get the unicode char if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; // check for invalid if (uc>=0xD800 && uc<=0xDBFF) // UTF16 surrogate pairs { if (ptr[1]!='\\' || ptr[2]!='u') break; // missing second-half of surrogate. uc2=parse_hex4(ptr+3);ptr+=6; if (uc2<0xDC00 || uc2>0xDFFF) break; // invalid second-half of surrogate uc=0x10000 + (((uc&0x3FF)<<10) | (uc2&0x3FF)); } len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; switch (len) { case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; case 1: *--ptr2 =(uc | firstByteMark[len]); } ptr2+=len; break; default: *ptr2++=*ptr; break; } ptr++; } } *ptr2=0; if (*ptr=='\"') ptr++; item->valuestring=out; item->type=cJSON_String; return ptr; }
unsigned int decode_hex(char *Source) {return _decode_hex(Source);}