diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-12-08 23:09:41 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-12-08 23:09:41 +0200 |
commit | b6bbeeceb6ebc39156808babbc4c303e78449d73 (patch) | |
tree | 82bb9a50a2f299f972807092d6427d18f3aa4336 | |
parent | 57b6fd09db652029b906255fcc594f55e96fddf7 (diff) | |
parent | 1fe8eb69ac9f54d2b6ce1bac821adee6bb893ef2 (diff) | |
download | mailfromd-b6bbeeceb6ebc39156808babbc4c303e78449d73.tar.gz mailfromd-b6bbeeceb6ebc39156808babbc4c303e78449d73.tar.bz2 |
Merge branch 'master' of ssh://git.gnu.org.ua/gitroot/mailfromd
-rw-r--r-- | doc/mailfromd.texi | 2 | ||||
-rw-r--r-- | src/drivers.c | 152 | ||||
-rw-r--r-- | src/gram.y | 4 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/prog.c | 6 | ||||
-rw-r--r-- | src/prog.h | 8 |
6 files changed, 89 insertions, 85 deletions
diff --git a/doc/mailfromd.texi b/doc/mailfromd.texi index 4d5dc101..07b5ec8b 100644 --- a/doc/mailfromd.texi +++ b/doc/mailfromd.texi @@ -8998,7 +8998,7 @@ configuration directory set when building @command{mailfromd} (@pxref{Building}).} If it does, the program attempts to retrieve its configuration settings from that file. - The @file{mailfromd.conf} must have the @dfn{GNU mailutils + The @file{mailfromd.conf} file must be written in the @dfn{GNU mailutils configuration format}, as described in @ref{conf-syntax, Configuration File Syntax,, mailutils, GNU Mailutils Manual}. This format can be summarized as follows: diff --git a/src/drivers.c b/src/drivers.c index 0ef1de57..721764e3 100644 --- a/src/drivers.c +++ b/src/drivers.c @@ -19,8 +19,8 @@ struct literal *lit = literal_lookup(node->locus.file); \ *old_locus = &node->locus; \ code_op(opcode_locus); \ - code_immediate((STKVAL)lit->off); \ - code_immediate((STKVAL)node->locus.line); \ + code_immediate(lit->off, ulong); \ + code_immediate(node->locus.line, str); \ } while (0) static void code_trycatch_exit(unsigned id); @@ -34,19 +34,19 @@ code_memref(NODE *node) switch (node->v.var_ref.variable->storage_class) { case storage_extern: code_op(opcode_push); - code_immediate((STKVAL)node->v.var_ref.variable->off); + code_immediate(node->v.var_ref.variable->off, long); break; case storage_auto: code_op(opcode_memstk); - code_immediate((STKVAL)node->v.var_ref.nframes); - code_immediate((STKVAL)(-node->v.var_ref.variable->off)); + code_immediate(node->v.var_ref.nframes, size); + code_immediate((-node->v.var_ref.variable->off), long); break; case storage_param: code_op(opcode_memstk); - code_immediate((STKVAL)node->v.var_ref.nframes); - code_immediate((STKVAL)(node->v.var_ref.variable->off + 2)); + code_immediate(node->v.var_ref.nframes, size); + code_immediate((node->v.var_ref.variable->off + 2), long); break; } } @@ -78,7 +78,7 @@ code_type_string(NODE *node, struct locus **old_locus) { MARK_LOCUS(); code_op(opcode_push); - code_immediate((STKVAL)node->v.literal->off); + code_immediate(node->v.literal->off, size); } @@ -96,7 +96,7 @@ code_type_symbol(NODE *node, struct locus **old_locus) { MARK_LOCUS(); code_op(opcode_symbol); - code_immediate((STKVAL)node->v.literal->off); + code_immediate(node->v.literal->off, size); } void @@ -119,7 +119,7 @@ code_type_number(NODE *node, struct locus **old_locus) { MARK_LOCUS(); code_op(opcode_push); - code_immediate((STKVAL)node->v.number); + code_immediate(node->v.number, long); } @@ -205,17 +205,17 @@ code_type_if(NODE *node, struct locus **old_locus) code_node(node->v.cond.cond); MARK_LOCUS(); code_op(opcode_bz); - pos1 = code_immediate((STKVAL)NULL); + pos1 = code_immediate(NULL, ptr); traverse_tree(node->v.cond.if_true); if (node->v.cond.if_false) { code_op(opcode_jmp); - pos2 = code_immediate((STKVAL)NULL); + pos2 = code_immediate(NULL, ptr); traverse_tree(node->v.cond.if_false); endpos = code_get_counter (); - code_put(pos1, (STKVAL)(pos2 - pos1)); - code_put(pos2, (STKVAL)(endpos - pos2 - 1)); + code_put(pos1, (pos2 - pos1), long); + code_put(pos2, (endpos - pos2 - 1), long); } else - code_put(pos1, (STKVAL)(code_get_counter () - pos1 - 1)); + code_put(pos1, (code_get_counter () - pos1 - 1), long); } @@ -785,17 +785,17 @@ code_type_bin(NODE *node, struct locus **old_locus) Y: push 1 Z: */ code_op(opcode_bz); - pos1 = code_immediate((STKVAL)NULL); + pos1 = code_immediate(NULL, ptr); code_node(node->v.bin.arg[1]); code_op(opcode_bnz); - pos2 = code_immediate((STKVAL)4); + pos2 = code_immediate(4, long); code_op(opcode_push); - code_immediate((STKVAL)0); + code_immediate(0, long); code_op(opcode_jmp); - code_immediate((STKVAL)2); + code_immediate(2, long); code_op(opcode_push); - code_immediate((STKVAL)1); - code_put(pos1, (STKVAL)(pos2 - pos1)); + code_immediate(1, long); + code_put(pos1, (pos2 - pos1), long); break; case bin_or: @@ -810,17 +810,17 @@ code_type_bin(NODE *node, struct locus **old_locus) Z: */ code_op(opcode_bnz); - pos1 = code_immediate((STKVAL)NULL); + pos1 = code_immediate(NULL, ptr); code_node(node->v.bin.arg[1]); code_op(opcode_bz); - pos2 = code_immediate((STKVAL)4); + pos2 = code_immediate(4, long); code_op(opcode_push); - code_immediate((STKVAL)1); + code_immediate(1, long); code_op(opcode_jmp); - code_immediate((STKVAL)2); + code_immediate(2, long); code_op(opcode_push); - code_immediate((STKVAL)0); - code_put(pos1, (STKVAL)(pos2 - pos1)); + code_immediate(0, long); + code_put(pos1, (pos2 - pos1), long); break; case bin_eq: @@ -1062,7 +1062,7 @@ code_result_arg(NODE *node) code_node(node); else { code_op(opcode_push); - code_immediate((STKVAL)NULL); + code_immediate(NULL, ptr); } } @@ -1115,7 +1115,7 @@ code_type_result(NODE *node, struct locus **old_locus) MARK_LOCUS(); code_op(opcode_result); - code_immediate((STKVAL)(mft_int)node->v.ret.stat); + code_immediate(node->v.ret.stat, int); code_op(opcode_nil); } @@ -1152,11 +1152,11 @@ code_type_header(NODE *node, struct locus **old_locus) code_node(node->v.hdr.value); else { code_op(opcode_push); - code_immediate((STKVAL)0); + code_immediate(0, size); } code_op(opcode_header); - code_immediate((STKVAL)(mft_int)node->v.hdr.opcode); - code_immediate((STKVAL)node->v.hdr.name->off); + code_immediate(node->v.hdr.opcode, int); + code_immediate(node->v.hdr.name->off, size); } @@ -1224,14 +1224,14 @@ code_type_builtin(NODE *node, struct locus **old_locus) if (bp->optcount || (bp->flags & MFD_BUILTIN_VARIADIC)) { /* Pass the number of actual arguments in a hidden arg */ code_op(opcode_push); - code_immediate((STKVAL)i); + code_immediate(i, size); } MARK_LOCUS(); code_op(opcode_builtin); s = literal_lookup(node->v.builtin.builtin->name); - code_immediate((STKVAL)s->off); - code_immediate((STKVAL)(void*)node->v.builtin.builtin->handler);/*FIXME*/ + code_immediate(s->off, size); + code_immediate(node->v.builtin.builtin->handler, ptr);/*FIXME*/ } @@ -1377,8 +1377,8 @@ void code_argref(NODE *node) { code_op(opcode_memstk); - code_immediate((STKVAL)0); - code_immediate((STKVAL)(node->v.arg.number + 2)); + code_immediate(0, size); + code_immediate((node->v.arg.number + 2), long); } void @@ -1410,11 +1410,11 @@ void code_argxref(NODE *node) { code_op(opcode_push); - code_immediate((STKVAL)0); + code_immediate(0, size); code_node(node->v.argx.node); code_op(opcode_push); - code_immediate((STKVAL)(node->v.argx.nargs + 2)); + code_immediate((node->v.argx.nargs + 2), size); code_op(opcode_add); code_op(opcode_xmemstk); @@ -1546,7 +1546,7 @@ void code_type_regex(NODE *node, struct locus **old_locus) { code_op(opcode_regex); - code_immediate((STKVAL)node->v.regex->index); + code_immediate(node->v.regex->index, size); } @@ -1601,7 +1601,7 @@ code_type_regcomp(NODE *node, struct locus **old_locus) save_regexp(node); code_node(node->v.regcomp_data.expr); code_op(opcode_regcomp); - code_immediate((STKVAL)node->v.regcomp_data.regind); + code_immediate(node->v.regcomp_data.regind, size); } @@ -1705,7 +1705,7 @@ code_type_catch(NODE *node, struct locus **old_locus) MARK_LOCUS(); code_op(opcode_catch); - pos1 = code_immediate((STKVAL)NULL); + pos1 = code_immediate(NULL, ptr); code_exmask(node->v.catch.exmask); ctr = jump_pc; @@ -1721,17 +1721,17 @@ code_type_catch(NODE *node, struct locus **old_locus) code_op(opcode_retcatch); if (node->v.catch.context == context_function) { code_op(opcode_jmp); - jump_pc = code_immediate((STKVAL)jump_pc); + jump_pc = code_immediate(jump_pc, long); } else { code_result_arg(NULL); code_result_arg(NULL); code_result_arg(NULL); code_op(opcode_result); - code_immediate((STKVAL)SMFIS_CONTINUE); + code_immediate(SMFIS_CONTINUE, int); } endpos = code_get_counter (); - code_put(pos1, (STKVAL)(endpos - pos1)); + code_put(pos1, (endpos - pos1), long); } @@ -1776,7 +1776,7 @@ code_type_try(NODE *node, struct locus **old_locus) code_exmask(catch->exmask); code_op(opcode_catch); - pos1 = code_immediate((STKVAL)NULL); + pos1 = code_immediate(NULL, ptr); code_exmask(catch->exmask); /* Compile `catch' part */ @@ -1788,17 +1788,17 @@ code_type_try(NODE *node, struct locus **old_locus) /* Normal exit from catch */ code_op(opcode_retcatch); code_op(opcode_jmp); - catch_jmp_pc = code_immediate((STKVAL)NULL); + catch_jmp_pc = code_immediate(NULL, ptr); /* Target point for returns from catch block */ jump_fixup(jump_pc, code_get_counter()); code_op(opcode_retcatch); code_op(opcode_jmp); - catch_ret_pc = code_immediate((STKVAL)NULL); + catch_ret_pc = code_immediate(NULL, ptr); pos = code_get_counter (); - code_put(pos1, (STKVAL)(pos - pos1)); + code_put(pos1, (pos - pos1), long); /* Compile `try' part */ MARK_LOCUS(); @@ -1808,7 +1808,7 @@ code_type_try(NODE *node, struct locus **old_locus) leave_trycatch(); try_ret_pc = jump_pc; code_op(opcode_jmp); - try_jmp_pc = code_immediate((STKVAL)NULL); + try_jmp_pc = code_immediate(NULL, ptr); /* Restore jump_pc */ jump_pc = ctr; @@ -1818,7 +1818,7 @@ code_type_try(NODE *node, struct locus **old_locus) pos = code_get_counter(); jump_fixup(try_ret_pc, pos); /* 2. Fixup the jump address for catch returns */ - code_put(catch_ret_pc, (STKVAL) (pos - catch_ret_pc - 1)); + code_put(catch_ret_pc, (pos - catch_ret_pc - 1), long); /* 3. Code return proper */ /* Restore exceptions */ code_op(opcode_restex); @@ -1826,13 +1826,13 @@ code_type_try(NODE *node, struct locus **old_locus) code_op(opcode_pushreg); code_op(opcode_jmp); - jump_pc = code_immediate((STKVAL)jump_pc); + jump_pc = code_immediate(jump_pc, long); /* Continue part */ /* 1. Fixup jump addresses */ pos = code_get_counter(); - code_put(try_jmp_pc, (STKVAL) (pos - try_jmp_pc - 1)); - code_put(catch_jmp_pc, (STKVAL) (pos - catch_jmp_pc - 1)); + code_put(try_jmp_pc, (pos - try_jmp_pc - 1), long); + code_put(catch_jmp_pc, (pos - catch_jmp_pc - 1), long); code_op(opcode_restex); /* FIN */ } @@ -1865,7 +1865,7 @@ code_type_throw(NODE *node, struct locus **old_locus) code_node(node->v.throw.expr); MARK_LOCUS(); code_op(opcode_throw); - code_immediate((STKVAL)node->v.throw.code); + code_immediate(node->v.throw.code, ulong); } @@ -1928,13 +1928,13 @@ code_type_return(NODE *node, struct locus **old_locus) if (func->rettype == dtype_unspecified) { MARK_LOCUS(); code_op(opcode_jmp); - jump_pc = code_immediate((STKVAL)jump_pc); + jump_pc = code_immediate(jump_pc, long); } else { code_node(node->v.node); MARK_LOCUS(); code_op(opcode_popreg); code_op(opcode_jmp); - jump_pc = code_immediate((STKVAL)jump_pc); + jump_pc = code_immediate(jump_pc, long); } } @@ -1986,7 +1986,7 @@ code_type_call(NODE *node, struct locus **old_locus) arguments possible. */ for (j = i; j < func->parmcount; j++) { code_op(opcode_push); - code_immediate((STKVAL)0); + code_immediate(0, ulong); } /* Pass actual arguments */ @@ -1995,7 +1995,7 @@ code_type_call(NODE *node, struct locus **old_locus) /* Pass the number of actual arguments in a hidden arg */ code_op(opcode_push); - code_immediate((STKVAL)i); + code_immediate(i, long); } else for (p = node->v.call.args, i = 0; p; p = p->next, i++) code_node(p); @@ -2008,10 +2008,10 @@ code_type_call(NODE *node, struct locus **old_locus) } code_op(opcode_funcall); s = literal_lookup(func->sym.name); - code_immediate((STKVAL)s->off); - code_immediate((STKVAL)func->entry); + code_immediate(s->off, size); + code_immediate(func->entry, size); code_op(opcode_adjust); - code_immediate((STKVAL)(func->parmcount + (func->optcount ? 1 : 0))); + code_immediate((func->parmcount + (func->optcount ? 1 : 0)), ulong); if (func->rettype != dtype_unspecified) code_op(opcode_pushreg); } @@ -2209,7 +2209,7 @@ jump_fixup(prog_counter_t pos, prog_counter_t endpos) { while (pos) { prog_counter_t next = (prog_counter_t)mf_cell_c_value(code_peek(pos), size); /*FIXME*/ - code_put(pos, (STKVAL)(endpos - pos - 1)); + code_put(pos, (endpos - pos - 1), long); pos = next; } } @@ -2248,10 +2248,10 @@ code_switch_branches(NODE *node, data_type_t type) code_op(opcode_popreg); code_op(type == dtype_number ? opcode_xlat : opcode_xlats); - start = code_immediate((STKVAL)node->v.switch_stmt.tabsize); - code_immediate((STKVAL) data_off); + start = code_immediate(node->v.switch_stmt.tabsize, ulong); + code_immediate(data_off, size); code_op(opcode_bnz); - code_immediate((STKVAL)1); + code_immediate(1, long); refpos = code_op(opcode_jreg); /* Generate code for the branches */ @@ -2266,7 +2266,7 @@ code_switch_branches(NODE *node, data_type_t type) traverse_tree(pcase->node); if (pcase->next) { code_op(opcode_jmp); - jmppos = code_immediate((STKVAL)jmppos); + jmppos = code_immediate(jmppos, long); } for (vp = pcase->valist; vp; vp = vp->next) { switch (type) { @@ -2390,7 +2390,7 @@ code_type_next(NODE *node, struct locus **old_locus) code_trycatch_exit(ent.trycatch_id); code_op(opcode_jmp); - *ent.nxtjmp = code_immediate((STKVAL) *ent.nxtjmp); + *ent.nxtjmp = code_immediate(*ent.nxtjmp, long); } @@ -2421,7 +2421,7 @@ code_type_break(NODE *node, struct locus **old_locus) code_trycatch_exit(ent.trycatch_id); code_op(opcode_jmp); - *ent.endjmp = code_immediate((STKVAL) *ent.endjmp); + *ent.endjmp = code_immediate(*ent.endjmp, long); } @@ -2525,7 +2525,7 @@ code_type_loop(NODE *node, struct locus **old_locus) if (node->v.loop.beg_while) { code_node(node->v.loop.beg_while); code_op(opcode_bz); - endjmp = code_immediate((STKVAL)endjmp); + endjmp = code_immediate(endjmp, long); } traverse_tree(node->v.loop.body); @@ -2535,12 +2535,12 @@ code_type_loop(NODE *node, struct locus **old_locus) if (node->v.loop.end_while) { code_node(node->v.loop.end_while); code_op(opcode_bz); - endjmp = code_immediate((STKVAL)endjmp); + endjmp = code_immediate(endjmp, long); } traverse_tree(node->v.loop.stmt); code_op(opcode_jmp); - code_immediate((STKVAL)(begin - code_get_counter() - 1)); + code_immediate((begin - code_get_counter() - 1), long); end = code_get_counter(); jump_fixup(endjmp, end); @@ -2563,7 +2563,7 @@ code_type_backref(NODE *node, struct locus **old_locus) { MARK_LOCUS(); code_op(opcode_backref); - code_immediate((STKVAL)node->v.number); + code_immediate(node->v.number, uint); } @@ -2751,17 +2751,17 @@ code_type_offset(NODE *node, struct locus **old_locus) switch (node->v.var_ref.variable->storage_class) { case storage_extern: code_op(opcode_push); - code_immediate((STKVAL)node->v.var_ref.variable->off); + code_immediate(node->v.var_ref.variable->off, size); break; case storage_auto: code_op(opcode_push); - code_immediate((STKVAL)0); + code_immediate(0, size); break; case storage_param: code_op(opcode_push); - code_immediate((STKVAL)node->v.var_ref.variable->ord); + code_immediate(node->v.var_ref.variable->ord, size); } } @@ -2311,7 +2311,7 @@ parse_program(char *name, int ydebug) return -1; outer_context = inner_context = context_none; catch_nesting = 0; - code_immediate((STKVAL)NULL); /* Reserve 0 slot */ + code_immediate(NULL, ptr); /* Reserve 0 slot */ rc = yyparse() + error_count; return rc; } @@ -2967,7 +2967,7 @@ codegen(prog_counter_t *pc, NODE *node, struct exmask *exmask, jump_pc = 0; if (nautos) { code_op(opcode_stkalloc); - code_immediate((STKVAL)nautos); + code_immediate(nautos, uint); } save_mask = exmask && bitmask_nset(&exmask->bm); if (save_mask) { @@ -1263,7 +1263,7 @@ main(int argc, char **argv) /* Set default logging */ mu_set_program_name(argv[0]); - mu_log_tag = (char*)mu_program_name; + mu_log_tag = mu_strdup(mu_program_name); mu_log_facility = DEFAULT_LOG_FACILITY; mu_stdstream_setup(MU_STDSTREAM_RESET_NONE); mf_srvcfg_log_setup(stderr_is_closed ? "syslog" : "stderr"); @@ -125,7 +125,7 @@ code_op(unsigned code) } prog_counter_t -code_immediate(STKVAL val) +code_immediate_stkval(STKVAL val) { return code_cell((mf_code_cell_t)val); } @@ -133,11 +133,11 @@ code_immediate(STKVAL val) prog_counter_t code_exmask(struct exmask *exmask) { - return code_immediate((STKVAL)exmask->off); + return code_immediate(exmask->off, size); } void -code_put(prog_counter_t pos, STKVAL val) +code_put_stkval(prog_counter_t pos, STKVAL val) { assert(pos < pmax); prog[pos].c_value = val; @@ -41,6 +41,8 @@ typedef union mf_stkval STKVAL; #define mf_cat(a,b) a ## b #define mf_c_val(x,t) ((x).mf_cat(v_,t)) +#define mf_c_cast(x,t) ((STKVAL)(mf_cat(mft_,t))x) + typedef void (*instr_t) (eval_environ_t env); /* Instruction */ union mf_code_cell { instr_t c_instr; @@ -59,11 +61,13 @@ struct optab { }; /* Code generation and diagnostics functions */ -void code_put(prog_counter_t pos, STKVAL val); +void code_put_stkval(prog_counter_t pos, STKVAL val); +#define code_put(p,v,t) code_put_stkval(p,mf_c_cast(v,t)) mf_code_cell_t code_peek(prog_counter_t pos); prog_counter_t code_reserve(size_t count); -prog_counter_t code_immediate(STKVAL value); +prog_counter_t code_immediate_stkval(STKVAL value); +#define code_immediate(v,t) code_immediate_stkval(mf_c_cast(v,t)) prog_counter_t code_op(unsigned code); prog_counter_t code_instr(const instr_t ptr); prog_counter_t code_exmask(struct exmask *exmask); |