Jan Breuer
2016-05-31 613c45be9ab30187f257a910b1a4ec2860fc4dc5
Convert c++ style comments // to c89 style comments /* */
17个文件已修改
740 ■■■■ 已修改文件
examples/common/scpi-def.c 144 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/common/scpi-def.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/test-CVI_w_GUI/main.c 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/test-LwIP-netconn/scpi_server.c 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/test-interactive/main.c 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/test-parser/main.c 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/test-tcp-srq/main.c 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/test-tcp/main.c 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/inc/scpi/parser.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/inc/scpi/types.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/inc/scpi/utils.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/expression.c 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/lexer.c 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/parser.c 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/src/utils.c 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/test/test_parser.c 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libscpi/test/test_scpi_utils.c 298 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
examples/common/scpi-def.c
@@ -43,16 +43,16 @@
static scpi_result_t DMM_MeasureVoltageDcQ(scpi_t * context) {
    scpi_number_t param1, param2;
    char bf[15];
    fprintf(stderr, "meas:volt:dc\r\n"); // debug command name
    fprintf(stderr, "meas:volt:dc\r\n"); /* debug command name */
    // read first parameter if present
    /* read first parameter if present */
    if (!SCPI_ParamNumber(context, scpi_special_numbers_def, &param1, FALSE)) {
        // do something, if parameter not present
        /* do something, if parameter not present */
    }
    // read second paraeter if present
    /* read second paraeter if present */
    if (!SCPI_ParamNumber(context, scpi_special_numbers_def, &param2, FALSE)) {
        // do something, if parameter not present
        /* do something, if parameter not present */
    }
@@ -71,16 +71,16 @@
static scpi_result_t DMM_MeasureVoltageAcQ(scpi_t * context) {
    scpi_number_t param1, param2;
    char bf[15];
    fprintf(stderr, "meas:volt:ac\r\n"); // debug command name
    fprintf(stderr, "meas:volt:ac\r\n"); /* debug command name */
    // read first parameter if present
    /* read first parameter if present */
    if (!SCPI_ParamNumber(context, scpi_special_numbers_def, &param1, FALSE)) {
        // do something, if parameter not present
        /* do something, if parameter not present */
    }
    // read second paraeter if present
    /* read second paraeter if present */
    if (!SCPI_ParamNumber(context, scpi_special_numbers_def, &param2, FALSE)) {
        // do something, if parameter not present
        /* do something, if parameter not present */
    }
@@ -98,16 +98,16 @@
static scpi_result_t DMM_ConfigureVoltageDc(scpi_t * context) {
    double param1, param2;
    fprintf(stderr, "conf:volt:dc\r\n"); // debug command name
    fprintf(stderr, "conf:volt:dc\r\n"); /* debug command name */
    // read first parameter if present
    /* read first parameter if present */
    if (!SCPI_ParamDouble(context, &param1, TRUE)) {
        return SCPI_RES_ERR;
    }
    // read second paraeter if present
    /* read second paraeter if present */
    if (!SCPI_ParamDouble(context, &param2, FALSE)) {
        // do something, if parameter not present
        /* do something, if parameter not present */
    }
    fprintf(stderr, "\tP1=%lf\r\n", param1);
@@ -118,9 +118,9 @@
static scpi_result_t TEST_Bool(scpi_t * context) {
    scpi_bool_t param1;
    fprintf(stderr, "TEST:BOOL\r\n"); // debug command name
    fprintf(stderr, "TEST:BOOL\r\n"); /* debug command name */
    // read first parameter if present
    /* read first parameter if present */
    if (!SCPI_ParamBool(context, &param1, TRUE)) {
        return SCPI_RES_ERR;
    }
@@ -207,15 +207,15 @@
 */
static scpi_result_t TEST_Chanlst(scpi_t *context) {
    scpi_parameter_t channel_list_param;
#define MAXROW 2    //maximum number of rows
#define MAXCOL 6    //maximum number of columns
#define MAXDIM 2    //maximum number of dimensions
    scpi_channel_value_t array[MAXROW * MAXCOL]; //array which holds values in order (2D)
    size_t chanlst_idx; //index for channel list
    size_t arr_idx = 0; //index for array
    size_t n, m = 1; //counters for row (n) and columns (m)
#define MAXROW 2    /* maximum number of rows */
#define MAXCOL 6    /* maximum number of columns */
#define MAXDIM 2    /* maximum number of dimensions */
    scpi_channel_value_t array[MAXROW * MAXCOL]; /* array which holds values in order (2D) */
    size_t chanlst_idx; /* index for channel list */
    size_t arr_idx = 0; /* index for array */
    size_t n, m = 1; /* counters for row (n) and columns (m) */
    // get channel list
    /* get channel list */
    if (SCPI_Parameter(context, &channel_list_param, TRUE)) {
        scpi_expr_result_t res;
        scpi_bool_t is_range;
@@ -223,65 +223,65 @@
        int32_t values_to[MAXDIM];
        size_t dimensions;
        bool for_stop_row = false; //true if iteration for rows has to stop
        bool for_stop_col = false; //true if iteration for columns has to stop
        int32_t dir_row = 1; //direction of counter for rows, +/-1
        int32_t dir_col = 1; //direction of counter for columns, +/-1
        bool for_stop_row = false; /* true if iteration for rows has to stop */
        bool for_stop_col = false; /* true if iteration for columns has to stop */
        int32_t dir_row = 1; /* direction of counter for rows, +/-1 */
        int32_t dir_col = 1; /* direction of counter for columns, +/-1 */
        // the next statement is valid usage and it gets only real number of dimensions for the first item (index 0)
        /* the next statement is valid usage and it gets only real number of dimensions for the first item (index 0) */
        if (!SCPI_ExprChannelListEntry(context, &channel_list_param, 0, &is_range, NULL, NULL, 0, &dimensions)) {
            chanlst_idx = 0; //call first index
            arr_idx = 0; //set arr_idx to 0
            do { //if valid, iterate over channel_list_param index while res == valid (do-while cause we have to do it once)
            chanlst_idx = 0; /* call first index */
            arr_idx = 0; /* set arr_idx to 0 */
            do { /* if valid, iterate over channel_list_param index while res == valid (do-while cause we have to do it once) */
                res = SCPI_ExprChannelListEntry(context, &channel_list_param, chanlst_idx, &is_range, values_from, values_to, 4, &dimensions);
                if (is_range == false) { //still can have multiple dimensions
                if (is_range == false) { /* still can have multiple dimensions */
                    if (dimensions == 1) {
                        //here we have our values
                        //row == values_from[0]
                        //col == 0 (fixed number)
                        //call a function or something
                        /* here we have our values
                         * row == values_from[0]
                         * col == 0 (fixed number)
                         * call a function or something */
                        array[arr_idx].row = values_from[0];
                        array[arr_idx].col = 0;
                    } else if (dimensions == 2) {
                        //here we have our values
                        //row == values_fom[0]
                        //col == values_from[1]
                        //call a function or something
                        /* here we have our values
                         * row == values_fom[0]
                         * col == values_from[1]
                         * call a function or something */
                        array[arr_idx].row = values_from[0];
                        array[arr_idx].col = values_from[1];
                    } else {
                        return SCPI_RES_ERR;
                    }
                    arr_idx++; //inkrement array where we want to save our values to, not neccessary otherwise
                    arr_idx++; /* inkrement array where we want to save our values to, not neccessary otherwise */
                    if (arr_idx >= MAXROW * MAXCOL) {
                        return SCPI_RES_ERR;
                    }
                } else if (is_range == true) {
                    if (values_from[0] > values_to[0]) {
                        dir_row = -1; //we have to decrement from values_from
                    } else { //if (values_from[0] < values_to[0])
                        dir_row = +1; //default, we increment from values_from
                        dir_row = -1; /* we have to decrement from values_from */
                    } else { /* if (values_from[0] < values_to[0]) */
                        dir_row = +1; /* default, we increment from values_from */
                    }
                    //iterating over rows, do it once -> set for_stop_row = false
                    //needed if there is channel list index isn't at end yet
                    /* iterating over rows, do it once -> set for_stop_row = false
                     * needed if there is channel list index isn't at end yet */
                    for_stop_row = false;
                    for (n = values_from[0]; for_stop_row == false; n += dir_row) {
                        //usual case for ranges, 2 dimensions
                        /* usual case for ranges, 2 dimensions */
                        if (dimensions == 2) {
                            if (values_from[1] > values_to[1]) {
                                dir_col = -1;
                            } else if (values_from[1] < values_to[1]) {
                                dir_col = +1;
                            }
                            //iterating over columns, do it at least once -> set for_stop_col = false
                            //needed if there is channel list index isn't at end yet
                            /* iterating over columns, do it at least once -> set for_stop_col = false
                             * needed if there is channel list index isn't at end yet */
                            for_stop_col = false;
                            for (m = values_from[1]; for_stop_col == false; m += dir_col) {
                                //here we have our values
                                //row == n
                                //col == m
                                //call a function or something
                                /* here we have our values
                                 * row == n
                                 * col == m
                                 * call a function or something */
                                array[arr_idx].row = n;
                                array[arr_idx].col = m;
                                arr_idx++;
@@ -289,16 +289,16 @@
                                    return SCPI_RES_ERR;
                                }
                                if (m == (size_t)values_to[1]) {
                                    //endpoint reached, stop column for-loop
                                    /* endpoint reached, stop column for-loop */
                                    for_stop_col = true;
                                }
                            }
                            //special case for range, example: (@2!1)
                            /* special case for range, example: (@2!1) */
                        } else if (dimensions == 1) {
                            //here we have values
                            //row == n
                            //col == 0 (fixed number)
                            //call function or sth.
                            /* here we have values
                             * row == n
                             * col == 0 (fixed number)
                             * call function or sth. */
                            array[arr_idx].row = n;
                            array[arr_idx].col = 0;
                            arr_idx++;
@@ -307,7 +307,7 @@
                            }
                        }
                        if (n == (size_t)values_to[0]) {
                            //endpoint reached, stop row for-loop
                            /* endpoint reached, stop row for-loop */
                            for_stop_row = true;
                        }
                    }
@@ -316,14 +316,14 @@
                } else {
                    return SCPI_RES_ERR;
                }
                //increase index
                /* increase index */
                chanlst_idx++;
            } while (SCPI_EXPR_OK == SCPI_ExprChannelListEntry(context, &channel_list_param, chanlst_idx, &is_range, values_from, values_to, 4, &dimensions));
            //while checks, whether incremented index is valid
            /* while checks, whether incremented index is valid */
        }
        //do something at the end if needed
        //array[arr_idx].row = 0;
        //array[arr_idx].col = 0;
        /* do something at the end if needed */
        /* array[arr_idx].row = 0; */
        /* array[arr_idx].col = 0; */
    }
    {
@@ -373,14 +373,14 @@
    {.pattern = "SYSTem:ERRor:COUNt?", .callback = SCPI_SystemErrorCountQ,},
    {.pattern = "SYSTem:VERSion?", .callback = SCPI_SystemVersionQ,},
    //{.pattern = "STATus:OPERation?", .callback = scpi_stub_callback,},
    //{.pattern = "STATus:OPERation:EVENt?", .callback = scpi_stub_callback,},
    //{.pattern = "STATus:OPERation:CONDition?", .callback = scpi_stub_callback,},
    //{.pattern = "STATus:OPERation:ENABle", .callback = scpi_stub_callback,},
    //{.pattern = "STATus:OPERation:ENABle?", .callback = scpi_stub_callback,},
    /* {.pattern = "STATus:OPERation?", .callback = scpi_stub_callback,}, */
    /* {.pattern = "STATus:OPERation:EVENt?", .callback = scpi_stub_callback,}, */
    /* {.pattern = "STATus:OPERation:CONDition?", .callback = scpi_stub_callback,}, */
    /* {.pattern = "STATus:OPERation:ENABle", .callback = scpi_stub_callback,}, */
    /* {.pattern = "STATus:OPERation:ENABle?", .callback = scpi_stub_callback,}, */
    {.pattern = "STATus:QUEStionable[:EVENt]?", .callback = SCPI_StatusQuestionableEventQ,},
    //{.pattern = "STATus:QUEStionable:CONDition?", .callback = scpi_stub_callback,},
    /* {.pattern = "STATus:QUEStionable:CONDition?", .callback = scpi_stub_callback,}, */
    {.pattern = "STATus:QUEStionable:ENABle", .callback = SCPI_StatusQuestionableEnable,},
    {.pattern = "STATus:QUEStionable:ENABle?", .callback = SCPI_StatusQuestionableEnableQ,},
examples/common/scpi-def.h
@@ -25,5 +25,5 @@
scpi_result_t SCPI_SystemCommTcpipControlQ(scpi_t * context);
#endif // __SCPI_DEF_H_
#endif /* __SCPI_DEF_H_ */
examples/test-CVI_w_GUI/main.c
@@ -83,7 +83,7 @@
                buf[len] = '\0';
                break;
            default:
                len = 0; // stop loop
                len = 0; /* stop loop */
                break;
        }
    }
@@ -113,19 +113,19 @@
size_t SCPI_Write(scpi_t * context, const char * data, size_t len) {
    if ((SCPI_outputBuffer_idx + len) > (SCPI_OUPUT_BUFFER_SIZE - 1)) {
        len = (SCPI_OUPUT_BUFFER_SIZE - 1) - SCPI_outputBuffer_idx; // limit length to left over space
        // apparently there is no mechanism to cope with buffers that are too small
        len = (SCPI_OUPUT_BUFFER_SIZE - 1) - SCPI_outputBuffer_idx; /* limit length to left over space */
        /* apparently there is no mechanism to cope with buffers that are too small */
    }
    memcpy(&SCPI_outputBuffer[SCPI_outputBuffer_idx], data, len);
    SCPI_outputBuffer_idx += len;
    SCPI_outputBuffer[SCPI_outputBuffer_idx] = '\0';
    // return fwrite(data, 1, len, stdout);
    /* return fwrite(data, 1, len, stdout); */
    return len;
}
scpi_result_t SCPI_Flush(scpi_t * context) {
    // fwrite(SCPI_outputBuffer, 1, SCPI_outputBuffer_idx, stdout);
    /* fwrite(SCPI_outputBuffer, 1, SCPI_outputBuffer_idx, stdout); */
    removeTrailingEndcodes(SCPI_outputBuffer);
    InsertTextBoxLine(panelHandle, PANEL_OUTPUT, -1, SCPI_outputBuffer);
    SCPI_outputBuffer_idx = 0;
@@ -135,7 +135,7 @@
int SCPI_Error(scpi_t * context, int_fast16_t err) {
    char buf[512];
    //  fprintf(stderr, "**ERROR: %d, \"%s\"\r\n", (int16_t) err, SCPI_ErrorTranslate(err));
    /*  fprintf(stderr, "**ERROR: %d, \"%s\"\r\n", (int16_t) err, SCPI_ErrorTranslate(err)); */
    sprintf(buf, "**ERROR: %d, \"%s\"", (int16_t) err, SCPI_ErrorTranslate(err));
    InsertTextBoxLine(panelHandle, PANEL_OUTPUTERR, -1, buf);
    return 0;
@@ -143,7 +143,7 @@
scpi_result_t SCPI_Control(scpi_t * context, scpi_ctrl_name_t ctrl, scpi_reg_val_t val) {
    if (SCPI_CTRL_SRQ == ctrl) {
        //  fprintf(stderr, "**SRQ: 0x%X (%d)\r\n", val, val);
        /*  fprintf(stderr, "**SRQ: 0x%X (%d)\r\n", val, val); */
        SetCtrlVal(panelHandle, PANEL_LEDSRQ, 1);
    } else {
        fprintf(stderr, "**CTRL %02x: 0x%X (%d)\r\n", ctrl, val, val);
@@ -153,7 +153,7 @@
scpi_result_t SCPI_Reset(scpi_t * context) {
    char buf[256];
    //  fprintf(stderr, "**Reset\r\n");
    /*  fprintf(stderr, "**Reset\r\n"); */
    sprintf(buf, "**Reset\r\n");
    debug_output(buf);
    return SCPI_RES_OK;
examples/test-LwIP-netconn/scpi_server.c
@@ -69,8 +69,8 @@
    struct netconn *io;
    struct netconn *control_io;
    xQueueHandle evtQueue;
    //FILE * fio;
    //fd_set fds;
    /* FILE * fio; */
    /* fd_set fds; */
} user_data_t;
struct _queue_event_t {
@@ -112,7 +112,7 @@
int SCPI_Error(scpi_t * context, int_fast16_t err) {
    (void) context;
    // BEEP
    /* BEEP */
    iprintf("**ERROR: %ld, \"%s\"\r\n", (int32_t) err, SCPI_ErrorTranslate(err));
    if (err != 0) {
        /* New error */
@@ -237,11 +237,11 @@
    if (netconn_accept(user_data->io_listen, &newconn) == ERR_OK) {
        if (user_data->io) {
            // Close unwanted connection
            /* Close unwanted connection */
            netconn_close(newconn);
            netconn_delete(newconn);
        } else {
            // connection established
            /* connection established */
            iprintf("***Connection established %s\r\n", inet_ntoa(newconn->pcb.ip->remote_ip));
            user_data->io = newconn;
        }
@@ -258,7 +258,7 @@
            netconn_close(newconn);
            netconn_delete(newconn);
        } else {
            // control connection established
            /* control connection established */
            iprintf("***Control Connection established %s\r\n", inet_ntoa(newconn->pcb.ip->remote_ip));
            user_data->control_io = newconn;
        }
@@ -268,7 +268,7 @@
}
static void closeIo(user_data_t * user_data) {
    // connection closed
    /* connection closed */
    netconn_close(user_data->io);
    netconn_delete(user_data->io);
    user_data->io = NULL;
@@ -276,7 +276,7 @@
}
static void closeSrqIo(user_data_t * user_data) {
    // control connection closed
    /* control connection closed */
    netconn_close(user_data->control_io);
    netconn_delete(user_data->control_io);
    user_data->control_io = NULL;
@@ -300,7 +300,7 @@
    if (buflen > 0) {
        SCPI_Input(&scpi_context, buf, buflen);
    } else {
        //goto fail2;
        /* goto fail2; */
    }
    netbuf_delete(inbuf);
@@ -330,9 +330,9 @@
    netbuf_data(inbuf, (void**) &buf, &buflen);
    if (buflen > 0) {
        // TODO process control
        /* TODO process control */
    } else {
        //goto fail2;
        /* goto fail2; */
    }
    netbuf_delete(inbuf);
@@ -357,7 +357,7 @@
    user_data.evtQueue = xQueueCreate(10, sizeof (queue_event_t));
    // user_context will be pointer to socket
    /* user_context will be pointer to socket */
    SCPI_Init(&scpi_context,
            scpi_commands,
            &scpi_interface,
@@ -374,7 +374,7 @@
    while (1) {
        waitServer(&user_data, &evt);
        if (evt.cmd == SCPI_MSG_TIMEOUT) { // timeout
        if (evt.cmd == SCPI_MSG_TIMEOUT) { /* timeout */
            SCPI_Input(&scpi_context, NULL, 0);
        }
examples/test-interactive/main.c
@@ -96,7 +96,7 @@
            scpi_input_buffer, SCPI_INPUT_BUFFER_LENGTH,
            scpi_error_queue_data, SCPI_ERROR_QUEUE_SIZE);
    //printf("%.*s %s\r\n",  3, "asdadasdasdasdas", "b");
    /* printf("%.*s %s\r\n",  3, "asdadasdasdasdas", "b"); */
    printf("SCPI Interactive demo\r\n");
    char smbuffer[10];
    while (1) {
examples/test-parser/main.c
@@ -107,14 +107,14 @@
    TEST_SCPI_INPUT("SYST:VERS?");
    TEST_SCPI_INPUT("\r\n*ID");
    TEST_SCPI_INPUT("N?");
    TEST_SCPI_INPUT(""); // emulate command timeout
    TEST_SCPI_INPUT(""); /* emulate command timeout */
    TEST_SCPI_INPUT("*ESE\r\n"); // cause error -109, missing parameter
    TEST_SCPI_INPUT("*ESE\r\n"); /* cause error -109, missing parameter */
    TEST_SCPI_INPUT("*ESE #H20\r\n");
    TEST_SCPI_INPUT("*SRE #HFF\r\n");
    TEST_SCPI_INPUT("IDN?\r\n"); // cause error -113, undefined header
    TEST_SCPI_INPUT("IDN?\r\n"); /* cause error -113, undefined header */
    TEST_SCPI_INPUT("SYST:ERR?\r\n");
    TEST_SCPI_INPUT("SYST:ERR?\r\n");
@@ -132,13 +132,14 @@
    TEST_SCPI_INPUT("test:text 'aa a'\r\n");
    TEST_SCPI_INPUT("test:text 'aaa aaaa'\r\n");
    TEST_SCPI_INPUT("TEST:CHANnellist (@9!2:3!4,5!6)\r\n");
    //printf("%.*s %s\r\n",  3, "asdadasdasdasdas", "b");
    // interactive demo
    //char smbuffer[10];
    //while (1) {
    //     fgets(smbuffer, 10, stdin);
    //     SCPI_Input(&scpi_context, smbuffer, strlen(smbuffer));
    //}
    /* printf("%.*s %s\r\n",  3, "asdadasdasdasdas", "b");
     * interactive demo
     * char smbuffer[10];
     * while (1) {
     *     fgets(smbuffer, 10, stdin);
     *     SCPI_Input(&scpi_context, smbuffer, strlen(smbuffer));
     * }
     */
    return (EXIT_SUCCESS);
examples/test-tcp-srq/main.c
@@ -82,7 +82,7 @@
int SCPI_Error(scpi_t * context, int_fast16_t err) {
    (void) context;
    // BEEP
    /* BEEP */
    fprintf(stderr, "**ERROR: %d, \"%s\"\r\n", (int16_t) err, SCPI_ErrorTranslate(err));
    return 0;
}
@@ -263,7 +263,7 @@
        closeSrqIo(user_data);
        printf("Control Connection closed\r\n");
    } else {
        // nothing to do
        /* nothing to do */
    }
}
@@ -294,7 +294,7 @@
    };
#endif
    // user_context will be pointer to socket
    /* user_context will be pointer to socket */
    SCPI_Init(&scpi_context,
            scpi_commands,
            &scpi_interface,
@@ -310,12 +310,12 @@
    while (1) {
        rc = waitServer(&user_data);
        if (rc < 0) { // failed
        if (rc < 0) { /* failed */
            perror("select failed");
            exit(-1);
        }
        if (rc == 0) { // timeout
        if (rc == 0) { /* timeout */
            SCPI_Input(&scpi_context, NULL, 0);
        }
examples/test-tcp/main.c
@@ -67,7 +67,7 @@
int SCPI_Error(scpi_t * context, int_fast16_t err) {
    (void) context;
    // BEEP
    /* BEEP */
    fprintf(stderr, "**ERROR: %d, \"%s\"\r\n", (int16_t) err, SCPI_ErrorTranslate(err));
    return 0;
}
@@ -179,7 +179,7 @@
    int listenfd;
    char smbuffer[10];
    // user_context will be pointer to socket
    /* user_context will be pointer to socket */
    scpi_context.user_context = NULL;
    SCPI_Init(&scpi_context,
@@ -208,14 +208,14 @@
        while (1) {
            rc = waitServer(clifd);
            if (rc < 0) { // failed
            if (rc < 0) { /* failed */
                perror("  recv() failed");
                break;
            }
            if (rc == 0) { // timeout
            if (rc == 0) { /* timeout */
                SCPI_Input(&scpi_context, NULL, 0);
            }
            if (rc > 0) { // something to read
            if (rc > 0) { /* something to read */
                rc = recv(clifd, smbuffer, sizeof (smbuffer), 0);
                if (rc < 0) {
                    if (errno != EWOULDBLOCK) {
libscpi/inc/scpi/parser.h
@@ -132,7 +132,7 @@
    scpi_bool_t SCPI_CommandNumbers(scpi_t * context, int32_t * numbers, size_t len, int32_t default_value);
#if USE_DEPRECATED_FUNCTIONS
    // deprecated finction, should be removed later
    /* deprecated finction, should be removed later */
#define SCPI_ResultIntBase(context, val, base) SCPI_ResultInt32Base ((context), (val), (base), TRUE)
#define SCPI_ResultInt(context, val) SCPI_ResultInt32 ((context), (val))
#define SCPI_ParamToInt(context, parameter, value) SCPI_ParamToInt32((context), (parameter), (value))
libscpi/inc/scpi/types.h
@@ -203,7 +203,7 @@
    struct _scpi_error_info_heap_t {
        size_t wr;
        //size_t rd;
        /* size_t rd; */
        size_t count;
        size_t size;
        char * data;
libscpi/inc/scpi/utils.h
@@ -50,7 +50,7 @@
    size_t SCPI_FloatToStr(float val, char * str, size_t len);
    size_t SCPI_DoubleToStr(double val, char * str, size_t len);
    // deprecated finction, should be removed later
    /* deprecated finction, should be removed later */
#define SCPI_LongToStr(val, str, len, base) SCPI_Int32ToStr((val), (str), (len), (base), TRUE)
#ifdef    __cplusplus
libscpi/src/expression.c
@@ -207,7 +207,7 @@
    if (i == 0) {
        return SCPI_EXPR_NO_MORE;
    } else {
        // there was at least one number followed by !, but after ! was not another number
        /* there was at least one number followed by !, but after ! was not another number */
        return SCPI_EXPR_ERROR;
    }
}
@@ -283,7 +283,7 @@
    lex.pos = lex.buffer;
    lex.len = param->len - 2;
    // detect channel list expression
    /* detect channel list expression */
    if (!scpiLex_SpecificCharacter(&lex, &token, '@')) {
        SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR);
        return SCPI_EXPR_ERROR;
libscpi/src/lexer.c
@@ -160,7 +160,7 @@
/* skip characters */
/* 7.4.1 <PROGRAM MESSAGE UNIT SEPARATOR>*/
// TODO: static int skipProgramMessageUnitSeparator(lex_state_t * state)
/* TODO: static int skipProgramMessageUnitSeparator(lex_state_t * state) */
/**
 * Skip all whitespaces
@@ -178,10 +178,10 @@
}
/* 7.4.2 <PROGRAM DATA SEPARATOR> */
// static int skipProgramDataSeparator(lex_state_t * state)
/* static int skipProgramDataSeparator(lex_state_t * state) */
/* 7.5.2 <PROGRAM MESSAGE TERMINATOR> */
// static int skipProgramMessageTerminator(lex_state_t * state)
/* static int skipProgramMessageTerminator(lex_state_t * state) */
/**
 * Skip decimal digit
@@ -535,7 +535,7 @@
    skipChr(state, '/');
    // TODO: strict parsing  : SLASH? (ALPHA+ (MINUS? DIGIT)?) ((SLASH | DOT) (ALPHA+ (MINUS? DIGIT)?))*
    /* TODO: strict parsing  : SLASH? (ALPHA+ (MINUS? DIGIT)?) ((SLASH | DOT) (ALPHA+ (MINUS? DIGIT)?))* */
    if (skipAlpha(state)) {
        skipChr(state, '-');
        skipDigit(state);
@@ -615,7 +615,7 @@
    }
    if (someNumbers) {
        token->ptr += 2; // ignore number prefix
        token->ptr += 2; /* ignore number prefix */
        token->len = state->pos - token->ptr;
    } else {
        token->type = SCPI_TOKEN_UNKNOWN;
@@ -692,8 +692,8 @@
    token->len = state->pos - token->ptr;
    if ((token->len > 0)) {
        //token->ptr++;
        //token->len -= 2;
        /* token->ptr++;
         * token->len -= 2; */
    } else {
        token->type = SCPI_TOKEN_UNKNOWN;
        state->pos = token->ptr;
@@ -755,15 +755,15 @@
    }
    if (validData == 1) {
        // valid
        /* valid */
        token->type = SCPI_TOKEN_ARBITRARY_BLOCK_PROGRAM_DATA;
    } else if (validData == 0) {
        // incomplete
        /* incomplete */
        token->type = SCPI_TOKEN_UNKNOWN;
        token->len = 0;
        state->pos = state->buffer + state->len;
    } else {
        // invalid
        /* invalid */
        token->type = SCPI_TOKEN_UNKNOWN;
        state->pos = token->ptr;
        token->len = 0;
@@ -794,7 +794,7 @@
    }
}
// TODO: 7.7.7.2-2 recursive - any program data
/* TODO: 7.7.7.2-2 recursive - any program data */
/**
 * Detect token Expression
libscpi/src/parser.c
@@ -699,7 +699,7 @@
        if (mandatory) {
            SCPI_ErrorPush(context, SCPI_ERROR_MISSING_PARAMETER);
        } else {
            parameter->type = SCPI_TOKEN_PROGRAM_MNEMONIC; // TODO: select something different
            parameter->type = SCPI_TOKEN_PROGRAM_MNEMONIC; /* TODO: select something different */
        }
        return FALSE;
    }
@@ -1134,7 +1134,7 @@
                break;
        }
        // TODO: return also parameter type (ProgramMnemonic, ArbitraryBlockProgramData, SingleQuoteProgramData, DoubleQuoteProgramData
        /* TODO: return also parameter type (ProgramMnemonic, ArbitraryBlockProgramData, SingleQuoteProgramData, DoubleQuoteProgramData */
    }
    return result;
libscpi/src/utils.c
@@ -108,13 +108,13 @@
                break;
        }
        // add sign for numbers in base 10
        /* add sign for numbers in base 10 */
        if (sign && ((int32_t) val < 0) && (base == 10)) {
            uval = -val;
            ADD_CHAR('-');
        }
        // remove leading zeros
        /* remove leading zeros */
        while ((uval / x) == 0) {
            x /= base;
        }
@@ -194,13 +194,13 @@
                break;
        }
        // add sign for numbers in base 10
        /* add sign for numbers in base 10 */
        if (sign && ((int64_t) val < 0) && (base == 10)) {
            uval = -val;
            ADD_CHAR('-');
        }
        // remove leading zeros
        /* remove leading zeros */
        while ((uval / x) == 0) {
            x /= base;
        }
@@ -378,7 +378,7 @@
        if (num) {
            if (len1 == len2) {
                //*num = 1;
                /* *num = 1; */
            } else {
                int32_t tmpNum;
                i = len1 + strBaseToInt32(str2 + len1, &tmpNum, 10);
@@ -530,11 +530,11 @@
    }
    /* now support optional keywords in pattern style, e.g. [:MEASure]:VOLTage:DC? */
    if (pattern_ptr[0] == '[') { // skip first '['
    if (pattern_ptr[0] == '[') { /* skip first '[' */
        SKIP_PATTERN(1);
        brackets++;
    }
    if (pattern_ptr[0] == ':') { // skip first ':'
    if (pattern_ptr[0] == ':') { /* skip first ':' */
        SKIP_PATTERN(1);
    }
@@ -557,7 +557,7 @@
        if ((pattern_sep_pos > 0) && pattern_ptr[pattern_sep_pos - 1] == '#') {
            if (numbers && (numbers_idx < numbers_len)) {
                number_ptr = numbers + numbers_idx;
                *number_ptr = default_value; // default value
                *number_ptr = default_value; /* default value */
            } else {
                number_ptr = NULL;
            }
@@ -584,7 +584,7 @@
            /* command complete, but pattern not */
            if (cmd_len == 0) {
                // verify all subsequent pattern parts are also optional
                /* verify all subsequent pattern parts are also optional */
                while (pattern_len) {
                    pattern_sep_pos = patternSeparatorPos(pattern_ptr, pattern_len);
                    switch (pattern_ptr[pattern_sep_pos]) {
@@ -622,14 +622,14 @@
                    && (pattern_ptr[1] == cmd_ptr[0])
                    && (pattern_ptr[0] == '[')
                    && (pattern_ptr[1] == ':')) {
                SKIP_PATTERN(2); // for skip '[' in "[:"
                SKIP_PATTERN(2); /* for skip '[' in "[:" */
                SKIP_CMD(1);
                brackets++;
            } else if ((pattern_len > 1)
                    && (pattern_ptr[1] == cmd_ptr[0])
                    && (pattern_ptr[0] == ']')
                    && (pattern_ptr[1] == ':')) {
                SKIP_PATTERN(2); // for skip ']' in "]:"
                SKIP_PATTERN(2); /* for skip ']' in "]:" */
                SKIP_CMD(1);
                brackets--;
            } else if ((pattern_len > 2)
@@ -637,10 +637,10 @@
                    && (pattern_ptr[0] == ']')
                    && (pattern_ptr[1] == '[')
                    && (pattern_ptr[2] == ':')) {
                SKIP_PATTERN(3); // for skip '][' in "][:"
                SKIP_PATTERN(3); /* for skip '][' in "][:" */
                SKIP_CMD(1);
                //brackets++;
                //brackets--;
                /* brackets++; */
                /* brackets--; */
            } else {
                result = FALSE;
                break;
@@ -648,14 +648,14 @@
        } else {
            SKIP_PATTERN(pattern_sep_pos);
            if ((pattern_ptr[0] == ']') && (pattern_ptr[1] == ':')) {
                SKIP_PATTERN(2); // for skip ']' in "]:" , pattern_ptr continue, while cmd_ptr remain unchanged
                SKIP_PATTERN(2); /* for skip ']' in "]:" , pattern_ptr continue, while cmd_ptr remain unchanged */
                brackets--;
            } else if ((pattern_len > 2) && (pattern_ptr[0] == ']')
                    && (pattern_ptr[1] == '[')
                    && (pattern_ptr[2] == ':')) {
                SKIP_PATTERN(3); // for skip ']' in "][:" , pattern_ptr continue, while cmd_ptr remain unchanged
                //brackets++;
                //brackets--;
                SKIP_PATTERN(3); /* for skip ']' in "][:" , pattern_ptr continue, while cmd_ptr remain unchanged */
                /* brackets++; */
                /* brackets--; */
            } else {
                result = FALSE;
                break;
@@ -790,7 +790,7 @@
        return NULL;
    }
    size_t len = SCPIDEFINE_strnlen(s, n) + 1; // additional '\0' at end
    size_t len = SCPIDEFINE_strnlen(s, n) + 1; /* additional '\0' at end */
    if (len > heap->count) {
        return NULL;
    }
@@ -810,7 +810,7 @@
    heap->wr += len;
    heap->count -= len;
    // ensure '\0' a the end
    /* ensure '\0' a the end */
    if (heap->wr > 0) {
        heap->data[heap->wr - 1] = '\0';
    } else {
@@ -891,34 +891,36 @@
#endif
// Floating point to string conversion routines
//
// Copyright (C) 2002 Michael Ringgaard. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. Neither the name of the project nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
/*
 * Floating point to string conversion routines
 *
 * Copyright (C) 2002 Michael Ringgaard. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the project nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
static char *scpi_ecvt(double arg, int ndigits, int *decpt, int *sign, char *buf, size_t bufsize) {
    int r1, r2;
libscpi/test/test_parser.c
@@ -282,11 +282,12 @@
    // TODO: SCPI_ERROR_INVALID_SEPARATOR
    // TODO: SCPI_ERROR_INVALID_SUFFIX
    // TODO: SCPI_ERROR_SUFFIX_NOT_ALLOWED
    // TODO: SCPI_ERROR_EXECUTION_ERROR
    // TODO: SCPI_ERROR_ILLEGAL_PARAMETER_VALUE
    /* TODO: SCPI_ERROR_INVALID_SEPARATOR
     * TODO: SCPI_ERROR_INVALID_SUFFIX
     * TODO: SCPI_ERROR_SUFFIX_NOT_ALLOWED
     * TODO: SCPI_ERROR_EXECUTION_ERROR
     * TODO: SCPI_ERROR_ILLEGAL_PARAMETER_VALUE
     */
    output_buffer_clear();
    error_buffer_clear();
@@ -471,17 +472,17 @@
static void testSCPI_ParamInt32(void) {
    TEST_ParamInt32("10", TRUE, 10, TRUE, 0);
    TEST_ParamInt32("", FALSE, 0, FALSE, 0);
    TEST_ParamInt32("10.5", TRUE, 10, TRUE, 0); // TODO: should be FALSE, -104
    TEST_ParamInt32("10.5", TRUE, 10, TRUE, 0); /* TODO: should be FALSE, -104 */
    TEST_ParamInt32("#B101010", TRUE, 42, TRUE, 0);
    TEST_ParamInt32("#H101010", TRUE, 1052688, TRUE, 0);
    TEST_ParamInt32("#Q10", TRUE, 8, TRUE, 0);
    TEST_ParamInt32("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); // missing parameter
    TEST_ParamInt32("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); // Data type error
    TEST_ParamInt32("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); /* missing parameter */
    TEST_ParamInt32("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); /* Data type error */
    TEST_ParamInt32("10.5V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    TEST_ParamInt32("10V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    // test range
    /* test range */
    TEST_ParamInt32("2147483647", TRUE, 2147483647, TRUE, 0);
    TEST_ParamInt32("-2147483647", TRUE, -2147483647, TRUE, 0);
}
@@ -510,17 +511,17 @@
static void testSCPI_ParamUInt32(void) {
    TEST_ParamUInt32("10", TRUE, 10, TRUE, 0);
    TEST_ParamUInt32("", FALSE, 0, FALSE, 0);
    TEST_ParamUInt32("10.5", TRUE, 10, TRUE, 0); // TODO: should be FALSE, -104
    TEST_ParamUInt32("10.5", TRUE, 10, TRUE, 0); /* TODO: should be FALSE, -104 */
    TEST_ParamUInt32("#B101010", TRUE, 42, TRUE, 0);
    TEST_ParamUInt32("#H101010", TRUE, 1052688, TRUE, 0);
    TEST_ParamUInt32("#Q10", TRUE, 8, TRUE, 0);
    TEST_ParamUInt32("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); // missing parameter
    TEST_ParamUInt32("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); // Data type error
    TEST_ParamUInt32("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); /* missing parameter *
    TEST_ParamUInt32("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); /* Data type error */
    TEST_ParamUInt32("10.5V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    TEST_ParamUInt32("10V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    // test range
    /* test range */
    TEST_ParamUInt32("2147483647", TRUE, 2147483647ULL, TRUE, 0);
    TEST_ParamUInt32("4294967295", TRUE, 4294967295ULL, TRUE, 0);
}
@@ -549,17 +550,17 @@
static void testSCPI_ParamInt64(void) {
    TEST_ParamInt64("10", TRUE, 10, TRUE, 0);
    TEST_ParamInt64("", FALSE, 0, FALSE, 0);
    TEST_ParamInt64("10.5", TRUE, 10, TRUE, 0); // TODO: should be FALSE, -104
    TEST_ParamInt64("10.5", TRUE, 10, TRUE, 0); /* TODO: should be FALSE, -104 */
    TEST_ParamInt64("#B101010", TRUE, 42, TRUE, 0);
    TEST_ParamInt64("#H101010", TRUE, 1052688, TRUE, 0);
    TEST_ParamInt64("#Q10", TRUE, 8, TRUE, 0);
    TEST_ParamInt64("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); // missing parameter
    TEST_ParamInt64("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); // Data type error
    TEST_ParamInt64("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); /* missing parameter */
    TEST_ParamInt64("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); /* Data type error */
    TEST_ParamInt64("10.5V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    TEST_ParamInt64("10V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    // test range
    /* test range */
    TEST_ParamInt64("2147483647", TRUE, 2147483647LL, TRUE, 0);
    TEST_ParamInt64("-2147483647", TRUE, -2147483647LL, TRUE, 0);
    TEST_ParamInt64("9223372036854775807", TRUE, 9223372036854775807LL, TRUE, 0);
@@ -590,17 +591,17 @@
static void testSCPI_ParamUInt64(void) {
    TEST_ParamUInt64("10", TRUE, 10, TRUE, 0);
    TEST_ParamUInt64("", FALSE, 0, FALSE, 0);
    TEST_ParamUInt64("10.5", TRUE, 10, TRUE, 0); // TODO: should be FALSE, -104
    TEST_ParamUInt64("10.5", TRUE, 10, TRUE, 0); /* TODO: should be FALSE, -104 */
    TEST_ParamUInt64("#B101010", TRUE, 42, TRUE, 0);
    TEST_ParamUInt64("#H101010", TRUE, 1052688, TRUE, 0);
    TEST_ParamUInt64("#Q10", TRUE, 8, TRUE, 0);
    TEST_ParamUInt64("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); // missing parameter
    TEST_ParamUInt64("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); // Data type error
    TEST_ParamUInt64("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); /* missing parameter */
    TEST_ParamUInt64("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); /* Data type error */
    TEST_ParamUInt64("10.5V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    TEST_ParamUInt64("10V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    // test range
    /* test range */
    TEST_ParamUInt64("2147483647", TRUE, 2147483647ULL, TRUE, 0);
    TEST_ParamUInt64("4294967295", TRUE, 4294967295ULL, TRUE, 0);
    TEST_ParamUInt64("9223372036854775807", TRUE, 9223372036854775807ULL, TRUE, 0);
@@ -638,8 +639,8 @@
    TEST_ParamFloat("#Q10", TRUE, 8, TRUE, 0);
    TEST_ParamFloat("#HFFFFFF", TRUE, 0xFFFFFFu, TRUE, 0);
    TEST_ParamFloat("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); // missing parameter
    TEST_ParamFloat("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); // Data type error
    TEST_ParamFloat("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); /* missing parameter */
    TEST_ParamFloat("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); /* Data type error */
    TEST_ParamFloat("10.5V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    TEST_ParamFloat("10V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
}
@@ -674,8 +675,8 @@
    TEST_ParamDouble("#Q10", TRUE, 8, TRUE, 0);
    TEST_ParamDouble("#HFFFFFFFF", TRUE, 0xFFFFFFFFu, TRUE, 0);
    TEST_ParamDouble("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); // missing parameter
    TEST_ParamDouble("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); // Data type error
    TEST_ParamDouble("", TRUE, 0, FALSE, SCPI_ERROR_MISSING_PARAMETER); /* missing parameter */
    TEST_ParamDouble("abcd", TRUE, 0, FALSE, SCPI_ERROR_DATA_TYPE_ERROR); /* Data type error */
    TEST_ParamDouble("10.5V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
    TEST_ParamDouble("10V", TRUE, 0, FALSE, SCPI_ERROR_SUFFIX_NOT_ALLOWED);
}
@@ -704,11 +705,11 @@
static void testSCPI_ParamCharacters(void) {
    TEST_ParamCharacters("10", TRUE, "10", TRUE, 0);
    TEST_ParamCharacters(" ABCD", TRUE, "ABCD", TRUE, 0); // TokProgramMnemonic
    TEST_ParamCharacters("\"ABCD\"", TRUE, "ABCD", TRUE, 0); // TokDoubleQuoteProgramData
    TEST_ParamCharacters("\'ABCD\'", TRUE, "ABCD", TRUE, 0); // TokSingleQuoteProgramData
    TEST_ParamCharacters("#204ABCD", TRUE, "ABCD", TRUE, 0); // TokArbitraryBlockProgramData
    TEST_ParamCharacters("#210ABCD", TRUE, "", FALSE, SCPI_ERROR_INVALID_STRING_DATA); // invalid Block Data
    TEST_ParamCharacters(" ABCD", TRUE, "ABCD", TRUE, 0); /* TokProgramMnemonic */
    TEST_ParamCharacters("\"ABCD\"", TRUE, "ABCD", TRUE, 0); /* TokDoubleQuoteProgramData */
    TEST_ParamCharacters("\'ABCD\'", TRUE, "ABCD", TRUE, 0); /* TokSingleQuoteProgramData */
    TEST_ParamCharacters("#204ABCD", TRUE, "ABCD", TRUE, 0); /* TokArbitraryBlockProgramData */
    TEST_ParamCharacters("#210ABCD", TRUE, "", FALSE, SCPI_ERROR_INVALID_STRING_DATA); /* invalid Block Data */
}
@@ -1123,7 +1124,7 @@
    TEST_Result(Int32, 10, "10");
    TEST_Result(Int32, -10, "-10");
    TEST_Result(Int32, 2147483647L, "2147483647");
    //TEST_Result(Int32, -2147483648L, "-2147483648"); // bug in GCC
    /* TEST_Result(Int32, -2147483648L, "-2147483648"); bug in GCC */
    TEST_Result(Int32, -2147483647L, "-2147483647");
}
@@ -1131,7 +1132,7 @@
    TEST_Result(UInt32, 10, "10");
    TEST_Result(UInt32, -10, "4294967286");
    TEST_Result(UInt32, 2147483647L, "2147483647");
    //TEST_Result(UInt32, -2147483648L, "2147483648"); // bug in GCC
    /* TEST_Result(UInt32, -2147483648L, "2147483648"); bug in GCC */
    TEST_Result(UInt32, -2147483647L, "2147483649");
    TEST_Result(UInt32, 4294967295UL, "4294967295");
@@ -1148,10 +1149,10 @@
    TEST_Result(Int64, 32767, "32767");
    TEST_Result(Int64, -32768, "-32768");
    TEST_Result(Int64, 2147483647L, "2147483647");
    //TEST_Result(Int64, -2147483648, "-2147483648"); // bug in gcc
    /* TEST_Result(Int64, -2147483648, "-2147483648"); bug in gcc */
    TEST_Result(Int64, -2147483647L, "-2147483647");
    TEST_Result(Int64, 9223372036854775807LL, "9223372036854775807");
    //TEST_Result(Int64, -9223372036854775808LL, "-9223372036854775808"); bug in GCC
    /* TEST_Result(Int64, -9223372036854775808LL, "-9223372036854775808"); bug in GCC */
    TEST_Result(Int64, -9223372036854775807LL, "-9223372036854775807");
}
@@ -1163,10 +1164,10 @@
    TEST_Result(UInt64, 32767, "32767");
    TEST_Result(UInt64, -32768, "18446744073709518848");
    TEST_Result(UInt64, 2147483647L, "2147483647");
    //TEST_Result(UInt64, -2147483648L, "18446744071562067968"); // bug in GCC
    /* TEST_Result(UInt64, -2147483648L, "18446744071562067968"); bug in GCC */
    TEST_Result(UInt64, -2147483647L, "18446744071562067969");
    TEST_Result(UInt64, 9223372036854775807LL, "9223372036854775807");
    //TEST_Result(Int64, -9223372036854775808LL, "9223372036854775808"); bug in GCC
    /* TEST_Result(Int64, -9223372036854775808LL, "9223372036854775808"); bug in GCC */
    TEST_Result(UInt64, -9223372036854775807LL, "9223372036854775809");
    TEST_Result(UInt64, 18446744073709551615ULL, "18446744073709551615");
@@ -1183,7 +1184,7 @@
    TEST_Result(Float, 32767, "32767");
    TEST_Result(Float, -32768, "-32768");
    TEST_Result(Float, 2147483647L, "2.14748e+09");
    //TEST_Result(Float, -2147483648, "-2.14748e+09"); // bug in GCC
    /* TEST_Result(Float, -2147483648, "-2.14748e+09"); bug in GCC */
    TEST_Result(Float, -2147483647L, "-2.14748e+09");
    TEST_Result(Float, 9223372036854775807LL, "9.22337e+18");
    TEST_Result(Float, -9223372036854775807LL, "-9.22337e+18");
@@ -1200,7 +1201,7 @@
    TEST_Result(Double, 32767, "32767");
    TEST_Result(Double, -32768, "-32768");
    TEST_Result(Double, 2147483647, "2147483647");
    //TEST_Result(Double, -2147483648, "-2147483648"); // bug in GCC
    /* TEST_Result(Double, -2147483648, "-2147483648"); bug in GCC */
    TEST_Result(Double, -2147483647, "-2147483647");
    TEST_Result(Double, 9223372036854775807LL, "9.22337203685478e+18");
    TEST_Result(Double, -9223372036854775807LL, "-9.22337203685478e+18");
libscpi/test/test_scpi_utils.c
@@ -78,7 +78,7 @@
    char ref[max];
    size_t len;
    // test signed conversion to decimal numbers
    /* test signed conversion to decimal numbers */
    for (i = 0; i < N; i++) {
        len = SCPI_Int32ToStr(val[i], str, max);
        snprintf(ref, max, "%"PRIi32, val[i]);
@@ -88,7 +88,7 @@
    int16_t val16[] = {0, 1, -1, INT16_MIN, INT16_MAX, 0x0123, 0x4567, 0x89ab, 0xcdef};
    int N16 = sizeof (val16) / sizeof (int16_t);
    // test signed conversion to decimal numbers
    /* test signed conversion to decimal numbers */
    for (i = 0; i < N16; i++) {
        len = SCPI_Int32ToStr((int32_t) val16[i], str, max);
        snprintf(ref, max, "%"PRIi16, val16[i]);
@@ -106,7 +106,7 @@
    char ref[max];
    size_t len;
    // test conversion to decimal numbers
    /* test conversion to decimal numbers */
    for (i = 0; i < N; i++) {
        len = SCPI_UInt32ToStrBase(val[i], str, max, 10);
        snprintf(ref, max, "%"PRIu32, val[i]);
@@ -114,7 +114,7 @@
        CU_ASSERT_STRING_EQUAL(str, ref);
    }
    // test conversion to hexadecimal numbers
    /* test conversion to hexadecimal numbers */
    for (i = 0; i < N; i++) {
        len = SCPI_UInt32ToStrBase(val[i], str, max, 16);
        snprintf(ref, max, "%"PRIX32, val[i]);
@@ -122,7 +122,7 @@
        CU_ASSERT_STRING_EQUAL(str, ref);
    }
    // test conversion to octal numbers
    /* test conversion to octal numbers */
    for (i = 0; i < N; i++) {
        len = SCPI_UInt32ToStrBase(val[i], str, max, 8);
        snprintf(ref, max, "%"PRIo32, val[i]);
@@ -130,7 +130,7 @@
        CU_ASSERT_STRING_EQUAL(str, ref);
    }
    // test conversion to binary numbers
    /* test conversion to binary numbers */
    len = SCPI_UInt32ToStrBase(0, str, max, 2);
    CU_ASSERT(len == 1);
    CU_ASSERT_STRING_EQUAL(str, "0");
@@ -161,7 +161,7 @@
    char ref[max];
    size_t len;
    // test conversion to decimal numbers
    /* test conversion to decimal numbers */
    for (i = 0; i < N; i++) {
        len = SCPI_Int64ToStr(val[i], str, max);
        snprintf(ref, max, "%"PRIi64, val[i]);
@@ -179,7 +179,7 @@
    char ref[max];
    size_t len;
    // test conversion to decimal numbers
    /* test conversion to decimal numbers */
    for (i = 0; i < N; i++) {
        len = SCPI_UInt64ToStrBase(val[i], str, max, 10);
        snprintf(ref, max, "%"PRIu64, val[i]);
@@ -187,7 +187,7 @@
        CU_ASSERT_STRING_EQUAL(str, ref);
    }
    // test conversion to hexadecimal numbers
    /* test conversion to hexadecimal numbers */
    for (i = 0; i < N; i++) {
        len = SCPI_UInt64ToStrBase(val[i], str, max, 16);
        snprintf(ref, max, "%"PRIX64, val[i]);
@@ -195,7 +195,7 @@
        CU_ASSERT_STRING_EQUAL(str, ref);
    }
    // test conversion to octal numbers
    /* test conversion to octal numbers */
    for (i = 0; i < N; i++) {
        len = SCPI_UInt64ToStrBase(val[i], str, max, 8);
        snprintf(ref, max, "%"PRIo64, val[i]);
@@ -203,7 +203,7 @@
        CU_ASSERT_STRING_EQUAL(str, ref);
    }
    // test conversion to binary numbers
    /* test conversion to binary numbers */
    len = SCPI_UInt64ToStrBase(0, str, max, 2);
    CU_ASSERT(len == 1);
    CU_ASSERT_STRING_EQUAL(str, "0");
@@ -311,7 +311,7 @@
        CU_ASSERT_EQUAL(result, r);                     \
    } while(0)                                          \
    // TODO: extend to corner cases, use scanf as reference
    /* TODO: extend to corner cases, use scanf as reference */
    TEST_STR_TO_INT32("", 0, 0, 10);
    TEST_STR_TO_INT32("1", 1, 1, 10);
    TEST_STR_TO_INT32("10", 2, 10, 10);
@@ -320,10 +320,10 @@
    TEST_STR_TO_INT32("MHz", 0, 0, 10);
    TEST_STR_TO_INT32("1.4", 1, 1, 10);
    TEST_STR_TO_INT32(" 1", 2, 1, 10);
    TEST_STR_TO_INT32(" +100", 5, 100, 10); // space and +
    TEST_STR_TO_INT32("FF", 2, 255, 16); // hexadecimal FF
    TEST_STR_TO_INT32("77", 2, 63, 8); // octal 77
    TEST_STR_TO_INT32("18", 1, 1, 8); // octal 1, 8 is ignored
    TEST_STR_TO_INT32(" +100", 5, 100, 10); /* space and + */
    TEST_STR_TO_INT32("FF", 2, 255, 16); /* hexadecimal FF */
    TEST_STR_TO_INT32("77", 2, 63, 8); /* octal 77 */
    TEST_STR_TO_INT32("18", 1, 1, 8); /* octal 1, 8 is ignored */
}
static void test_strBaseToUInt32() {
@@ -337,7 +337,7 @@
        CU_ASSERT_EQUAL(result, r);                     \
    } while(0)                                          \
    // TODO: extend to corner cases, use scanf as reference
    /* TODO: extend to corner cases, use scanf as reference */
    TEST_STR_TO_UINT32("", 0, 0, 10);
    TEST_STR_TO_UINT32("1", 1, 1, 10);
    TEST_STR_TO_UINT32("10", 2, 10, 10);
@@ -345,11 +345,11 @@
    TEST_STR_TO_UINT32("MHz", 0, 0, 10);
    TEST_STR_TO_UINT32("1.4", 1, 1, 10);
    TEST_STR_TO_UINT32(" 1", 2, 1, 10);
    TEST_STR_TO_UINT32(" +100", 5, 100, 10); // space and +
    TEST_STR_TO_UINT32("FF", 2, 255, 16); // hexadecimal FF
    TEST_STR_TO_UINT32("77", 2, 63, 8); // octal 77
    TEST_STR_TO_UINT32("18", 1, 1, 8); // octal 1, 8 is ignored
    TEST_STR_TO_UINT32("FFFFFFFF", 8, 0xffffffffu, 16); // octal 1, 8 is ignored
    TEST_STR_TO_UINT32(" +100", 5, 100, 10); /* space and + */
    TEST_STR_TO_UINT32("FF", 2, 255, 16); /* hexadecimal FF */
    TEST_STR_TO_UINT32("77", 2, 63, 8); /* octal 77 */
    TEST_STR_TO_UINT32("18", 1, 1, 8); /* octal 1, 8 is ignored */
    TEST_STR_TO_UINT32("FFFFFFFF", 8, 0xffffffffu, 16); /* octal 1, 8 is ignored */
}
static void test_strBaseToInt64() {
@@ -363,7 +363,7 @@
        CU_ASSERT_EQUAL(result, r);                     \
    } while(0)                                          \
    // TODO: extend to corner cases, use scanf as reference
    /* TODO: extend to corner cases, use scanf as reference */
    TEST_STR_TO_INT64("", 0, 0, 10);
    TEST_STR_TO_INT64("1", 1, 1, 10);
    TEST_STR_TO_INT64("10", 2, 10, 10);
@@ -372,10 +372,10 @@
    TEST_STR_TO_INT64("MHz", 0, 0, 10);
    TEST_STR_TO_INT64("1.4", 1, 1, 10);
    TEST_STR_TO_INT64(" 1", 2, 1, 10);
    TEST_STR_TO_INT64(" +100", 5, 100, 10); // space and +
    TEST_STR_TO_INT64("FF", 2, 255, 16); // hexadecimal FF
    TEST_STR_TO_INT64("77", 2, 63, 8); // octal 77
    TEST_STR_TO_INT64("18", 1, 1, 8); // octal 1, 8 is ignored
    TEST_STR_TO_INT64(" +100", 5, 100, 10); /* space and + */
    TEST_STR_TO_INT64("FF", 2, 255, 16); /* hexadecimal FF */
    TEST_STR_TO_INT64("77", 2, 63, 8); /* octal 77 */
    TEST_STR_TO_INT64("18", 1, 1, 8); /* octal 1, 8 is ignored */
}
static void test_strBaseToUInt64() {
@@ -389,7 +389,7 @@
        CU_ASSERT_EQUAL(result, r);                     \
    } while(0)                                          \
    // TODO: extend to corner cases, use scanf as reference
    /* TODO: extend to corner cases, use scanf as reference */
    TEST_STR_TO_UINT64("", 0, 0, 10);
    TEST_STR_TO_UINT64("1", 1, 1, 10);
    TEST_STR_TO_UINT64("10", 2, 10, 10);
@@ -397,11 +397,11 @@
    TEST_STR_TO_UINT64("MHz", 0, 0, 10);
    TEST_STR_TO_UINT64("1.4", 1, 1, 10);
    TEST_STR_TO_UINT64(" 1", 2, 1, 10);
    TEST_STR_TO_UINT64(" +100", 5, 100, 10); // space and +
    TEST_STR_TO_UINT64("FF", 2, 255, 16); // hexadecimal FF
    TEST_STR_TO_UINT64("77", 2, 63, 8); // octal 77
    TEST_STR_TO_UINT64("18", 1, 1, 8); // octal 1, 8 is ignored
    TEST_STR_TO_UINT64("FFFFFFFF", 8, 0xffffffffu, 16); // octal 1, 8 is ignored
    TEST_STR_TO_UINT64(" +100", 5, 100, 10); /* space and + */
    TEST_STR_TO_UINT64("FF", 2, 255, 16); /* hexadecimal FF */
    TEST_STR_TO_UINT64("77", 2, 63, 8); /* octal 77 */
    TEST_STR_TO_UINT64("18", 1, 1, 8); /* octal 1, 8 is ignored */
    TEST_STR_TO_UINT64("FFFFFFFF", 8, 0xffffffffu, 16); /* octal 1, 8 is ignored */
}
static void test_strToDouble() {
@@ -541,88 +541,88 @@
    TEST_MATCH_COMMAND("A?", "A?", TRUE);
    TEST_MATCH_COMMAND("A", "A?", FALSE);
    TEST_MATCH_COMMAND("A?", "A", FALSE);
    TEST_MATCH_COMMAND("[:ABcc]:AACddd", ":ab:aac", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:AACddd", "aac", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:AACddd", "aac?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:AACddd?", ":ab:aac?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:AACddd?", "aac?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:AACddd?", "aac", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee", "ab:bcc:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee", "ab:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee", "ab:cdefg?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee?", "ab:bcc:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee?", "ab:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee?", "ab:cdefg", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]", "ab:bcc:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]", "ab:bcc", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]", "ab:bcc?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]?", "ab:bcc:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]?", "ab:bcc?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]?", "ab:bcc", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:AACddd", ":ab:aac", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:AACddd", "aac", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:AACddd", "aac?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:AACddd?", ":ab:aac?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:AACddd?", "aac?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:AACddd?", "aac", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee", "ab:bcc:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee", "ab:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee", "ab:cdefg?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee?", "ab:bcc:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee?", "ab:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd]:CDEFGeeeee?", "ab:cdefg", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]", "ab:bcc:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]", "ab:bcc", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]", "ab:bcc?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]?", "ab:bcc:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]?", "ab:bcc?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc:BCCdddd[:CDEFGeeeee]?", "ab:bcc", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "ab:bcc:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "ab:bcc", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "bcc:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "ab:bcc?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "bcc:cdefg?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "ab:bcc:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "ab:bcc?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "bcc:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "ab:bcc", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "bcc:cdefg", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "ab:bcc:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "ab:bcc", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "bcc:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "ab:bcc?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]", "bcc:cdefg?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "ab:bcc:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "ab:bcc?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "bcc:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "ab:bcc", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("[:ABcc]:BCCdddd[:CDEFGeeeee]?", "bcc:cdefg", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:bcc:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:bcc", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:bcc?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:cdefg?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:bcc:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:bcc?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:bcc", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:cdefg", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:bcc:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:bcc", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:bcc?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]", "ab:cdefg?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:bcc:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:bcc?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:bcc", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee]?", "ab:cdefg", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg:defffffffff", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg:deffffffffffffffffffff", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg:de", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:defffffffff", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:cdefg:defffffffff", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:cdefg", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:defffffffff", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:defffffffff?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:cdefg:defffffffff?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:cdefg?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:defffffffff?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab?", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg:defffffffff", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg:deffffffffffffffffffff", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg:de", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:defffffffff", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:cdefg:defffffffff", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:cdefg", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:defffffffff", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:cdefg?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc:defffffffff?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:cdefg:defffffffff?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:bcc?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:cdefg?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab:defffffffff?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]", "ab?", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:cdefg:defffffffff?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:defffffffff?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:cdefg:defffffffff?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:cdefg?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:defffffffff?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab?", TRUE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:cdefg", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:defffffffff", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:cdefg:defffffffff", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:cdefg", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:defffffffff", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab", FALSE); // test optional keyword
    TEST_MATCH_COMMAND("*IDN?", "idn", FALSE); // common command
    TEST_MATCH_COMMAND("*IDN?", "idn?", FALSE); // common command
    TEST_MATCH_COMMAND("*IDN?", "*idn", FALSE); // common command
    TEST_MATCH_COMMAND("*IDN?", "*idn?", TRUE); // common command
    TEST_MATCH_COMMAND("*IDN?", ":idn", FALSE); // common command
    TEST_MATCH_COMMAND("*IDN?", ":idn?", FALSE); // common command
    TEST_MATCH_COMMAND("*IDN?", ":*idn", FALSE); // common command
    TEST_MATCH_COMMAND("*IDN?", ":*idn?", FALSE); // common command
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:cdefg:defffffffff?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:defffffffff?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:cdefg:defffffffff?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:cdefg?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:defffffffff?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab?", TRUE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:cdefg", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc:defffffffff", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:cdefg:defffffffff", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:bcc", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:cdefg", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab:defffffffff", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("ABcc[:BCCdddd][:CDEFGeeeee][:DEFFFFFFFFFfffffffffff]?", "ab", FALSE); /* test optional keyword */
    TEST_MATCH_COMMAND("*IDN?", "idn", FALSE); /* common command */
    TEST_MATCH_COMMAND("*IDN?", "idn?", FALSE); /* common command */
    TEST_MATCH_COMMAND("*IDN?", "*idn", FALSE); /* common command */
    TEST_MATCH_COMMAND("*IDN?", "*idn?", TRUE); /* common command */
    TEST_MATCH_COMMAND("*IDN?", ":idn", FALSE); /* common command */
    TEST_MATCH_COMMAND("*IDN?", ":idn?", FALSE); /* common command */
    TEST_MATCH_COMMAND("*IDN?", ":*idn", FALSE); /* common command */
    TEST_MATCH_COMMAND("*IDN?", ":*idn?", FALSE); /* common command */
    TEST_MATCH_COMMAND("MEASure[:SCALar]:CURRent[:DC]?", ":MEAS?", FALSE);
    TEST_MATCH_COMMAND("MEASure[:SCALar]:CURRent[:DC]?", "MEAS?", FALSE);
@@ -650,48 +650,48 @@
    TEST_MATCH_COMMAND("MEASure[:SCALar]:CURRent[:DC]", ":MEAS:CURR:DC", TRUE);
    TEST_MATCH_COMMAND("MEASure[:SCALar]:CURRent[:DC]", "MEAS:CURR:DC", TRUE);
    TEST_MATCH_COMMAND("ABCdef#", "abc", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("ABCdef#", "abc1324", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("ABCdef#", "abcDef1324", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("ABCdef#", "abcDef124b", FALSE); // test numeric parameter
    TEST_MATCH_COMMAND("ABCdef#", "abc", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("ABCdef#", "abc1324", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("ABCdef#", "abcDef1324", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("ABCdef#", "abcDef124b", FALSE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "abc", FALSE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "outp1:mod10:fm", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "output1:mod10:fm", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "outp1:modulation:fm5", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "output:mod:fm", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "outp1:mod10a:fm", FALSE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#[:MODulation#]:FM#", "outp1:fm", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#[:MODulation#]:FM#", "outp1:mod10:fm", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#[:MODulation#]:FM#", "outp1:fm2", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#[:MODulation#]:FM#", "output:fm", TRUE); // test numeric parameter
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "abc", FALSE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "outp1:mod10:fm", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "output1:mod10:fm", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "outp1:modulation:fm5", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "output:mod:fm", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#:MODulation#:FM#", "outp1:mod10a:fm", FALSE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#[:MODulation#]:FM#", "outp1:fm", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#[:MODulation#]:FM#", "outp1:mod10:fm", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#[:MODulation#]:FM#", "outp1:fm2", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND("OUTPut#[:MODulation#]:FM#", "output:fm", TRUE); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM#", "outp3:mod10:fm", TRUE, (3, 10, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM#", "output3:mod10:fm", TRUE, (3, 10, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM#", "outp30:modulation:fm5", TRUE, (30, -1, 5)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM#", "output:mod:fm", TRUE, (-1, -1, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM#", "outp3:fm", TRUE, (3, -1, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM#", "outp3:mod10:fm", TRUE, (3, 10, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM#", "outp3:fm2", TRUE, (3, -1, 2)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM#", "output:fm", TRUE, (-1, -1, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM#", "outp3:mod10:fm", TRUE, (3, 10, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM#", "output3:mod10:fm", TRUE, (3, 10, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM#", "outp30:modulation:fm5", TRUE, (30, -1, 5)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM#", "output:mod:fm", TRUE, (-1, -1, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM#", "outp3:fm", TRUE, (3, -1, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM#", "outp3:mod10:fm", TRUE, (3, 10, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM#", "outp3:fm2", TRUE, (3, -1, 2)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM#", "output:fm", TRUE, (-1, -1, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation:FM#", "outp3:mod:fm", TRUE, (3, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation:FM#", "output3:mod:fm", TRUE, (3, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation:FM#", "outp30:modulation:fm5", TRUE, (30, 5)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation:FM#", "output:mod:fm", TRUE, (-1, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation]:FM#", "outp3:fm", TRUE, (3, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation]:FM#", "outp3:mod:fm", TRUE, (3, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation]:FM#", "outp3:fm2", TRUE, (3, 2)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation]:FM#", "output:fm", TRUE, (-1, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation:FM#", "outp3:mod:fm", TRUE, (3, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation:FM#", "output3:mod:fm", TRUE, (3, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation:FM#", "outp30:modulation:fm5", TRUE, (30, 5)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation:FM#", "output:mod:fm", TRUE, (-1, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation]:FM#", "outp3:fm", TRUE, (3, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation]:FM#", "outp3:mod:fm", TRUE, (3, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation]:FM#", "outp3:fm2", TRUE, (3, 2)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation]:FM#", "output:fm", TRUE, (-1, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM", "outp3:mod10:fm", TRUE, (3, 10)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM", "output3:mod10:fm", TRUE, (3, 10)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM", "outp30:modulation:fm", TRUE, (30, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM", "output:mod:fm", TRUE, (-1, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM", "outp3:fm", TRUE, (3, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM", "outp3:mod10:fm", TRUE, (3, 10)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM", "outp3:fm", TRUE, (3, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM", "output:fm", TRUE, (-1, -1)); // test numeric parameter
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM", "outp3:mod10:fm", TRUE, (3, 10)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM", "output3:mod10:fm", TRUE, (3, 10)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM", "outp30:modulation:fm", TRUE, (30, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#:MODulation#:FM", "output:mod:fm", TRUE, (-1, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM", "outp3:fm", TRUE, (3, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM", "outp3:mod10:fm", TRUE, (3, 10)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM", "outp3:fm", TRUE, (3, -1)); /* test numeric parameter */
    TEST_MATCH_COMMAND2("OUTPut#[:MODulation#]:FM", "output:fm", TRUE, (-1, -1)); /* test numeric parameter */
}
static void test_composeCompoundCommand(void) {