From 2df8ee6c6f411e5fa0b774874e759c5e7b045121 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周二, 27 11月 2012 19:52:23 +0800 Subject: [PATCH] Units parsing completition --- scpi/scpi_units.c | 117 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 88 insertions(+), 29 deletions(-) diff --git a/scpi/scpi_units.c b/scpi/scpi_units.c index 205639b..723e0d9 100644 --- a/scpi/scpi_units.c +++ b/scpi/scpi_units.c @@ -99,44 +99,65 @@ SCPI_UNITS_LIST_END, }; - const scpi_special_number_def_t scpi_special_numbers_def[] = { - { .name = "MIN", .type = SCPI_NUM_MIN}, - { .name = "MINIMUM", .type = SCPI_NUM_MIN}, - { .name = "MAX", .type = SCPI_NUM_MAX}, - { .name = "MAXIMUM", .type = SCPI_NUM_MAX}, - { .name = "DEF", .type = SCPI_NUM_DEF}, - { .name = "DEFAULT", .type = SCPI_NUM_DEF}, + { .name = "MINimum", .type = SCPI_NUM_MIN}, + { .name = "MAXimum", .type = SCPI_NUM_MAX}, + { .name = "DEFault", .type = SCPI_NUM_DEF}, + { .name = "UP", .type = SCPI_NUM_UP}, + { .name = "DOWN", .type = SCPI_NUM_DOWN}, { .name = "NAN", .type = SCPI_NUM_NAN}, { .name = "INF", .type = SCPI_NUM_INF}, { .name = "NINF", .type = SCPI_NUM_NINF}, SCPI_SPECIAL_NUMBERS_LIST_END, }; -static scpi_special_number_t translateSpecialNumber(const char * str, size_t len) { +static scpi_special_number_t translateSpecialNumber(const scpi_special_number_def_t * specs, const char * str, size_t len) { int i; - for (i = 0; scpi_special_numbers_def[i].name != NULL; i++) { - if (compareStr(str, len, scpi_special_numbers_def[i].name, strlen(scpi_special_numbers_def[i].name))) { - return scpi_special_numbers_def[i].type; + for (i = 0; specs[i].name != NULL; i++) { + if (matchPattern(specs[i].name, strlen(specs[i].name), str, len)) { + return specs[i].type; } } return SCPI_NUM_NUMBER; } -static const scpi_unit_def_t * searchUnit(const char * unit, size_t len) { +static const char * translateSpecialNumberInverse(const scpi_special_number_def_t * specs, scpi_special_number_t type) { int i; - for(i = 0; scpi_units_def[i].name != NULL; i++) { - if (compareStr(unit, len, scpi_units_def[i].name, strlen(scpi_units_def[i].name))) { - return &scpi_units_def[i]; + + for (i = 0; specs[i].name != NULL; i++) { + if (specs[i].type == type) { + return specs[i].name; } } - + return NULL; } -static bool_t transformNumber(const char * unit, size_t len, scpi_number_t * value) { +static const scpi_unit_def_t * translateUnit(const scpi_unit_def_t * units, const char * unit, size_t len) { + int i; + for (i = 0; units[i].name != NULL; i++) { + if (compareStr(unit, len, units[i].name, strlen(units[i].name))) { + return &units[i]; + } + } + + return NULL; +} + +static const char * translateUnitInverse(const scpi_unit_def_t * units, const scpi_unit_t unit) { + int i; + for (i = 0; units[i].name != NULL; i++) { + if ((units[i].unit == unit) && (units[i].mult == 1)) { + return units[i].name; + } + } + + return NULL; +} + +static bool_t transformNumber(const scpi_unit_def_t * units, const char * unit, size_t len, scpi_number_t * value) { size_t s; const scpi_unit_def_t * unitDef; s = skipWhitespace(unit, len); @@ -145,16 +166,16 @@ value->unit = SCPI_UNIT_NONE; return TRUE; } - - unitDef = searchUnit(unit + s, len - s); - + + unitDef = translateUnit(units, unit + s, len - s); + if (unitDef == NULL) { return FALSE; } - + value->value *= unitDef->mult; value->unit = unitDef->unit; - + return TRUE; } @@ -171,19 +192,26 @@ size_t len; size_t numlen; - result = SCPI_ParamString(context, ¶m, &len, mandatory); + // TODO: get scpi_special_numbers_def and scpi_units_def from context - if (!result) { - return FALSE; - } + result = SCPI_ParamString(context, ¶m, &len, mandatory); if (!value) { return FALSE; } + if (!result) { + if (mandatory) { + return FALSE; + } else { + value->type = SCPI_NUM_DEF; + return TRUE; + } + } + value->unit = SCPI_UNIT_NONE; value->value = 0.0; - value->type = translateSpecialNumber(param, len); + value->type = translateSpecialNumber(scpi_special_numbers_def, param, len); if (value->type != SCPI_NUM_NUMBER) { // found special type @@ -193,13 +221,44 @@ numlen = strToDouble(param, &value->value); if (numlen <= len) { - if (transformNumber(param + numlen, len - numlen, value)) { + if (transformNumber(scpi_units_def, param + numlen, len - numlen, value)) { return TRUE; } else { - SCPI_ErrorPush(context, SCPI_ERROR_INVALID_SUFFIX); + SCPI_ErrorPush(context, SCPI_ERROR_INVALID_SUFFIX); } } return FALSE; } +size_t SCPI_NumberToStr(scpi_context_t * context, scpi_number_t * value, char * str, size_t len) { + const char * type; + const char * unit; + size_t result; + + (void) context; // TODO: get scpi_special_numbers_def and scpi_units_def from context + + + if (!value || !str) { + return 0; + } + + type = translateSpecialNumberInverse(scpi_special_numbers_def, value->type); + + if (type) { + strncpy(str, type, len); + return min(strlen(type), len); + } + + result = doubleToStr(value->value, str, len); + + unit = translateUnitInverse(scpi_units_def, value->unit); + + if (unit) { + strncat(str, " ", len); + strncat(str, unit, len); + result += strlen(unit) + 1; + } + + return result; +} \ No newline at end of file -- Gitblit v1.9.1