libscpi/src/parser.c
@@ -50,11 +50,11 @@
 * Write data to SCPI output
 * @param context
 * @param data
 * @param len - lenght of data to be written
 * @param len - length of data to be written
 * @return number of bytes written
 */
static size_t writeData(scpi_t * context, const char * data, size_t len) {
    if (len > 0) {
    if ((len > 0) && (data != NULL)) {
        return context->interface->write(context, data, len);
    } else {
        return 0;
@@ -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,14 +127,17 @@
    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;
    context->input_count = 0;
    context->arbitrary_reminding = 0;
    context->arbitrary_remaining = 0;
    /* if callback exists - call command callback */
    if (cmd->callback != NULL) {
@@ -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);
@@ -221,7 +229,7 @@
                cmd_prev = state->programHeader;
            } else {
                /* place undefined header with error */
                /* calculate length of errornouse header and trim \r\n */
                /* calculate length of errorenous header and trim \r\n */
                size_t r2 = r;
                while (r2 > 0 && (data[r2 - 1] == '\r' || data[r2 - 1] == '\n')) r2--;
                SCPI_ErrorPushEx(context, SCPI_ERROR_UNDEFINED_HEADER, data, r2);
@@ -238,7 +246,7 @@
    }
    /* conditionaly write new line */
    /* conditionally write new line */
    writeNewLine(context);
    return result;
@@ -506,7 +514,7 @@
}
/**
 * Write string withn " to the result
 * Write string within "" to the result
 * @param context
 * @param data
 * @return
@@ -606,6 +614,7 @@
 * @return
 */
size_t SCPI_ResultArbitraryBlockHeader(scpi_t * context, size_t len) {
    size_t result = 0;
    char block_header[12];
    size_t header_len;
    block_header[0] = '#';
@@ -614,8 +623,10 @@
    header_len = strlen(block_header + 2);
    block_header[1] = (char) (header_len + '0');
    context->arbitrary_reminding = len;
    return writeData(context, block_header, header_len + 2);
    context->arbitrary_remaining = len;
    result  = writeDelimiter(context);
    result += writeData(context, block_header, header_len + 2);
    return result;
}
/**
@@ -627,14 +638,14 @@
 */
size_t SCPI_ResultArbitraryBlockData(scpi_t * context, const void * data, size_t len) {
    if (context->arbitrary_reminding < len) {
    if (context->arbitrary_remaining < len) {
        SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR);
        return 0;
    }
    context->arbitrary_reminding -= len;
    context->arbitrary_remaining -= len;
    if (context->arbitrary_reminding == 0) {
    if (context->arbitrary_remaining == 0) {
        context->output_count++;
    }