int extcap_parse_dlt_sentence(extcap_token_sentence *s, extcap_dlt **rd) { extcap_token_param *v = NULL; extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN; *rd = NULL; if (s == NULL) return -1; if (g_ascii_strcasecmp(s->sentence, "dlt") == 0) { sent = EXTCAP_SENTENCE_DLT; } if (sent == EXTCAP_SENTENCE_UNKNOWN) return -1; *rd = extcap_new_dlt(); if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARGNUM)) == NULL) { printf("No number in DLT sentence\n"); extcap_free_dlt(*rd); return -1; } if (sscanf(v->value, "%d", &((*rd)->number)) != 1) { printf("Invalid number in DLT sentence\n"); extcap_free_dlt(*rd); return -1; } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_NAME)) == NULL) { printf("No name in DLT sentence\n"); extcap_free_dlt(*rd); return -1; } (*rd)->name = g_strdup(v->value); if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) == NULL) { printf("No display in DLT sentence\n"); extcap_free_dlt(*rd); return -1; } (*rd)->display = g_strdup(v->value); return 1; }
int extcap_parse_interface_sentence(extcap_token_sentence *s, extcap_interface **ri) { extcap_token_param *v = NULL; extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN; *ri = NULL; if (s == NULL) return -1; if (g_ascii_strcasecmp(s->sentence, "interface") == 0) { sent = EXTCAP_SENTENCE_INTERFACE; } else if (g_ascii_strcasecmp(s->sentence, "extcap") == 0) { sent = EXTCAP_SENTENCE_EXTCAP; } if (sent == EXTCAP_SENTENCE_UNKNOWN) return -1; *ri = extcap_new_interface(); (*ri)->if_type = sent; if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_VALUE)) == NULL && sent == EXTCAP_SENTENCE_INTERFACE) { printf("No value in INTERFACE sentence\n"); extcap_free_interface(*ri); return -1; } if ( v != NULL ) (*ri)->call = g_strdup(v->value); if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) == NULL && sent == EXTCAP_SENTENCE_INTERFACE) { printf("No display in INTERFACE sentence\n"); extcap_free_interface(*ri); return -1; } if ( v != NULL ) (*ri)->display = g_strdup(v->value); if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_VERSION)) != NULL) { (*ri)->version = g_strdup(v->value); } return 1; }
extcap_arg *extcap_parse_arg_sentence(GList * args, extcap_token_sentence *s) { extcap_token_param *v = 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) return target_arg; if (g_ascii_strcasecmp(s->sentence, "arg") == 0) { sent = EXTCAP_SENTENCE_ARG; /* printf("ARG sentence\n"); */ } else if (g_ascii_strcasecmp(s->sentence, "value") == 0) { sent = EXTCAP_SENTENCE_VALUE; /* printf("VALUE sentence\n"); */ } if (sent == EXTCAP_SENTENCE_ARG) { target_arg = extcap_new_arg(); if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARGNUM)) == NULL) { extcap_free_arg(target_arg); return NULL ; } if (sscanf(v->value, "%d", &(target_arg->arg_num)) != 1) { extcap_free_arg(target_arg); return NULL ; } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_CALL)) == NULL) { extcap_free_arg(target_arg); return NULL ; } target_arg->call = g_strdup(v->value); /* No value only parameters allowed */ if (strlen(target_arg->call) == 0) { extcap_free_arg(target_arg); return NULL ; } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) == NULL) { extcap_free_arg(target_arg); return NULL ; } target_arg->display = g_strdup(v->value); if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_TOOLTIP)) != NULL) { target_arg->tooltip = g_strdup(v->value); } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_FILE_MUSTEXIST)) != NULL) { target_arg->fileexists = (v->value[0] == 't' || v->value[0] == 'T'); } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_FILE_EXTENSION)) != NULL) { target_arg->fileextension = g_strdup(v->value); } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_VALIDATION)) != NULL) { target_arg->regexp = g_strdup(v->value); } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_REQUIRED)) != NULL) { target_arg->is_required = (v->value[0] == 't' || v->value[0] == 'T'); } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_TYPE)) == NULL) { /* printf("no type in ARG sentence\n"); */ extcap_free_arg(target_arg); return NULL ; } if (g_ascii_strcasecmp(v->value, "integer") == 0) { target_arg->arg_type = EXTCAP_ARG_INTEGER; } else if (g_ascii_strcasecmp(v->value, "unsigned") == 0) { target_arg->arg_type = EXTCAP_ARG_UNSIGNED; } else if (g_ascii_strcasecmp(v->value, "long") == 0) { target_arg->arg_type = EXTCAP_ARG_LONG; } else if (g_ascii_strcasecmp(v->value, "double") == 0) { target_arg->arg_type = EXTCAP_ARG_DOUBLE; } else if (g_ascii_strcasecmp(v->value, "boolean") == 0) { target_arg->arg_type = EXTCAP_ARG_BOOLEAN; } else if (g_ascii_strcasecmp(v->value, "boolflag") == 0) { target_arg->arg_type = EXTCAP_ARG_BOOLFLAG; } else if (g_ascii_strcasecmp(v->value, "selector") == 0) { target_arg->arg_type = EXTCAP_ARG_SELECTOR; } else if (g_ascii_strcasecmp(v->value, "radio") == 0) { target_arg->arg_type = EXTCAP_ARG_RADIO; } else if (g_ascii_strcasecmp(v->value, "string") == 0) { target_arg->arg_type = EXTCAP_ARG_STRING; } else if (g_ascii_strcasecmp(v->value, "fileselect") == 0) { target_arg->arg_type = EXTCAP_ARG_FILESELECT; } else if (g_ascii_strcasecmp(v->value, "multicheck") == 0) { target_arg->arg_type = EXTCAP_ARG_MULTICHECK; } else { printf("invalid type %s in ARG sentence\n", v->value); extcap_free_arg(target_arg); return NULL ; } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_RANGE)) != NULL) { gchar *cp = g_strstr_len(v->value, -1, ","); if (cp == NULL) { printf("invalid range, expected value,value got %s\n", v->value); extcap_free_arg(target_arg); return NULL ; } if ((target_arg->range_start = extcap_parse_complex( target_arg->arg_type, v->value)) == NULL) { printf("invalid range, expected value,value got %s\n", v->value); extcap_free_arg(target_arg); return NULL ; } if ((target_arg->range_end = extcap_parse_complex( target_arg->arg_type, cp + 1)) == NULL) { printf("invalid range, expected value,value got %s\n", v->value); extcap_free_arg(target_arg); return NULL ; } } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DEFAULT)) != NULL) { if ((target_arg->default_complex = extcap_parse_complex( target_arg->arg_type, v->value)) == NULL) { printf("invalid default, couldn't parse %s\n", v->value); } } } else if (sent == EXTCAP_SENTENCE_VALUE) { if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARG)) == NULL) { printf("no arg in VALUE sentence\n"); return NULL ; } if (sscanf(v->value, "%d", &tint) != 1) { printf("invalid arg in VALUE sentence\n"); return NULL ; } ; if ((entry = g_list_find_custom(args, &tint, glist_find_numbered_arg)) == NULL) { printf("couldn't find arg %d in list for VALUE sentence\n", tint); return NULL ; } value = g_new(extcap_value, 1); value->display = NULL; value->call = NULL; value->enabled = FALSE; value->is_default = FALSE; value->arg_num = tint; value->parent = NULL; if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_VALUE)) == NULL) { /* printf("no value in VALUE sentence\n"); */ extcap_free_value(value); return NULL ; } value->call = g_strdup(v->value); if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) == NULL) { /* printf("no display in VALUE sentence\n"); */ extcap_free_value(value); return NULL ; } value->display = g_strdup(v->value); if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_PARENT)) != NULL) { value->parent = g_strdup(v->value); } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DEFAULT)) != NULL) { /* printf("found default value\n"); */ value->is_default = (v->value[0] == 't' || v->value[0] == 'T'); } if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ENABLED)) != NULL) { value->enabled = (v->value[0] == 't' || v->value[0] == 'T'); } ((extcap_arg*) entry->data)->values = g_list_append( ((extcap_arg*) entry->data)->values, value); return NULL ; } return target_arg; }