diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-03-31 17:22:01 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-03-31 17:22:01 +0000 |
commit | 5633a8204a428a28582225810f215b23445037d5 (patch) | |
tree | 1c83499b3c1031aff88ea5a61ab59fa23e0cfb8a | |
parent | 0bed9472b34d72347089dee1d0ce6f3d3bb65496 (diff) | |
download | mailfromd-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-- | ChangeLog | 3 | ||||
-rw-r--r-- | src/prog.c | 148 | ||||
-rw-r--r-- | src/prog.h | 2 | ||||
-rw-r--r-- | src/snarf.m4 | 21 |
4 files changed, 99 insertions, 75 deletions
@@ -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, @@ -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 = ®tab[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 = ®tab[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 = ®tab[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)); @@ -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 [< |