[ruamoko] Make cbuf functions take a cbuf param

A nil param refers to the default cbuf if it has been set by the engine,
otherwise it is invalid. This is the first step to fleshing out the cbuf
API.
This commit is contained in:
Bill Currie 2023-05-24 20:58:33 +09:00
parent b9cff7aae0
commit db9a6a9a5c
5 changed files with 49 additions and 45 deletions

View file

@ -38,7 +38,8 @@
#include "rua_internal.h"
typedef struct {
cbuf_t *cbuf;
progs_t *pr;
cbuf_t *default_cbuf;
} cbuf_resources_t;
static cbuf_t * __attribute__((pure))
@ -47,44 +48,43 @@ _get_cbuf (progs_t *pr, cbuf_resources_t *res, int arg, const char *func)
cbuf_t *cbuf = 0;
if (arg == 0) {
cbuf = res->cbuf;
// a nil cbuf is valid only if the default cbuf has been set
cbuf = res->default_cbuf;
} else {
PR_RunError (pr, "%s: Invalid cbuf_t", func);
}
if (!cbuf)
PR_RunError (pr, "Invalid cbuf_t");
if (!cbuf) {
PR_RunError (pr, "%s: Invalid cbuf_t: %d", func, arg);
}
return cbuf;
}
#define get_cbuf(pr, res, arg) _get_cbuf(pr, res, arg, __FUNCTION__)
static void
bi_Cbuf_AddText (progs_t *pr, void *data)
#define bi(n) static void bi_##n (progs_t *pr, void *data)
bi(Cbuf_AddText)
{
const char *text = P_GSTRING (pr, 0);
cbuf_t *cbuf = get_cbuf (pr, data, 0);
cbuf_t *cbuf = get_cbuf (pr, data, P_INT (pr, 0));
const char *text = P_GSTRING (pr, 1);
Cbuf_AddText (cbuf, text);
}
static void
bi_Cbuf_InsertText (progs_t *pr, void *data)
bi(Cbuf_InsertText)
{
const char *text = P_GSTRING (pr, 0);
cbuf_t *cbuf = get_cbuf (pr, data, 0);
cbuf_t *cbuf = get_cbuf (pr, data, P_INT (pr, 0));
const char *text = P_GSTRING (pr, 1);
Cbuf_InsertText (cbuf, text);
}
static void
bi_Cbuf_Execute (progs_t *pr, void *data)
bi(Cbuf_Execute)
{
cbuf_t *cbuf = get_cbuf (pr, data, 0);
cbuf_t *cbuf = get_cbuf (pr, data, P_INT (pr, 0));
Cbuf_Execute (cbuf);
}
static void
bi_Cbuf_Execute_Sets (progs_t *pr, void *data)
bi(Cbuf_Execute_Sets)
{
cbuf_t *cbuf = get_cbuf (pr, data, 0);
cbuf_t *cbuf = get_cbuf (pr, data, P_INT (pr, 0));
Cbuf_Execute_Sets (cbuf);
}
@ -99,14 +99,15 @@ bi_cbuf_destroy (progs_t *pr, void *data)
free (data);
}
#undef bi
#define bi(x,np,params...) {#x, bi_##x, -1, np, {params}}
#define p(type) PR_PARAM(type)
#define P(a, s) { .size = (s), .alignment = BITOP_LOG2 (a), }
static builtin_t builtins[] = {
bi(Cbuf_AddText, 1, p(string)),
bi(Cbuf_InsertText, 1, p(string)),
bi(Cbuf_Execute, 0),
bi(Cbuf_Execute_Sets, 0),
bi(Cbuf_AddText, 2, p(ptr), p(string)),
bi(Cbuf_InsertText, 2, p(ptr), p(string)),
bi(Cbuf_Execute, 1, p(ptr)),
bi(Cbuf_Execute_Sets, 1, p(ptr)),
{0}
};
@ -114,6 +115,7 @@ void
RUA_Cbuf_Init (progs_t *pr, int secure)
{
cbuf_resources_t *res = calloc (sizeof (cbuf_resources_t), 1);
res->pr = pr;
PR_Resources_Register (pr, "Cbuf", res, bi_cbuf_clear, bi_cbuf_destroy);
PR_RegisterBuiltins (pr, builtins, res);
}
@ -122,5 +124,5 @@ VISIBLE void
RUA_Cbuf_SetCbuf (progs_t *pr, cbuf_t *cbuf)
{
cbuf_resources_t *res = PR_Resources_Find (pr, "Cbuf");
res->cbuf = cbuf;
res->default_cbuf = cbuf;
}

View file

@ -247,7 +247,7 @@ int (int key, int unicode, int down) load_quickbup_keyevent =
if (loadable[load_cursor]) {
S_LocalSound ("misc/menu2.wav");
Menu_SelectMenu (nil);
Cbuf_AddText (sprintf ("load quick%i.sav\n", load_cursor));
Cbuf_AddText (nil, sprintf ("load quick%i.sav\n", load_cursor));
load_cursor = MAX_SAVEGAMES;
}
return 1;
@ -279,7 +279,7 @@ int (int key, int unicode, int down) load_keyevent =
} else if (loadable[load_cursor]) {
S_LocalSound ("misc/menu2.wav");
Menu_SelectMenu (nil);
Cbuf_AddText (sprintf ("load s%i.sav\n", load_cursor));
Cbuf_AddText (nil, sprintf ("load s%i.sav\n", load_cursor));
}
return 1;
}
@ -304,7 +304,7 @@ int (int key, int unicode, int down) save_keyevent =
case QFK_RETURN:
//case QFM_BUTTON1:
Menu_SelectMenu (nil);
Cbuf_AddText (sprintf ("save s%i.sav\n", save_cursor));
Cbuf_AddText (nil, sprintf ("save s%i.sav\n", save_cursor));
return 1;
}
return 0;
@ -398,15 +398,15 @@ void () quit_menu =
int (string text, int key) sp_start =
{
Menu_SelectMenu (nil);
Cbuf_AddText ("disconnect\n");
Cbuf_AddText ("maxplayers 1\n");
Cbuf_AddText ("coop 0\n");
Cbuf_AddText ("deathmatch 0\n");
Cbuf_AddText ("teamplay 0\n");
Cbuf_AddText ("listen 0\n");
Cbuf_AddText ("noexit 0\n");
Cbuf_AddText ("samelevel 0\n");
Cbuf_AddText ("map start\n");
Cbuf_AddText (nil, "disconnect\n");
Cbuf_AddText (nil, "maxplayers 1\n");
Cbuf_AddText (nil, "coop 0\n");
Cbuf_AddText (nil, "deathmatch 0\n");
Cbuf_AddText (nil, "teamplay 0\n");
Cbuf_AddText (nil, "listen 0\n");
Cbuf_AddText (nil, "noexit 0\n");
Cbuf_AddText (nil, "samelevel 0\n");
Cbuf_AddText (nil, "map start\n");
return 0;
};

View file

@ -436,7 +436,7 @@ int (string text, int key)
op_goto_console =
{
Menu_SelectMenu ("");
Cbuf_AddText ("toggleconsole\n");
Cbuf_AddText (nil, "toggleconsole\n");
return 0;
};

View file

@ -1,9 +1,11 @@
#ifndef __ruamoko_cbuf_h
#define __ruamoko_cbuf_h
@extern void Cbuf_AddText (string text);
@extern void Cbuf_InsertText (string text);
@extern void Cbuf_Execute (void);
@extern void Cbuf_Execute_Sets (void);
typedef struct { int x; } cbuf_t;
@extern void Cbuf_AddText (cbuf_t *cbuf, string text);
@extern void Cbuf_InsertText (cbuf_t *cbuf, string text);
@extern void Cbuf_Execute (cbuf_t *cbuf);
@extern void Cbuf_Execute_Sets (cbuf_t *cbuf);
#endif//__ruamoko_cbuf_h

View file

@ -1,6 +1,6 @@
#include <cbuf.h>
void (string text) Cbuf_AddText = #0;
void (string text) Cbuf_InsertText = #0;
void () Cbuf_Execute = #0;
void () Cbuf_Execute_Sets = #0;
void Cbuf_AddText (cbuf_t *cbuf, string text) = #0;
void Cbuf_InsertText (cbuf_t *cbuf, string text) = #0;
void Cbuf_Execute (cbuf_t *cbuf) = #0;
void Cbuf_Execute_Sets (cbuf_t *cbuf) = #0;