summaryrefslogtreecommitdiff
path: root/console.c
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2004-09-19 15:24:45 +0000
committerdarkvater <darkvater@openttd.org>2004-09-19 15:24:45 +0000
commite2c1370d60501f96713feb441fd386120d1e32b9 (patch)
tree43e68d106a9b15a2ae77c7dfe20b59411a597776 /console.c
parent089a2a7847a640d2993abb44cd378058154c2df3 (diff)
downloadopenttd-e2c1370d60501f96713feb441fd386120d1e32b9.tar.xz
(svn r295) -Fix: Rewrite and fix of console stuff, including marking (XXX) of areas that require further investigation (Tron)
-Note: booby trapped some suspicous assignments (Tron)
Diffstat (limited to 'console.c')
-rw-r--r--console.c1622
1 files changed, 774 insertions, 848 deletions
diff --git a/console.c b/console.c
index 27aa9b046..bf6bf4fad 100644
--- a/console.c
+++ b/console.c
@@ -7,20 +7,28 @@
#include "variables.h"
#include "hal.h"
#include <stdarg.h>
+#include <string.h>
#include "console.h"
#ifdef WIN32
#include <windows.h>
#endif
+#define ICONSOLE_BUFFER_SIZE 80
+
+typedef enum {
+ ICONSOLE_OPENED,
+ ICONSOLE_CLOSED
+} _iconsole_modes;
+
// ** main console ** //
static bool _iconsole_inited;
-static byte* _iconsole_buffer[80];
-static byte _iconsole_cbuffer[80];
-static byte _iconsole_cmdline[255];
+static char* _iconsole_buffer[ICONSOLE_BUFFER_SIZE];
+static char _iconsole_cbuffer[ICONSOLE_BUFFER_SIZE];
+static char _iconsole_cmdline[255];
static byte _iconsole_cmdpos;
-static byte _iconsole_mode = ICONSOLE_CLOSED;
-static Window *_iconsole_win = NULL;
+static _iconsole_modes _iconsole_mode = ICONSOLE_CLOSED;
+static Window* _iconsole_win = NULL;
static byte _iconsole_scroll;
// ** console cursor ** //
@@ -29,20 +37,22 @@ static byte _icursor_rate;
static byte _icursor_counter;
// ** stdlib ** //
-byte _stdlib_developer=1;
-bool _stdlib_con_developer=false;
-FILE * _iconsole_output_file;
+byte _stdlib_developer = 1;
+bool _stdlib_con_developer = false;
+FILE* _iconsole_output_file;
-// ** main console cmd buffer ** // sign_de: especialy for Celestar :D
-static byte* _iconsole_cmdbuffer[20];
+// ** main console cmd buffer ** // sign_de: especially for Celestar :D
+static char* _iconsole_cmdbuffer[20];
static byte _iconsole_cmdbufferpos;
// ** console window ** //
-static void IConsoleWndProc(Window *w, WindowEvent *e);
-static const Widget _iconsole_window_widgets[] = {{WIDGETS_END}};
+static void IConsoleWndProc(Window* w, WindowEvent* e);
+static const Widget _iconsole_window_widgets[] = {
+ {WIDGETS_END}
+};
static const WindowDesc _iconsole_window_desc = {
0, 0, 2, 2,
- WC_CONSOLE,0,
+ WC_CONSOLE, 0,
WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
_iconsole_window_widgets,
IConsoleWndProc,
@@ -52,24 +62,19 @@ static const WindowDesc _iconsole_window_desc = {
/* end of header */
/* *************** */
-static void IConsoleAppendClipboard()
+static void IConsoleAppendClipboard(void)
{
#ifdef WIN32
if (IsClipboardFormatAvailable(CF_TEXT)) {
- byte * data;
+ const char* data;
HGLOBAL cbuf;
- int i;
OpenClipboard(NULL);
cbuf = GetClipboardData(CF_TEXT);
- data = (byte *) GlobalLock(cbuf);
+ data = GlobalLock(cbuf);
- i=0;
- while (IS_INT_INSIDE(data[i], 32, 256)) {
- _iconsole_cmdline[_iconsole_cmdpos]=data[i];
- i++;
- _iconsole_cmdpos++;
- }
+ for (; IS_INT_INSIDE(*data, 32, 256); ++data) /* XXX magic numbers */
+ _iconsole_cmdline[_iconsole_cmdpos++] = *data; /* XXX prone to buffer overflow */
GlobalUnlock(cbuf);
CloseClipboard();
@@ -77,147 +82,133 @@ static void IConsoleAppendClipboard()
#endif
}
-static void IConsoleClearCommand()
+static void IConsoleClearCommand(void)
{
-int i;
-for (i=0; i<255; i++) _iconsole_cmdline[i]=0;
-_iconsole_cmdpos=0;
-SetWindowDirty(_iconsole_win);
+ memset(_iconsole_cmdline, 0, sizeof(_iconsole_cmdline));
+ _iconsole_cmdpos = 0;
+ SetWindowDirty(_iconsole_win);
}
-static void IConsoleWndProc(Window *w, WindowEvent *e)
+static void IConsoleWndProc(Window* w, WindowEvent* e)
{
// only do window events with the console
w = FindWindowById(WC_CONSOLE, 0);
switch(e->event) {
-
- case WE_PAINT:
- GfxFillRect(w->left,w->top,w->width,w->height-1,0);
+ case WE_PAINT:
{
- int i=_iconsole_scroll;
- int max=(w->height/12)-1;
- while ((i>_iconsole_scroll-max) && (_iconsole_buffer[i]!=NULL)) {
- DoDrawString(_iconsole_buffer[i],5,w->height-(((_iconsole_scroll+2)-i)*12),_iconsole_cbuffer[i]);
- i--;
+ int i = _iconsole_scroll;
+ int max = w->height / 12 - 1;
+ GfxFillRect(w->left, w->top, w->width, w->height - 1, 0);
+ while ((i > _iconsole_scroll - max) && (_iconsole_buffer[i] != NULL)) {
+ DoDrawString(_iconsole_buffer[i], 5,
+ w->height - (_iconsole_scroll + 2 - i) * 12, _iconsole_cbuffer[i]);
+ i--;
}
- DoDrawString("]",5,w->height-12,_iconsole_color_commands);
- DoDrawString((char *)&_iconsole_cmdline,10,w->height-12,_iconsole_color_commands);
+ DoDrawString("]", 5, w->height - 12, _iconsole_color_commands);
+ DoDrawString(_iconsole_cmdline, 10, w->height - 12,
+ _iconsole_color_commands);
+ break;
}
- break;
-
- case WE_TICK:
-
- _icursor_counter++;
- if (_icursor_counter>_icursor_rate) {
- _icursor_state=!_icursor_state;
- {
+ case WE_TICK:
+ _icursor_counter++;
+ if (_icursor_counter > _icursor_rate) {
int posx;
int posy;
- int color;
- _cur_dpi=&_screen;
- if (_icursor_state) color=14; else color=0;
- posx=10+GetStringWidth((char *)&_iconsole_cmdline);
- posy=w->height-3;
- GfxFillRect(posx,posy,posx+5,posy+1,color);
- _video_driver->make_dirty(posx,posy,5,1);
- }
- _icursor_counter=0;
- }
- break;
- case WE_DESTROY:
- _iconsole_win=NULL;
- _iconsole_mode=ICONSOLE_CLOSED;
- break;
-
- case WE_KEYPRESS:
- e->keypress.cont=false;
- if (e->keypress.keycode == (WKC_CTRL | 'V'))
- {
- IConsoleAppendClipboard();
- SetWindowDirty(w);
- } else
- if (e->keypress.keycode == (WKC_UP))
- {
- IConsoleCmdBufferNavigate(+1);
- SetWindowDirty(w);
- } else
- if (e->keypress.keycode == (WKC_DOWN))
- {
- IConsoleCmdBufferNavigate(-1);
- SetWindowDirty(w);
- } else
- if (e->keypress.keycode == (WKC_SHIFT | WKC_PAGEUP))
- {
- if ((_iconsole_scroll - ((w->height/12)-1))<0) {
- _iconsole_scroll = 0;
- } else {
- _iconsole_scroll -= (w->height/12)-1;
- }
- SetWindowDirty(w);
- } else
- if (e->keypress.keycode == (WKC_SHIFT | WKC_PAGEDOWN))
- {
- if ((_iconsole_scroll + ((w->height/12)-1))>79) {
- _iconsole_scroll = 79;
- } else {
- _iconsole_scroll += (w->height/12)-1;
- }
- SetWindowDirty(w);
- } else
- if (e->keypress.keycode == (WKC_SHIFT | WKC_UP))
- {
- if ((_iconsole_scroll - 1)<0) {
- _iconsole_scroll = 0;
- } else {
- _iconsole_scroll -= 1;
- }
- SetWindowDirty(w);
- } else
- if (e->keypress.keycode == (WKC_SHIFT | WKC_DOWN))
- {
- if ((_iconsole_scroll + 1)>79) {
- _iconsole_scroll = 79;
- } else {
- _iconsole_scroll += 1;
- }
- SetWindowDirty(w);
- } else
- if (e->keypress.keycode == WKC_BACKQUOTE)
- {
- IConsoleSwitch();
- } else
- if (e->keypress.keycode == WKC_RETURN)
- {
- IConsolePrintF(_iconsole_color_commands, "] %s", _iconsole_cmdline);
- IConsoleCmdBufferAdd(_iconsole_cmdline);
- IConsoleCmdExec((byte *) _iconsole_cmdline);
- IConsoleClearCommand();
- } else
- if (e->keypress.keycode == WKC_BACKSPACE)
- {
- if (_iconsole_cmdpos!=0) _iconsole_cmdpos--;
- _iconsole_cmdline[_iconsole_cmdpos]=0;
- SetWindowDirty(w);
- _iconsole_cmdbufferpos=19;
- } else
- if (IS_INT_INSIDE((e->keypress.ascii), 32, 256))
- {
- _iconsole_scroll=79;
- _iconsole_cmdline[_iconsole_cmdpos]=e->keypress.ascii;
- if (_iconsole_cmdpos!=255) _iconsole_cmdpos++;
- SetWindowDirty(w);
- _iconsole_cmdbufferpos=19;
- } else e->keypress.cont=true;
- break;
+ _icursor_state = !_icursor_state;
+ _cur_dpi = &_screen;
+ posx = 10 + GetStringWidth(_iconsole_cmdline);
+ posy = w->height - 3;
+ GfxFillRect(posx, posy, posx + 5, posy + 1, _icursor_state ? 14 : 0);
+ _video_driver->make_dirty(posx, posy, 5, 1);
+ _icursor_counter = 0;
+ }
+ break;
+ case WE_DESTROY:
+ _iconsole_win = NULL;
+ _iconsole_mode = ICONSOLE_CLOSED;
+ break;
+ case WE_KEYPRESS:
+ {
+ e->keypress.cont = false;
+ switch (e->keypress.keycode) {
+ case WKC_CTRL | 'V':
+ IConsoleAppendClipboard();
+ SetWindowDirty(w);
+ break;
+ case WKC_UP:
+ IConsoleCmdBufferNavigate(+1);
+ SetWindowDirty(w);
+ break;
+ case WKC_DOWN:
+ IConsoleCmdBufferNavigate(-1);
+ SetWindowDirty(w);
+ break;
+ case WKC_SHIFT | WKC_PAGEUP:
+ if (_iconsole_scroll - w->height / 12 - 1 < 0)
+ _iconsole_scroll = 0;
+ else
+ _iconsole_scroll -= w->height / 12 - 1;
+ SetWindowDirty(w);
+ break;
+ case WKC_SHIFT | WKC_PAGEDOWN:
+ if (_iconsole_scroll + w->height / 12 - 1 > 79) /* XXX magic number */
+ _iconsole_scroll = 79; /* XXX magic number */
+ else
+ _iconsole_scroll += w->height / 12 - 1;
+ SetWindowDirty(w);
+ break;
+ case WKC_SHIFT | WKC_UP:
+ if (_iconsole_scroll <= 0)
+ _iconsole_scroll = 0;
+ else
+ --_iconsole_scroll;
+ SetWindowDirty(w);
+ break;
+ case WKC_SHIFT | WKC_DOWN:
+ if (_iconsole_scroll >= 79) /* XXX magic number */
+ _iconsole_scroll = 79; /* XXX magic number */
+ else
+ ++_iconsole_scroll;
+ SetWindowDirty(w);
+ break;
+ case WKC_BACKQUOTE:
+ IConsoleSwitch();
+ break;
+ case WKC_RETURN:
+ IConsolePrintF(_iconsole_color_commands, "] %s", _iconsole_cmdline);
+ IConsoleCmdBufferAdd(_iconsole_cmdline);
+ IConsoleCmdExec(_iconsole_cmdline);
+ IConsoleClearCommand();
+ break;
+ case WKC_BACKSPACE:
+ if (_iconsole_cmdpos != 0) _iconsole_cmdpos--;
+ _iconsole_cmdline[_iconsole_cmdpos] = 0;
+ SetWindowDirty(w);
+ _iconsole_cmdbufferpos = 19;
+ break;
+ default:
+ if (IS_INT_INSIDE(e->keypress.ascii, 32, 256)) {
+ _iconsole_scroll = 79; /* XXX magic number */
+ _iconsole_cmdline[_iconsole_cmdpos] = e->keypress.ascii;
+ if (_iconsole_cmdpos != sizeof(_iconsole_cmdline))
+ _iconsole_cmdpos++;
+ SetWindowDirty(w);
+ _iconsole_cmdbufferpos = 19;
+ }
+ else
+ e->keypress.cont = true;
+ }
+ break;
+ }
}
}
-void IConsoleInit()
+void IConsoleInit(void)
{
- int i;
+ uint i;
#if defined(WITH_REV)
extern char _openttd_revision[];
#endif
@@ -227,208 +218,202 @@ void IConsoleInit()
_iconsole_color_warning = 13;
_iconsole_color_debug = 5;
_iconsole_color_commands = 2;
- _iconsole_scroll=79;
- _iconsole_cmdbufferpos=19;
- _iconsole_inited=true;
- _iconsole_mode=ICONSOLE_CLOSED;
- _iconsole_win=NULL;
- _icursor_state=false;
- _icursor_rate=5;
- _icursor_counter=0;
- for (i=0;i<20;i++) {
- _iconsole_cmdbuffer[i]=NULL;
- }
- for (i=0;i<80;i++) {
- _iconsole_buffer[i]=NULL;
- _iconsole_cbuffer[i]=0;
- }
+ _iconsole_scroll = 79; /* XXX magic number */
+ _iconsole_cmdbufferpos = 19; /* XXX magic number */
+ _iconsole_inited = true;
+ _iconsole_mode = ICONSOLE_CLOSED;
+ _iconsole_win = NULL;
+ _icursor_state = false;
+ _icursor_rate = 5;
+ _icursor_counter = 0;
+ for (i = 0; i < lengthof(_iconsole_cmdbuffer); i++)
+ _iconsole_cmdbuffer[i] = NULL;
+ for (i = 0; i < ICONSOLE_BUFFER_SIZE; i++) {
+ _iconsole_buffer[i] = NULL;
+ _iconsole_cbuffer[i] = 0;
+ }
IConsoleStdLibRegister();
#if defined(WITH_REV)
- IConsolePrintF(13,"OpenTTD Game Console Revision 4 - %s",_openttd_revision);
+ IConsolePrintF(13, "OpenTTD Game Console Revision 4 - %s", _openttd_revision);
#else
- IConsolePrint(13,"OpenTTD Game Console Revision 4");
+ IConsolePrint(13, "OpenTTD Game Console Revision 4");
#endif
- IConsolePrint(12,"---------------------------------");
- IConsolePrint(12,"use \"help\" for more info");
- IConsolePrint(12,"");
+ IConsolePrint(12, "---------------------------------");
+ IConsolePrint(12, "use \"help\" for more info");
+ IConsolePrint(12, "");
IConsoleClearCommand();
IConsoleCmdBufferAdd("");
}
-void IConsoleClear()
+void IConsoleClear(void)
{
- int i;
- for (i=0;i<80;i++) if (_iconsole_buffer[i]!=NULL) {
+ uint i;
+ for (i = 0; i < ICONSOLE_BUFFER_SIZE; i++)
free(_iconsole_buffer[i]);
- }
}
-void IConsoleFree()
+void IConsoleFree(void)
{
- _iconsole_inited=false;
+ _iconsole_inited = false;
IConsoleClear();
- if (_iconsole_output_file!=NULL) fclose(_iconsole_output_file);
+ if (_iconsole_output_file != NULL) fclose(_iconsole_output_file);
}
-void IConsoleResize()
+void IConsoleResize(void)
{
- if (_iconsole_win!=NULL) {
+ if (_iconsole_win != NULL) {
_iconsole_win->height = _screen.height / 3;
- _iconsole_win->width= _screen.width;
+ _iconsole_win->width = _screen.width;
}
}
-void IConsoleSwitch()
+void IConsoleSwitch(void)
{
- if (_iconsole_mode==ICONSOLE_CLOSED) {
- _iconsole_win = AllocateWindowDesc(&_iconsole_window_desc);
- _iconsole_win->height = _screen.height / 3;
- _iconsole_win->width= _screen.width;
- _iconsole_mode=ICONSOLE_OPENED;
- } else
- if (_iconsole_mode==ICONSOLE_OPENED) {
- DeleteWindowById(WC_CONSOLE,0);
- _iconsole_win=NULL;
- _iconsole_mode=ICONSOLE_CLOSED;
- }
+ switch (_iconsole_mode) {
+ case ICONSOLE_CLOSED:
+ _iconsole_win = AllocateWindowDesc(&_iconsole_window_desc);
+ _iconsole_win->height = _screen.height / 3;
+ _iconsole_win->width = _screen.width;
+ _iconsole_mode = ICONSOLE_OPENED;
+ break;
+ case ICONSOLE_OPENED:
+ DeleteWindowById(WC_CONSOLE, 0);
+ _iconsole_win = NULL;
+ _iconsole_mode = ICONSOLE_CLOSED;
+ break;
+ }
MarkWholeScreenDirty();
- MarkAllViewportsDirty(0,0,_screen.width,_screen.height);
- _video_driver->make_dirty(0,0,_screen.width,_screen.height);
+ MarkAllViewportsDirty(0, 0, _screen.width, _screen.height);
+ _video_driver->make_dirty(0, 0, _screen.width, _screen.height);
}
-void IConsoleClose()
+void IConsoleClose(void)
{
- if (_iconsole_mode==ICONSOLE_OPENED) IConsoleSwitch();
- _iconsole_mode=ICONSOLE_CLOSED;
+ if (_iconsole_mode == ICONSOLE_OPENED) IConsoleSwitch();
+ _iconsole_mode = ICONSOLE_CLOSED;
}
-void IConsoleOpen()
+void IConsoleOpen(void)
{
- if (_iconsole_mode==ICONSOLE_CLOSED) IConsoleSwitch();
+ if (_iconsole_mode == ICONSOLE_CLOSED) IConsoleSwitch();
+ /* XXX missing _iconsole_mode ? */
}
-void IConsoleCmdBufferAdd(const byte * cmd)
+void IConsoleCmdBufferAdd(const char* cmd)
{
int i;
if (_iconsole_cmdbufferpos != 19) return;
- if (_iconsole_cmdbuffer[18]!=NULL) free(_iconsole_cmdbuffer[18]);
- for (i=18; i>0; i--) _iconsole_cmdbuffer[i]=_iconsole_cmdbuffer[i-1];
- i=strlen(cmd);
- _iconsole_cmdbuffer[0]=malloc(i+1);
- memset(((void *)_iconsole_cmdbuffer[0]),0,i+1);
- memcpy(((void *)_iconsole_cmdbuffer[0]),cmd,i);
- _iconsole_cmdbuffer[0][i]=0;
- _iconsole_cmdbufferpos = 19;
+ free(_iconsole_cmdbuffer[18]);
+ for (i = 18; i > 0; i--) _iconsole_cmdbuffer[i] = _iconsole_cmdbuffer[i - 1];
+ _iconsole_cmdbuffer[0] = strdup(cmd);
}
void IConsoleCmdBufferNavigate(signed char direction)
{
int i;
- i=_iconsole_cmdbufferpos + direction;
- if (i<0) i=19;
- if (i>19) i=0;
- if (direction>0) while (_iconsole_cmdbuffer[i]==NULL) {
- i++;
- if (i>19) i=0;
+ i = _iconsole_cmdbufferpos + direction;
+ if (i < 0) i = 19;
+ if (i > 19) i = 0;
+ if (direction > 0)
+ while (_iconsole_cmdbuffer[i] == NULL) {
+ ++i;
+ if (i > 19) i = 0;
}
- if (direction<0) while (_iconsole_cmdbuffer[i]==NULL) {
- i--;
- if (i<0) i=19;
+ if (direction < 0)
+ while (_iconsole_cmdbuffer[i] == NULL) {
+ --i;
+ if (i < 0) i = 19;
}
_iconsole_cmdbufferpos = i;
IConsoleClearCommand();
- memcpy((void *)_iconsole_cmdline,(void *)_iconsole_cmdbuffer[i],strlen(_iconsole_cmdbuffer[i]));
- _iconsole_cmdpos =strlen(_iconsole_cmdbuffer[i]);
+ memcpy(_iconsole_cmdline, _iconsole_cmdbuffer[i],
+ strlen(_iconsole_cmdbuffer[i]));
+ _iconsole_cmdpos = strlen(_iconsole_cmdbuffer[i]);
}
-void IConsolePrint(byte color_code, const byte* string)
+void IConsolePrint(byte color_code, const char* string)
{
- byte * _ex;
- byte * _new;
- byte _exc;
- byte _newc;
- int i,j;
+ char* _ex;
+ char* _new;
+ char _exc;
+ char _newc;
+ char* i;
+ int j;
if (!_iconsole_inited) return;
- _newc=color_code;
- i=strlen(string);
- _new=malloc(i+1);
- memset(_new,0,i+1);
- memcpy(_new,string,i);
+ _newc = color_code;
+ _new = strdup(string);
- for (j=0;j<i;j++) {
- if (_new[j]<0x1F) _new[j]=0x20;
- }
+ for (i = _new; *i != '\0'; ++i)
+ if (*i < 0x1F) *i = ' '; /* XXX 0x1F seems wrong + magic number */
- i=79;
- while (i>=0) {
- _ex=_iconsole_buffer[i];
- _exc=_iconsole_cbuffer[i];
- _iconsole_buffer[i]=_new;
- _iconsole_cbuffer[i]=_newc;
- _new=_ex;
- _newc=_exc;
- i--;
- }
- if (_ex!=NULL) free(_ex);
+ for (j = ICONSOLE_BUFFER_SIZE - 1; j >= 0; --j) {
+ _ex = _iconsole_buffer[j];
+ _exc = _iconsole_cbuffer[j];
+ _iconsole_buffer[j] = _new;
+ _iconsole_cbuffer[j] = _newc;
+ _new = _ex;
+ _newc = _exc;
+ }
+ free(_ex);
- if (_iconsole_win!=NULL) SetWindowDirty(_iconsole_win);
+ if (_iconsole_win != NULL) SetWindowDirty(_iconsole_win);
}
-void CDECL IConsolePrintF(byte color_code, const char *s, ...)
+void CDECL IConsolePrintF(byte color_code, const char* s, ...)
{
va_list va;
char buf[1024];
int len;
va_start(va, s);
- len = vsprintf(buf, s, va);
+ len = vsnprintf(buf, sizeof(buf), s, va);
va_end(va);
- if (_iconsole_output_file!=NULL) {
- // if there is an console output file ... also print it there
- fwrite((void *) &buf, len, 1, _iconsole_output_file);
- buf[1023]='\n';
- fwrite((void *)&buf[1023], 1, 1,_iconsole_output_file);
- }
+ IConsolePrint(color_code, buf);
- IConsolePrint(color_code, (byte *) &buf);
+ if (_iconsole_output_file != NULL) {
+ // if there is an console output file ... also print it there
+ fwrite(buf, len, 1, _iconsole_output_file);
+ /* XXX why newline? */
+ buf[1023] = '\n';
+ fwrite(&buf[1023], 1, 1, _iconsole_output_file);
+ }
}
-void IConsoleDebug(byte* string)
+void IConsoleDebug(const char* string)
{
- if (_stdlib_developer>1) IConsolePrintF(_iconsole_color_debug, "DEBUG: %s", string);
+ if (_stdlib_developer > 1)
+ IConsolePrintF(_iconsole_color_debug, "DEBUG: %s", string);
}
-void IConsoleError(const byte* string)
+void IConsoleError(const char* string)
{
- if (_stdlib_developer>0) IConsolePrintF(_iconsole_color_error, "ERROR: %s", string);
+ if (_stdlib_developer > 0)
+ IConsolePrintF(_iconsole_color_error, "ERROR: %s", string);
}
-void IConsoleWarning(const byte* string)
+void IConsoleWarning(const char* string)
{
- if (_stdlib_developer>0) IConsolePrintF(_iconsole_color_warning, "WARNING: %s", string);
+ if (_stdlib_developer > 0)
+ IConsolePrintF(_iconsole_color_warning, "WARNING: %s", string);
}
-void IConsoleCmdRegister(const byte * name, void * addr)
+void IConsoleCmdRegister(const char* name, _iconsole_cmd_addr addr)
{
- byte * _new;
- _iconsole_cmd * item;
- _iconsole_cmd * item_new;
- int i;
+ char* _new;
+ _iconsole_cmd* item;
+ _iconsole_cmd* item_new;
- i=strlen(name);
- _new=malloc(i+1);
- memset(_new,0,i+1);
- memcpy(_new,name,i);
+ _new = strdup(name);
item_new = malloc(sizeof(_iconsole_cmd));
item_new->_next = NULL;
- item_new->addr = addr;
- item_new->name = _new;
+ item_new->addr = addr;
+ item_new->name = _new;
item_new->hook_access = NULL;
item_new->hook_after_exec = NULL;
@@ -437,43 +422,62 @@ void IConsoleCmdRegister(const byte * name, void * addr)
item = _iconsole_cmds;
if (item == NULL) {
_iconsole_cmds = item_new;
- } else {
- while (item->_next != NULL) { item = item->_next; };
+ } else {
+ while (item->_next != NULL) item = item->_next;
item->_next = item_new;
- }
+ }
}
-_iconsole_cmd * IConsoleCmdGet(const byte * name)
+_iconsole_cmd* IConsoleCmdGet(const char* name)
{
- _iconsole_cmd * item;
+ _iconsole_cmd* item;
item = _iconsole_cmds;
while (item != NULL) {
- if (strcmp(item->name,name)==0) return item;
+ if (strcmp(item->name, name) == 0) return item;
item = item->_next;
- }
+ }
return NULL;
}
-void IConsoleVarRegister(const byte * name, void * addr, byte type)
+void IConsoleVarRegister(const char* name, void* addr, _iconsole_var_types type)
{
- byte * _new;
- _iconsole_var * item;
- _iconsole_var * item_new;
- int i;
+ _iconsole_var* item;
+ _iconsole_var* item_new;
- i=strlen(name)+1;
- _new=malloc(i+1);
- memset(_new,0,i+1);
- _new[0]='*';
- memcpy(_new+1,name,i);
+ item_new = malloc(sizeof(_iconsole_var)); /* XXX unchecked malloc */
- item_new = malloc(sizeof(_iconsole_var));
+ item_new->name = malloc(strlen(name) + 2); /* XXX unchecked malloc */
+ sprintf(item_new->name, "*%s", name);
item_new->_next = NULL;
- item_new->addr = addr;
- item_new->name = _new;
- item_new->type = type;
+ switch (type) {
+ case ICONSOLE_VAR_BOOLEAN:
+ item_new->data.bool_ = addr;
+ break;
+ case ICONSOLE_VAR_BYTE:
+ item_new->data.byte_ = addr;
+ break;
+ case ICONSOLE_VAR_UINT16:
+ item_new->data.uint16_ = addr;
+ break;
+ case ICONSOLE_VAR_UINT32:
+ item_new->data.uint32_ = addr;
+ break;
+ case ICONSOLE_VAR_INT16:
+ item_new->data.int16_ = addr;
+ break;
+ case ICONSOLE_VAR_INT32:
+ item_new->data.int32_ = addr;
+ break;
+ case ICONSOLE_VAR_STRING:
+ item_new->data.string_ = addr;
+ break;
+ default:
+ assert(0); /* XXX */
+ break;
+ }
+ item_new->type = type;
item_new->_malloc = false;
item_new->hook_access = NULL;
@@ -483,117 +487,96 @@ void IConsoleVarRegister(const byte * name, void * addr, byte type)
item = _iconsole_vars;
if (item == NULL) {
_iconsole_vars = item_new;
- } else {
- while (item->_next != NULL) { item = item->_next; };
+ } else {
+ while (item->_next != NULL) item = item->_next;
item->_next = item_new;
- }
+ }
}
-void IConsoleVarMemRegister(const byte * name, byte type)
+void IConsoleVarMemRegister(const char* name, _iconsole_var_types type)
{
- _iconsole_var * item;
+ _iconsole_var* item;
item = IConsoleVarAlloc(type);
- IConsoleVarInsert(item,name);
+ IConsoleVarInsert(item, name);
}
-void IConsoleVarInsert(_iconsole_var * var, const byte * name)
+void IConsoleVarInsert(_iconsole_var* var, const char* name)
{
- byte * _new;
- _iconsole_var * item;
- _iconsole_var * item_new;
- int i;
-
- item_new = var;
-
- // dont allow to build variable rings
- if (item_new->_next != NULL) return;
+ _iconsole_var* item;
- i=strlen(name)+1;
- _new=malloc(i+1);
- memset(_new,0,i+1);
- _new[0]='*';
- memcpy(_new+1,name,i);
+ // disallow building variable rings
+ if (var->_next != NULL) return;
- item_new->name = _new;
+ var->name = malloc(strlen(name) + 2); /* XXX unchecked malloc */
+ sprintf(var->name, "*%s", name);
item = _iconsole_vars;
if (item == NULL) {
- _iconsole_vars = item_new;
+ _iconsole_vars = var;
} else {
- while (item->_next != NULL) { item = item->_next; };
- item->_next = item_new;
+ while (item->_next != NULL) item = item->_next;
+ item->_next = var;
}
}
-_iconsole_var * IConsoleVarGet(const byte * name)
+_iconsole_var* IConsoleVarGet(const char* name)
{
- _iconsole_var * item;
-
- item = _iconsole_vars;
- while (item != NULL) {
- if (strcmp(item->name,name)==0) return item;
- item = item->_next;
- }
+ _iconsole_var* item;
+ for (item = _iconsole_vars; item != NULL; item = item->_next)
+ if (strcmp(item->name, name) == 0) return item;
return NULL;
}
-_iconsole_var * IConsoleVarAlloc(byte type)
+_iconsole_var* IConsoleVarAlloc(_iconsole_var_types type)
{
- _iconsole_var * item;
- item=malloc(sizeof(_iconsole_var));
+ _iconsole_var* item = malloc(sizeof(_iconsole_var)); /* XXX unchecked malloc */
item->_next = NULL;
- item->name = "";
- item->type = type;
+ item->name = NULL;
+ item->type = type;
switch (item->type) {
- case ICONSOLE_VAR_BOOLEAN:
- {
- item->addr=malloc(sizeof(bool));
- memset(item->addr,0,sizeof(bool));
- item->_malloc=true;
- }
- break;
- case ICONSOLE_VAR_BYTE:
- {
- item->addr=malloc(sizeof(byte));
- memset(item->addr,0,sizeof(byte));
- item->_malloc=true;
- }
- break;
- case ICONSOLE_VAR_UINT16:
- {
- item->addr=malloc(sizeof(unsigned short));
- memset(item->addr,0,sizeof(unsigned short));
- item->_malloc=true;
- }
- break;
- case ICONSOLE_VAR_UINT32:
- {
- item->addr=malloc(sizeof(unsigned int));
- memset(item->addr,0,sizeof(unsigned int));
- item->_malloc=true;
- }
- break;
- case ICONSOLE_VAR_INT16:
- {
- item->addr=malloc(sizeof(signed short));
- memset(item->addr,0,sizeof(signed short));
- item->_malloc=true;
- }
- break;
- case ICONSOLE_VAR_INT32:
- {
- item->addr=malloc(sizeof(signed int));
- memset(item->addr,0,sizeof(signed int));
- item->_malloc=true;
- }
- break;
- default:
- item->addr = NULL;
- item->_malloc = false;
- break;
- }
+ case ICONSOLE_VAR_BOOLEAN:
+ item->data.bool_ = malloc(sizeof(*item->data.bool_));
+ *item->data.bool_ = false;
+ item->_malloc = true;
+ break;
+ case ICONSOLE_VAR_BYTE:
+ item->data.byte_ = malloc(sizeof(*item->data.byte_));
+ *item->data.byte_ = 0;
+ item->_malloc = true;
+ break;
+ case ICONSOLE_VAR_UINT16:
+ item->data.uint16_ = malloc(sizeof(*item->data.uint16_));
+ *item->data.uint16_ = 0;
+ item->_malloc = true;
+ break;
+ case ICONSOLE_VAR_UINT32:
+ item->data.uint32_ = malloc(sizeof(*item->data.uint32_));
+ *item->data.uint32_ = 0;
+ item->_malloc = true;
+ break;
+ case ICONSOLE_VAR_INT16:
+ item->data.int16_ = malloc(sizeof(*item->data.int16_));
+ *item->data.int16_ = 0;
+ item->_malloc = true;
+ break;
+ case ICONSOLE_VAR_INT32:
+ item->data.int32_ = malloc(sizeof(*item->data.int32_));
+ *item->data.int32_ = 0;
+ item->_malloc = true;
+ break;
+ case ICONSOLE_VAR_POINTER:
+ case ICONSOLE_VAR_STRING: /* XXX */
+ item->data.addr = NULL;
+ item->_malloc = false;
+ break;
+ default:
+ assert(0); /* XXX */
+ item->data.addr = NULL;
+ item->_malloc = false;
+ break;
+ }
item->hook_access = NULL;
item->hook_after_change = NULL;
@@ -602,217 +585,197 @@ _iconsole_var * IConsoleVarAlloc(byte type)
}
-void IConsoleVarFree(_iconsole_var * var)
+void IConsoleVarFree(_iconsole_var* var)
{
if (var->_malloc)
- free(var->addr);
+ free(var->data.addr);
+ free(var->name);
free(var);
}
-void IConsoleVarSetString(_iconsole_var * var, const byte * string)
+void IConsoleVarSetString(_iconsole_var* var, const char* string)
{
- int l;
-
if (string == NULL) return;
- if (var->_malloc) {
- free(var->addr);
- }
+ if (var->_malloc)
+ free(var->data.string_);
- l=strlen(string);
- var->addr=malloc(l+1);
- var->_malloc=true;
- memset(var->addr,0,l);
- memcpy(var->addr, string, l);
- ((byte *)var->addr)[l]=0;
+ var->data.string_ = strdup(string);
+ var->_malloc = true;
}
-void IConsoleVarSetValue(_iconsole_var * var, int value) {
+void IConsoleVarSetValue(_iconsole_var* var, int value) {
switch (var->type) {
- case ICONSOLE_VAR_BOOLEAN:
- *(bool *)var->addr = (value != 0);
- break;
- case ICONSOLE_VAR_BYTE:
- *(byte *)var->addr = value;
- break;
- case ICONSOLE_VAR_UINT16:
- *(unsigned short *)var->addr = value;
- break;
- case ICONSOLE_VAR_UINT32:
- *(unsigned int *)var->addr = value;
- break;
- case ICONSOLE_VAR_INT16:
- *(signed short *)var->addr = value;
- break;
- case ICONSOLE_VAR_INT32:
- *(signed int *)var->addr = value;
- break;
- default:
- break;
+ case ICONSOLE_VAR_BOOLEAN:
+ *var->data.bool_ = (value != 0);
+ break;
+ case ICONSOLE_VAR_BYTE:
+ *var->data.byte_ = value;
+ break;
+ case ICONSOLE_VAR_UINT16:
+ *var->data.uint16_ = value;
+ break;
+ case ICONSOLE_VAR_UINT32:
+ *var->data.uint32_ = value;
+ break;
+ case ICONSOLE_VAR_INT16:
+ *var->data.int16_ = value;
+ break;
+ case ICONSOLE_VAR_INT32:
+ *var->data.int32_ = value;
+ break;
+ default:
+ assert(0);
+ break;
}
}
-void IConsoleVarDump(_iconsole_var * var, const byte * dump_desc)
+void IConsoleVarDump(const _iconsole_var* var, const char* dump_desc)
{
- byte var_b; // TYPE BYTE
- unsigned short var_ui16; // TYPE UINT16
- unsigned int var_ui32; // TYPE UINT32
- signed short var_i16; // TYPE INT16
- signed int var_i32; // TYPE INT32
- byte * var_s; // TYPE STRING
-
- if (dump_desc==NULL) dump_desc = var->name;
+ if (dump_desc == NULL) dump_desc = var->name;
switch (var->type) {
case ICONSOLE_VAR_BOOLEAN:
- {
- if (*(bool *)var->addr) {
- IConsolePrintF(_iconsole_color_default, "%s = true",dump_desc);
- } else {
- IConsolePrintF(_iconsole_color_default, "%s = false",dump_desc);
- }
- }
- break;
+ IConsolePrintF(_iconsole_color_default, "%s = %s",
+ dump_desc, *var->data.bool_ ? "true" : "false");
+ break;
+ break;
case ICONSOLE_VAR_BYTE:
- {
- var_b=*(byte *)var->addr;
- IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_b);
- }
- break;
+ IConsolePrintF(_iconsole_color_default, "%s = %u",
+ dump_desc, *var->data.byte_);
+ break;
case ICONSOLE_VAR_UINT16:
- {
- var_ui16=*(unsigned short *)var->addr;
- IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_ui16);
- }
- break;
+ IConsolePrintF(_iconsole_color_default, "%s = %u",
+ dump_desc, *var->data.uint16_);
+ break;
case ICONSOLE_VAR_UINT32:
- {
- var_ui32=*(unsigned int *)var->addr;
- IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_ui32);
- }
- break;
+ IConsolePrintF(_iconsole_color_default, "%s = %u",
+ dump_desc, *var->data.uint32_);
+ break;
case ICONSOLE_VAR_INT16:
- {
- var_i16=*(signed short *)var->addr;
- IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_i16);
- }
- break;
+ IConsolePrintF(_iconsole_color_default, "%s = %i",
+ dump_desc, *var->data.int16_);
+ break;
case ICONSOLE_VAR_INT32:
- {
- var_i32=*(signed int *)var->addr;
- IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_i32);
- }
- break;
+ IConsolePrintF(_iconsole_color_default, "%s = %i",
+ dump_desc, *var->data.int32_);
+ break;
case ICONSOLE_VAR_STRING:
- {
- var_s=(byte *)var->addr;
- IConsolePrintF(_iconsole_color_default, "%s = %s",dump_desc,var_s);
- }
- break;
+ IConsolePrintF(_iconsole_color_default, "%s = %s",
+ dump_desc, var->data.string_);
+ break;
case ICONSOLE_VAR_REFERENCE:
- IConsolePrintF(_iconsole_color_default, "%s = @%s",dump_desc,((_iconsole_var *)var->addr)->name);
- break;
+ IConsolePrintF(_iconsole_color_default, "%s = @%s",
+ dump_desc, var->data.reference_);
case ICONSOLE_VAR_UNKNOWN:
case ICONSOLE_VAR_POINTER:
- {
- var_i32=(signed int)((byte *)var->addr);
- IConsolePrintF(_iconsole_color_default, "%s = @%i",dump_desc,var_i32);
- }
- break;
- }
+ IConsolePrintF(_iconsole_color_default, "%s = @%p",
+ dump_desc, var->data.addr);
+ break;
+ case ICONSOLE_VAR_NONE: /* XXX */
+ break;
+ }
}
// * ************************* * //
// * hooking code * //
// * ************************* * //
-void IConsoleVarHook(const byte * name, byte type, void * proc)
+void IConsoleVarHook(const char* name, _iconsole_hook_types type, iconsole_var_hook proc)
{
- _iconsole_var * hook_var;
- hook_var = IConsoleVarGet(name);
+ _iconsole_var* hook_var = IConsoleVarGet(name);
if (hook_var == NULL) return;
switch (type) {
- case ICONSOLE_HOOK_BEFORE_CHANGE:
- hook_var->hook_after_change = proc;
- break;
- case ICONSOLE_HOOK_AFTER_CHANGE:
- hook_var->hook_after_change = proc;
- break;
- case ICONSOLE_HOOK_ACCESS:
- hook_var->hook_access = proc;
- break;
+ case ICONSOLE_HOOK_BEFORE_CHANGE:
+ hook_var->hook_before_change = proc;
+ break;
+ case ICONSOLE_HOOK_AFTER_CHANGE:
+ hook_var->hook_after_change = proc;
+ break;
+ case ICONSOLE_HOOK_ACCESS:
+ hook_var->hook_access = proc;
+ break;
+ case ICONSOLE_HOOK_BEFORE_EXEC:
+ case ICONSOLE_HOOK_AFTER_EXEC:
+ assert(0);
+ break;
}
}
-bool IConsoleVarHookHandle(_iconsole_var * hook_var, byte type)
+bool IConsoleVarHookHandle(_iconsole_var* hook_var, _iconsole_hook_types type)
{
- bool (*proc)(_iconsole_var * hook_var) = NULL;
+ iconsole_var_hook proc = NULL;
switch (type) {
- case ICONSOLE_HOOK_BEFORE_CHANGE:
- proc = hook_var->hook_before_change;
- break;
- case ICONSOLE_HOOK_AFTER_CHANGE:
- proc = hook_var->hook_after_change;
- break;
- case ICONSOLE_HOOK_ACCESS:
- proc = hook_var->hook_access;
- break;
+ case ICONSOLE_HOOK_BEFORE_CHANGE:
+ proc = hook_var->hook_before_change;
+ break;
+ case ICONSOLE_HOOK_AFTER_CHANGE:
+ proc = hook_var->hook_after_change;
+ break;
+ case ICONSOLE_HOOK_ACCESS:
+ proc = hook_var->hook_access;
+ break;
+ case ICONSOLE_HOOK_BEFORE_EXEC:
+ case ICONSOLE_HOOK_AFTER_EXEC:
+ assert(0);
+ break;
}
-
- if (proc == NULL) { return true;}
-
- return proc(hook_var);
+ return proc == NULL ? true : proc(hook_var);
}
-void IConsoleCmdHook(const byte * name, byte type, void * proc)
+void IConsoleCmdHook(const char* name, _iconsole_hook_types type, iconsole_cmd_hook proc)
{
- _iconsole_cmd * hook_cmd;
- hook_cmd = IConsoleCmdGet(name);
+ _iconsole_cmd* hook_cmd = IConsoleCmdGet(name);
if (hook_cmd == NULL) return;
switch (type) {
- case ICONSOLE_HOOK_AFTER_EXEC:
- hook_cmd->hook_after_exec = proc;
- break;
- case ICONSOLE_HOOK_BEFORE_EXEC:
- hook_cmd->hook_before_exec = proc;
- break;
- case ICONSOLE_HOOK_ACCESS:
- hook_cmd->hook_access = proc;
- break;
+ case ICONSOLE_HOOK_AFTER_EXEC:
+ hook_cmd->hook_after_exec = proc;
+ break;
+ case ICONSOLE_HOOK_BEFORE_EXEC:
+ hook_cmd->hook_before_exec = proc;
+ break;
+ case ICONSOLE_HOOK_ACCESS:
+ hook_cmd->hook_access = proc;
+ break;
+ case ICONSOLE_HOOK_BEFORE_CHANGE:
+ case ICONSOLE_HOOK_AFTER_CHANGE:
+ assert(0);
+ break;
}
}
-bool IConsoleCmdHookHandle(_iconsole_cmd * hook_cmd, byte type)
+bool IConsoleCmdHookHandle(_iconsole_cmd* hook_cmd, _iconsole_hook_types type)
{
- bool (*proc)(_iconsole_cmd * hook_cmd) = NULL;
+ iconsole_cmd_hook proc = NULL;
switch (type) {
- case ICONSOLE_HOOK_AFTER_EXEC:
- proc = hook_cmd->hook_after_exec;
- break;
- case ICONSOLE_HOOK_BEFORE_EXEC:
- proc = hook_cmd->hook_before_exec;
- break;
- case ICONSOLE_HOOK_ACCESS:
- proc = hook_cmd->hook_access;
- break;
+ case ICONSOLE_HOOK_AFTER_EXEC:
+ proc = hook_cmd->hook_after_exec;
+ break;
+ case ICONSOLE_HOOK_BEFORE_EXEC:
+ proc = hook_cmd->hook_before_exec;
+ break;
+ case ICONSOLE_HOOK_ACCESS:
+ proc = hook_cmd->hook_access;
+ break;
+ case ICONSOLE_HOOK_BEFORE_CHANGE:
+ case ICONSOLE_HOOK_AFTER_CHANGE:
+ assert(0);
+ break;
}
-
- if (proc == NULL) { return true;}
-
- return proc(hook_cmd);
+ return proc == NULL ? true : proc(hook_cmd);
}
-void IConsoleCmdExec(const byte* cmdstr)
+void IConsoleCmdExec(const char* cmdstr)
{
- _iconsole_var * (*function)(byte argc, byte* argv[], byte argt[]);
- byte * tokens[20];
- byte tokentypes[20];
- byte * tokenstream;
- byte * tokenstream_s;
- byte execution_mode;
- _iconsole_var * var = NULL;
- _iconsole_var * result = NULL;
- _iconsole_cmd * cmd = NULL;
+ _iconsole_cmd_addr function;
+ char* tokens[20];
+ byte tokentypes[20];
+ char* tokenstream;
+ char* tokenstream_s;
+ byte execution_mode;
+ _iconsole_var* var = NULL;
+ _iconsole_var* result = NULL;
+ _iconsole_cmd* cmd = NULL;
bool longtoken;
bool valid_token;
@@ -824,96 +787,102 @@ void IConsoleCmdExec(const byte* cmdstr)
//** clearing buffer **//
- for (i=0;i<20;i++) { tokens[i]=NULL; tokentypes[i]=ICONSOLE_VAR_NONE; };
- tokenstream_s=tokenstream=malloc(1024);
- memset(tokenstream,0,1024);
+ for (i = 0; i < 20; i++) {
+ tokens[i] = NULL;
+ tokentypes[i] = ICONSOLE_VAR_NONE;
+ }
+ tokenstream_s = tokenstream = malloc(1024);
+ memset(tokenstream, 0, 1024);
//** parsing **//
- longtoken=false;
- valid_token=false;
- skip_lt_change=false;
- l=strlen(cmdstr);
- i=0;
- c=0;
+ longtoken = false;
+ valid_token = false;
+ skip_lt_change = false;
+ l = strlen(cmdstr);
+ i = 0;
+ c = 0;
tokens[c] = tokenstream;
- while (i<l) {
- if (cmdstr[i]=='"') {
+ while (i < l) {
+ if (cmdstr[i] == '"') {
if (longtoken) {
- if (cmdstr[i+1]=='"') {
+ if (cmdstr[i + 1] == '"') {
i++;
*tokenstream = '"';
tokenstream++;
- skip_lt_change=true;
- } else {
- longtoken=!longtoken;
- }
+ skip_lt_change = true;
} else {
- longtoken=!longtoken;
+ longtoken = !longtoken;
}
+ } else
+ longtoken = !longtoken;
if (!skip_lt_change) {
if (!longtoken) {
if (valid_token) {
c++;
- *tokenstream = 0;
+ *tokenstream = '\0';
tokenstream++;
tokens[c] = tokenstream;
valid_token = false;
- }
}
- skip_lt_change=false;
}
+ skip_lt_change=false;
}
- else if ((!longtoken) && (cmdstr[i]==' ')) {
+ } else if (!longtoken && cmdstr[i] == ' ') {
if (valid_token) {
c++;
- *tokenstream = 0;
+ *tokenstream = '\0';
tokenstream++;
tokens[c] = tokenstream;
valid_token = false;
- }
}
- else {
- valid_token=true;
+ } else {
+ valid_token = true;
*tokenstream = cmdstr[i];
tokenstream++;
- }
- i++;
}
+ i++;
+ }
tokenstream--;
- if (!(*tokenstream==0)) {
+ if (*tokenstream != '\0') {
c++;
tokenstream++;
- *tokenstream = 0;
- }
+ *tokenstream = '\0';
+ }
//** interpreting **//
- for (i=0; i<c; i++) {
- tokentypes[i]=ICONSOLE_VAR_UNKNOWN;
- if (tokens[i]!=NULL) if (i>0) if (strlen((char *) tokens[i])>0) {
- if (tokens[i][0]=='*') {
- if ((i==2) && (tokentypes[1]==ICONSOLE_VAR_UNKNOWN) && (strcmp(tokens[1],"<<")==0)) {
- // dont change the variable to an pointer if execution_mode 4 is being prepared
- // this is used to assign one variable the value of the other one [token 0 and 2]
- } else {
+ for (i = 0; i < c; i++) {
+ tokentypes[i] = ICONSOLE_VAR_UNKNOWN;
+ if (tokens[i] != NULL && i > 0 && strlen(tokens[i]) > 0) {
+ if (tokens[i][0] == '*') {
+ if ((i == 2) && (tokentypes[1] == ICONSOLE_VAR_UNKNOWN) &&
+ (strcmp(tokens[1], "<<") == 0)) {
+ // don't change the variable to an pointer if execution_mode 4 is
+ // being prepared
+ // this is used to assign one variable the value of the other one
+ // [token 0 and 2]
+ /* XXX empty? */
+ } else {
var = IConsoleVarGet(tokens[i]);
- if (var!=NULL) {
- tokens[i]=(byte *)var->addr;
- tokentypes[i]=var->type;
- }
+ if (var != NULL) {
+ assert(0); /* XXX */
+ //tokens[i] = var->addr; /* XXX ? */
+ tokentypes[i] = var->type;
}
}
- if (tokens[i]!=NULL) if (tokens[i][0]=='@') if (tokens[i][1]=='*') {
- var = IConsoleVarGet(tokens[i]+1);
- if (var!=NULL) {
- tokens[i]=(byte *)var;
- tokentypes[i]=ICONSOLE_VAR_REFERENCE;
- }
+ }
+ if (tokens[i] != NULL && tokens[i][0] == '@' && tokens[i][1] == '*') {
+ var = IConsoleVarGet(tokens[i] + 1);
+ if (var != NULL) {
+ assert(0); /* XXX */
+ //tokens[i] = var; /* XXX wtf? incompatible pointer type! */
+ tokentypes[i] = ICONSOLE_VAR_REFERENCE;
}
}
}
+ }
execution_mode=0;
@@ -922,12 +891,12 @@ void IConsoleCmdExec(const byte* cmdstr)
if (cmd != NULL) function = cmd->addr;
if (function != NULL) {
- execution_mode=1; // this is a command
- } else {
+ execution_mode = 1; // this is a command
+ } else {
var = IConsoleVarGet(tokens[0]);
if (var != NULL) {
- execution_mode=2; // this is a variable
- if (c>2) if (strcmp(tokens[1],"<<")==0) {
+ execution_mode = 2; // this is a variable
+ if (c > 2 && strcmp(tokens[1], "<<") == 0) {
// this is command to variable mode [normal]
function = NULL;
@@ -935,335 +904,292 @@ void IConsoleCmdExec(const byte* cmdstr)
if (cmd != NULL) function = cmd->addr;
if (function != NULL) {
- execution_mode=3;
- } else {
+ execution_mode = 3;
+ } else {
result = IConsoleVarGet(tokens[2]);
- if (result != NULL) {
+ if (result != NULL)
execution_mode=4;
- }
- }
}
}
}
+ }
//** executing **//
- if (_stdlib_con_developer) IConsolePrintF(_iconsole_color_debug,"CONDEBUG: execution_mode: %i",execution_mode);
+ if (_stdlib_con_developer)
+ IConsolePrintF(_iconsole_color_debug, "CONDEBUG: execution_mode: %i",
+ execution_mode);
switch (execution_mode) {
- case 0:
- {
- // not found
- IConsoleError("command or variable not found");
- }
- break;
- case 1:
- if (IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_ACCESS)) {
- // execution with command syntax
- IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_BEFORE_EXEC);
- result = function(c,tokens,tokentypes);
- if (result!=NULL) {
- IConsoleVarDump(result,"result");
- IConsoleVarFree(result);
+ case 0:
+ // not found
+ IConsoleError("command or variable not found");
+ break;
+ case 1:
+ if (IConsoleCmdHookHandle(cmd, ICONSOLE_HOOK_ACCESS)) {
+ // execution with command syntax
+ IConsoleCmdHookHandle(cmd, ICONSOLE_HOOK_BEFORE_EXEC);
+ result = function(c, tokens, tokentypes);
+ if (result != NULL) {
+ IConsoleVarDump(result, "result");
+ IConsoleVarFree(result);
+ }
+ IConsoleCmdHookHandle(cmd, ICONSOLE_HOOK_AFTER_EXEC);
+ break;
}
- IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_AFTER_EXEC);
- }
- break;
- case 2:
+ case 2:
{
- // execution with variable syntax
- if (IConsoleVarHookHandle(var,ICONSOLE_HOOK_ACCESS)) if ((c==2) || (c==3)) {
- // ** variable modifications ** //
- IConsoleVarHookHandle(var,ICONSOLE_HOOK_BEFORE_CHANGE);
- switch (var->type) {
- case ICONSOLE_VAR_BOOLEAN:
+ // execution with variable syntax
+ if (IConsoleVarHookHandle(var, ICONSOLE_HOOK_ACCESS) && (c == 2 || c == 3)) {
+ // ** variable modifications ** //
+ IConsoleVarHookHandle(var, ICONSOLE_HOOK_BEFORE_CHANGE);
+ switch (var->type) {
+ case ICONSOLE_VAR_BOOLEAN:
{
- if (strcmp(tokens[1],"=")==0) {
- if (c==3) {
- *(bool *)var->addr=(atoi((char *) tokens[2])!=0);
- IConsoleVarDump(var,NULL);
+ if (strcmp(tokens[1], "=") == 0) {
+ if (c == 3) {
+ *var->data.bool_ = (atoi(tokens[2]) != 0);
} else {
- *(bool *)var->addr=false;
- IConsoleVarDump(var,NULL);
+ *var->data.bool_ = false;
}
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "++") == 0) {
+ *var->data.bool_ = !*var->data.bool_; /* XXX ++ on bool */
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "--") == 0) {
+ *var->data.bool_ = !*var->data.bool_; /* XXX -- on bool */
+ IConsoleVarDump(var, NULL);
}
- else if (strcmp(tokens[1],"++")==0) {
- *(bool *)var->addr=!*(bool *)var->addr;
- IConsoleVarDump(var,NULL);
- }
- else if (strcmp(tokens[1],"--")==0) {
- *(bool *)var->addr=!*(bool *)var->addr;
- IConsoleVarDump(var,NULL);
- }
- else { IConsoleError("operation not supported"); }
+ else
+ IConsoleError("operation not supported");
+ break;
}
- break;
- case ICONSOLE_VAR_BYTE:
+ case ICONSOLE_VAR_BYTE:
{
- if (strcmp(tokens[1],"=")==0) {
- if (c==3) {
- *(byte *)var->addr=atoi((char *) tokens[2]);
- IConsoleVarDump(var,NULL);
- } else {
- *(byte *)var->addr=0;
- IConsoleVarDump(var,NULL);
- }
- }
- else if (strcmp(tokens[1],"++")==0) {
- (*(byte *)var->addr)++;
- IConsoleVarDump(var,NULL);
- }
- else if (strcmp(tokens[1],"--")==0) {
- (*(byte *)var->addr)--;
- IConsoleVarDump(var,NULL);
+ if (strcmp(tokens[1], "=") == 0) {
+ if (c == 3)
+ *var->data.byte_ = atoi(tokens[2]);
+ else
+ *var->data.byte_ = 0;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "++") == 0) {
+ ++*var->data.byte_;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "--")==0) {
+ --*var->data.byte_;
+ IConsoleVarDump(var, NULL);
}
- else { IConsoleError("operation not supported"); }
+ else
+ IConsoleError("operation not supported");
+ break;
}
- break;
- case ICONSOLE_VAR_UINT16:
+ case ICONSOLE_VAR_UINT16:
{
- if (strcmp(tokens[1],"=")==0) {
- if (c==3) {
- *(unsigned short *)var->addr=atoi((char *) tokens[2]);
- IConsoleVarDump(var,NULL);
- } else {
- *(unsigned short *)var->addr=0;
- IConsoleVarDump(var,NULL);
- }
- }
- else if (strcmp(tokens[1],"++")==0) {
- (*(unsigned short *)var->addr)++;
- IConsoleVarDump(var,NULL);
+ if (strcmp(tokens[1], "=") == 0) {
+ if (c == 3)
+ *var->data.uint16_ = atoi(tokens[2]);
+ else
+ *var->data.uint16_ = 0;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "++") == 0) {
+ ++*var->data.uint16_;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "--") == 0) {
+ --*var->data.uint16_;
+ IConsoleVarDump(var, NULL);
}
- else if (strcmp(tokens[1],"--")==0) {
- (*(unsigned short *)var->addr)--;
- IConsoleVarDump(var,NULL);
- }
- else { IConsoleError("operation not supported"); }
+ else
+ IConsoleError("operation not supported");
+ break;
}
- break;
- case ICONSOLE_VAR_UINT32:
+ case ICONSOLE_VAR_UINT32:
{
- if (strcmp(tokens[1],"=")==0) {
- if (c==3) {
- *(unsigned int *)var->addr=atoi((char *) tokens[2]);
- IConsoleVarDump(var,NULL);
- } else {
- *(unsigned int *)var->addr=0;
- IConsoleVarDump(var,NULL);
- }
- }
- else if (strcmp(tokens[1],"++")==0) {
- (*(unsigned int *)var->addr)++;
- IConsoleVarDump(var,NULL);
+ if (strcmp(tokens[1], "=") == 0) {
+ if (c == 3)
+ *var->data.uint32_ = atoi(tokens[2]);
+ else
+ *var->data.uint32_ = 0;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "++") == 0) {
+ ++*var->data.uint32_;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "--") == 0) {
+ --*var->data.uint32_;
+ IConsoleVarDump(var, NULL);
}
- else if (strcmp(tokens[1],"--")==0) {
- (*(unsigned int *)var->addr)--;
- IConsoleVarDump(var,NULL);
- }
- else { IConsoleError("operation not supported"); }
+ else
+ IConsoleError("operation not supported");
+ break;
}
- break;
- case ICONSOLE_VAR_INT16:
+ case ICONSOLE_VAR_INT16:
{
- if (strcmp(tokens[1],"=")==0) {
- if (c==3) {
- *(signed short *)var->addr=atoi((char *) tokens[2]);
- IConsoleVarDump(var,NULL);
- } else {
- *(signed short *)var->addr=0;
- IConsoleVarDump(var,NULL);
- }
+ if (strcmp(tokens[1], "=") == 0) {
+ if (c == 3)
+ *var->data.int16_ = atoi(tokens[2]);
+ else
+ *var->data.int16_ = 0;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "++") == 0) {
+ ++*var->data.int16_;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "--") == 0) {
+ --*var->data.int16_;
+ IConsoleVarDump(var, NULL);
}
- else if (strcmp(tokens[1],"++")==0) {
- (*(signed short *)var->addr)++;
- IConsoleVarDump(var,NULL);
- }
- else if (strcmp(tokens[1],"--")==0) {
- (*(signed short *)var->addr)--;
- IConsoleVarDump(var,NULL);
- }
- else { IConsoleError("operation not supported"); }
+ else
+ IConsoleError("operation not supported");
+ break;
}
- break;
- case ICONSOLE_VAR_INT32:
+ case ICONSOLE_VAR_INT32:
{
- if (strcmp(tokens[1],"=")==0) {
- if (c==3) {
- *(signed int *)var->addr=atoi((char *) tokens[2]);
- IConsoleVarDump(var,NULL);
- } else {
- *(signed int *)var->addr=0;
- IConsoleVarDump(var,NULL);
- }
+ if (strcmp(tokens[1], "=") == 0) {
+ if (c == 3)
+ *var->data.int32_ = atoi(tokens[2]);
+ else
+ *var->data.int32_ = 0;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "++") == 0) {
+ ++*var->data.int32_;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "--") == 0) {
+ --*var->data.int32_;
+ IConsoleVarDump(var, NULL);
}
- else if (strcmp(tokens[1],"++")==0) {
- (*(signed int *)var->addr)++;
- IConsoleVarDump(var,NULL);
- }
- else if (strcmp(tokens[1],"--")==0) {
- (*(signed int *)var->addr)--;
- IConsoleVarDump(var,NULL);
- }
- else { IConsoleError("operation not supported"); }
+ else { IConsoleError("operation not supported"); }
+ break;
}
- break;
- case ICONSOLE_VAR_STRING:
+ case ICONSOLE_VAR_STRING:
{
- if (strcmp(tokens[1],"=")==0) {
- if (c==3) {
- IConsoleVarSetString(var, tokens[2]);
- IConsoleVarDump(var,NULL);
- } else {
- IConsoleVarSetString(var, "");
- IConsoleVarDump(var,NULL);
- }
+ if (strcmp(tokens[1], "=") == 0) {
+ if (c == 3)
+ IConsoleVarSetString(var, tokens[2]);
+ else
+ IConsoleVarSetString(var, "");
+ IConsoleVarDump(var, NULL);
}
- else { IConsoleError("operation not supported"); }
+ else
+ IConsoleError("operation not supported");
+ break;
}
- break;
- case ICONSOLE_VAR_POINTER:
+ case ICONSOLE_VAR_POINTER:
{
- if (strcmp(tokens[1],"=")==0) {
- if (c==3) {
- if (tokentypes[2]==ICONSOLE_VAR_UNKNOWN) {
- var->addr = (void *)atoi(tokens[2]);
- } else {
- var->addr = (void *)tokens[2];
- }
- IConsoleVarDump(var,NULL);
- } else {
- var->addr = NULL;
- IConsoleVarDump(var,NULL);
- }
- }
- else if (strcmp(tokens[1],"++")==0) {
- var->addr = ((char *)var->addr)+1;
- IConsoleVarDump(var,NULL);
+ if (strcmp(tokens[1], "=") == 0) {
+ if (c == 3) {
+ if (tokentypes[2] == ICONSOLE_VAR_UNKNOWN)
+ var->data.addr = (void*)atoi(tokens[2]); /* XXX ? */
+ else
+ var->data.addr = (void*)tokens[2]; /* XXX ? */
+ } else
+ var->data.addr = NULL;
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "++") == 0) {
+ ++*(char*)&var->data.addr; /* XXX ++ on an arbitrary pointer? */
+ IConsoleVarDump(var, NULL);
+ } else if (strcmp(tokens[1], "--") == 0) {
+ --*(char*)&var->data.addr; /* XXX -- on an arbitrary pointer? */
+ IConsoleVarDump(var, NULL);
}
- else if (strcmp(tokens[1],"--")==0) {
- var->addr = ((char *)var->addr)-1;;
- IConsoleVarDump(var,NULL);
- }
- else { IConsoleError("operation not supported"); }
+ else
+ IConsoleError("operation not supported");
+ break;
}
- break;
+ case ICONSOLE_VAR_NONE: /* XXX */
+ case ICONSOLE_VAR_REFERENCE: /* XXX */
+ case ICONSOLE_VAR_UNKNOWN: /* XXX */
+ break;
}
- IConsoleVarHookHandle(var,ICONSOLE_HOOK_AFTER_CHANGE);
- }
- if (c==1) {
- // ** variable output ** //
- IConsoleVarDump(var,NULL);
+ IConsoleVarHookHandle(var, ICONSOLE_HOOK_AFTER_CHANGE);
}
+ if (c == 1) // ** variable output ** //
+ IConsoleVarDump(var, NULL);
+ break;
}
- break;
- case 3:
- case 4:
+ case 3:
+ case 4:
{
- // execute command with result or assign a variable
- if (execution_mode==3) {
- if (IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_ACCESS)) {
+ // execute command with result or assign a variable
+ if (execution_mode == 3) {
+ if (IConsoleCmdHookHandle(cmd, ICONSOLE_HOOK_ACCESS)) {
int i;
int diff;
- void * temp;
+ void* temp;
byte temp2;
// tokenshifting
- for (diff=0; diff<2; diff++) {
- temp=tokens[0];
- temp2=tokentypes[0];
- for (i=1; i<20; i++) {
- tokens[i-1]=tokens[i];
- tokentypes[i-1]=tokentypes[i];
+ for (diff = 0; diff < 2; diff++) {
+ temp = tokens[0];
+ temp2 = tokentypes[0];
+ for (i = 0; i < 19; i++) {
+ tokens[i] = tokens[i + 1];
+ tokentypes[i] = tokentypes[i + 1];
}
- tokens[19]=temp;
- tokentypes[19]=temp2;
+ tokens[19] = temp;
+ tokentypes[19] = temp2;
}
- IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_BEFORE_EXEC);
- result = function(c,tokens,tokentypes);
- IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_AFTER_EXEC);
+ IConsoleCmdHookHandle(cmd, ICONSOLE_HOOK_BEFORE_EXEC);
+ result = function(c, tokens, tokentypes);
+ IConsoleCmdHookHandle(cmd, ICONSOLE_HOOK_AFTER_EXEC);
} else
- execution_mode=255;
+ execution_mode = 255;
}
- if (IConsoleVarHookHandle(var,ICONSOLE_HOOK_ACCESS)) if (result!=NULL) {
- if (result ->type != var -> type) {
- IConsoleError("variable type missmatch");
- } else {
- IConsoleVarHookHandle(var,ICONSOLE_HOOK_BEFORE_CHANGE);
- switch (result->type) {
- case ICONSOLE_VAR_BOOLEAN:
- {
- (*(bool *)var->addr)=(*(bool *)result->addr);
- IConsoleVarDump(var,NULL);
- }
- break;
- case ICONSOLE_VAR_BYTE:
- {
- (*(byte *)var->addr)=(*(byte *)result->addr);
- IConsoleVarDump(var,NULL);
- }
- break;
- case ICONSOLE_VAR_UINT16:
- {
- (*(unsigned short *)var->addr)=(*(unsigned short *)result->addr);
- IConsoleVarDump(var,NULL);
- }
- break;
- case ICONSOLE_VAR_UINT32:
- {
- (*(unsigned int *)var->addr)=(*(unsigned int *)result->addr);
- IConsoleVarDump(var,NULL);
- }
- break;
- case ICONSOLE_VAR_INT16:
- {
- (*(signed short *)var->addr)=(*(signed short *)result->addr);
- IConsoleVarDump(var,NULL);
- }
- break;
- case ICONSOLE_VAR_INT32:
- {
- (*(signed int *)var->addr)=(*(signed int *)result->addr);
- IConsoleVarDump(var,NULL);
- }
- break;
- case ICONSOLE_VAR_POINTER:
- {
- var->addr=result->addr;
- IConsoleVarDump(var,NULL);
- }
- break;
- case ICONSOLE_VAR_STRING:
- {
- IConsoleVarSetString(var,result->addr);
- IConsoleVarDump(var,NULL);
- }
- break;
- default:
- {
+ if (IConsoleVarHookHandle(var, ICONSOLE_HOOK_ACCESS) && result != NULL) {
+ if (result->type != var->type) {
IConsoleError("variable type missmatch");
+ } else {
+ IConsoleVarHookHandle(var, ICONSOLE_HOOK_BEFORE_CHANGE);
+ switch (result->type) {
+ case ICONSOLE_VAR_BOOLEAN:
+ *var->data.bool_ = *result->data.bool_;
+ IConsoleVarDump(var, NULL);
+ break;
+ case ICONSOLE_VAR_BYTE:
+ *var->data.byte_ = *result->data.byte_;
+ IConsoleVarDump(var, NULL);
+ break;
+ case ICONSOLE_VAR_UINT16:
+ *var->data.uint16_ = *result->data.uint16_;
+ IConsoleVarDump(var, NULL);
+ break;
+ case ICONSOLE_VAR_UINT32:
+ *var->data.uint32_ = *result->data.uint32_;
+ IConsoleVarDump(var, NULL);
+ break;
+ case ICONSOLE_VAR_INT16:
+ *var->data.int16_ = *result->data.int16_;
+ IConsoleVarDump(var, NULL);
+ break;
+ case ICONSOLE_VAR_INT32:
+ *var->data.int32_ = *result->data.int32_;
+ IConsoleVarDump(var, NULL);
+ break;
+ case ICONSOLE_VAR_POINTER:
+ var->data.addr = result->data.addr;
+ IConsoleVarDump(var, NULL);
+ break;
+ case ICONSOLE_VAR_STRING:
+ IConsoleVarSetString(var, result->data.string_);
+ IConsoleVarDump(var, NULL);
+ break;
+ default:
+ IConsoleError("variable type missmatch");
+ break;
}
- break;
- }
- IConsoleVarHookHandle(var,ICONSOLE_HOOK_AFTER_CHANGE);
+ IConsoleVarHookHandle(var, ICONSOLE_HOOK_AFTER_CHANGE);
}
- if (execution_mode==3) {
- IConsoleVarFree(result);
- result = NULL;
+ if (execution_mode == 3) {
+ IConsoleVarFree(result);
+ result = NULL;
}
}
-
- }
- break;
- default:
- {
- // execution mode invalid
- IConsoleError("invalid execution mode");
+ break;
}
+ default:
+ // execution mode invalid
+ IConsoleError("invalid execution mode");
+ break;
}
//** freeing the tokens **//
- for (i=0;i<20;i++) tokens[i]=NULL;
+ for (i = 0; i < 20; i++) tokens[i] = NULL; /* XXX wtf? */
free(tokenstream_s);
-
}