From af4e630a29e8ddcb11f377d3b0e6f6d580040313 Mon Sep 17 00:00:00 2001
From: Jan Breuer <jan.breuer@jaybee.cz>
Date: 周五, 12 12月 2014 17:50:29 +0800
Subject: [PATCH] Parser refactoring

---
 libscpi/src/parser.c |  136 ++++++++++++++++++++++++++++++++++++---------
 1 files changed, 109 insertions(+), 27 deletions(-)

diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c
index f2211c6..7f8f6b6 100644
--- a/libscpi/src/parser.c
+++ b/libscpi/src/parser.c
@@ -166,7 +166,7 @@
     while (1) {
         result = 0;
 
-        r = detectProgramMessageUnit(state, data, len);
+        r = scpiParser_detectProgramMessageUnit(state, data, len);
 
         if (state->programHeader.type == TokInvalid) {
             SCPI_ErrorPush(context, SCPI_ERROR_INVALID_CHARACTER);
@@ -256,7 +256,7 @@
 
 
         while (1) {
-            cmdlen = detectProgramMessageUnit(&context->parser_state, context->buffer.data + totcmdlen, context->buffer.position - totcmdlen);
+            cmdlen = scpiParser_detectProgramMessageUnit(&context->parser_state, context->buffer.data + totcmdlen, context->buffer.position - totcmdlen);
             totcmdlen += cmdlen;
             if (context->parser_state.termination == PmutNewLine) break;
             if (context->parser_state.programHeader.type == TokUnknown) break;
@@ -299,6 +299,11 @@
     return SCPI_ResultIntBase(context, val, 10);
 }
 
+/**
+ * Return prefix of nondecimal base
+ * @param base
+ * @return 
+ */
 static const char * getBasePrefix(int8_t base) {
     switch (base) {
         case 2: return "#B";
@@ -308,6 +313,13 @@
     }
 }
 
+/**
+ * Write integer value in specific base to the result
+ * @param context
+ * @param val
+ * @param base
+ * @return 
+ */
 size_t SCPI_ResultIntBase(scpi_t * context, int32_t val, int8_t base) {
     char buffer[33];
     const char * basePrefix;
@@ -353,6 +365,7 @@
     size_t result = 0;
     result += writeDelimiter(context);
     result += writeData(context, "\"", 1);
+    // TODO: convert " to ""
     result += writeData(context, data, strlen(data));
     result += writeData(context, "\"", 1);
     context->output_count++;
@@ -371,7 +384,13 @@
 
 
 /* parsing parameters */
-
+/**
+ * Get one parameter from command line
+ * @param context
+ * @param parameter
+ * @param mandatory
+ * @return 
+ */
 scpi_bool_t SCPI_Parameter(scpi_t * context, scpi_parameter_t * parameter, scpi_bool_t mandatory) {
     scpi_token_t token;
     lex_state_t * state;
@@ -397,7 +416,7 @@
         return FALSE;
     }
     if (context->input_count != 0) {
-        lexComma(state, &token);
+        scpiLex_Comma(state, &token);
         if (token.type != TokComma) {
             SCPI_ErrorPush(context, SCPI_ERROR_INVALID_SEPARATOR);
             return FALSE;
@@ -406,7 +425,7 @@
 
     context->input_count++;
 
-    parseProgramData(&context->param_list.lex_state, &token);
+    scpiParser_parseProgramData(&context->param_list.lex_state, &token);
 
     parameter->type = token.type;
     parameter->data.ptr = token.ptr;
@@ -455,6 +474,12 @@
     }
 }
 
+/**
+ * Detect if parameter is number
+ * @param parameter
+ * @param suffixAllowed
+ * @return 
+ */
 scpi_bool_t SCPI_ParamIsNumber(scpi_parameter_t * parameter, scpi_bool_t suffixAllowed) {
     switch (parameter->type) {
         case TokHexnum:
@@ -469,6 +494,13 @@
     }   
 }
 
+/**
+ * Read floating point parameter
+ * @param context
+ * @param value
+ * @param mandatory
+ * @return 
+ */
 scpi_bool_t SCPI_ParamDouble(scpi_t * context, double * value, scpi_bool_t mandatory)
 {
     scpi_bool_t result;
@@ -494,6 +526,13 @@
     return result;  
 }
 
+/**
+ * Read integer parameter
+ * @param context
+ * @param value
+ * @param mandatory
+ * @return 
+ */
 scpi_bool_t SCPI_ParamInt(scpi_t * context, int32_t * value, scpi_bool_t mandatory)
 {
     // TODO: remove dependency on double
@@ -513,6 +552,14 @@
     return result;
 }
 
+/**
+ * Read character parameter
+ * @param context
+ * @param value
+ * @param len
+ * @param mandatory
+ * @return 
+ */
 scpi_bool_t SCPI_ParamCharacters(scpi_t * context, const char ** value, size_t * len, scpi_bool_t mandatory)   
 {
     scpi_bool_t result;
@@ -534,6 +581,13 @@
     return result;
 }
 
+/**
+ * Read BOOL parameter (0,1,ON,OFF)
+ * @param context
+ * @param value
+ * @param mandatory
+ * @return 
+ */
 scpi_bool_t SCPI_ParamBool(scpi_t * context, scpi_bool_t * value, scpi_bool_t mandatory)
 {
     scpi_bool_t result;
@@ -570,6 +624,14 @@
     return result;
 }
 
+/**
+ * Read value from list of options
+ * @param context
+ * @param options
+ * @param value
+ * @param mandatory
+ * @return 
+ */
 scpi_bool_t SCPI_ParamChoice(scpi_t * context, const char * options[], int32_t * value, scpi_bool_t mandatory)
 {
     size_t res;
@@ -604,21 +666,27 @@
     return result;
 }
 
-int parseProgramData(lex_state_t * state, scpi_token_t * token) {
+/**
+ * Parse one parameter and detect type
+ * @param state
+ * @param token
+ * @return 
+ */
+int scpiParser_parseProgramData(lex_state_t * state, scpi_token_t * token) {
     scpi_token_t tmp;
     int result = 0;
     int wsLen;
     int suffixLen;
     int realLen = 0;
-    realLen += lexWhiteSpace(state, &tmp);
+    realLen += scpiLex_WhiteSpace(state, &tmp);
 
-    if (result == 0) result = lexNondecimalNumericData(state, token);
-    if (result == 0) result = lexCharacterProgramData(state, token);
+    if (result == 0) result = scpiLex_NondecimalNumericData(state, token);
+    if (result == 0) result = scpiLex_CharacterProgramData(state, token);
     if (result == 0) {
-        result = lexDecimalNumericProgramData(state, token);
+        result = scpiLex_DecimalNumericProgramData(state, token);
         if (result != 0) {
-            wsLen = lexWhiteSpace(state, &tmp);
-            suffixLen = lexSuffixProgramData(state, &tmp);
+            wsLen = scpiLex_WhiteSpace(state, &tmp);
+            suffixLen = scpiLex_SuffixProgramData(state, &tmp);
             if (suffixLen > 0) {
                 token->len += wsLen + suffixLen;
                 token->type = TokDecimalNumericProgramDataWithSuffix;
@@ -627,16 +695,23 @@
         }
     }
 
-    if (result == 0) result = lexStringProgramData(state, token);
-    if (result == 0) result = lexArbitraryBlockProgramData(state, token);
-    if (result == 0) result = lexProgramExpression(state, token);
+    if (result == 0) result = scpiLex_StringProgramData(state, token);
+    if (result == 0) result = scpiLex_ArbitraryBlockProgramData(state, token);
+    if (result == 0) result = scpiLex_ProgramExpression(state, token);
 
-    realLen += lexWhiteSpace(state, &tmp);
+    realLen += scpiLex_WhiteSpace(state, &tmp);
 
     return result + realLen;
 }
 
-int parseAllProgramData(lex_state_t * state, scpi_token_t * token, int * numberOfParameters) {
+/**
+ * Skip all parameters to correctly detect end of command line.
+ * @param state
+ * @param token
+ * @param numberOfParameters
+ * @return 
+ */
+int scpiParser_parseAllProgramData(lex_state_t * state, scpi_token_t * token, int * numberOfParameters) {
 
     int result;
     scpi_token_t tmp;
@@ -647,7 +722,7 @@
     token->ptr = state->pos;
 
 
-    for (result = 1; result != 0; result = lexComma(state, &tmp)) {
+    for (result = 1; result != 0; result = scpiLex_Comma(state, &tmp)) {
         token->len += result;
 
         if (result == 0) {
@@ -657,7 +732,7 @@
             break;
         }
 
-        result = parseProgramData(state, &tmp);
+        result = scpiParser_parseProgramData(state, &tmp);
         if (tmp.type != TokUnknown) {
             token->len += result;
         } else {
@@ -685,7 +760,14 @@
     token->type = TokUnknown;
 }
 
-int detectProgramMessageUnit(scpi_parser_state_t * state, const char * buffer, int len) {
+/**
+ * Skip complete command line - program header and parameters
+ * @param state
+ * @param buffer
+ * @param len
+ * @return 
+ */
+int scpiParser_detectProgramMessageUnit(scpi_parser_state_t * state, const char * buffer, int len) {
     lex_state_t lex_state;
     scpi_token_t tmp;
     int result = 0;
@@ -695,11 +777,11 @@
     state->numberOfParameters = 0;
 
     /* ignore whitespace at the begginig */
-    lexWhiteSpace(&lex_state, &tmp);
+    scpiLex_WhiteSpace(&lex_state, &tmp);
 
-    if (lexProgramHeader(&lex_state, &state->programHeader) >= 0) {
-        if (lexWhiteSpace(&lex_state, &tmp) > 0) {
-            parseAllProgramData(&lex_state, &state->programData, &state->numberOfParameters);
+    if (scpiLex_ProgramHeader(&lex_state, &state->programHeader) >= 0) {
+        if (scpiLex_WhiteSpace(&lex_state, &tmp) > 0) {
+            scpiParser_parseAllProgramData(&lex_state, &state->programData, &state->numberOfParameters);
         } else {
             invalidateToken(&state->programData, lex_state.pos);
         }
@@ -708,10 +790,10 @@
         invalidateToken(&state->programData, lex_state.buffer);
     }
 
-    if (result == 0) result = lexNewLine(&lex_state, &tmp);
-    if (result == 0) result = lexSemicolon(&lex_state, &tmp);
+    if (result == 0) result = scpiLex_NewLine(&lex_state, &tmp);
+    if (result == 0) result = scpiLex_Semicolon(&lex_state, &tmp);
 
-    if (!lexIsEos(&lex_state) && (result == 0)) {
+    if (!scpiLex_IsEos(&lex_state) && (result == 0)) {
         lex_state.pos++;
 
         state->programHeader.len = 1;

--
Gitblit v1.9.1