nancy.liao
2025-05-26 77a92c3204b95eaf2870605718b9099ab6ece56a
libscpi/src/parser.c
@@ -57,7 +57,7 @@
static size_t writeData(scpi_t * context, const char * data, size_t len) {
    if ((len > 0) && (data != NULL)) {
        return 0;
       // return context->interface->write(context, data, len);
        return context->interface->write(context, data, len);
    } else {
        return 0;
    }
@@ -127,10 +127,9 @@
 */
 //负命令回调的执行、参数处理和错误管理
static scpi_bool_t processCommand(scpi_t * context) {
    //这个地方修改为 读comdlist->pattern
static scpi_bool_t processCommand(scpi_t * context)
{
    const scpi_command_t * cmd = context->param_list.cmd;
    //const scpi_command_t * cmd = context->cmdlist->pattern;
    lex_state_t * state = &context->param_list.lex_state;
    scpi_bool_t result = TRUE;
    // 先检测是否为查询命令(以?结尾)
@@ -181,18 +180,23 @@
 * @param context
 * @result TRUE if context->paramlist is filled with correct values
 */
scpi_bool_t findCommandHeader(scpi_t * context, const char * header, int len)
scpi_bool_t findCommandHeader(scpi_t * context, const char * header)
{
    //参数已经在前面部分解析完成,匹配命令时就不再需要参数部分 将命令拆除即可
    char *header_copy = strdup(header);
    char *first_part = strtok(header_copy, " ");
    for(int i=0;i<get_pattern_count();i++)
    {
        if( match_segments_global(header,i) )
        if( match_segments_global(first_part,i) )
        {
            setCurrentIndex(i);
            context->param_list.cmd = &context->cmdlist[i];
            free(header_copy);
            return TRUE;
        }
    }
    context->SCPIerror = RETURN_NotFind;
     context->SCPIerror = RETURN_NotFind;
    return FALSE;
}
@@ -242,7 +246,7 @@
            //命令有效开始处理
            composeCompoundCommand(&cmd_prev, &state->programHeader);
            //查找命令后并且设置解析状态并且执行命令
            if (findCommandHeader(context, state->programHeader.ptr, state->programHeader.len)) {
            if (findCommandHeader(context, state->programHeader.ptr)) {
                context->param_list.lex_state.buffer = state->programData.ptr;
                context->param_list.lex_state.pos = context->param_list.lex_state.buffer;
@@ -358,6 +362,7 @@
 */
scpi_bool_t SCPI_Input(scpi_t * context, const char * data, int len)
{
    clearCurrentGroup();
    scpi_bool_t result = FALSE;
    size_t totcmdlen = 0;
    int cmdlen = 0;