diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-09-08 21:20:39 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-09-08 21:20:39 +0000 |
commit | 4cd3031ed36e207ce341c0854636c9047cd35d24 (patch) | |
tree | 6e9274a96c5fdb0984a6822e351eb7230d3319ef | |
parent | da3381a039b1ab4878baa9e5fc9be39284a154f2 (diff) | |
download | mailfromd-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-- | ChangeLog | 10 | ||||
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/bi_sieve.m4 | 0 | ||||
-rw-r--r-- | src/bi_sprintf.m4 | 19 | ||||
-rw-r--r-- | src/prog.c | 272 | ||||
-rw-r--r-- | src/prog.h | 4 | ||||
-rw-r--r-- | src/snarf.m4 | 70 |
8 files changed, 267 insertions, 117 deletions
@@ -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> @@ -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 @@ -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 = ®tab[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 = ®tab[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); + } } @@ -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 |