embryo support for varargs... i was just missing native funcs to export

enough info


SVN revision: 10656
This commit is contained in:
Carsten Haitzler 2004-07-01 06:08:06 +00:00
parent 5b506efe2c
commit 41b8b1cf4d
6 changed files with 104 additions and 0 deletions

View File

@ -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);

View File

@ -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 */

View File

@ -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 \

View File

@ -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);

View File

@ -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);
}

View File

@ -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);