aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2008-09-08 21:20:39 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2008-09-08 21:20:39 +0000
commit4cd3031ed36e207ce341c0854636c9047cd35d24 (patch)
tree6e9274a96c5fdb0984a6822e351eb7230d3319ef
parentda3381a039b1ab4878baa9e5fc9be39284a154f2 (diff)
downloadmailfromd-release_4_4_patches.tar.gz
mailfromd-release_4_4_patches.tar.bz2
* src/snarf.m4, src/bi_sprintf.m4, src/prog.h, src/bi_sieve.m4,release_4_4_patches
Ported r1655 from trunk. * src/prog.c: Ported r1655 and r1660 from trunk. * NEWS: Update, set version number 4.4.1. * configure.ac: set version number 4.4.1. git-svn-id: file:///svnroot/mailfromd/branches/release_4_4_patches@1661 7a8a7f39-df28-0410-adc6-e0d955640f24
-rw-r--r--ChangeLog10
-rw-r--r--NEWS7
-rw-r--r--configure.ac2
-rw-r--r--src/bi_sieve.m40
-rw-r--r--src/bi_sprintf.m419
-rw-r--r--src/prog.c272
-rw-r--r--src/prog.h4
-rw-r--r--src/snarf.m470
8 files changed, 267 insertions, 117 deletions
diff --git a/ChangeLog b/ChangeLog
index 3602649b..5ab79460 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1 +1,11 @@
+2008-09-08 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/snarf.m4, src/bi_sprintf.m4, src/prog.h, src/bi_sieve.m4,
+ Ported r1655 from trunk.
+
+ * src/prog.c: Ported r1655 and r1660 from trunk.
+
+ * NEWS: Update, set version number 4.4.1.
+ * configure.ac: set version number 4.4.1.
+
2008-03-10 Sergey Poznyakoff <gray@gnu.org.ua>
diff --git a/NEWS b/NEWS
index 674dbae4..a212fcc2 100644
--- a/NEWS
+++ b/NEWS
@@ -1,2 +1,2 @@
-Mailfromd NEWS -- history of user-visible changes. 2008-03-10
+Mailfromd NEWS -- history of user-visible changes. 2008-09-09
Copyright (C) 2005, 2006, 2007, 2008 Sergey Poznyakoff
@@ -7,2 +7,7 @@ Please send mailfromd bug reports to <bug-mailfromd@gnu.org.ua>
+Version 4.4.1
+
+* Fix stack reallocation.
+
+
Version 4.4, 2008-03-10
diff --git a/configure.ac b/configure.ac
index 5a146171..5a6e224c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -19,3 +19,3 @@ m4_define([MF_VERSION_MAJOR], 4)
m4_define([MF_VERSION_MINOR], 4)
-dnl m4_define([MF_VERSION_PATCH], 0)
+m4_define([MF_VERSION_PATCH], 1)
AC_INIT([mailfromd],
diff --git a/src/bi_sieve.m4 b/src/bi_sieve.m4
index 04ae8f95..0c5af274 100644
--- a/src/bi_sieve.m4
+++ b/src/bi_sieve.m4
diff --git a/src/bi_sprintf.m4 b/src/bi_sprintf.m4
index afd63d32..051d2dc4 100644
--- a/src/bi_sprintf.m4
+++ b/src/bi_sprintf.m4
@@ -152,4 +152,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
if (*q == '$') {
- num = (unsigned) MF_VA_ARG(n-1,
- NUMBER);
+ MF_VA_ARG(n-1, NUMBER, num);
p = q + 1;
@@ -163,3 +162,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
}
- num = MF_VA_ARG(i, NUMBER);
+ MF_VA_ARG(i, NUMBER, num);
i++;
@@ -195,3 +194,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
if (*q == '$') {
- num = MF_VA_ARG(n-1, NUMBER);
+ MF_VA_ARG(n-1, NUMBER, num);
if (num > 0)
@@ -202,3 +201,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
}
- num = MF_VA_ARG(i, NUMBER);
+ MF_VA_ARG(i, NUMBER, num);
i++;
@@ -213,3 +212,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
case 's':
- str = MF_VA_ARG(argnum,STRING);
+ MF_VA_ARG(argnum, STRING, str);
n = strlen(str);
@@ -237,3 +236,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
case 'd':
- num = MF_VA_ARG(argnum,NUMBER);
+ MF_VA_ARG(argnum, NUMBER, num);
if (num < 0) {
@@ -292,3 +291,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
case 'u':
- num = MF_VA_ARG(argnum,NUMBER);
+ MF_VA_ARG(argnum, NUMBER, num);
/* If a precision is given with a
@@ -325,3 +324,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
case 'X':
- num = MF_VA_ARG(argnum,NUMBER);
+ MF_VA_ARG(argnum, NUMBER, num);
/* If a precision is given with a
@@ -371,3 +370,3 @@ MF_DEFUN_VARARGS(sprintf, STRING, STRING format)
case 'o':
- num = MF_VA_ARG(argnum,NUMBER);
+ MF_VA_ARG(argnum, NUMBER, num);
/* If a precision is given with a
diff --git a/src/prog.c b/src/prog.c
index 26621102..9dc17daa 100644
--- a/src/prog.c
+++ b/src/prog.c
@@ -237,2 +237,6 @@ disable_prog_trace(const char *modlist)
+/* Max. number of C locals to save in struct eval_environ for eventual fixups.
+ See comment to env_fixup_autos, below. */
+#define MAX_AUTO_PTR 128
+
struct eval_environ {
@@ -256,2 +260,6 @@ struct eval_environ {
+ STKVAL *auto_ptr[MAX_AUTO_PTR]; /* Pointers to C automatic variables
+ referring to dataseg. */
+ size_t numautos; /* Number of entries in auto_ptr. */
+
/* Sendmail interaction data: */
@@ -330,2 +338,40 @@ env_get_stream(eval_environ_t env)
+
+/* A call to expand_dataseg (see below) invalidates any C variables that
+ pointed to dataseg before the call. To avoid dereferencing invalid memory
+ pointers, the addresses of such C variables are stored in env->auto_ptr
+ using env_register_auto (it is done by get_string_arg). When
+ expand_dataseg is called, it calls env_fixup_autos and passes it the
+ offset of new dataseg from old one. env_fixup_autos adds this value to
+ every address in auto_ptr, thereby fixing them.
+
+ The auto_ptr array is cleared (by calling env_unregister_autos) after
+ executing each instruction (see eval_environment).
+ */
+void
+env_register_auto(eval_environ_t env, void *ptr)
+{
+ if (env->numautos == MAX_AUTO_PTR)
+ runtime_error(env, "INTERNAL ERROR at %s:%d, please report",
+ __FILE__, __LINE__);
+ env->auto_ptr[env->numautos++] = ptr;
+}
+
+void
+env_unregister_autos(eval_environ_t env)
+{
+ env->numautos = 0;
+}
+
+void
+env_fixup_autos(eval_environ_t env, ptrdiff_t offset)
+{
+ int i;
+ for (i = 0; i < env->numautos; i++) {
+ STKVAL *pptr = env->auto_ptr[i];
+ *pptr += offset;
+ }
+}
+
+
#define STACK_EXPAND_BLOCK 64
@@ -336,2 +382,4 @@ expand_dataseg(eval_environ_t env, size_t count, const char *errtext)
STKVAL *newds;
+ ptrdiff_t offset;
+
count = ((count + STACK_EXPAND_BLOCK - 1) / STACK_EXPAND_BLOCK)
@@ -348,2 +396,3 @@ expand_dataseg(eval_environ_t env, size_t count, const char *errtext)
+ offset = (char*)newds - (char*)env->dataseg;
env->dataseg = newds;
@@ -355,2 +404,3 @@ expand_dataseg(eval_environ_t env, size_t count, const char *errtext)
* sizeof newds[0]);
+ env_fixup_autos(env, offset);
mu_error(_("Warning: stack segment expanded, new size=%lu"),
@@ -464,6 +514,7 @@ get_immediate(eval_environ_t env, unsigned n)
-const char *
-get_literal(eval_environ_t env, unsigned n)
+void
+get_literal(eval_environ_t env, unsigned n, const char **p)
{
- return (char*)(env->dataseg + (size_t) get_immediate(env, n));
+ *p = (char*)(env->dataseg + (size_t) get_immediate(env, n));
+ env_register_auto(env, p);
}
@@ -476,12 +527,19 @@ get_arg(eval_environ_t env, unsigned n)
-char *
-get_string_arg(eval_environ_t env, unsigned n)
+void
+get_string_arg(eval_environ_t env, unsigned n, char **p)
{
- return (char*) (env->dataseg + (size_t) get_arg(env, n));
+ *p = (char*) (env->dataseg + (size_t) get_arg(env, n));
+ env_register_auto(env, p);
}
-size_t
-get_numeric_arg(eval_environ_t env, unsigned n)
+void
+get_numeric_arg(eval_environ_t env, unsigned n, long *np)
{
- return (size_t) get_arg(env, n);
+ *np = (long) get_arg(env, n);
+}
+
+void
+get_pointer_arg(eval_environ_t env, unsigned n, void **p)
+{
+ *p = (void*) get_arg(env, n);
}
@@ -494,3 +552,2 @@ push(eval_environ_t env, STKVAL val)
__FILE__, __LINE__);
-
if (env->tos == env->toh) {
@@ -593,4 +650,4 @@ instr_locus(eval_environ_t env)
{
- env->locus.file = get_literal(env, 0);
env->locus.line = (size_t) get_immediate(env, 1);
+ get_literal(env, 0, &env->locus.file);
if (PROG_TRACE_ENGINE)
@@ -689,2 +746,10 @@ instr_stkalloc(eval_environ_t env)
prog_trace(env, "STKALLOC %p", n);
+ if (env->tos - n < env->toh) {
+ debug3(100, "tos=%lu, toh=%lu, delta=%u",
+ (unsigned long) env->tos,
+ (unsigned long) env->toh,
+ n);
+ expand_dataseg(env, env->toh - (env->tos - n),
+ _("Out of stack space; increase #pragma stacksize"));
+ }
env->tos -= n;
@@ -745,5 +810,8 @@ instr_ston(eval_environ_t env)
{
- char *s = get_string_arg(env, 0);
+ char *s;
char *p;
- long v = strtol(s, &p, 0);
+ long v;
+
+ get_string_arg(env, 0, &s);
+ v = strtol(s, &p, 0);
@@ -763,3 +831,3 @@ instr_ntos(eval_environ_t env)
{
- long v = (long) get_numeric_arg(env, 0);
+ long v = (long) get_arg(env, 0);
char buf[NUMERIC_BUFSIZE_BOUND];
@@ -778,4 +846,4 @@ instr_cmp(eval_environ_t env)
{
- long l = (long) get_numeric_arg(env, 1);
- long r = (long) get_numeric_arg(env, 0);
+ long l = (long) get_arg(env, 1);
+ long r = (long) get_arg(env, 0);
adjust_stack(env, 2);
@@ -789,4 +857,6 @@ instr_symbol(eval_environ_t env)
{
- char *symbol = (char *) get_literal(env, 0);
- char *s = env->getsym(env->data, symbol);
+ char *symbol, *s;
+
+ get_literal(env, 0, (const char **)&symbol);
+ s = env->getsym(env->data, symbol);
@@ -817,4 +887,4 @@ instr_eqn(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -828,4 +898,5 @@ instr_eqs(eval_environ_t env)
{
- char *a = get_string_arg(env, 1);
- char *b = get_string_arg(env, 0);
+ char *a, *b;
+ get_string_arg(env, 1, &a);
+ get_string_arg(env, 0, &b);
if (PROG_TRACE_ENGINE)
@@ -839,4 +910,4 @@ instr_nen(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -850,4 +921,6 @@ instr_nes(eval_environ_t env)
{
- char *a = get_string_arg(env, 1);
- char *b = get_string_arg(env, 0);
+ char *a, *b;
+
+ get_string_arg(env, 1, &a);
+ get_string_arg(env, 0, &b);
if (PROG_TRACE_ENGINE)
@@ -861,4 +934,4 @@ instr_ltn(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -872,4 +945,6 @@ instr_lts(eval_environ_t env)
{
- char *a = get_string_arg(env, 1);
- char *b = get_string_arg(env, 0);
+ char *a, *b;
+
+ get_string_arg(env, 1, &a);
+ get_string_arg(env, 0, &b);
if (PROG_TRACE_ENGINE)
@@ -883,4 +958,4 @@ instr_len(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -894,4 +969,6 @@ instr_les(eval_environ_t env)
{
- char *a = get_string_arg(env, 1);
- char *b = get_string_arg(env, 0);
+ char *a, *b;
+
+ get_string_arg(env, 1, &a);
+ get_string_arg(env, 0, &b);
if (PROG_TRACE_ENGINE)
@@ -905,4 +982,4 @@ instr_gtn(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -916,4 +993,6 @@ instr_gts(eval_environ_t env)
{
- char *a = get_string_arg(env, 1);
- char *b = get_string_arg(env, 0);
+ char *a, *b;
+
+ get_string_arg(env, 1, &a);
+ get_string_arg(env, 0, &b);
if (PROG_TRACE_ENGINE)
@@ -927,4 +1006,4 @@ instr_gen(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -938,4 +1017,6 @@ instr_ges(eval_environ_t env)
{
- char *a = get_string_arg(env, 1);
- char *b = get_string_arg(env, 0);
+ char *a, *b;
+
+ get_string_arg(env, 1, &a);
+ get_string_arg(env, 0, &b);
if (PROG_TRACE_ENGINE)
@@ -950,3 +1031,3 @@ instr_bz(eval_environ_t env)
{
- long v = (long) get_numeric_arg(env, 0);
+ long v = (long) get_arg(env, 0);
long off = (long) get_immediate(env, 0);
@@ -970,3 +1051,3 @@ instr_bnz(eval_environ_t env)
{
- long v = (long) get_numeric_arg(env, 0);
+ long v = (long) get_arg(env, 0);
long off = (long) get_immediate(env, 0);
@@ -994,3 +1075,3 @@ instr_not(eval_environ_t env)
{
- long v = (long) get_numeric_arg(env, 0);
+ long v = (long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -1005,4 +1086,4 @@ instr_logand(eval_environ_t env)
{
- unsigned long a = (unsigned long) get_numeric_arg(env, 1);
- unsigned long b = (unsigned long) get_numeric_arg(env, 0);
+ unsigned long a = (unsigned long) get_arg(env, 1);
+ unsigned long b = (unsigned long) get_arg(env, 0);
adjust_stack(env, 2);
@@ -1016,4 +1097,4 @@ instr_logor(eval_environ_t env)
{
- unsigned long a = (unsigned long) get_numeric_arg(env, 1);
- unsigned long b = (unsigned long) get_numeric_arg(env, 0);
+ unsigned long a = (unsigned long) get_arg(env, 1);
+ unsigned long b = (unsigned long) get_arg(env, 0);
adjust_stack(env, 2);
@@ -1027,4 +1108,4 @@ instr_logxor(eval_environ_t env)
{
- unsigned long a = (unsigned long) get_numeric_arg(env, 1);
- unsigned long b = (unsigned long) get_numeric_arg(env, 0);
+ unsigned long a = (unsigned long) get_arg(env, 1);
+ unsigned long b = (unsigned long) get_arg(env, 0);
adjust_stack(env, 2);
@@ -1038,3 +1119,3 @@ instr_lognot(eval_environ_t env)
{
- unsigned long v = (unsigned long) get_numeric_arg(env, 0);
+ unsigned long v = (unsigned long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -1049,4 +1130,4 @@ instr_add(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
adjust_stack(env, 2);
@@ -1060,4 +1141,4 @@ instr_sub(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
adjust_stack(env, 2);
@@ -1071,4 +1152,4 @@ instr_mul(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
adjust_stack(env, 2);
@@ -1082,4 +1163,4 @@ instr_div(eval_environ_t env)
{
- long a = (long) get_numeric_arg(env, 1);
- long b = (long) get_numeric_arg(env, 0);
+ long a = (long) get_arg(env, 1);
+ long b = (long) get_arg(env, 0);
adjust_stack(env, 2);
@@ -1096,3 +1177,3 @@ instr_neg(eval_environ_t env)
{
- long v = (long) get_numeric_arg(env, 0);
+ long v = (long) get_arg(env, 0);
if (PROG_TRACE_ENGINE)
@@ -1137,5 +1218,7 @@ instr_regmatch(eval_environ_t env)
int v;
- size_t index = (size_t)get_numeric_arg(env, 0);
+ size_t index = (size_t)get_arg(env, 0);
regex_t *re = &regtab[index].re;
- char *string = get_string_arg(env, 1);
+ char *string;
+
+ get_string_arg(env, 1, &string);
adjust_stack(env, 2);
@@ -1169,3 +1252,3 @@ instr_regcomp(eval_environ_t env)
size_t expr_off = (size_t)get_arg(env, 0);
- char *expr = get_string_arg(env, 0);
+ char *expr;
size_t index = (size_t) get_immediate(env, 0);
@@ -1173,2 +1256,4 @@ instr_regcomp(eval_environ_t env)
+ get_string_arg(env, 0, &expr);
+
advance_pc(env, 1);
@@ -1213,4 +1298,6 @@ instr_fnmatch(eval_environ_t env)
{
- char *string = get_string_arg(env, 1);
- char *pattern = get_string_arg(env, 0);
+ char *string, *pattern;
+
+ get_string_arg(env, 1, &string);
+ get_string_arg(env, 0, &pattern);
adjust_stack(env, 2);
@@ -1260,4 +1347,6 @@ instr_fnmatch_mx(eval_environ_t env)
{
- char *string = get_string_arg(env, 1);
- char *pattern = get_string_arg(env, 0);
+ char *string, *pattern;
+
+ get_string_arg(env, 1, &string);
+ get_string_arg(env, 0, &pattern);
adjust_stack(env, 2);
@@ -1279,5 +1368,7 @@ instr_regmatch_mx(eval_environ_t env)
int rc;
- size_t index = (size_t)get_numeric_arg(env, 0);
+ size_t index = (size_t)get_arg(env, 0);
regex_t *re = &regtab[index].re;
- char *string = get_string_arg(env, 1);
+ char *string;
+
+ get_string_arg(env, 1, &string);
adjust_stack(env, 2);
@@ -1309,5 +1400,8 @@ instr_result(eval_environ_t env)
sfsistat status = (sfsistat) get_immediate(env, 0);
- char *code = (char *) get_literal(env, 1);
- char *xcode = (char *) get_literal(env, 2);
- char *message = get_string_arg(env, 0);
+ char *code, *xcode;
+ char *message;
+
+ get_string_arg(env, 0, &message);
+ get_literal(env, 1, (const char**)&code);
+ get_literal(env, 2, (const char**)&xcode);
@@ -1352,6 +1446,8 @@ instr_header(eval_environ_t env)
struct old_header_node *hdr = xmalloc (sizeof(*hdr));
+ char *value;
hdr->opcode = (enum header_opcode) get_immediate(env, 0);
- hdr->name = get_literal(env, 1);
- hdr->value = strdup(get_string_arg(env, 0));
+ get_literal(env, 1, &hdr->name);
+ get_string_arg(env, 0, &value);
+ hdr->value = strdup(value);
@@ -1384,5 +1480,6 @@ instr_builtin(eval_environ_t env)
{
- const char *name = get_literal(env, 0);
+ const char *name;
void (*handler)(eval_environ_t) = get_immediate(env, 1);
+ get_literal(env, 0, &name);
if (PROG_TRACE_ENGINE)
@@ -1402,6 +1499,10 @@ instr_concat(eval_environ_t env)
{
- char *left = get_string_arg(env, 1);
- char *right = get_string_arg(env, 0);
- size_t off = heap_reserve(env, strlen(left) + strlen(right) + 1);
- char *res = (char*) env_data_ref(env, off);
+ char *left, *right;
+ size_t off;
+ char *res;
+
+ get_string_arg(env, 1, &left);
+ get_string_arg(env, 0, &right);
+ off = heap_reserve(env, strlen(left) + strlen(right) + 1);
+ res = (char*) env_data_ref(env, off);
@@ -1424,3 +1525,3 @@ instr_asgn(eval_environ_t env)
STKVAL val = get_arg(env, 1);
- size_t dest = get_numeric_arg(env, 0);
+ size_t dest = (size_t) get_arg(env, 0);
adjust_stack(env, 2);
@@ -1578,4 +1679,5 @@ instr_funcall(eval_environ_t env)
{
- const char *name = get_literal(env, 0);
+ const char *name;
prog_counter_t pc = (prog_counter_t) get_immediate(env, 1);
+ get_literal(env, 0, &name);
advance_pc(env, 2);
@@ -1762,2 +1864,4 @@ env_init(eval_environ_t env)
+ env->numautos = 0;
+
/* Initialize catch functions */
@@ -1808,4 +1912,6 @@ eval_environment(eval_environ_t env, prog_counter_t start)
break;
- if (setjmp(env->catch_jmp) == 0)
+ if (setjmp(env->catch_jmp) == 0) {
(*(prog[env->pc]))(env);
+ env_unregister_autos(env);
+ }
}
diff --git a/src/prog.h b/src/prog.h
index c18ab87c..ef972826 100644
--- a/src/prog.h
+++ b/src/prog.h
@@ -33,4 +33,4 @@ void runtime_error(eval_environ_t env, const char *fmt, ...)
STKVAL get_arg(eval_environ_t env, unsigned n);
-char *get_string_arg(eval_environ_t env, unsigned n);
-size_t get_numeric_arg(eval_environ_t env, unsigned n);
+void get_string_arg(eval_environ_t env, unsigned n, char **ptr);
+void get_numeric_arg(eval_environ_t env, unsigned n, long *np);
void push(eval_environ_t env, STKVAL val);
diff --git a/src/snarf.m4 b/src/snarf.m4
index 6d419326..7ceb4af1 100644
--- a/src/snarf.m4
+++ b/src/snarf.m4
@@ -81,12 +81,39 @@ m4_define([<__mf_c_getarg>],m4_dnl
/* mf_c_argdcl(TYPE NAME) -- translate Mailfromd declaration "TYPE NAME"
- * into the corresponding C one, followed by an equals sign, a typecast,
- * and the name of corresponding get_.*_arg function
- * e.g.:
- * mf_c_argdcl(STRING str) => char *str = (char*) get_string_arg
+ * into the corresponding C one:
+ *
+ * mf_c_argdcl(STRING str) => char *str
*/
m4_define([<mf_c_argdcl>],m4_dnl
-[<m4_regexp([<$1>],[<\(\w+\)\W+\(\w+\)>],[<__mf_c_type(\1)>] \2 = ([<__mf_c_type(\1)>]) [<__mf_c_getarg(\1)>])>])
+[<m4_regexp([<$1>],[<\(\w+\)\W+\(\w+\)>],[<__mf_c_type(\1)>] \2)>])
+
+/* mf_c_arginit(TYPE NAME, NUM) -- translate Mailfromd declaration "TYPE NAME"
+ * into the corresponding C initialization:
+ *
+ * mf_c_argdcl(STRING str) => get_string_arg(env, NUM, &str)
+ */
+m4_define([<mf_c_arginit>],m4_dnl
+[<m4_regexp([<$1>],[<\(\w+\)\W+\(\w+\)>],[<__mf_c_getarg(\1)(env, $2, &\2)>])>])
+
+/* __mf_c_argdcl_list(NARG, LIST) -- translate Mailfromd declaration list
+ * into a set of corresponding C variable declarations.
+ * For more details, see mf_c_arglist below.
+ */
+m4_define([<__mf_c_argdcl_list>],m4_dnl
+[<m4_ifelse($2, , ,$2,[<OPTIONAL>],[<m4_dnl
+__mf_c_argdcl_list($1, m4_shift(m4_shift($@)))>],
+[<mf_c_argdcl($2);
+ __mf_c_argdcl_list(m4_incr($1), m4_shift(m4_shift($@)))>])>])
+
+/* __mf_c_arginit_list(NARG, LIST) -- translate Mailfromd declaration list
+ * into a set of corresponding C variable initializations.
+ * For more details, see mf_c_arglist below.
+ */
+m4_define([<__mf_c_arginit_list>],m4_dnl
+[<m4_ifelse($2, , ,$2,[<OPTIONAL>],[<m4_dnl
+__mf_c_arginit_list($1, m4_shift(m4_shift($@)))>],
+[<mf_c_arginit($2, m4_eval($1));
+ __mf_c_arginit_list(m4_incr($1), m4_shift(m4_shift($@)))>])>])
/* __mf_c_arglist(NARG, LIST) -- translate Mailfromd declaration list
- * into a set of corresponding C variable declarations with initializations.
+ * into a set of corresponding C variable declarations and initializations.
* Arguments:
@@ -95,7 +122,4 @@ m4_define([<mf_c_argdcl>],m4_dnl
*/
-m4_define([<__mf_c_arglist>],m4_dnl
-[<m4_ifelse($2, , ,$2,[<OPTIONAL>],[<m4_dnl
-__mf_c_arglist($1, m4_shift(m4_shift($@)))>],
-[<mf_c_argdcl($2)(env, m4_eval($1));
- __mf_c_arglist(m4_incr($1), m4_shift(m4_shift($@)))>])>])
+m4_define([<__mf_c_arglist>],[<__mf_c_argdcl_list($@)
+__mf_c_arginit_list($@)>])
@@ -107,4 +131,6 @@ __mf_c_arglist($1, m4_shift(m4_shift($@)))>],
* mf_c_arglist(STRING a, NUMBER n) =>
- * char *a = (char*)get_string_arg(env, 0);
- * long n = (long)get_numeric_arg(env, 1);
+ * char *a;
+ * long n;
+ * get_string_arg(env, 0, &a);
+ * get_numeric_arg(env, 1, &n);
* adjust_stack(env, 2);
@@ -114,5 +140,8 @@ __mf_c_arglist($1, m4_shift(m4_shift($@)))>],
* mf_c_arglist(STRING a, NUMBER n) =>
- * long __bi_argcnt = (long)get_numeric_arg(env, 0);
- * char *a = (char*)get_string_arg(env, 1);
- * long n = (long)get_numeric_arg(env, 2);
+ * long __bi_argcnt;
+ * char *a;
+ * long n;
+ * get_string_arg(env, 1, &a);
+ * get_numeric_arg(env, 2, &n);
+ * get_numeric_arg(env, 0, &__bi_argcnt);
* adjust_stack(env, __bi_argcnt + 1);
@@ -122,4 +151,5 @@ m4_define([<mf_c_arglist>],m4_dnl
m4_pushdef([<__ARG1__>], m4_ifelse(__MF_VARARGS__,1,1,[<__mf_has_optarg($@)>]))
-m4_ifelse(__ARG1__,0,,[<long __bi_argcnt = (long)get_numeric_arg(env, 0);>])
+m4_ifelse(__ARG1__,0,,[<long __bi_argcnt;>])
__mf_c_arglist(__ARG1__, $@)
+m4_ifelse(__ARG1__,0,,[<get_numeric_arg(env, 0, &__bi_argcnt);>])
adjust_stack(env, m4_ifelse(__ARG1__,0,mf_argcount($@),__bi_argcnt + 1));
@@ -431,4 +461,4 @@ m4_define([<__mf_error_code>],1)>])>])
-/* MF_VA_ARG(N, TYPE) -- Produce a code for returning Nth argument of the
- given TYPE in a vararg section. */
+/* MF_VA_ARG(N, TYPE, VAR) -- Produce a code for assigning to VAR the Nth
+ argument of the given TYPE in a vararg section. */
m4_define([<MF_VA_ARG>],[<m4_dnl
@@ -437,3 +467,3 @@ m4_ifdef([<__MF_VA_START_USED__>],m4_dnl
((__bi_argcnt > __ARGN__) ?m4_dnl
- __mf_c_getarg($2)(env, __ARGN__ + 1) :m4_dnl
+ __mf_c_getarg($2)(env, __ARGN__ + 1, &$3) :m4_dnl
(MF_THROW(mfe_range, "Argument %d is not supplied", __ARGN__),m4_dnl

Return to:

Send suggestions and report system problems to the System administrator.