aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2007-03-31 17:22:01 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2007-03-31 17:22:01 +0000
commit5633a8204a428a28582225810f215b23445037d5 (patch)
tree1c83499b3c1031aff88ea5a61ab59fa23e0cfb8a
parent0bed9472b34d72347089dee1d0ce6f3d3bb65496 (diff)
downloadmailfromd-5633a8204a428a28582225810f215b23445037d5.tar.gz
mailfromd-5633a8204a428a28582225810f215b23445037d5.tar.bz2
Use different argument accessors for different argument types
git-svn-id: file:///svnroot/mailfromd/trunk@1329 7a8a7f39-df28-0410-adc6-e0d955640f24
-rw-r--r--ChangeLog3
-rw-r--r--src/prog.c148
-rw-r--r--src/prog.h2
-rw-r--r--src/snarf.m421
4 files changed, 99 insertions, 75 deletions
diff --git a/ChangeLog b/ChangeLog
index 082a7486..be99f994 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2007-03-31 Sergey Poznyakoff <gray@gnu.org.ua>
+ * src/snarf.m4, src/prog.c, src/prog.h: Use different argument
+ accessors for different argument types.
+
* src/drivers.c (code_type_bin, code_type_regex,
optimize_type_regcomp, code_type_regcomp), src/mailfromd.h (struct
regcomp_data), src/prog.c (register_regex, instr_regex,
diff --git a/src/prog.c b/src/prog.c
index 386feb4b..780e3bf6 100644
--- a/src/prog.c
+++ b/src/prog.c
@@ -393,6 +393,18 @@ get_arg(eval_environ_t env, unsigned n)
return env->stack[env->tos - n - 1];
}
+char *
+get_string_arg(eval_environ_t env, unsigned n)
+{
+ return (char*) get_arg(env, n);
+}
+
+size_t
+get_numeric_arg(eval_environ_t env, unsigned n)
+{
+ return get_arg(env, n);
+}
+
void
push(eval_environ_t env, STKVAL val)
{
@@ -577,9 +589,9 @@ dump_memext(prog_counter_t i)
void
instr_mem(eval_environ_t env)
{
- size_t frame = (size_t) get_arg(env, 2);
- size_t off = (size_t) get_arg(env, 1);
- storage_class_t class = (storage_class_t) get_arg(env, 0);
+ size_t frame = (size_t) get_numeric_arg(env, 2);
+ size_t off = (size_t) get_numeric_arg(env, 1);
+ storage_class_t class = (storage_class_t) get_numeric_arg(env, 0);
adjust_stack(env, 3);
if (PROG_TRACE_ENGINE)
@@ -698,7 +710,7 @@ instr_ston(eval_environ_t env)
void
instr_ntos(eval_environ_t env)
{
- long v = (long) get_arg(env, 0);
+ long v = (long) get_numeric_arg(env, 0);
char buf[NUMERIC_BUFSIZE_BOUND];
if (PROG_TRACE_ENGINE)
@@ -713,8 +725,8 @@ instr_ntos(eval_environ_t env)
void
instr_cmp(eval_environ_t env)
{
- long l = (long) get_arg(env, 1);
- long r = (long) get_arg(env, 0);
+ long l = (long) get_numeric_arg(env, 1);
+ long r = (long) get_numeric_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "CMP %ld %ld", l, r);
@@ -754,8 +766,8 @@ dump_symbol(prog_counter_t i)
void
instr_eqn(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "EQN %ld %ld", a, b);
adjust_stack(env, 2);
@@ -765,8 +777,8 @@ instr_eqn(eval_environ_t env)
void
instr_eqs(eval_environ_t env)
{
- char *a = (char*) get_arg(env, 1);
- char *b = (char*) get_arg(env, 0);
+ char *a = get_string_arg(env, 1);
+ char *b = get_string_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "EQS %s %s", a, b);
adjust_stack(env, 2);
@@ -776,8 +788,8 @@ instr_eqs(eval_environ_t env)
void
instr_nen(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "NEN %ld %ld", a, b);
adjust_stack(env, 2);
@@ -787,8 +799,8 @@ instr_nen(eval_environ_t env)
void
instr_nes(eval_environ_t env)
{
- char *a = (char*) get_arg(env, 1);
- char *b = (char*) get_arg(env, 0);
+ char *a = get_string_arg(env, 1);
+ char *b = get_string_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "NES %s %s", a, b);
adjust_stack(env, 2);
@@ -798,8 +810,8 @@ instr_nes(eval_environ_t env)
void
instr_ltn(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "LTN %ld %ld", a, b);
adjust_stack(env, 2);
@@ -809,8 +821,8 @@ instr_ltn(eval_environ_t env)
void
instr_lts(eval_environ_t env)
{
- char *a = (char*) get_arg(env, 1);
- char *b = (char*) get_arg(env, 0);
+ char *a = get_string_arg(env, 1);
+ char *b = get_string_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "LTS %s %s", a, b);
adjust_stack(env, 2);
@@ -820,8 +832,8 @@ instr_lts(eval_environ_t env)
void
instr_len(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "LEN %ld %ld", a, b);
adjust_stack(env, 2);
@@ -831,8 +843,8 @@ instr_len(eval_environ_t env)
void
instr_les(eval_environ_t env)
{
- char *a = (char*) get_arg(env, 1);
- char *b = (char*) get_arg(env, 0);
+ char *a = get_string_arg(env, 1);
+ char *b = get_string_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "LES %s %s", a, b);
adjust_stack(env, 2);
@@ -842,8 +854,8 @@ instr_les(eval_environ_t env)
void
instr_gtn(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "GTN %ld %ld", a, b);
adjust_stack(env, 2);
@@ -853,8 +865,8 @@ instr_gtn(eval_environ_t env)
void
instr_gts(eval_environ_t env)
{
- char *a = (char*) get_arg(env, 1);
- char *b = (char*) get_arg(env, 0);
+ char *a = get_string_arg(env, 1);
+ char *b = get_string_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "GTS %s %s", a, b);
adjust_stack(env, 2);
@@ -864,8 +876,8 @@ instr_gts(eval_environ_t env)
void
instr_gen(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "GEN %ld %ld", a, b);
adjust_stack(env, 2);
@@ -875,8 +887,8 @@ instr_gen(eval_environ_t env)
void
instr_ges(eval_environ_t env)
{
- char *a = (char*) get_arg(env, 1);
- char *b = (char*) get_arg(env, 0);
+ char *a = get_string_arg(env, 1);
+ char *b = get_string_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "GES %s %s", a, b);
adjust_stack(env, 2);
@@ -887,7 +899,7 @@ instr_ges(eval_environ_t env)
void
instr_bz(eval_environ_t env)
{
- long v = (long) get_arg(env, 0);
+ long v = (long) get_numeric_arg(env, 0);
long off = (long) get_immediate(env, 0);
if (PROG_TRACE_ENGINE)
@@ -907,7 +919,7 @@ dump_branch (prog_counter_t i)
void
instr_bnz(eval_environ_t env)
{
- long v = (long) get_arg(env, 0);
+ long v = (long) get_numeric_arg(env, 0);
long off = (long) get_immediate(env, 0);
if (PROG_TRACE_ENGINE)
@@ -931,7 +943,7 @@ instr_jmp(eval_environ_t env)
void
instr_not(eval_environ_t env)
{
- long v = (long) get_arg(env, 0);
+ long v = (long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "NOT %ld", v);
adjust_stack(env, 1);
@@ -942,8 +954,8 @@ instr_not(eval_environ_t env)
void
instr_logand(eval_environ_t env)
{
- unsigned long a = (unsigned long) get_arg(env, 1);
- unsigned long b = (unsigned long) get_arg(env, 0);
+ unsigned long a = (unsigned long) get_numeric_arg(env, 1);
+ unsigned long b = (unsigned long) get_numeric_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "LOGAND %lu %lu", a, b);
@@ -953,8 +965,8 @@ instr_logand(eval_environ_t env)
void
instr_logor(eval_environ_t env)
{
- unsigned long a = (unsigned long) get_arg(env, 1);
- unsigned long b = (unsigned long) get_arg(env, 0);
+ unsigned long a = (unsigned long) get_numeric_arg(env, 1);
+ unsigned long b = (unsigned long) get_numeric_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "LOGOR %lu %lu", a, b);
@@ -964,8 +976,8 @@ instr_logor(eval_environ_t env)
void
instr_logxor(eval_environ_t env)
{
- unsigned long a = (unsigned long) get_arg(env, 1);
- unsigned long b = (unsigned long) get_arg(env, 0);
+ unsigned long a = (unsigned long) get_numeric_arg(env, 1);
+ unsigned long b = (unsigned long) get_numeric_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "LOGXOR %lu %lu", a, b);
@@ -975,7 +987,7 @@ instr_logxor(eval_environ_t env)
void
instr_lognot(eval_environ_t env)
{
- unsigned long v = (unsigned long) get_arg(env, 0);
+ unsigned long v = (unsigned long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "LOGNOT %ld", v);
adjust_stack(env, 1);
@@ -986,8 +998,8 @@ instr_lognot(eval_environ_t env)
void
instr_add(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "ADD %ld %ld", a, b);
@@ -997,8 +1009,8 @@ instr_add(eval_environ_t env)
void
instr_sub(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "SUB %ld %ld", a, b);
@@ -1008,8 +1020,8 @@ instr_sub(eval_environ_t env)
void
instr_mul(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "MUL %ld %ld", a, b);
@@ -1019,8 +1031,8 @@ instr_mul(eval_environ_t env)
void
instr_div(eval_environ_t env)
{
- long a = (long) get_arg(env, 1);
- long b = (long) get_arg(env, 0);
+ long a = (long) get_numeric_arg(env, 1);
+ long b = (long) get_numeric_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "DIV %ld %ld", a, b);
@@ -1033,7 +1045,7 @@ instr_div(eval_environ_t env)
void
instr_neg(eval_environ_t env)
{
- long v = (long) get_arg(env, 0);
+ long v = (long) get_numeric_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "NEG %ld", v);
adjust_stack(env, 1);
@@ -1075,9 +1087,9 @@ void
instr_regmatch(eval_environ_t env)
{
int v;
- size_t index = (size_t)get_arg(env, 0);
+ size_t index = (size_t)get_numeric_arg(env, 0);
regex_t *re = &regtab[index].re;
- char *string = get_arg(env, 1);
+ char *string = get_string_arg(env, 1);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE) /*FIXME: print string instead of %p */
@@ -1106,7 +1118,7 @@ instr_regcomp(eval_environ_t env)
int v;
regex_t *re;
char buffer[REGEX_STRING_BUFSIZE];
- char *expr = get_arg(env, 0);
+ char *expr = get_string_arg(env, 0);
size_t index = (size_t) get_immediate(env, 0);
struct rt_regex *rtx = &regtab[index];
@@ -1148,8 +1160,8 @@ dump_regcomp(prog_counter_t i)
void
instr_fnmatch(eval_environ_t env)
{
- char *string = get_arg(env, 1);
- char *pattern = get_arg(env, 0);
+ char *string = get_string_arg(env, 1);
+ char *pattern = get_string_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
prog_trace(env, "FNMATCH %s %s", string, pattern);
@@ -1195,8 +1207,8 @@ fn_matcher(const char *string, void *data)
void
instr_fnmatch_mx(eval_environ_t env)
{
- char *string = get_arg(env, 1);
- char *pattern = get_arg(env, 0);
+ char *string = get_string_arg(env, 1);
+ char *pattern = get_string_arg(env, 0);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE)
@@ -1214,9 +1226,9 @@ void
instr_regmatch_mx(eval_environ_t env)
{
int rc;
- size_t index = (size_t)get_arg(env, 0);
+ size_t index = (size_t)get_numeric_arg(env, 0);
regex_t *re = &regtab[index].re;
- char *string = get_arg(env, 1);
+ char *string = get_string_arg(env, 1);
adjust_stack(env, 2);
if (PROG_TRACE_ENGINE) /*FIXME: print string instead of %p */
@@ -1245,7 +1257,7 @@ 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 = (char *) get_arg(env, 0);
+ char *message = get_string_arg(env, 0);
if (PROG_TRACE_ENGINE)
prog_trace(env, "RESULT %d %s %s %s",
@@ -1289,7 +1301,7 @@ instr_header(eval_environ_t env)
hdr->opcode = (enum header_opcode) get_immediate(env, 0);
hdr->name = get_literal(env, 1);
- hdr->value = strdup((char *)get_arg(env, 0));
+ hdr->value = strdup(get_string_arg(env, 0));
advance_pc(env, 2);
adjust_stack(env, 1);
@@ -1336,8 +1348,8 @@ dump_builtin(prog_counter_t i)
void
instr_concat(eval_environ_t env)
{
- char *left = get_arg(env, 1);
- char *right = get_arg(env, 0);
+ char *left = get_string_arg(env, 1);
+ char *right = get_string_arg(env, 0);
char *res = heap_reserve(env, strlen(left) + strlen(right) + 1);
strcat(strcpy(res, left), right);
@@ -1415,7 +1427,7 @@ void
instr_throw(eval_environ_t env)
{
unsigned long n = (unsigned long) get_immediate(env, 0);
- char *str = get_arg(env, 0);
+ char *str = get_string_arg(env, 0);
advance_pc(env, 1);
adjust_stack(env, 1);
if (n > mf_status_count)
@@ -1433,7 +1445,7 @@ dump_throw(prog_counter_t i)
void
instr_echo(eval_environ_t env)
{
- char *str = (char*) get_arg(env, 0);
+ char *str = get_string_arg(env, 0);
logmsg(LOG_INFO, "%s", str);
}
@@ -2090,13 +2102,13 @@ create_environment(SMFICTX *ctx,
exit(1);
}
- env->stack = calloc(stack_size + datasize, sizeof env->stack[0]);
- if (!env->stack) {
+ env->dataseg = calloc(stack_size + datasize, sizeof env->stack[0]);
+ if (!env->dataseg) {
mu_error("Not enough memory");
exit(1);
}
- env->dataseg = env->stack + stack_size;
+ env->stack = env->dataseg + datasize;
init_dataseg(env->dataseg);
env->ctx = ctx;
@@ -2120,7 +2132,7 @@ create_environment(SMFICTX *ctx,
void
destroy_environment(eval_environ_t env)
{
- free(env->stack);
+ free(env->dataseg);
free(env->matches);
mu_stream_close(env->stream);
mu_stream_destroy(&env->stream, mu_stream_get_owner(env->stream));
diff --git a/src/prog.h b/src/prog.h
index be110c10..19c969a1 100644
--- a/src/prog.h
+++ b/src/prog.h
@@ -33,6 +33,8 @@ void runtime_warning(eval_environ_t env, const char *fmt, ...);
void runtime_error(eval_environ_t env, const char *fmt, ...)
ATTRIBUTE_NORETURN;
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 push(eval_environ_t env, STKVAL val);
STKVAL pop(eval_environ_t env);
STKVAL heap_reserve(eval_environ_t env, size_t size);
diff --git a/src/snarf.m4 b/src/snarf.m4
index 31a09a57..7d58163c 100644
--- a/src/snarf.m4
+++ b/src/snarf.m4
@@ -61,12 +61,18 @@ dnl
define([<__mf_c_type>],dnl
[<ifelse($1,STRING,char *,$1,NUMBER,long , ERROR )>])
+dnl __mf_c_getarg(TYPE) -- return a get_(.*)_arg function for the given MFL
+dnl TYPE
+define([<__mf_c_getarg>],dnl
+[<ifelse($1,STRING,get_string_arg,$1,NUMBER,get_numeric_arg, ERROR )>])
+
dnl mf_c_argdcl(TYPE NAME) -- translate Mailfromd declaration "TYPE NAME"
-dnl into the corresponding C one, followed by an equals sign and a typecast,
+dnl into the corresponding C one, followed by an equals sign, a typecast,
+dnl and the name of corresponding get_.*_arg function
dnl e.g.:
-dnl mf_c_argdcl(STRING str) => char *str = (char*)
+dnl mf_c_argdcl(STRING str) => char *str = (char*) get_string_arg
define([<mf_c_argdcl>],dnl
-[<regexp([<$1>],[<\(\w+\)\W+\(\w+\)>],[<__mf_c_type(\1)>] \2 = ([<__mf_c_type(\1)>]))>])
+[<regexp([<$1>],[<\(\w+\)\W+\(\w+\)>],[<__mf_c_type(\1)>] \2 = ([<__mf_c_type(\1)>]) [<__mf_c_getarg(\1)>])>])
dnl __mf_c_arglist(ARGC, NARG, LIST) -- translate Mailfromd declaration list
dnl into a set of corresponding C variable declarations with initializations.
@@ -78,7 +84,7 @@ dnl
define([<__mf_c_arglist>],dnl
[<ifelse($3, , ,$3,[<OPTIONAL>],[<dnl
__mf_c_arglist($1, $2, shift(shift(shift($@))))>],
-[<mf_c_argdcl($3) get_arg(env, eval($1 - $2));
+[<mf_c_argdcl($3)(env, eval($1 - $2));
__mf_c_arglist($1, incr($2), shift(shift(shift($@))))>])>])
dnl mf_c_arglist(LIST) -- translate Mailfromd declaration list
@@ -86,9 +92,10 @@ dnl into a set of corresponding C variable declarations with initializations.
dnl Insert an instruction to adjust the stack parameters after obtaining the
dnl variables.
dnl E.g.:
-dnl mf_c_arglist(STRING a, NUMBER n) => char *a = (char*)get_arg(env, 1);
-dnl long n = (long)get_arg(env, 0);
-dnl adjust_stack(env, 2);
+dnl mf_c_arglist(STRING a, NUMBER n) =>
+dnl char *a = (char*)get_string_arg(env, 1);
+dnl long n = (long)get_numeric_arg(env, 0);
+dnl adjust_stack(env, 2);
dnl
define([<mf_c_arglist>],dnl
[<

Return to:

Send suggestions and report system problems to the System administrator.