diff --git a/legacy/embryo/examples/test.sma b/legacy/embryo/examples/test.sma index 262c81fc08..9c08cb422e 100644 --- a/legacy/embryo/examples/test.sma +++ b/legacy/embryo/examples/test.sma @@ -97,11 +97,43 @@ main() ret = testfn(12345, "A Test String", 7); printf("Done. Return value of testfn() was %i\n", ret); + printf("Test varargs...\n"); + vargs(1, 2, "hello", "there", 8, 9); + printf("\n\n"); return 7; } +vargs(a, b, ...) +{ + printf("ARGS...\n"); + printf(" a = %i\n", a); + printf(" b = %i\n", b); + for (new i = 2; i < numargs(); i++) + { + new val; + new str[100]; + + printf(" GET ARG... %i\n", i); + if (i < 4) + { + for (new j = 0; j < (sizeof(str) - 1); j++) + { + str[j] = getarg(i, j); + if (str[j] == 0) break; + } + printf(" ARG: %s [max %i]\n", str, sizeof(str)); + } + else + { + val = getarg(i); + printf(" ARG: %i\n", val); + } + } + printf("ARGS DONE.\n"); +} + recurse(val) { printf("Recurse: val = %i\n", val); diff --git a/legacy/embryo/include/default.inc b/legacy/embryo/include/default.inc index 704a348518..411131e044 100644 --- a/legacy/embryo/include/default.inc +++ b/legacy/embryo/include/default.inc @@ -32,6 +32,13 @@ enum Float_Angle_Mode RADIAN, DEGREES, GRADES }; +/* varags - get numebr of args to a function */ +native numargs(); +/* varags - get arg no "arg" */ +native getarg(arg, index=0); +/* varags - set arg no "arg" */ +native setarg(arg, index=0, value); + /* Convert a string into a floating point value */ native Float:atof(const string[]); /* Return the fractional part of a float */ diff --git a/legacy/embryo/src/lib/Makefile.am b/legacy/embryo/src/lib/Makefile.am index e27169c3d8..2575d6e38e 100644 --- a/legacy/embryo/src/lib/Makefile.am +++ b/legacy/embryo/src/lib/Makefile.am @@ -17,6 +17,7 @@ lib_LTLIBRARIES = libembryo.la include_HEADERS = Embryo.h libembryo_la_SOURCES = \ embryo_amx.c \ +embryo_args.c \ embryo_float.c \ embryo_main.c \ embryo_rand.c \ diff --git a/legacy/embryo/src/lib/embryo_amx.c b/legacy/embryo/src/lib/embryo_amx.c index 7b7ff3e004..ed05f3054b 100644 --- a/legacy/embryo/src/lib/embryo_amx.c +++ b/legacy/embryo/src/lib/embryo_amx.c @@ -196,6 +196,7 @@ _embryo_program_init(Embryo_Program *ep, void *code) } #endif /* init native api for handling floating point - default in embryo */ + _embryo_args_init(ep); _embryo_fp_init(ep); _embryo_rand_init(ep); _embryo_str_init(ep); diff --git a/legacy/embryo/src/lib/embryo_args.c b/legacy/embryo/src/lib/embryo_args.c new file mode 100644 index 0000000000..251da41273 --- /dev/null +++ b/legacy/embryo/src/lib/embryo_args.c @@ -0,0 +1,62 @@ +#include "embryo_private.h" + +/* exported args api */ + +static Embryo_Cell +_embryo_args_numargs(Embryo_Program *ep, Embryo_Cell *params) +{ + Embryo_Header *hdr; + unsigned char *data; + Embryo_Cell bytes; + + hdr = (Embryo_Header *)ep->base; + data = ep->base + (int)hdr->dat; + bytes = *(Embryo_Cell *)(data + (int)ep->frm + + (2 * sizeof(Embryo_Cell))); + return bytes / sizeof(Embryo_Cell); +} + +static Embryo_Cell +_embryo_args_getarg(Embryo_Program *ep, Embryo_Cell *params) +{ + Embryo_Header *hdr; + unsigned char *data; + Embryo_Cell val; + + if (params[0] != (2 * sizeof(Embryo_Cell))) return 0; + hdr = (Embryo_Header *)ep->base; + data = ep->base + (int)hdr->dat; + val = *(Embryo_Cell *)(data + (int)ep->frm + + (((int)params[1] + 3) * sizeof(Embryo_Cell))); + val += params[2] * sizeof(Embryo_Cell); + val = *(Embryo_Cell *)(data + (int)val); + return val; +} + +static Embryo_Cell +_embryo_args_setarg(Embryo_Program *ep, Embryo_Cell *params) +{ + Embryo_Header *hdr; + unsigned char *data; + Embryo_Cell val; + + if (params[0] != (3 * sizeof(Embryo_Cell))) return 0; + hdr = (Embryo_Header *)ep->base; + data = ep->base + (int)hdr->dat; + val = *(Embryo_Cell *)(data + (int)ep->frm + + (((int)params[1] + 3) * sizeof(Embryo_Cell))); + val += params[2] * sizeof(Embryo_Cell); + if ((val < 0) || (val >= ep->hea) && (val < ep->stk)) return 0; + *(Embryo_Cell *)(data + (int)val) = params[3]; + return 1; +} + +/* functions used by the rest of embryo */ + +void +_embryo_args_init(Embryo_Program *ep) +{ + embryo_program_native_call_add(ep, "numargs", _embryo_args_numargs); + embryo_program_native_call_add(ep, "getarg", _embryo_args_getarg); + embryo_program_native_call_add(ep, "setarg", _embryo_args_setarg); +} diff --git a/legacy/embryo/src/lib/embryo_private.h b/legacy/embryo/src/lib/embryo_private.h index f630df5b39..f0f43ce583 100644 --- a/legacy/embryo/src/lib/embryo_private.h +++ b/legacy/embryo/src/lib/embryo_private.h @@ -279,6 +279,7 @@ struct _Embryo_Header int nametable; /* name table, file version 7 only */ } __attribute__((packed)); +void _embryo_args_init(Embryo_Program *ep); void _embryo_fp_init(Embryo_Program *ep); void _embryo_rand_init(Embryo_Program *ep); void _embryo_str_init(Embryo_Program *ep);