aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2016-12-08 23:09:41 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2016-12-08 23:09:41 +0200
commitb6bbeeceb6ebc39156808babbc4c303e78449d73 (patch)
tree82bb9a50a2f299f972807092d6427d18f3aa4336
parent57b6fd09db652029b906255fcc594f55e96fddf7 (diff)
parent1fe8eb69ac9f54d2b6ce1bac821adee6bb893ef2 (diff)
downloadmailfromd-b6bbeeceb6ebc39156808babbc4c303e78449d73.tar.gz
mailfromd-b6bbeeceb6ebc39156808babbc4c303e78449d73.tar.bz2
Merge branch 'master' of ssh://git.gnu.org.ua/gitroot/mailfromd
-rw-r--r--doc/mailfromd.texi2
-rw-r--r--src/drivers.c152
-rw-r--r--src/gram.y4
-rw-r--r--src/main.c2
-rw-r--r--src/prog.c6
-rw-r--r--src/prog.h8
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);
}
}
diff --git a/src/gram.y b/src/gram.y
index a70307d5..75a57a1f 100644
--- a/src/gram.y
+++ b/src/gram.y
@@ -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) {
diff --git a/src/main.c b/src/main.c
index a03a2da1..235292aa 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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");
diff --git a/src/prog.c b/src/prog.c
index 5b883bec..6b2d025f 100644
--- a/src/prog.c
+++ b/src/prog.c
@@ -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;
diff --git a/src/prog.h b/src/prog.h
index 3f63b514..e9b496fa 100644
--- a/src/prog.h
+++ b/src/prog.h
@@ -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);

Return to:

Send suggestions and report system problems to the System administrator.