Changeset 96 in libcf


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

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/cf_codec.h

    r90 r96  
    2525CF_EXPORT int
    2626CF_Codec_Hex_Decode         (const char     * hex,
    27                              unsigned char  * bin);
     27                             unsigned char  * bin,
     28                             size_t         * len);
    2829
    2930CF_EXPORT int
     
    3435CF_EXPORT int
    3536CF_Codec_Base64_Decode      (const char     * base64,
    36                              unsigned char  * bin);
     37                             unsigned char  * bin,
     38                             size_t         * len);
    3739
    3840#ifdef __cplusplus
  • 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++;
  • trunk/test/codec.c

    r90 r96  
    1414    char encode[512] = {0x00,};
    1515    unsigned char bin[512] = {0x00,};
    16     int length = 0;
     16    size_t length = 0;
    1717
    1818    /* hex */
     
    2525
    2626    CF_DEBUG_PRINT (stderr, "= Convert hex to binary =\n");
    27     length = CF_Codec_Hex_Decode (encode, bin);
    28     if (length < 0) {
     27    if (CF_Codec_Hex_Decode (encode, bin, &length) < 0) {
    2928        // error
    3029    }
    31     CF_DEBUG_PRINT_BIN (stderr, bin, (size_t)length, "bin    : %s\n", bin);
     30    else
     31        CF_DEBUG_PRINT_BIN (stderr, bin, length, "bin    : %s\n", bin);
    3232
    3333    memset (bin   , 0x00, sizeof (bin));
     
    4343
    4444    CF_DEBUG_PRINT (stderr, "= Convert base64 to binary =\n");
    45     length = CF_Codec_Base64_Decode (encode, bin);
    46     if (length < 0) {
     45    if (CF_Codec_Base64_Decode (encode, bin, &length) < 0) {
    4746        // error
    4847    }
    49     CF_DEBUG_PRINT_BIN (stderr, bin, (size_t)length, "bin    : %s\n", bin);
     48    else
     49        CF_DEBUG_PRINT_BIN (stderr, bin, length, "bin    : %s\n", bin);
    5050
    5151    return 0;
  • trunk/test/test.c

    r94 r96  
    389389    char encode[512] = {0x00,};
    390390    unsigned char bin[512] = {0x00,};
    391     int length = 0;
     391    size_t length = 0;
    392392
    393393    /* hex */
     
    400400
    401401    CF_DEBUG_PRINT (stderr, "= Convert hex to binary =\n");
    402     length = CF_Codec_Hex_Decode (encode, bin);
    403     if (length < 0) {
    404         // error
    405     }
    406     CF_DEBUG_PRINT_BIN (stderr, bin, (size_t)length, "bin    : %s\n", bin);
     402    if (CF_Codec_Hex_Decode (encode, bin, &length) < 0) {
     403        // error
     404    }
     405    else
     406        CF_DEBUG_PRINT_BIN (stderr, bin, length, "bin    : %s\n", bin);
    407407
    408408    memset (bin   , 0x00, sizeof (bin));
     
    418418
    419419    CF_DEBUG_PRINT (stderr, "= Convert base64 to binary =\n");
    420     length = CF_Codec_Base64_Decode (encode, bin);
    421     if (length < 0) {
    422         // error
    423     }
    424     CF_DEBUG_PRINT_BIN (stderr, bin, (size_t)length, "bin    : %s\n", bin);
    425 }
     420    if (CF_Codec_Base64_Decode (encode, bin, &length) < 0) {
     421        // error
     422    }
     423    else
     424        CF_DEBUG_PRINT_BIN (stderr, bin, length, "bin    : %s\n", bin);
     425}
Note: See TracChangeset for help on using the changeset viewer.