Howard Li
2020-04-28 47bd350398607f06c093807288ffb8cf6cb7e05e
Fix event commands adding semi-colons to output

Prior to this fix having a event-only command follow a query
command will result in a semi-colon being added to the output despite
the event-only command not writing any sort of output.
3个文件已修改
18 ■■■■ 已修改文件
libscpi/inc/scpi/types.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/parser.c 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/test/test_parser.c 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/inc/scpi/types.h
@@ -371,6 +371,7 @@
        scpi_interface_t * interface;
        int_fast16_t output_count;
        int_fast16_t input_count;
        scpi_bool_t first_output;
        scpi_bool_t cmd_error;
        scpi_fifo_t error_queue;
#if USE_DEVICE_DEPENDENT_ERROR_INFORMATION && !USE_MEMORY_ALLOCATION_FREE
libscpi/src/parser.c
@@ -93,7 +93,7 @@
 * @return number of characters written
 */
static size_t writeNewLine(scpi_t * context) {
    if (context->output_count > 0) {
    if (!context->first_output) {
        size_t len;
#ifndef SCPI_LINE_ENDING
#error no termination character defined
@@ -127,9 +127,12 @@
    const scpi_command_t * cmd = context->param_list.cmd;
    lex_state_t * state = &context->param_list.lex_state;
    scpi_bool_t result = TRUE;
    scpi_bool_t is_query = context->param_list.cmd_raw.data[context->param_list.cmd_raw.length - 1] == '?';
    /* conditionaly write ; */
    writeSemicolon(context);
    /* conditionally write ; */
    if(!context->first_output && is_query) {
        writeData(context, ";", 1);
    }
    context->cmd_error = FALSE;
    context->output_count = 0;
@@ -146,6 +149,10 @@
        } else {
            if (context->cmd_error) {
                result = FALSE;
            } else {
                if(context->first_output && is_query) {
                    context->first_output = FALSE;
                }
            }
        }
    }
@@ -197,6 +204,7 @@
    state = &context->parser_state;
    context->output_count = 0;
    context->first_output = TRUE;
    while (1) {
        r = scpiParser_detectProgramMessageUnit(state, data, len);
libscpi/test/test_parser.c
@@ -257,6 +257,9 @@
    TEST_INPUT("*IDN?;*IDN?;*IDN?;*IDN?\r\n", "MA,IN,0,VER;MA,IN,0,VER;MA,IN,0,VER;MA,IN,0,VER\r\n");
    output_buffer_clear();
    TEST_INPUT("*IDN?;STUB\r\n", "MA,IN,0,VER\r\n");
    output_buffer_clear();
    TEST_INPUT("*IDN?;*OPC;*IDN?\r\n", "MA,IN,0,VER;MA,IN,0,VER\r\n");
    output_buffer_clear();