modargs.c

根据输入的args,将key和value存入到map中,关键就是如何解析args。

 

■ static int add_key_value(struct pa_hashmap *map, char *key, char *value, const char* const* valid_keys)
■ struct pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys)
■ void pa_modargs_free(struct pa_modargs*ma)
■ const char *pa_modargs_get_value(struct pa_modargs *ma, const char *key, const char *def)
■ int pa_modargs_get_value_u32(struct pa_modargs *ma, const char *key, uint32_t *value)
■ int pa_modargs_get_sample_spec(struct pa_modargs *ma, struct pa_sample_spec *rss)
■ int pa_modargs_get_source_index(struct pa_modargs *ma, struct pa_core *c, uint32_t *index)
■ int pa_modargs_get_sink_index(struct pa_modargs *ma, struct pa_core *c, uint32_t *index)

解析args中的参数

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

#define LOG(fmt, ...)        printf("%s():%d "fmt"\n",__FUNCTION__, __LINE__, ## __VA_ARGS__)

int main()
{
//    const char *args = NULL;
     const char *args = "name='hello' num=1234 nick_name=\"kitty\"";
     //错误的用法
     //key和=之间不能有空格 "name ='hello'";, 空格是识别到key末尾
     //value和=之间不能有空格 "name= 'hello'"; value识别为空
       if (args) {
        enum { WHITESPACE, KEY, VALUE_START, VALUE_SIMPLE, VALUE_DOUBLE_QUOTES, VALUE_TICKS } state;
        const char *p, *key, *value;
        size_t key_len = 0, value_len = 0;
        
        key = value = NULL;
        state = WHITESPACE;
        for (p = args; *p; p++) {
            switch (state) {
                case WHITESPACE:
                    if (*p == '=')
                        goto fail;
                    else if (!isspace(*p)) {
                        key = p;
                        state = KEY;
                        key_len = 1;
                    }
                    break;
                case KEY:
                    if (*p == '=')
                        state = VALUE_START;
                    else
                        key_len++;
                    break;
                case  VALUE_START:
                    if (*p == '\'') {
                        state = VALUE_TICKS;
                        value = p+1;
                        value_len = 0;
                    } else if (*p == '"') {
                        state = VALUE_DOUBLE_QUOTES;
                        value = p+1;
                        value_len = 0;
                    } else if (isspace(*p)) {
                              char *rel_key = strndup(key, key_len);
                              LOG("key = %s key_len = %d", rel_key, key_len);
                              free(rel_key);
                        state = WHITESPACE;
                    } else {
                        state = VALUE_SIMPLE;
                        value = p;
                        value_len = 1;
                    }
                    break;
                case VALUE_SIMPLE:
                    if (isspace(*p)) {
                              char *rel_key = strndup(key, key_len);
                              char *rel_value = strndup(value, value_len);
                              LOG("key = %s key_len = %d value = %s value_len = %d", rel_key, key_len, rel_value, value_len);
                           free(rel_value);
                             free(rel_key);
                        state = WHITESPACE;
                    } else
                        value_len++;
                    break;
                case VALUE_DOUBLE_QUOTES:
                    if (*p == '"') {
                              char *rel_key = strndup(key, key_len);
                              char *rel_value = strndup(value, value_len);
                              LOG("key = %s key_len = %d value = %s value_len = %d", rel_key, key_len, rel_value, value_len);
                           free(rel_value);
                             free(rel_key);
                             state = WHITESPACE;
                    } else
                        value_len++;
                    break;
                case VALUE_TICKS:
                    if (*p == '\'') {
                              char *rel_key = strndup(key, key_len);
                              char *rel_value = strndup(value, value_len);
                              LOG("key = %s key_len = %d value = %s value_len = %d", rel_key, key_len, rel_value, value_len);
                           free(rel_value);
                             free(rel_key);
                        state = WHITESPACE;
                    } else
                        value_len++;
                    break;
            }
        }

        if (state == VALUE_START) {
                              char *rel_key = strndup(key, key_len);
                              char *rel_value = strndup(value, value_len);
                              LOG("key = %s key_len = %d value = %s value_len = %d", rel_key, key_len, rel_value, value_len);
                           free(rel_value);
                             free(rel_key);
    } else if (state == VALUE_SIMPLE) {
                              char *rel_key = strndup(key, key_len);
                              char *rel_value = strndup(value, value_len);
                              LOG("key = %s key_len = %d value = %s value_len = %d", rel_key, key_len, rel_value, value_len);
                           free(rel_value);
                             free(rel_key);
        } else if (state != WHITESPACE)
              LOG("state is failed state = %d", state);
    }
    
    return 0;
    fail:
    LOG("----failed----");
    return -1;
}

 

posted @ 2020-06-02 08:15  renhl  阅读(223)  评论(0编辑  收藏  举报