From 6e5e3e0e3fc450eaf53feee059824ad85c4f270d Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: ćšć, 06 8æ 2015 22:32:35 +0800 Subject: [PATCH] Resolve #38 Error queue not empty bit --- libscpi/src/parser.c | 90 +++++++++++++++++++++++++++----------------- 1 files changed, 55 insertions(+), 35 deletions(-) diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c index ad7ebc4..dfe84d7 100644 --- a/libscpi/src/parser.c +++ b/libscpi/src/parser.c @@ -90,9 +90,25 @@ static size_t writeNewLine(scpi_t * context) { if (context->output_count > 0) { size_t len; - len = writeData(context, "\r\n", 2); +#ifndef SCPI_LINE_ENDING +#error no termination character defined +#endif + len = writeData(context, SCPI_LINE_ENDING, strlen(SCPI_LINE_ENDING)); flushData(context); return len; + } else { + return 0; + } +} + +/** + * Conditionaly write ";" + * @param context + * @return number of characters written + */ +static size_t writeSemicolon(scpi_t * context) { + if (context->output_count > 0) { + return writeData(context, ";", 1); } else { return 0; } @@ -106,20 +122,19 @@ const scpi_command_t * cmd = context->param_list.cmd; lex_state_t * state = &context->param_list.lex_state; + /* conditionaly write ; */ + writeSemicolon(context); + context->cmd_error = FALSE; context->output_count = 0; context->input_count = 0; - SCPI_DEBUG_COMMAND(context); /* if callback exists - call command callback */ if (cmd->callback != NULL) { if ((cmd->callback(context) != SCPI_RES_OK) && !context->cmd_error) { SCPI_ErrorPush(context, SCPI_ERROR_EXECUTION_ERROR); } } - - /* conditionaly write new line */ - writeNewLine(context); /* set error if command callback did not read all parameters */ if (state->pos < (state->buffer + state->len) && !context->cmd_error) { @@ -138,7 +153,7 @@ for (i = 0; context->cmdlist[i].pattern != NULL; i++) { cmd = &context->cmdlist[i]; - if (matchCommand(cmd->pattern, header, len)) { + if (matchCommand(cmd->pattern, header, len, NULL, 0)) { context->param_list.cmd = cmd; return TRUE; } @@ -164,6 +179,7 @@ } state = &context->parser_state; + context->output_count = 0; while (1) { result = 0; @@ -202,6 +218,10 @@ } } + + /* conditionaly write new line */ + writeNewLine(context); + return result; } @@ -309,7 +329,7 @@ /** * Return prefix of nondecimal base * @param base - * @return + * @return */ static const char * getBasePrefix(int8_t base) { switch (base) { @@ -325,7 +345,7 @@ * @param context * @param val * @param base - * @return + * @return */ size_t SCPI_ResultIntBase(scpi_t * context, int32_t val, int8_t base) { char buffer[33]; @@ -384,7 +404,7 @@ * @param context * @param data * @param len - * @return + * @return */ size_t SCPI_ResultArbitraryBlock(scpi_t * context, const char * data, size_t len) { size_t result = 0; @@ -394,7 +414,7 @@ SCPI_LongToStr(len, block_header + 2, 10, 10); header_len = strlen(block_header + 2); - block_header[1] = header_len + '0'; + block_header[1] = (char)(header_len + '0'); result += writeData(context, block_header, header_len + 2); result += writeData(context, data, len); @@ -431,7 +451,7 @@ * @param context * @param parameter * @param mandatory - * @return + * @return */ scpi_bool_t SCPI_Parameter(scpi_t * context, scpi_parameter_t * parameter, scpi_bool_t mandatory) { lex_state_t * state; @@ -489,7 +509,7 @@ * Detect if parameter is number * @param parameter * @param suffixAllowed - * @return + * @return */ scpi_bool_t SCPI_ParamIsNumber(scpi_parameter_t * parameter, scpi_bool_t suffixAllowed) { switch (parameter->type) { @@ -510,7 +530,7 @@ * @param context * @param parameter * @param value result - * @return true if succesful + * @return TRUE if succesful */ scpi_bool_t SCPI_ParamToInt(scpi_t * context, scpi_parameter_t * parameter, int32_t * value) { @@ -538,7 +558,7 @@ * @param context * @param parameter * @param value result - * @return true if succesful + * @return TRUE if succesful */ scpi_bool_t SCPI_ParamToDouble(scpi_t * context, scpi_parameter_t * parameter, double * value) { scpi_bool_t result = FALSE; @@ -569,7 +589,7 @@ * @param context * @param value * @param mandatory - * @return + * @return */ scpi_bool_t SCPI_ParamDouble(scpi_t * context, double * value, scpi_bool_t mandatory) { scpi_bool_t result; @@ -600,7 +620,7 @@ * @param context * @param value * @param mandatory - * @return + * @return */ scpi_bool_t SCPI_ParamInt(scpi_t * context, int32_t * value, scpi_bool_t mandatory) { scpi_bool_t result; @@ -632,7 +652,7 @@ * @param value * @param len * @param mandatory - * @return + * @return */ scpi_bool_t SCPI_ParamCharacters(scpi_t * context, const char ** value, size_t * len, scpi_bool_t mandatory) { scpi_bool_t result; @@ -660,7 +680,7 @@ * @param value result pointer to data * @param len result length of data * @param mandatory - * @return + * @return */ scpi_bool_t SCPI_ParamArbitraryBlock(scpi_t * context, const char ** value, size_t * len, scpi_bool_t mandatory) { scpi_bool_t result; @@ -730,7 +750,7 @@ * @param parameter - should be PROGRAM_MNEMONIC * @param options - NULL terminated list of choices * @param value - index to options - * @return + * @return */ scpi_bool_t SCPI_ParamToChoice(scpi_t * context, scpi_parameter_t * parameter, const scpi_choice_def_t * options, int32_t * value) { size_t res; @@ -743,7 +763,7 @@ if (parameter->type == SCPI_TOKEN_PROGRAM_MNEMONIC) { for (res = 0; options[res].name; ++res) { - if (matchPattern(options[res].name, strlen(options[res].name), parameter->ptr, parameter->len)) { + if (matchPattern(options[res].name, strlen(options[res].name), parameter->ptr, parameter->len, NULL)) { *value = options[res].tag; result = TRUE; break; @@ -765,7 +785,7 @@ * @param options specifications of choices numbers (patterns) * @param tag numerical representatio of choice * @param text result text - * @return true if succesfule, else false + * @return TRUE if succesfule, else FALSE */ scpi_bool_t SCPI_ChoiceToName(const scpi_choice_def_t * options, int32_t tag, const char ** text) { int i; @@ -785,7 +805,7 @@ * @param context * @param value * @param mandatory - * @return + * @return */ scpi_bool_t SCPI_ParamBool(scpi_t * context, scpi_bool_t * value, scpi_bool_t mandatory) { scpi_bool_t result; @@ -826,7 +846,7 @@ * @param options * @param value * @param mandatory - * @return + * @return */ scpi_bool_t SCPI_ParamChoice(scpi_t * context, const scpi_choice_def_t * options, int32_t * value, scpi_bool_t mandatory) { scpi_bool_t result; @@ -849,7 +869,7 @@ * Parse one parameter and detect type * @param state * @param token - * @return + * @return */ int scpiParser_parseProgramData(lex_state_t * state, scpi_token_t * token) { scpi_token_t tmp; @@ -888,7 +908,7 @@ * @param state * @param token * @param numberOfParameters - * @return + * @return */ int scpiParser_parseAllProgramData(lex_state_t * state, scpi_token_t * token, int * numberOfParameters) { @@ -938,7 +958,7 @@ * @param state * @param buffer * @param len - * @return + * @return */ int scpiParser_detectProgramMessageUnit(scpi_parser_state_t * state, char * buffer, int len) { lex_state_t lex_state; @@ -991,15 +1011,17 @@ * - suitable for one handle to multiple commands * @param context * @param cmd - * @return + * @return */ scpi_bool_t SCPI_IsCmd(scpi_t * context, const char * cmd) { + const char * pattern; + if (!context->param_list.cmd) { return FALSE; } - const char * pattern = context->param_list.cmd->pattern; - return matchCommand(pattern, cmd, strlen(cmd)); + pattern = context->param_list.cmd->pattern; + return matchCommand (pattern, cmd, strlen (cmd), NULL, 0); } /** @@ -1016,11 +1038,9 @@ } scpi_bool_t SCPI_Match(const char * pattern, const char * value, size_t len) { - return matchCommand (pattern, value, len); + return matchCommand (pattern, value, len, NULL, 0); } - - - - - +scpi_bool_t SCPI_CommandNumbers(scpi_t * context, int32_t * numbers, size_t len) { + return matchCommand (context->param_list.cmd->pattern, context->param_list.cmd_raw.data, context->param_list.cmd_raw.length, numbers, len); +} -- Gitblit v1.9.1