static void config_add_item(struct darray *items, struct strref *name, struct strref *value) { struct config_item item; item.name = bstrdup_n(name->array, name->len); item.value = bstrdup_n(value->array, value->len); darray_push_back(sizeof(struct config_item), items, &item); }
static int ep_parse_pass(struct effect_parser *ep, struct ep_pass *pass) { struct cf_token peek; if (!cf_token_is(&ep->cfp, "pass")) return PARSE_UNEXPECTED_CONTINUE; if (!cf_next_valid_token(&ep->cfp)) return PARSE_EOF; if (!cf_token_is(&ep->cfp, "{")) { pass->name = bstrdup_n(ep->cfp.cur_token->str.array, ep->cfp.cur_token->str.len); if (!cf_next_valid_token(&ep->cfp)) return PARSE_EOF; } if (!cf_peek_valid_token(&ep->cfp, &peek)) return PARSE_EOF; while (strref_cmp(&peek.str, "}") != 0) { int ret = ep_parse_pass_command(ep, pass); if (ret < 0 && ret != PARSE_CONTINUE) return ret; if (!cf_peek_valid_token(&ep->cfp, &peek)) return PARSE_EOF; } /* token is '}' */ cf_next_token(&ep->cfp); return PARSE_SUCCESS; }
static int config_parse(struct darray *sections, const char *file, bool always_open) { char *file_data; struct lexer lex; struct base_token token; struct strref section_name; FILE *f; f = os_fopen(file, "rb"); if (always_open && !f) f = os_fopen(file, "w+"); if (!f) return CONFIG_FILENOTFOUND; os_fread_utf8(f, &file_data); fclose(f); if (!file_data) return CONFIG_SUCCESS; lexer_init(&lex); lexer_start_move(&lex, file_data); base_token_clear(&token); while (lexer_getbasetoken(&lex, &token, PARSE_WHITESPACE)) { struct config_section *section; while (token.type == BASETOKEN_WHITESPACE) { if (!lexer_getbasetoken(&lex, &token, PARSE_WHITESPACE)) goto complete; } if (*token.text.array != '[') { while (!is_newline(*token.text.array)) { if (!lexer_getbasetoken(&lex, &token, PARSE_WHITESPACE)) goto complete; } continue; } strref_clear(§ion_name); config_parse_string(&lex, §ion_name, ']'); if (!section_name.len) break; section = darray_push_back_new(sizeof(struct config_section), sections); section->name = bstrdup_n(section_name.array, section_name.len); config_parse_section(section, &lex); } complete: lexer_free(&lex); return CONFIG_SUCCESS; }
static void config_add_item(struct darray *items, struct strref *name, struct strref *value) { struct config_item item; struct dstr item_value; dstr_init_copy_strref(&item_value, value); dstr_replace(&item_value, "\\n", "\n"); dstr_replace(&item_value, "\\r", "\r"); dstr_replace(&item_value, "\\\\", "\\"); item.name = bstrdup_n(name->array, name->len); item.value = item_value.array; darray_push_back(sizeof(struct config_item), items, &item); }
static bool getparam(const char *param, char **name, const char **value) { const char *assign; if (!param || !*param || (*param == '=')) return false; assign = strchr(param, '='); if (!assign || !*assign || !*(assign+1)) return false; *name = bstrdup_n(param, assign-param); *value = assign+1; return true; }
static void parse_config_data(struct darray *sections, struct lexer *lex) { struct strref section_name; struct base_token token; base_token_clear(&token); while (lexer_getbasetoken(lex, &token, PARSE_WHITESPACE)) { struct config_section *section; while (token.type == BASETOKEN_WHITESPACE) { if (!lexer_getbasetoken(lex, &token, PARSE_WHITESPACE)) return; } if (*token.text.array != '[') { while (!is_newline(*token.text.array)) { if (!lexer_getbasetoken(lex, &token, PARSE_WHITESPACE)) return; } continue; } strref_clear(§ion_name); config_parse_string(lex, §ion_name, ']'); if (!section_name.len) return; section = darray_push_back_new(sizeof(struct config_section), sections); section->name = bstrdup_n(section_name.array, section_name.len); config_parse_section(section, lex); } }