aboutsummaryrefslogtreecommitdiffstats
path: root/extcap_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'extcap_parser.c')
-rw-r--r--extcap_parser.c143
1 files changed, 95 insertions, 48 deletions
diff --git a/extcap_parser.c b/extcap_parser.c
index ca351743d5..24608d4af5 100644
--- a/extcap_parser.c
+++ b/extcap_parser.c
@@ -175,6 +175,8 @@ static extcap_token_sentence *extcap_tokenize_sentence(const gchar *s) {
param_type = EXTCAP_PARAM_ENABLED;
} else if (g_ascii_strcasecmp(arg, "parent") == 0) {
param_type = EXTCAP_PARAM_PARENT;
+ } else if (g_ascii_strcasecmp(arg, "reload") == 0) {
+ param_type = EXTCAP_PARAM_RELOAD;
} else if (g_ascii_strcasecmp(arg, "required") == 0) {
param_type = EXTCAP_PARAM_REQUIRED;
} else if (g_ascii_strcasecmp(arg, "save") == 0) {
@@ -321,13 +323,74 @@ static void extcap_free_tokenized_sentences(GList *sentences) {
g_list_free(sentences);
}
+static extcap_value *extcap_parse_value_sentence(extcap_token_sentence *s) {
+ extcap_value *value = NULL;
+ gchar *param_value = NULL;
+
+ int tint = 0;
+
+ if (s == NULL)
+ return value;
+
+ if (g_ascii_strcasecmp(s->sentence, "value") == 0) {
+
+ if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ARG)))
+ == NULL) {
+ printf("no arg in VALUE sentence\n");
+ return NULL;
+ }
+
+ if (sscanf(param_value, "%d", &tint) != 1) {
+ printf("invalid arg in VALUE sentence\n");
+ return NULL;
+ }
+
+ value = g_new0(extcap_value, 1);
+ value->arg_num = tint;
+
+ if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_VALUE)))
+ == NULL) {
+ /* printf("no value in VALUE sentence\n"); */
+ extcap_free_value(value);
+ return NULL;
+ }
+ value->call = g_strdup(param_value);
+
+ if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DISPLAY)))
+ == NULL) {
+ /* printf("no display in VALUE sentence\n"); */
+ extcap_free_value(value);
+ return NULL;
+ }
+ value->display = g_strdup(param_value);
+
+ if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_PARENT)))
+ != NULL) {
+ value->parent = g_strdup(param_value);
+ }
+
+ if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DEFAULT)))
+ != NULL) {
+ /* printf("found default value\n"); */
+ value->is_default = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ }
+
+ if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ENABLED)))
+ != NULL) {
+ value->enabled = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ }
+ }
+
+ return value;
+}
+
static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence *s) {
gchar *param_value = NULL;
extcap_arg *target_arg = NULL;
extcap_value *value = NULL;
GList *entry = NULL;
- int tint;
+
extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN;
if (s == NULL)
@@ -451,6 +514,11 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
target_arg->save = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
}
+ if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_RELOAD)))
+ != NULL) {
+ target_arg->reload = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
+ }
+
if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_RANGE)))
!= NULL) {
gchar *cp = g_strstr_len(param_value, -1, ",");
@@ -491,58 +559,14 @@ static extcap_arg *extcap_parse_arg_sentence(GList *args, extcap_token_sentence
}
} else if (sent == EXTCAP_SENTENCE_VALUE) {
- if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ARG)))
- == NULL) {
- printf("no arg in VALUE sentence\n");
- return NULL;
- }
-
- if (sscanf(param_value, "%d", &tint) != 1) {
- printf("invalid arg in VALUE sentence\n");
- return NULL;
- }
+ value = extcap_parse_value_sentence(s);
- if ((entry = g_list_find_custom(args, &tint, glist_find_numbered_arg))
+ if ((entry = g_list_find_custom(args, &value->arg_num, glist_find_numbered_arg))
== NULL) {
- printf("couldn't find arg %d in list for VALUE sentence\n", tint);
+ printf("couldn't find arg %d in list for VALUE sentence\n", value->arg_num);
return NULL;
}
- value = g_new0(extcap_value, 1);
- value->arg_num = tint;
-
- if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_VALUE)))
- == NULL) {
- /* printf("no value in VALUE sentence\n"); */
- extcap_free_value(value);
- return NULL;
- }
- value->call = g_strdup(param_value);
-
- if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DISPLAY)))
- == NULL) {
- /* printf("no display in VALUE sentence\n"); */
- extcap_free_value(value);
- return NULL;
- }
- value->display = g_strdup(param_value);
-
- if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_PARENT)))
- != NULL) {
- value->parent = g_strdup(param_value);
- }
-
- if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_DEFAULT)))
- != NULL) {
- /* printf("found default value\n"); */
- value->is_default = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
- }
-
- if ((param_value = (gchar *)g_hash_table_lookup(s->param_list, ENUM_KEY(EXTCAP_PARAM_ENABLED)))
- != NULL) {
- value->enabled = g_regex_match_simple(EXTCAP_BOOLEAN_REGEX, param_value, G_REGEX_CASELESS, (GRegexMatchFlags)0);
- }
-
((extcap_arg *) entry->data)->values = g_list_append(
((extcap_arg *) entry->data)->values, value);
@@ -575,6 +599,29 @@ GList *extcap_parse_args(gchar *output) {
return result;
}
+GList *extcap_parse_values(gchar *output) {
+ GList *result = NULL;
+ GList *walker = NULL;
+ GList *temp = NULL;
+
+ walker = extcap_tokenize_sentences(output);
+ temp = walker;
+
+ while (walker) {
+ extcap_value *ra = NULL;
+ extcap_token_sentence *sentence = (extcap_token_sentence *)walker->data;
+
+ if ((ra = extcap_parse_value_sentence(sentence)) != NULL)
+ result = g_list_append(result, (gpointer) ra);
+
+ walker = g_list_next(walker);
+ }
+
+ extcap_free_tokenized_sentences(temp);
+
+ return result;
+}
+
static extcap_interface *extcap_parse_interface_sentence(extcap_token_sentence *s) {
extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN;
gchar *param_value = NULL;