Changeset 96 in libcf for trunk/src/cf_codec.c


Ignore:
Timestamp:
05/27/13 09:37:51 (11 years ago)
Author:
cheese
Message:

#1 fix hex decoder exception and rollback function interface of decoders

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/cf_codec.c

    r92 r96  
    7373 *
    7474 * @param bin   바이너리 데이터
    75  * @param len   바이너리 데이터 길이
     75 * @param len   바이너리 데이터 길이
    7676 * @param hex   16진수 문자열을 저장할 주소
    7777 *
     
    114114 * @param hex   16진수 문자열
    115115 * @param bin   바이너리 데이터를 저장할 주소
     116 * @param len   바이너리 데이터의 길이를 저장할 주소
    116117 *
    117118 * @remark
     
    120121int
    121122CF_Codec_Hex_Decode (const char     * hex,
    122                      unsigned char  * bin)
    123 {
    124     size_t  length = strlen (hex);  /* absolutely even-number */
     123                     unsigned char  * bin,
     124                     size_t         * len)
     125{
     126    size_t  length = 0; /* absolutely even-number */
    125127    size_t  iter = 0;
    126     int     binlen = (int)length / 2;
     128    size_t  binlen = 0;
    127129
    128130    const char      * ptr = hex;
     
    133135    ASSERT_ARGS (hex == NULL);
    134136    ASSERT_ARGS (bin == NULL);
    135 
    136     for (iter = 0 ; iter < binlen ; iter++)
     137    ASSERT_ARGS (len == NULL);
     138
     139    *len = 0;
     140
     141    for ( ; g_ascii_HexDecode[(int)*ptr] && *ptr ; ptr++, length++);
     142
     143    if (*ptr)
     144        return CF_ERROR_CODEC_NOT_HEXSTRING;
     145
     146    binlen = length / 2;
     147
     148    for (iter = 0, ptr = hex ; *ptr ; iter++)
    137149    {
    138150        val = 0;    /* init/re-init docoding-buffer */
     
    145157        asciiHex = g_ascii_HexDecode[(int)buf];     \
    146158                                                    \
    147         if (buf)                                    \
    148             val |=  (unsigned char)                 \
    149                     (buf - asciiHex + (asciiHex == '0' ? 0 : 10));  \
    150         else                                        \
    151             return CF_ERROR_CODEC_NOT_HEXSTRING;    \
     159        val |=  (unsigned char)                     \
     160                (buf - asciiHex + (asciiHex == '0' ? 0 : 10));  \
    152161        } while (0)
    153162
     
    159168    }
    160169
    161     return binlen;
     170    * len = binlen;
     171
     172    return CF_OK;
    162173}
    163174
     
    232243 * @param base64    base64 문자열
    233244 * @param bin       바이너리 데이터를 저장할 주소
     245 * @param len       바이너리 데이터의 길이를 저장할 주소
    234246 *
    235247 * @remark
     
    238250int
    239251CF_Codec_Base64_Decode (const char      * base64,
    240                         unsigned char   * bin)
     252                        unsigned char   * bin,
     253                        size_t          * len)
    241254{
    242255    const char      * src = base64;
     
    247260    ASSERT_ARGS (src == NULL);
    248261    ASSERT_ARGS (dst == NULL);
     262    ASSERT_ARGS (len == NULL);
     263
     264    *len = 0;
    249265
    250266    while (g_ascii_Base64Decode[(int)*src] < BASE64_PADDING_CHAR_INDEX) src++;
Note: See TracChangeset for help on using the changeset viewer.