| | |
| | | #include <string.h> |
| | | #include "scpi/parser.h" |
| | | #include "scpi/units.h" |
| | | #include "utils.h" |
| | | #include "utils_private.h" |
| | | #include "scpi/error.h" |
| | | #include "scpi/lexer.h" |
| | | #include "lexer_private.h" |
| | | |
| | | |
| | | /* |
| | |
| | | {/* 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 */ "INFinity", /* type */ SCPI_NUM_INF}, |
| | | {/* name */ "NINF", /* type */ SCPI_NUM_NINF}, |
| | | SCPI_SPECIAL_NUMBERS_LIST_END, |
| | | }; |
| | |
| | | * @param value resultin value |
| | | * @return TRUE if str matches one of specs patterns |
| | | */ |
| | | static bool_t translateSpecialNumber(const scpi_special_number_def_t * specs, const char * str, size_t len, scpi_number_parameter_t * value) { |
| | | static scpi_bool_t translateSpecialNumber(const scpi_special_number_def_t * specs, const char * str, size_t len, scpi_number_parameter_t * value) { |
| | | int i; |
| | | |
| | | value->value = 0.0; |
| | |
| | | * @param value preparsed numeric value |
| | | * @return TRUE if value parameter was converted to base units |
| | | */ |
| | | static bool_t transformNumber(scpi_t * context, const char * unit, size_t len, scpi_number_parameter_t * value) { |
| | | static scpi_bool_t transformNumber(scpi_t * context, const char * unit, size_t len, scpi_number_parameter_t * value) { |
| | | size_t s; |
| | | const scpi_unit_def_t * unitDef; |
| | | s = skipWhitespace(unit, len); |
| | |
| | | * @param mandatory if the parameter is mandatory |
| | | * @return |
| | | */ |
| | | bool_t SCPI_ParamTranslateNumberVal(scpi_t * context, scpi_parameter_t * parameter) { |
| | | token_t token; |
| | | scpi_bool_t SCPI_ParamTranslateNumberVal(scpi_t * context, scpi_parameter_t * parameter) { |
| | | scpi_token_t token; |
| | | lex_state_t state; |
| | | |
| | | state.buffer = parameter->data.ptr; |
| | |
| | | |
| | | switch(parameter->type) { |
| | | case TokDecimalNumericProgramDataWithSuffix: |
| | | SCPI_LexDecimalNumericProgramData(&state, &token); |
| | | SCPI_LexWhiteSpace(&state, &token); |
| | | SCPI_LexSuffixProgramData(&state, &token); |
| | | lexDecimalNumericProgramData(&state, &token); |
| | | lexWhiteSpace(&state, &token); |
| | | lexSuffixProgramData(&state, &token); |
| | | |
| | | return transformNumber(context, token.ptr, token.len, ¶meter->number); |
| | | case TokProgramMnemonic: |
| | | SCPI_LexWhiteSpace(&state, &token); |
| | | SCPI_LexCharacterProgramData(&state, &token); |
| | | lexWhiteSpace(&state, &token); |
| | | lexCharacterProgramData(&state, &token); |
| | | |
| | | /* convert string to special number type */ |
| | | return translateSpecialNumber(context->special_numbers, token.ptr, token.len, ¶meter->number); |