From 794b64e3f68ae2315b8bbd2c01b23c05e0cc295b Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周三, 05 8月 2015 02:55:14 +0800 Subject: [PATCH] Fix `static` in utils.c --- libscpi/src/parser.c | 88 +++++++++++++++++++++++++++---------------- 1 files changed, 55 insertions(+), 33 deletions(-) diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c index ad7ebc4..921e885 100644 --- a/libscpi/src/parser.c +++ b/libscpi/src/parser.c @@ -44,6 +44,7 @@ #include "scpi/error.h" #include "scpi/constants.h" #include "scpi/utils.h" +#include "scpi/debug.h" /** * Write data to SCPI output @@ -90,9 +91,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,6 +123,9 @@ 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; @@ -117,9 +137,6 @@ 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 +155,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 +181,7 @@ } state = &context->parser_state; + context->output_count = 0; while (1) { result = 0; @@ -202,6 +220,10 @@ } } + + /* conditionaly write new line */ + writeNewLine(context); + return result; } @@ -309,7 +331,7 @@ /** * Return prefix of nondecimal base * @param base - * @return + * @return */ static const char * getBasePrefix(int8_t base) { switch (base) { @@ -325,7 +347,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 +406,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; @@ -431,7 +453,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 +511,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 +532,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 +560,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 +591,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 +622,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 +654,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 +682,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 +752,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 +765,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 +787,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 +807,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 +848,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 +871,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 +910,7 @@ * @param state * @param token * @param numberOfParameters - * @return + * @return */ int scpiParser_parseAllProgramData(lex_state_t * state, scpi_token_t * token, int * numberOfParameters) { @@ -938,7 +960,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 +1013,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 +1040,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