integer parser: added 64 bit Param* functions
| | |
| | | VERSION = 2.1.0 |
| | | LIBNAME = scpi |
| | | |
| | | CFLAGS += -std=c99 |
| | | CFLAGS += -Wextra -Wmissing-prototypes -Wimplicit -Iinc |
| | | CFLAGS_SHARED += $(CFLAGS) -fPIC |
| | | LDFLAGS += -Wl,--as-needed |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | |
| | | */ |
| | | 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); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | |
| | | 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)); |
| | |
| | | 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)); |
| | |
| | | } |
| | | |
| | | // 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)); |
| | |
| | | } |
| | | |
| | | // 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)); |
| | |
| | | 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)); |
| | |
| | | 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)); |
| | |
| | | } |
| | | |
| | | // 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)); |
| | |
| | | } |
| | | |
| | | // 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)); |
| | |
| | | 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)); |