int mln_lang_aes(mln_lang_ctx_t *ctx) { mln_lang_val_t *val; mln_lang_var_t *var; mln_lang_func_detail_t *func; mln_string_t funcname = mln_string("mln_aes"); mln_string_t v1 = mln_string("data"); mln_string_t v2 = mln_string("key"); mln_string_t v3 = mln_string("bits"); mln_string_t v4 = mln_string("op"); if ((func = mln_lang_func_detail_new(ctx->pool, M_FUNC_INTERNAL, mln_lang_aes_process, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); return -1; } if ((val = mln_lang_val_new(ctx->pool, M_LANG_VAL_TYPE_NIL, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_func_detail_free(func); return -1; } if ((var = mln_lang_var_new(ctx->pool, &v1, M_LANG_VAR_NORMAL, val, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_val_free(val); mln_lang_func_detail_free(func); return -1; } mln_lang_var_chain_add(&(func->args_head), &(func->args_tail), var); ++func->nargs; if ((val = mln_lang_val_new(ctx->pool, M_LANG_VAL_TYPE_NIL, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_func_detail_free(func); return -1; } if ((var = mln_lang_var_new(ctx->pool, &v2, M_LANG_VAR_NORMAL, val, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_val_free(val); mln_lang_func_detail_free(func); return -1; } mln_lang_var_chain_add(&(func->args_head), &(func->args_tail), var); ++func->nargs; if ((val = mln_lang_val_new(ctx->pool, M_LANG_VAL_TYPE_NIL, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_func_detail_free(func); return -1; } if ((var = mln_lang_var_new(ctx->pool, &v3, M_LANG_VAR_NORMAL, val, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_val_free(val); mln_lang_func_detail_free(func); return -1; } mln_lang_var_chain_add(&(func->args_head), &(func->args_tail), var); ++func->nargs; if ((val = mln_lang_val_new(ctx->pool, M_LANG_VAL_TYPE_NIL, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_func_detail_free(func); return -1; } if ((var = mln_lang_var_new(ctx->pool, &v4, M_LANG_VAR_NORMAL, val, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_val_free(val); mln_lang_func_detail_free(func); return -1; } mln_lang_var_chain_add(&(func->args_head), &(func->args_tail), var); ++func->nargs; if ((val = mln_lang_val_new(ctx->pool, M_LANG_VAL_TYPE_FUNC, func)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_func_detail_free(func); return -1; } if ((var = mln_lang_var_new(ctx->pool, &funcname, M_LANG_VAR_NORMAL, val, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); mln_lang_val_free(val); return -1; } if (mln_lang_symbolNode_join(ctx, M_LANG_SYMBOL_VAR, var) < 0) { mln_lang_errmsg(ctx, "No memory."); mln_lang_var_free(var); return -1; } return 0; }
{\ mln_string_t *path = mln_lex_getCurFilename(lex);\ fprintf(stderr, "Configuration error. ");\ if (path != NULL) {\ write(STDERR_FILENO, path->data, path->len);\ write(STDERR_FILENO, ":", 1);\ }\ fprintf(stderr, "%d: \"%s\" %s.\n", (TK)->line, (char *)((TK)->text->data), MSG);\ } mln_conf_hook_t *gConfHookHead = NULL, *gConfHookTail = NULL; mln_conf_t *gConf = NULL; mln_string_t default_domain = {(mln_u8ptr_t)"main", 4, 1}; char conf_filename[] = "conf/melon.conf"; mln_string_t conf_keywords[] = { mln_string("on"), mln_string("off"), mln_string(NULL) }; MLN_DEFINE_TOKEN_TYPE_AND_STRUCT(static, mln_conf_lex, CONF, \ CONF_TK_ON, \ CONF_TK_OFF, \ CONF_TK_COMMENT, \ CONF_TK_CHAR, \ CONF_TK_STRING); MLN_DEFINE_TOKEN(mln_conf_lex, CONF, \ {CONF_TK_ON, "CONF_TK_ON"}, \ {CONF_TK_OFF, "CONF_TK_OFF"}, \ {CONF_TK_COMMENT, "CONF_TK_COMMENT"}, \
static mln_lang_retExp_t *mln_lang_aes_process(mln_lang_ctx_t *ctx) { mln_u32_t bits = M_AES_128; mln_s32_t type, encode = 0; mln_lang_val_t *val; mln_string_t *tmp; mln_lang_retExp_t *retExp; mln_string_t v1 = mln_string("data"); mln_string_t v2 = mln_string("key"); mln_string_t v3 = mln_string("bits"); mln_string_t v4 = mln_string("op"); mln_lang_symbolNode_t *sym; mln_aes_t aes; mln_u8ptr_t p, pend; if ((sym = mln_lang_symbolNode_search(ctx, &v4, 1)) == NULL) { ASSERT(0); mln_lang_errmsg(ctx, "Argument missing."); return NULL; } ASSERT(sym->type == M_LANG_SYMBOL_VAR); val = sym->data.var->val; if (mln_lang_var_getValType(sym->data.var) != M_LANG_VAL_TYPE_STRING) { mln_lang_errmsg(ctx, "Invalid argument 4."); return NULL; } if ((tmp = val->data.s) == NULL) { mln_lang_errmsg(ctx, "Invalid argument 4."); return NULL; } if (!mln_string_constStrcmp(tmp, "encode")) { encode = 1; } else if (!mln_string_constStrcmp(tmp, "decode")) { /*do nothing, encode = 0*/ } else { mln_lang_errmsg(ctx, "Invalid argument 4."); return NULL; } if ((sym = mln_lang_symbolNode_search(ctx, &v2, 1)) == NULL) { ASSERT(0); mln_lang_errmsg(ctx, "Argument missing."); return NULL; } ASSERT(sym->type == M_LANG_SYMBOL_VAR); val = sym->data.var->val; if (mln_lang_var_getValType(sym->data.var) != M_LANG_VAL_TYPE_STRING) { mln_lang_errmsg(ctx, "Invalid argument 2."); return NULL; } if ((tmp = val->data.s) == NULL) { mln_lang_errmsg(ctx, "Invalid argument 2."); return NULL; } if ((sym = mln_lang_symbolNode_search(ctx, &v3, 1)) == NULL) { ASSERT(0); mln_lang_errmsg(ctx, "Argument missing."); return NULL; } ASSERT(sym->type == M_LANG_SYMBOL_VAR); type = mln_lang_var_getValType(sym->data.var); val = sym->data.var->val; if (type != M_LANG_VAL_TYPE_INT) { mln_lang_errmsg(ctx, "Invalid argument 3."); return NULL; } switch (val->data.i) { case 128: if (tmp->len < 16) { mln_lang_errmsg(ctx, "Invalid argument 3."); return NULL; } break; case 192: if (tmp->len < 24) { mln_lang_errmsg(ctx, "Invalid argument 3."); return NULL; } bits = M_AES_192; break; case 256: if (tmp->len < 32) { mln_lang_errmsg(ctx, "Invalid argument 3."); return NULL; } bits = M_AES_256; break; default: mln_lang_errmsg(ctx, "Invalid argument 3."); return NULL; } if ((sym = mln_lang_symbolNode_search(ctx, &v1, 1)) == NULL) { ASSERT(0); mln_lang_errmsg(ctx, "Argument missing."); return NULL; } ASSERT(sym->type == M_LANG_SYMBOL_VAR); val = sym->data.var->val; if (mln_lang_var_getValType(sym->data.var) != M_LANG_VAL_TYPE_STRING) { mln_lang_errmsg(ctx, "Invalid argument 1."); return NULL; } if (val->data.s == NULL || val->data.s->len%16) { mln_lang_errmsg(ctx, "Invalid argument 1."); return NULL; } (void)mln_aes_init(&aes, tmp->data, bits); if (encode) { p = val->data.s->data; pend = val->data.s->data + val->data.s->len; for (; p < pend; p += 16) { (void)mln_aes_encrypt(&aes, p); } } else { p = val->data.s->data; pend = val->data.s->data + val->data.s->len; for (; p < pend; p += 16) { (void)mln_aes_decrypt(&aes, p); } } if ((retExp = mln_lang_retExp_createTmpString(ctx->pool, val->data.s, NULL)) == NULL) { mln_lang_errmsg(ctx, "No memory."); return NULL; } return retExp; }