Ejemplo n.º 1
0
static int
mln_conf_domain_cmp(const void *data1, const void *data2)
{
    mln_conf_domain_t *d1 = (mln_conf_domain_t *)data1;
    mln_conf_domain_t *d2 = (mln_conf_domain_t *)data2;
    return mln_string_strcmp(d1->domain_name, d2->domain_name);
}
Ejemplo n.º 2
0
static int
mln_conf_cmd_cmp(const void *data1, const void *data2)
{
    mln_conf_cmd_t *c1 = (mln_conf_cmd_t *)data1;
    mln_conf_cmd_t *c2 = (mln_conf_cmd_t *)data2;
    return mln_string_strcmp(c1->cmd_name, c2->cmd_name);
}
Ejemplo n.º 3
0
static int
mln_lang_str_nonequal(mln_lang_ctx_t *ctx, mln_lang_retExp_t **ret, mln_lang_retExp_t *op1, mln_lang_retExp_t *op2)
{
    ASSERT(op1->type == M_LANG_RETEXP_VAR && op2->type == M_LANG_RETEXP_VAR);
    int rv;
    mln_string_t *tmp;
    if ((tmp = mln_lang_var_toString(ctx->pool, op2->data.var)) == NULL) {
        mln_lang_errmsg(ctx, "No memory.");
        return -1;
    }
    rv = mln_string_strcmp(mln_lang_var_getVal(op1->data.var)->data.s, tmp);
    mln_string_pool_free(tmp);
    if (rv) {
        if ((*ret = mln_lang_retExp_createTmpTrue(ctx->pool, NULL)) == NULL) {
            mln_lang_errmsg(ctx, "No memory.");
            return -1;
        }
    } else {
        if ((*ret = mln_lang_retExp_createTmpFalse(ctx->pool, NULL)) == NULL) {
            mln_lang_errmsg(ctx, "No memory.");
            return -1;
        }
    }
    return 0;
}
Ejemplo n.º 4
0
static int _mln_conf_load(mln_conf_t *cf, mln_conf_domain_t *current)
{
    mln_conf_lex_struct_t *fir, *next;
    mln_conf_cmd_t *cmd;
    mln_conf_domain_t *cd;
    mln_rbtree_node_t *rn;
    while ( 1 ) {
        fir = mln_conf_token(cf->lex);
        if (fir == NULL) {
            fprintf(stderr, "Get token error. %s\n", mln_lex_strerror(cf->lex));
            return -1;
        } else if (fir->type == CONF_TK_EOF) {
            mln_conf_lex_free(fir);
            break;
        } else if (fir->type == CONF_TK_RBRACE) {
            if (mln_string_strcmp(current->domain_name, &default_domain)) {
                mln_conf_lex_free(fir);
                return 0;
            }
            CONF_ERR(cf->lex, fir, "Invalid right brace");
            mln_conf_lex_free(fir);
            return -1;
        } else if (fir->type != CONF_TK_ID) {
            CONF_ERR(cf->lex, fir, "Unexpected token");
            mln_conf_lex_free(fir);
            return -1;
        }
        next = mln_conf_token(cf->lex);
        if (next == NULL) {
            mln_conf_lex_free(fir);
            fprintf(stderr, "Get token error. %s\n", mln_lex_strerror(cf->lex));
            return -1;
        }
        else if (next->type == CONF_TK_EOF) {
            CONF_ERR(cf->lex, next, "Invalid end of file");
            mln_conf_lex_free(fir);
            mln_conf_lex_free(next);
            return -1;
        }
        /*as domain*/
        if (next->type == CONF_TK_LBRACE) {
            mln_conf_lex_free(next);
            if (mln_string_strcmp(current->domain_name, &default_domain)) {
                CONF_ERR(cf->lex, fir, "Illegal domain");
                mln_conf_lex_free(fir);
                return -1;
            }

            cd = mln_conf_domain_init(cf, fir->text);
            mln_conf_lex_free(fir);
            if (cd == NULL) {
                fprintf(stderr, "No memory.\n");
                return -1;
            }
            if ((rn = mln_rbtree_new_node(cf->domain, cd)) == NULL) {
                fprintf(stderr, "No memory.\n");
                mln_conf_domain_destroy(cd);
                return -1;
            }
            mln_rbtree_insert(cf->domain, rn);

            if (_mln_conf_load(cf, cd) < 0) return -1;
            continue;
        }
        /*as command*/
        cmd = mln_conf_cmd_init(fir->text);
        mln_conf_lex_free(fir);
        if (cmd == NULL) {
            fprintf(stderr, "No memory.\n");
            mln_conf_lex_free(next);
            return -1;
        }
        if ((rn = mln_rbtree_new_node(current->cmd, cmd)) == NULL) {
            fprintf(stderr, "No memory.\n");
            mln_conf_cmd_destroy(cmd);
            mln_conf_lex_free(next);
            return -1;
        }
        mln_rbtree_insert(current->cmd, rn);

        if (mln_conf_item_recursive(cf, cmd, next, 0) < 0) return -1;
        /*
         * we don't need to free the pointer 'next' here,
         * because it has already freed in mln_conf_item_recursive().
         */
    }
    return 0;
}