Return Type | Function name | Arguments |
---|---|---|
hzEcode | CharsetStringDecode | (hzString&,const hzString&,) |
Declared in file: hzCodec.h
Defined in file : hzCodec.cpp
Function Logic:
Function body:
hzEcode CharsetStringDecode (hzString& Decoded, const hzString& raw) { _hzfunc(__func__) ; const char* i ; const char* j ; char* x ; char* limit ; char* outBuf ; int32_t val ; int32_t a ; int32_t b ; int32_t c ; int32_t d ; Decoded.Clear() ; if (!raw) return E_OK ; x = outBuf = new char[raw.Length() + 4]; limit = outBuf + (raw.Length() + 3); memset(outBuf, 0,raw.Length() + 4); for (i = *raw ; *i ; i++) { if (*i == CHAR_EQUAL && i[1]== CHAR_QUERY) { for (j = i + 2; *j && *j != CHAR_QUERY ; j++) ; if (j[0]== CHAR_QUERY && j[2]== CHAR_QUERY) { if (j[1]== ''b''||j[1]== ''B'') { for (i = j + 3; *i ; i++) { if (i[0]== CHAR_QUERY && i[1]== CHAR_EQUAL) { i += 2; break ; } a = _get6bit(*i) ; i++ ; b = _get6bit(*i) ; i++ ; c = _get6bit(*i) ; i++ ; d = _get6bit(*i) ; i++ ; if (a == 101||b== 101||c== 101||d== 101) return E_FORMAT ; val = 0; if (a < 100)val += (a << 18); if (b < 100)val += (b << 12); if (c < 100)val += (c << 6); if (d < 100)val += d ; a = (val & 0xff0000)>>16; b = (val & 0xff00)>>8; c = val & 0xff; if (a && x != limit) *x++ = a ; if (b && x != limit) *x++ = b ; if (c && x != limit) *x++ = c ; } } else if (j[1]== ''q''||j[1]== ''Q'') { for (i = j + 3; *i ; i++) { if (i[0]== CHAR_QUERY && i[1]== CHAR_EQUAL) { i += 2; break ; } if (*i == CHAR_EQUAL && IsHex(i[1])&& IsHex(i[2])) { i++ ; val = _get1hex(*i) ; i++ ; val *= 16; val += _get1hex(*i) ; if (val && x != limit) *x++ = val ; continue ; } if (*i && x != limit) *x++ = *i ; } } else { for (i = j + 3; *i ; i++) { if (i[0]== CHAR_QUERY && i[1]== CHAR_EQUAL) { i += 2; break ; } if (*i && x != limit) *x++ = *i ; } } continue ; } } if (*i && x != limit) *x++ = *i ; } if (*i && x != limit) *x = 0; Decoded = outBuf ; delete outBuf ; return E_OK ; }