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; };
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; }
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; }