mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-29 23:52:22 +00:00
Added the string::findsub builtin. Added a reset function to the cbuf
interpreter struct so that custom cbuf data can be reset after an error. This fixes a bug where GIB would think it was still waiting for a return value after an error occurred in an embedded command.
This commit is contained in:
parent
ac8169ba54
commit
d4b1c74866
8 changed files with 38 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -59,6 +59,7 @@ cbuf_interpreter_t gib_interp = {
|
|||
GIB_Parse_Execute_Line,
|
||||
GIB_Buffer_Construct,
|
||||
GIB_Buffer_Destruct,
|
||||
GIB_Buffer_Reset
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -178,4 +178,5 @@ cbuf_interpreter_t id_interp = {
|
|||
COM_execute_line,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue