diff --git a/tools/qwaq/.gitignore b/tools/qwaq/.gitignore new file mode 100644 index 000000000..f4a8d5fec --- /dev/null +++ b/tools/qwaq/.gitignore @@ -0,0 +1,7 @@ +*.la +*.lo +.deps +.libs +.vimrc +Makefile +Makefile.in diff --git a/tools/qwaq/Makefile b/tools/qwaq/Makefile new file mode 100644 index 000000000..9c9261b7e --- /dev/null +++ b/tools/qwaq/Makefile @@ -0,0 +1,26 @@ +EXE=qctest + +MAKEDEPS=$(CC) -MM $(CPPFLAGS) $< | sed -e 's/$*\.o:*/$*\.o $@:/g' > $@ + +CFLAGS+=-Wall -Werror -g -O2 +CPPFLAGS+= +LIBS= +vpath %.a + +SRC=main.c builtins.c + +%.d: %.c + $(MAKEDEPS) + +OBJ=$(patsubst %,%.o,$(basename $(SRC))) +DEP=$(patsubst %.o,%.d,$(OBJ)) + +all: $(EXE) + +$(EXE): $(OBJ) $(LIBS) + $(CC) $(LDFLAGS) -o $@ $^ -lQFgamecode -lQFutil + +clean: + rm -f $(EXE) *.o *.d core *.dat progdefs.h + +-include $(DEP) diff --git a/tools/qwaq/builtins.c b/tools/qwaq/builtins.c new file mode 100644 index 000000000..8aa6970db --- /dev/null +++ b/tools/qwaq/builtins.c @@ -0,0 +1,31 @@ +#include + +#define RETURN_EDICT(p, e) ((p)->pr_globals[OFS_RETURN].int_var = EDICT_TO_PROG(p, e)) +#define RETURN_STRING(p, s) ((p)->pr_globals[OFS_RETURN].int_var = PR_SetString((p), s)) + +void +bi_fixme (progs_t *pr) +{ + PR_Error (pr, "unimplemented function\n"); +} + +void +bi_print (progs_t *pr) +{ + char *str; + + str = G_STRING (pr, (OFS_PARM0)); + fprintf (stdout, "%s", str); +} + +builtin_t builtins[] = { + bi_fixme, + bi_print, +}; + +void +BI_Init (progs_t *progs) +{ + progs->builtins = builtins; + progs->numbuiltins = sizeof (builtins) / sizeof (builtins[0]); +} diff --git a/tools/qwaq/defs.qc b/tools/qwaq/defs.qc new file mode 100644 index 000000000..974aeaaf6 --- /dev/null +++ b/tools/qwaq/defs.qc @@ -0,0 +1,8 @@ +void (string str) print = #1; + +float time; +entity self; + +.float nextthink; +.float think; +.float frame; diff --git a/tools/qwaq/main.c b/tools/qwaq/main.c new file mode 100644 index 000000000..af4200a3a --- /dev/null +++ b/tools/qwaq/main.c @@ -0,0 +1,50 @@ +#include + +#include +#include +#include +#include +#include + +progs_t progs; +void *membase; +int memsize = 16*1024*1024; + +void BI_Init (progs_t *progs); + +int +main () +{ + func_t main_func; + FILE *f; + int len; + + Cvar_Init_Hash (); + Cmd_Init_Hash (); + membase = malloc (memsize); + Memory_Init (membase, memsize); + Cvar_Init (); + Cbuf_Init (); + Cmd_Init (); + + PR_Init_Cvars (); + PR_Init (); + BI_Init (&progs); + + f = fopen ("qctest.dat", "rb"); + if (f) { + fseek (f, 0, SEEK_END); + len = ftell (f); + fseek (f, 0, SEEK_SET); + progs.progs = Hunk_AllocName (len, "qctest.dat"); + fread (progs.progs, 1, len, f); + fclose (f); + if (progs.progs) + PR_LoadProgs (&progs, 0); + } + if (!progs.progs) + Sys_Error ("couldn't load %s\n", "qctest.dat"); + main_func = PR_GetFunctionIndex (&progs, "main"); + PR_ExecuteProgram (&progs, main_func); + return 0; +} diff --git a/tools/qwaq/main.qc b/tools/qwaq/main.qc new file mode 100644 index 000000000..e010b3c76 --- /dev/null +++ b/tools/qwaq/main.qc @@ -0,0 +1,4 @@ +float () main = +{ + print ("hello world\n"); +}; diff --git a/tools/qwaq/progs.src b/tools/qwaq/progs.src new file mode 100644 index 000000000..5d8a6d897 --- /dev/null +++ b/tools/qwaq/progs.src @@ -0,0 +1,5 @@ +qctest.dat + +defs.qc + +main.qc