Exemple #1
0
static bool cf_preprocessor(struct cf_preprocessor *pp,
                            bool if_block, struct cf_token **p_cur_token)
{
    struct cf_token *cur_token = *p_cur_token;

    if (strref_cmp(&cur_token->str, "include") == 0) {
        cf_preprocess_include(pp, p_cur_token);

    } else if (strref_cmp(&cur_token->str, "define") == 0) {
        cf_preprocess_define(pp, p_cur_token);

    } else if (strref_cmp(&cur_token->str, "undef") == 0) {
        cf_preprocess_undef(pp, p_cur_token);

    } else if (strref_cmp(&cur_token->str, "ifdef") == 0) {
        cf_preprocess_ifdef(pp, false, p_cur_token);

    } else if (strref_cmp(&cur_token->str, "ifndef") == 0) {
        cf_preprocess_ifdef(pp, true, p_cur_token);

        /*} else if (strref_cmp(&cur_token->str, "if") == 0) {
        	TODO;*/
    } else if (strref_cmp(&cur_token->str, "else") == 0 ||
               /*strref_cmp(&cur_token->str, "elif") == 0 ||*/
               strref_cmp(&cur_token->str, "endif") == 0) {
        if (!if_block) {
            struct dstr name;
            dstr_init_copy_strref(&name, &cur_token->str);
            cf_adderror(pp, cur_token,"#$1 outside of "
                        "#if/#ifdef/#ifndef block",
                        name.array, NULL, NULL);
            dstr_free(&name);
            (*p_cur_token)++;

            return true;
        }

        return false;

    } else if (cur_token->type != CFTOKEN_NEWLINE &&
               cur_token->type != CFTOKEN_NONE) {
        /*
         * TODO: language-specific preprocessor stuff should be sent to
         * handler of some sort
         */
        (*p_cur_token)++;
    }

    return true;
}
Exemple #2
0
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);
}
Exemple #3
0
void cf_preprocessor_add_def(struct cf_preprocessor *pp, struct cf_def *def)
{
    struct cf_def *existing = cf_preprocess_get_def(pp, &def->name.str);

    if (existing) {
        struct dstr name;
        dstr_init_copy_strref(&name, &def->name.str);
        cf_addwarning(pp, &def->name, "Token $1 already defined",
                      name.array, NULL, NULL);
        cf_addwarning(pp, &existing->name,
                      "Previous definition of $1 is here",
                      name.array, NULL, NULL);

        cf_def_free(existing);
        memcpy(existing, def, sizeof(struct cf_def));
    } else {
        da_push_back(pp->defines, def);
    }
}