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