Return TypeFunction nameArguments
hzEcodeCharsetStringDecode(hzString&,const hzString&,)

Declared in file: hzCodec.h
Defined in file : hzCodec.cpp

Function Logic:

0:START 1:hzString::Clear 2:!raw 3:Return E_OK 4:outBuf x hzString::Length limit hzString::Length memset 5:*i; 6:*i==(char)61&&i[1]==(char)63 7:*j&&*j!=(char)63; 8:j[0]==(char)63&&j[2]==(char)63 9:j[1]=='b'||j[1]=='B' 10:*i; 11:i[0]==(char)63&&i[1]==(char)61 12:i 13:a items b items c items d items 14:a==101||b==101||c==101||d==101 15:Return E_FORMAT 16:val 17:a<100 18:val 19:b<100 20:val 21:c<100 22:val 23:d<100 24:val 25:a b c 26:a&&x!=limit 27:* 28:b&&x!=limit 29:* 30:c&&x!=limit 31:* 32:j[1]=='q'||j[1]=='Q' 33:*i; 34:i[0]==(char)63&&i[1]==(char)61 35:i 36:*i==(char)61&&IsHex(i[1])&&IsHex(i[2]) 37:items val items val val 38:val&&x!=limit 39:* 40:*i&&x!=limit 41:* 42:*i; 43:i[0]==(char)63&&i[1]==(char)61 44:i 45:*i&&x!=limit 46:* 47:*i&&x!=limit 48:* 49:*i&&x!=limit 50:* 51:Decoded outBuf 52:Return E_OK

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