From 811e11d96f5ae2fa6972ac1bf095eeebd9486f9a Mon Sep 17 00:00:00 2001
From: Andrey Nakin <andrey.nakin@gmail.com>
Date: 周一, 21 10月 2013 03:48:06 +0800
Subject: [PATCH] add function SCPI_ParamChoice

---
 libscpi/inc/scpi/error.h  |    1 +
 libscpi/src/parser.c      |   32 ++++++++++++++++++++++++++++++++
 libscpi/src/error.c       |    1 +
 libscpi/inc/scpi/parser.h |    1 +
 4 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/libscpi/inc/scpi/error.h b/libscpi/inc/scpi/error.h
index cb5b398..36de436 100644
--- a/libscpi/inc/scpi/error.h
+++ b/libscpi/inc/scpi/error.h
@@ -59,6 +59,7 @@
 #define SCPI_ERROR_SUFFIX_NOT_ALLOWED   -138
 
 #define SCPI_ERROR_EXECUTION_ERROR      -200
+#define SCPI_ERROR_ILLEGAL_PARAMETER_VALUE	-224
     
 #ifdef	__cplusplus
 }
diff --git a/libscpi/inc/scpi/parser.h b/libscpi/inc/scpi/parser.h
index 509879d..6977d5f 100644
--- a/libscpi/inc/scpi/parser.h
+++ b/libscpi/inc/scpi/parser.h
@@ -61,6 +61,7 @@
     bool_t SCPI_ParamString(scpi_t * context, const char ** value, size_t * len, bool_t mandatory);
     bool_t SCPI_ParamText(scpi_t * context, const char ** value, size_t * len, bool_t mandatory);    
     bool_t SCPI_ParamBool(scpi_t * context, bool_t * value, bool_t mandatory);
+    bool_t SCPI_ParamChoice(scpi_t * context, const char * options[], size_t * value, bool_t mandatory);
 
 
 #ifdef	__cplusplus
diff --git a/libscpi/src/error.c b/libscpi/src/error.c
index 9577d6b..2705ff1 100644
--- a/libscpi/src/error.c
+++ b/libscpi/src/error.c
@@ -181,6 +181,7 @@
         case SCPI_ERROR_MISSING_PARAMETER: return "Missing parameter";
         case SCPI_ERROR_INVALID_SUFFIX: return "Invalid suffix";
         case SCPI_ERROR_SUFFIX_NOT_ALLOWED: return "Suffix not allowed";
+        case SCPI_ERROR_ILLEGAL_PARAMETER_VALUE: return "Illegal parameter value";
         default: return "Unknown error";
     }
 }
diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c
index 22e9b04..fb6396f 100644
--- a/libscpi/src/parser.c
+++ b/libscpi/src/parser.c
@@ -617,3 +617,35 @@
     return TRUE;
 }
 
+/**
+ * Parse choice parameter
+ * @param context
+ * @param options
+ * @param value
+ * @param mandatory
+ * @return 
+ */
+bool_t SCPI_ParamChoice(scpi_t * context, const char * options[], size_t * value, bool_t mandatory) {
+    const char * param;
+    size_t param_len;
+    size_t res;
+
+    if (!options || !value) {
+        return FALSE;
+    }
+
+    if (!SCPI_ParamString(context, &param, &param_len, mandatory)) {
+        return FALSE;
+    }
+
+	for (res = 0; options[res]; ++res) {
+	    if (matchPattern(options[res], strlen(options[res]), param, param_len)) {
+			*value = res;
+			return TRUE;
+		}
+    }
+
+	SCPI_ErrorPush(context, SCPI_ERROR_ILLEGAL_PARAMETER_VALUE);
+    return FALSE;
+}
+

--
Gitblit v1.9.1