nancy.liao
2025-05-08 bf8143c649292042de87c0cef63e6cb3c523388f
libscpi/src/parser.c
@@ -37,6 +37,7 @@
#include <ctype.h>
#include <string.h>
#include "scpi/externinterface.h"
#include "scpi/config.h"
#include "scpi/parser.h"
@@ -45,7 +46,7 @@
#include "scpi/error.h"
#include "scpi/constants.h"
#include "scpi/utils.h"
#include "scpi/externinterface.h"
/**
 * Write data to SCPI output
 * @param context
@@ -55,7 +56,8 @@
 */
static size_t writeData(scpi_t * context, const char * data, size_t len) {
    if ((len > 0) && (data != NULL)) {
        return context->interface->write(context, data, len);
        return 0;
       // return context->interface->write(context, data, len);
    } else {
        return 0;
    }
@@ -125,7 +127,8 @@
 */
 //负命令回调的执行、参数处理和错误管理
static scpi_bool_t processCommand(scpi_t * context) {
static scpi_bool_t processCommand(scpi_t * context)
{
    const scpi_command_t * cmd = context->param_list.cmd;
    lex_state_t * state = &context->param_list.lex_state;
    scpi_bool_t result = TRUE;
@@ -177,17 +180,22 @@
 * @param context
 * @result TRUE if context->paramlist is filled with correct values
 */
static scpi_bool_t findCommandHeader(scpi_t * context, const char * header, int len) {
    int32_t i;
    const scpi_command_t * cmd;
scpi_bool_t findCommandHeader(scpi_t * context, const char * header,int len)
{
    //参数已经在前面部分解析完成,匹配命令时就不再需要参数部分 将命令拆除即可
    char *header_copy = strdup(header);
    char *first_part = strtok(header_copy, " ");
    for (i = 0; context->cmdlist[i].pattern != NULL; i++) {
        cmd = &context->cmdlist[i];
        if (matchCommand(cmd->pattern, header, len, NULL, 0, 0)) {
            context->param_list.cmd = cmd;
    for(int i=0;i<get_pattern_count();i++)
    {
        if( match_segments_global(first_part,i) )
        {
            context->param_list.cmd = &context->cmdlist[i];
            free(header_copy);
            return TRUE;
        }
    }
    context->SCPIerror = RETURN_NotFind;
    return FALSE;
}
@@ -229,6 +237,7 @@
        if (state->programHeader.type == SCPI_TOKEN_INVALID) {
            SCPI_ErrorPush(context, SCPI_ERROR_INVALID_CHARACTER);
            context->SCPIerror = RETURN_IllegalCommand;
            result = FALSE;
        } 
        else if (state->programHeader.len > 0) 
@@ -254,6 +263,7 @@
                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);
                context->SCPIerror = RETURN_UnDefine;
                result = FALSE;
            }
        }
@@ -310,6 +320,8 @@
    context->buffer.data = input_buffer;
    context->buffer.length = input_buffer_length;
    context->buffer.position = 0;
    SCPI_ErrorInit(context, error_queue_data, error_queue_size);
}
@@ -347,7 +359,8 @@
    data:输入的数据
    len:输入数据的长度
 */
scpi_bool_t SCPI_Input(scpi_t * context, const char * data, int len) {
scpi_bool_t SCPI_Input(scpi_t * context, const char * data, int len)
{
    scpi_bool_t result = FALSE;
    size_t totcmdlen = 0;
    int cmdlen = 0;
@@ -371,7 +384,8 @@
            context->buffer.position = 0;
            context->buffer.data[context->buffer.position] = 0;
            SCPI_ErrorPush(context, SCPI_ERROR_INPUT_BUFFER_OVERRUN);
            return FALSE;
            context->SCPIerror = RETURN_LengthOverFlow;
            return result;
        }
        memcpy(&context->buffer.data[context->buffer.position], data, len);
        context->buffer.position += len;
@@ -1050,6 +1064,9 @@
    return result;
}
/**
 * Read signed/unsigned 32 bit integer parameter
 * @param context
@@ -1479,8 +1496,8 @@
 */
 //识别完整的SCPI命令
int scpiParser_detectProgramMessageUnit(scpi_parser_state_t * state, char * buffer, int len) {
    lex_state_t lex_state;
    scpi_token_t tmp;
    lex_state_t lex_state = {};
    scpi_token_t tmp = {};
    int result = 0;
    // 初始化词法分析
    lex_state.buffer = lex_state.pos = buffer;