From b9972c6b63937373ea9db39249b3f23985758425 Mon Sep 17 00:00:00 2001 From: Iztok Jeras <iztok.jeras@redpitaya.com> Date: ćšć, 08 10æ 2015 03:00:34 +0800 Subject: [PATCH] integer parser: added 64 bit Param* functions --- libscpi/Makefile | 1 libscpi/src/parser.c | 110 ++++++++++++++++++++++++++++++++++++ libscpi/test/test_scpi_utils.c | 23 ++++--- 3 files changed, 124 insertions(+), 10 deletions(-) diff --git a/libscpi/Makefile b/libscpi/Makefile index b1e95cb..e56d850 100644 --- a/libscpi/Makefile +++ b/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 diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c index cac80ec..6cc21d4 100644 --- a/libscpi/src/parser.c +++ b/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, ¶m, mandatory); + if (result) { + if (SCPI_ParamIsNumber(¶m, FALSE)) { + result = ParamSignToUInt64(context, ¶m, value, sign); + } else if (SCPI_ParamIsNumber(¶m, 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 diff --git a/libscpi/test/test_scpi_utils.c b/libscpi/test/test_scpi_utils.c index 1f1853a..a912f0c 100644 --- a/libscpi/test/test_scpi_utils.c +++ b/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)); -- Gitblit v1.9.1