Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}