Beispiel #1
0
ini_t *ini_parse(const gchar *buf, gsize len) {
    ini_parser_t *parser;
    if (buf == NULL || len == 0) {
        return NULL;
    }

    parser = g_new0(ini_parser_t, 1);
    parser->tokenizer = ini_tokenizer_new(buf, len);
    parser->ini = ini_new();

    while (next_token(parser)->type != INI_TOKEN_EOF) {
        skip_whitespace(parser);
        switch (parser->curr_token->type) {
            case INI_TOKEN_EOL:
            case INI_TOKEN_EOF:
                continue;
            case INI_TOKEN_BRACKET_LEFT:
                parse_section_header(parser);
                break;
            case INI_TOKEN_TEXT:
                parse_key_value_pair(parser);
                break;
            case INI_TOKEN_SEMICOLON:
                skip_comment(parser);
                break;
            default:
                // XXX: Error. Log error and continue or shut down?
                break;
        }
    }

    return parser->ini;
};
Beispiel #2
0
int av_dict_parse_string(AVDictionary **pm, const char *str,
                         const char *key_val_sep, const char *pairs_sep,
                         int flags)
{
    int ret;

    if (!str)
        return 0;

    /* ignore STRDUP flags */
    flags &= ~(AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);

    while (*str) {
        if ((ret = parse_key_value_pair(pm, &str, key_val_sep, pairs_sep, flags)) < 0)
            return ret;

        if (*str)
            str++;
    }

    return 0;
}
Beispiel #3
0
int parse_rule_content(char* rule)
{
	if(rule == NULL)
		return -1;

	char* index = rule;
	char** toks;
	int i;	// j;
	int num_toks;
//	int ruletype;
	int level;

	rule_node_t rule_node[10];	//每一行内容可能包含多个content
	int rule_num = 0;
	memset(&rule_node, 0, sizeof(rule_node_t)*10);

	while(*index == ' ' || *index =='\t')
		index++;
	for(i=0; i<strlen(index); i++)
	{
		if(*(index+i) == '\n')
		{
			*(index+i) = 0x00;
			break;
		}
	}

	toks = m_split(index, ";", PARSERULE_SIZE, &num_toks, 0);
	for(i=0; i<num_toks; i++)
	{
		char key[PARSERULE_SIZE]={0};
		char value[PARSERULE_SIZE]={0};
		char* idx;

		idx = toks[i];
		while(*idx == ' ' || *idx == '\t')
			idx++;
		if(*idx == '\n' || *idx == 0x00)	//是否是最后一个元素,即换行符
			break;

		if(parse_key_value_pair(idx, key, value) < 0)
		{
			save_err_log("profile %s, line:%d, this line is not in the expected format", file_name, file_line);
			exit(1);
		}

		if(!strcmp(key, "classtype"))
		{
			strcpy(rule_node[0].type, value);
		}
		else if(!strcmp(key, "level"))
		{
			level = rule_level(value);
			if(level < 0)
			{
				m_split_free(&toks, num_toks);
				return -1;
			}
			rule_node[0].level = level;
		}
		else if(!strcmp(key, "msg"))
		{
			strcpy(rule_node[0].msg, value);
		}
		else if(!strcmp(key, "content") || !strcmp(key, "uricontent"))
		{
			if(parse_pattern(value, rule_node[rule_num].content, &rule_node[rule_num].content_len)<0)
			{
				save_err_log("profile %s, line:%d, this line is not in the expected format", file_name, file_line);
				m_split_free(&toks, num_toks);
				return -1;
			}
			rule_num++;
		}
	}

	for(i=0; i<rule_num; i++)
	{
		rule_node[i].nocase = NOCASE;
		rule_node[i].id = rule_id++;
		strcpy(rule_node[i].file_name, file_name);
		rule_node[i].file_line = file_line;

		if(i != 0)
		{
			strcpy(rule_node[i].type, rule_node[0].type);
			rule_node[i].level = rule_node[0].level;
			strcpy(rule_node[i].msg, rule_node[0].msg);
		}
	}

	m_split_free(&toks, num_toks);

	if(rule_node[0].content_len > 0 && rule_num >= 1)
	{
		rule_node_t* cur_rule_node = &rule_node[0];
		if(rule_num == 1)
		{
			fpdetect_add_rule(cur_rule_node);
		}
		else
		{
			int j=1;
			for(j=1; j<rule_num; j++)
			{
				cur_rule_node = &rule_node[j];

				if(cur_rule_node->content_len > 0)
					fpdetect_add_rule(cur_rule_node);
			}
		}
	}
	return 0;
}