Iztok Jeras
2015-10-07 b9972c6b63937373ea9db39249b3f23985758425
integer parser: added 64 bit Param* functions
3个文件已修改
134 ■■■■■ 已修改文件
libscpi/Makefile 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/parser.c 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/test/test_scpi_utils.c 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/Makefile
@@ -1,7 +1,6 @@
VERSION = 2.1.0
LIBNAME = scpi
CFLAGS += -std=c99
CFLAGS += -Wextra -Wmissing-prototypes -Wimplicit -Iinc
CFLAGS_SHARED += $(CFLAGS) -fPIC
LDFLAGS += -Wl,--as-needed
libscpi/src/parser.c
@@ -618,6 +618,40 @@
}
/**
 * Convert parameter to signed/unsigned 64 bit integer
 * @param context
 * @param parameter
 * @param value result
 * @param sign
 * @return TRUE if succesful
 */
static scpi_bool_t ParamSignToUInt64(scpi_t * context, scpi_parameter_t * parameter, uint64_t * value, scpi_bool_t sign) {
    if (!value) {
        SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR);
        return FALSE;
    }
    switch (parameter->type) {
        case SCPI_TOKEN_HEXNUM:
            return strBaseToUInt64(parameter->ptr, value, 16) > 0 ? TRUE : FALSE;
        case SCPI_TOKEN_OCTNUM:
            return strBaseToUInt64(parameter->ptr, value, 8) > 0 ? TRUE : FALSE;
        case SCPI_TOKEN_BINNUM:
            return strBaseToUInt64(parameter->ptr, value, 2) > 0 ? TRUE : FALSE;
        case SCPI_TOKEN_DECIMAL_NUMERIC_PROGRAM_DATA:
        case SCPI_TOKEN_DECIMAL_NUMERIC_PROGRAM_DATA_WITH_SUFFIX:
            if (sign) {
                return strBaseToInt64(parameter->ptr, (uint64_t *)value, 10) > 0 ? TRUE : FALSE;
            } else {
                return strBaseToUInt64(parameter->ptr, value, 10) > 0 ? TRUE : FALSE;
            }
        default:
            return FALSE;
    }
}
/**
 * Convert parameter to signed 32 bit integer
 * @param context
 * @param parameter
@@ -637,6 +671,28 @@
 */
scpi_bool_t SCPI_ParamToUInt32(scpi_t * context,  scpi_parameter_t * parameter, uint32_t * value) {
    return ParamSignToUInt32(context, parameter, value, FALSE);
}
/**
 * Convert parameter to signed 64 bit integer
 * @param context
 * @param parameter
 * @param value result
 * @return TRUE if succesful
 */
scpi_bool_t SCPI_ParamToInt64(scpi_t * context, scpi_parameter_t * parameter, int64_t * value) {
    return ParamSignToUInt64(context, parameter, (uint64_t *)value, TRUE);
}
/**
 * Convert parameter to unsigned 32 bit integer
 * @param context
 * @param parameter
 * @param value result
 * @return TRUE if succesful
 */
scpi_bool_t SCPI_ParamToUInt64(scpi_t * context,  scpi_parameter_t * parameter, uint64_t * value) {
    return ParamSignToUInt64(context, parameter, value, FALSE);
}
/**
@@ -737,6 +793,38 @@
}
/**
 * Read signed/unsigned 64 bit integer parameter
 * @param context
 * @param value
 * @param mandatory
 * @param sign
 * @return
 */
static scpi_bool_t ParamSignUInt64(scpi_t * context, uint64_t * value, scpi_bool_t mandatory, scpi_bool_t sign) {
    scpi_bool_t result;
    scpi_parameter_t param;
    if (!value) {
        SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR);
        return FALSE;
    }
    result = SCPI_Parameter(context, &param, mandatory);
    if (result) {
        if (SCPI_ParamIsNumber(&param, FALSE)) {
            result = ParamSignToUInt64(context, &param, value, sign);
        } else if (SCPI_ParamIsNumber(&param, TRUE)) {
            SCPI_ErrorPush(context, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
            result = FALSE;
        } else {
            SCPI_ErrorPush(context, SCPI_ERROR_DATA_TYPE_ERROR);
            result = FALSE;
        }
    }
    return result;
}
/**
 * Read signed 32 bit integer parameter
 * @param context
 * @param value
@@ -759,6 +847,28 @@
}
/**
 * Read signed 64 bit integer parameter
 * @param context
 * @param value
 * @param mandatory
 * @return
 */
scpi_bool_t SCPI_ParamInt64(scpi_t * context, int64_t * value, scpi_bool_t mandatory) {
    return ParamSignUInt64(context, (uint64_t *)value, mandatory, TRUE);
}
/**
 * Read unsigned 64 bit integer parameter
 * @param context
 * @param value
 * @param mandatory
 * @return
 */
scpi_bool_t SCPI_ParamUInt64(scpi_t * context, uint64_t * value, scpi_bool_t mandatory) {
    return ParamSignUInt64(context, value, mandatory, FALSE);
}
/**
 * Read character parameter
 * @param context
 * @param value
libscpi/test/test_scpi_utils.c
@@ -73,12 +73,13 @@
    const size_t max=32+1;
    int32_t val[] = {0, 1, -1, INT32_MIN, INT32_MAX, 0x01234567, 0x89abcdef};
    int N = sizeof(val) / sizeof(int32_t);
    int i;
    char str[max];
    char ref[max];
    size_t len;
    // test signed conversion to decimal numbers
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_Int32ToStr(val[i], str, max);
        snprintf(ref, max, "%"PRIi32, val[i]);
        CU_ASSERT(len == strlen(ref));
@@ -90,12 +91,13 @@
    const size_t max=32+1;
    uint32_t val[] = {0, 1, -1, INT32_MIN, INT32_MAX, 0x01234567, 0x89abcdef};
    int N = sizeof(val) / sizeof(uint32_t);
    int i;
    char str[max];
    char ref[max];
    size_t len;
    // test conversion to decimal numbers
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_UInt32ToStrBase(val[i], str, max, 10);
        snprintf(ref, max, "%"PRIu32, val[i]);
        CU_ASSERT(len == strlen(ref));
@@ -103,7 +105,7 @@
    }
    // test conversion to hexadecimal numbers
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_UInt32ToStrBase(val[i], str, max, 16);
        snprintf(ref, max, "%"PRIX32, val[i]);
        CU_ASSERT(len == strlen(ref));
@@ -111,7 +113,7 @@
    }
    // test conversion to octal numbers
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_UInt32ToStrBase(val[i], str, max, 8);
        snprintf(ref, max, "%"PRIo32, val[i]);
        CU_ASSERT(len == strlen(ref));
@@ -144,12 +146,13 @@
    const size_t max=64+1;
    int64_t val[] = {0, 1, -1, INT64_MIN, INT64_MAX, 0x0123456789abcdef, 0xfedcba9876543210};
    int N = sizeof(val) / sizeof(int64_t);
    int i;
    char str[max];
    char ref[max];
    size_t len;
    // test conversion to decimal numbers
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_Int64ToStr(val[i], str, max);
        snprintf(ref, max, "%"PRIi64, val[i]);
        CU_ASSERT(len == strlen(ref));
@@ -161,12 +164,13 @@
    const size_t max=64+1;
    uint64_t val[] = {0, 1, -1, INT64_MIN, INT64_MAX, 0x0123456789abcdef, 0xfedcba9876543210};
    int N = sizeof(val) / sizeof(uint64_t);
    int i;
    char str[max];
    char ref[max];
    size_t len;
    // test conversion to decimal numbers
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_UInt64ToStrBase(val[i], str, max, 10);
        snprintf(ref, max, "%"PRIu64, val[i]);
        CU_ASSERT(len == strlen(ref));
@@ -174,7 +178,7 @@
    }
    // test conversion to hexadecimal numbers
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_UInt64ToStrBase(val[i], str, max, 16);
        snprintf(ref, max, "%"PRIX64, val[i]);
        CU_ASSERT(len == strlen(ref));
@@ -182,7 +186,7 @@
    }
    // test conversion to octal numbers
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_UInt64ToStrBase(val[i], str, max, 8);
        snprintf(ref, max, "%"PRIo64, val[i]);
        CU_ASSERT(len == strlen(ref));
@@ -215,11 +219,12 @@
    const size_t max=49+1;
    double val[] = {1, -1, 1.1, -1.1, 1e3, 1e30, -1.3e30, -1.3e-30};
    int N = sizeof(val) / sizeof(int);
    int i;
    char str[max];
    char ref[max];
    size_t len;
    for (uintptr_t i=0; i<N; i++) {
    for (i=0; i<N; i++) {
        len = SCPI_DoubleToStr(val[i], str, max);
        snprintf(ref, max, "%g", val[i]);
        CU_ASSERT(len == strlen(ref));