diff --git a/include/QF/cbuf.h b/include/QF/cbuf.h index dec891ee3..c4a60cc07 100644 --- a/include/QF/cbuf.h +++ b/include/QF/cbuf.h @@ -72,6 +72,7 @@ typedef struct cbuf_interpreter_s { void (*execute_line) (struct cbuf_s *cbuf); void (*construct) (struct cbuf_s *cbuf); void (*destruct) (struct cbuf_s *cbuf); + void (*reset) (struct cbuf_s *cbuf); } cbuf_interpreter_t; extern cbuf_t *cbuf_active; diff --git a/include/QF/gib_buffer.h b/include/QF/gib_buffer.h index 7040f15d5..5de7e9dda 100644 --- a/include/QF/gib_buffer.h +++ b/include/QF/gib_buffer.h @@ -50,7 +50,6 @@ typedef struct gib_buffer_data_s { qboolean cat; // Concatenate to previous token? int noprocess; // Process tokens? char delim; // delimiter of token - } ret; struct hashtab_s *locals; // Local variables @@ -64,4 +63,4 @@ typedef struct gib_buffer_data_s { void GIB_Buffer_Construct (struct cbuf_s *cbuf); void GIB_Buffer_Destruct (struct cbuf_s *cbuf); - +void GIB_Buffer_Reset (struct cbuf_s *cbuf); diff --git a/include/QF/gib_builtin.h b/include/QF/gib_builtin.h index 0d39ac9ce..fc63d16e8 100644 --- a/include/QF/gib_builtin.h +++ b/include/QF/gib_builtin.h @@ -47,6 +47,8 @@ typedef struct gib_builtin_s { #define GIB_Args(x) ((x) < cbuf_active->args->argc ? cbuf_active->args->args[(x)] : "") #define GIB_Argd(x) ((x) < cbuf_active->args->argc ? cbuf_active->args->argv[(x)] : NULL) +#define GIB_USAGE(x) (Cbuf_Error ("syntax", "%s: invalid syntax\nusage: %s %s", GIB_Argv(0), GIB_Argv(0), (x))) + void GIB_Arg_Strip_Delim (unsigned int arg); void GIB_Return (const char *str); void GIB_Builtin_Add (const char *name, void (*func) (void), enum gib_builtin_type_e type); diff --git a/libs/gib/gib_buffer.c b/libs/gib/gib_buffer.c index 9e232043a..85fe0d379 100644 --- a/libs/gib/gib_buffer.c +++ b/libs/gib/gib_buffer.c @@ -67,3 +67,9 @@ GIB_Buffer_Destruct (struct cbuf_s *cbuf) Hash_DelTable (GIB_DATA(cbuf)->locals); free (cbuf->data); } + +void +GIB_Buffer_Reset (struct cbuf_s *cbuf) +{ + GIB_DATA (cbuf)->ret.waiting = GIB_DATA (cbuf)->ret.available = false; +} diff --git a/libs/gib/gib_builtin.c b/libs/gib/gib_builtin.c index 1b1e98c10..feaa9ec2f 100644 --- a/libs/gib/gib_builtin.c +++ b/libs/gib/gib_builtin.c @@ -446,7 +446,7 @@ GIB_Function_Export_f (void) if (GIB_Argc() < 2) Cbuf_Error ("syntax", "function::export: invalid syntax\n" - "usage: funciton::export function1 function2 function3 [...]"); + "usage: function::export function1 function2 function3 [...]"); for (i = 1; i < GIB_Argc(); i++) { if (!(f = GIB_Function_Find (GIB_Argv (i)))) Cbuf_Error ("function", "function::export: function '%s' not found", GIB_Argv (i)); @@ -479,6 +479,28 @@ GIB_String_Equal_f (void) GIB_Return (va("%i", !strcmp(GIB_Argv(1), GIB_Argv(2)))); } +void +GIB_String_Findsub_f (void) +{ + char *haystack, *res; + unsigned int pos; + if (GIB_Argc() < 3 || GIB_Argc() > 4) { + GIB_USAGE ("string substr [start_pos]"); + return; + } + haystack = GIB_Argv(1); + pos = atoi(GIB_Argv(3)); + if (pos < 0) + Cbuf_Error ("string","%s: start position must be >= 0.", GIB_Argv(0)); + else if (pos >= strlen (haystack)) + GIB_Return ("-1"); + else if ((res = strstr(haystack+pos, GIB_Argv(2)))) + GIB_Return (va("%i", res - haystack)); + else + GIB_Return ("-1"); +} + + void GIB_Thread_Create_f (void) { @@ -800,6 +822,7 @@ GIB_Builtin_Init (qboolean sandbox) GIB_Builtin_Add ("break", GIB_Break_f, GIB_BUILTIN_NORMAL); GIB_Builtin_Add ("string::length", GIB_String_Length_f, GIB_BUILTIN_NORMAL); GIB_Builtin_Add ("string::equal", GIB_String_Equal_f, GIB_BUILTIN_NORMAL); + GIB_Builtin_Add ("string::findsub", GIB_String_Findsub_f, GIB_BUILTIN_NORMAL); GIB_Builtin_Add ("thread::create", GIB_Thread_Create_f, GIB_BUILTIN_NORMAL); GIB_Builtin_Add ("thread::kill", GIB_Thread_Kill_f, GIB_BUILTIN_NORMAL); GIB_Builtin_Add ("file::read", GIB_File_Read_f, GIB_BUILTIN_NORMAL); diff --git a/libs/gib/gib_parse.c b/libs/gib/gib_parse.c index b749e7d08..efd0c141b 100644 --- a/libs/gib/gib_parse.c +++ b/libs/gib/gib_parse.c @@ -59,6 +59,7 @@ cbuf_interpreter_t gib_interp = { GIB_Parse_Execute_Line, GIB_Buffer_Construct, GIB_Buffer_Destruct, + GIB_Buffer_Reset }; /* diff --git a/libs/util/cbuf.c b/libs/util/cbuf.c index f402d763c..5e73641f6 100644 --- a/libs/util/cbuf.c +++ b/libs/util/cbuf.c @@ -196,6 +196,8 @@ Cbuf_Execute_Stack (cbuf_t *cbuf) Cbuf_DeleteStack (cbuf->down); cbuf->down = 0; } + if (cbuf->interpreter->reset) + cbuf->interpreter->reset (cbuf); } void diff --git a/libs/util/idparse.c b/libs/util/idparse.c index 94ebb044f..45f5e7ae1 100644 --- a/libs/util/idparse.c +++ b/libs/util/idparse.c @@ -178,4 +178,5 @@ cbuf_interpreter_t id_interp = { COM_execute_line, NULL, NULL, + NULL };