| 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 ;
}