darkvater@135: #include "stdafx.h" darkvater@135: #include "ttd.h" darkvater@135: #include "window.h" darkvater@135: #include "gui.h" darkvater@135: #include "gfx.h" darkvater@135: #include "player.h" darkvater@135: #include "variables.h" darkvater@135: #include "hal.h" darkvater@135: #include darkvater@135: #include "console.h" darkvater@135: darkvater@135: // ** main console ** // darkvater@135: static bool _iconsole_inited; darkvater@135: static byte* _iconsole_buffer[80]; darkvater@135: static byte _iconsole_cbuffer[80]; darkvater@135: static byte _iconsole_cmdline[255]; darkvater@135: static byte _iconsole_cmdpos; dominik@136: static byte _iconsole_mode = ICONSOLE_CLOSED; darkvater@135: static Window *_iconsole_win = NULL; darkvater@135: static byte _iconsole_scroll; darkvater@135: darkvater@135: // ** console cursor ** // darkvater@135: static bool _icursor_state; darkvater@135: static byte _icursor_rate; darkvater@135: static byte _icursor_counter; darkvater@135: signde@220: // ** stdlib ** // signde@220: byte _stdlib_developer=1; signde@220: bool _stdlib_con_developer=false; signde@220: signde@220: // ** main console cmd buffer ** // sign_de: especialy for Celestar :D signde@220: static byte* _iconsole_cmdbuffer[20]; signde@220: static byte _iconsole_cmdbufferpos; signde@220: darkvater@135: // ** console window ** // darkvater@135: static void IConsoleWndProc(Window *w, WindowEvent *e); darkvater@176: static const Widget _iconsole_window_widgets[] = {{WIDGETS_END}}; darkvater@135: static const WindowDesc _iconsole_window_desc = { darkvater@135: 0, 0, 2, 2, darkvater@135: WC_CONSOLE,0, darkvater@135: WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, darkvater@135: _iconsole_window_widgets, darkvater@135: IConsoleWndProc, darkvater@135: }; darkvater@135: darkvater@135: /* *************** */ darkvater@135: /* end of header */ darkvater@135: /* *************** */ darkvater@135: darkvater@135: void IConsoleClearCommand() darkvater@135: { darkvater@135: int i; darkvater@135: for (i=0; i<255; i++) _iconsole_cmdline[i]=0; darkvater@135: _iconsole_cmdpos=0; darkvater@135: SetWindowDirty(_iconsole_win); darkvater@135: } darkvater@135: darkvater@135: static void IConsoleWndProc(Window *w, WindowEvent *e) darkvater@135: { signde@209: // only do window events with the console signde@209: w = FindWindowById(WC_CONSOLE, 0); signde@209: darkvater@135: switch(e->event) { darkvater@135: darkvater@169: case WE_PAINT: darkvater@135: GfxFillRect(w->left,w->top,w->width,w->height-1,0); darkvater@135: { darkvater@135: int i=_iconsole_scroll; darkvater@135: int max=(w->height/12)-1; darkvater@135: while ((i>_iconsole_scroll-max) && (_iconsole_buffer[i]!=NULL)) { darkvater@135: DoDrawString(_iconsole_buffer[i],5,w->height-(((_iconsole_scroll+2)-i)*12),_iconsole_cbuffer[i]); darkvater@135: i--; darkvater@135: } darkvater@135: DoDrawString("]",5,w->height-12,_iconsole_color_commands); darkvater@135: DoDrawString((char *)&_iconsole_cmdline,10,w->height-12,_iconsole_color_commands); darkvater@135: } darkvater@135: break; darkvater@135: darkvater@135: case WE_TICK: darkvater@135: darkvater@135: _icursor_counter++; darkvater@135: if (_icursor_counter>_icursor_rate) { darkvater@135: _icursor_state=!_icursor_state; darkvater@135: { darkvater@135: int posx; darkvater@135: int posy; darkvater@135: int color; darkvater@135: _cur_dpi=&_screen; darkvater@135: if (_icursor_state) color=14; else color=0; darkvater@135: posx=10+GetStringWidth((char *)&_iconsole_cmdline); darkvater@135: posy=w->height-3; darkvater@135: GfxFillRect(posx,posy,posx+5,posy+1,color); darkvater@135: _video_driver->make_dirty(posx,posy,5,1); darkvater@135: } truelight@193: _icursor_counter=0; darkvater@135: } darkvater@135: break; darkvater@135: darkvater@169: case WE_DESTROY: darkvater@169: _iconsole_win=NULL; darkvater@169: _iconsole_mode=ICONSOLE_CLOSED; darkvater@169: break; darkvater@169: darkvater@135: case WE_KEYPRESS: darkvater@135: e->keypress.cont=false; darkvater@141: if (e->keypress.keycode == (WKC_UP)) darkvater@141: { darkvater@141: IConsoleCmdBufferNavigate(+1); darkvater@141: SetWindowDirty(w); darkvater@141: } else darkvater@141: if (e->keypress.keycode == (WKC_DOWN)) darkvater@141: { darkvater@141: IConsoleCmdBufferNavigate(-1); darkvater@141: SetWindowDirty(w); darkvater@141: } else darkvater@141: if (e->keypress.keycode == (WKC_SHIFT | WKC_PAGEUP)) darkvater@135: { darkvater@135: if ((_iconsole_scroll - ((w->height/12)-1))<0) { darkvater@135: _iconsole_scroll = 0; darkvater@135: } else { darkvater@135: _iconsole_scroll -= (w->height/12)-1; darkvater@135: } darkvater@135: SetWindowDirty(w); darkvater@135: } else darkvater@141: if (e->keypress.keycode == (WKC_SHIFT | WKC_PAGEDOWN)) darkvater@135: { darkvater@135: if ((_iconsole_scroll + ((w->height/12)-1))>79) { darkvater@135: _iconsole_scroll = 79; darkvater@135: } else { darkvater@135: _iconsole_scroll += (w->height/12)-1; darkvater@135: } darkvater@135: SetWindowDirty(w); darkvater@135: } else darkvater@141: if (e->keypress.keycode == (WKC_SHIFT | WKC_UP)) darkvater@135: { darkvater@135: if ((_iconsole_scroll - 1)<0) { darkvater@135: _iconsole_scroll = 0; darkvater@135: } else { darkvater@135: _iconsole_scroll -= 1; darkvater@135: } darkvater@135: SetWindowDirty(w); darkvater@135: } else darkvater@141: if (e->keypress.keycode == (WKC_SHIFT | WKC_DOWN)) darkvater@135: { darkvater@135: if ((_iconsole_scroll + 1)>79) { darkvater@135: _iconsole_scroll = 79; darkvater@135: } else { darkvater@135: _iconsole_scroll += 1; darkvater@135: } darkvater@135: SetWindowDirty(w); darkvater@135: } else darkvater@135: if (e->keypress.keycode == WKC_BACKQUOTE) darkvater@135: { darkvater@135: IConsoleSwitch(); darkvater@135: } else truelight@193: if (e->keypress.keycode == WKC_RETURN) darkvater@135: { darkvater@135: IConsolePrintF(_iconsole_color_commands, "] %s", _iconsole_cmdline); darkvater@141: IConsoleCmdBufferAdd(_iconsole_cmdline); darkvater@135: IConsoleCmdExec((byte *) _iconsole_cmdline); darkvater@135: IConsoleClearCommand(); darkvater@135: } else truelight@193: if (e->keypress.keycode == WKC_BACKSPACE) darkvater@135: { darkvater@135: if (_iconsole_cmdpos!=0) _iconsole_cmdpos--; darkvater@135: _iconsole_cmdline[_iconsole_cmdpos]=0; darkvater@135: SetWindowDirty(w); darkvater@141: _iconsole_cmdbufferpos=19; darkvater@135: } else darkvater@135: if (IS_INT_INSIDE((e->keypress.ascii), 32, 256)) darkvater@135: { darkvater@135: _iconsole_scroll=79; darkvater@135: _iconsole_cmdline[_iconsole_cmdpos]=e->keypress.ascii; truelight@193: if (_iconsole_cmdpos!=255) _iconsole_cmdpos++; darkvater@135: SetWindowDirty(w); darkvater@141: _iconsole_cmdbufferpos=19; truelight@193: } else e->keypress.cont=true; darkvater@135: break; darkvater@135: darkvater@135: } darkvater@135: } darkvater@135: darkvater@135: void IConsoleInit() darkvater@135: { signde@220: int i; signde@220: #if defined(WITH_REV) signde@220: extern char _openttd_revision[]; signde@220: #endif signde@220: _iconsole_color_default = 1; signde@220: _iconsole_color_error = 3; signde@220: _iconsole_color_debug = 5; signde@220: _iconsole_color_commands = 2; signde@220: _iconsole_scroll=79; signde@220: _iconsole_cmdbufferpos=19; signde@220: _iconsole_inited=true; signde@220: _iconsole_mode=ICONSOLE_CLOSED; signde@220: _iconsole_win=NULL; signde@220: _icursor_state=false; signde@220: _icursor_rate=5; signde@220: _icursor_counter=0; signde@220: for (i=0;i<20;i++) { signde@220: _iconsole_cmdbuffer[i]=NULL; signde@220: } signde@220: for (i=0;i<80;i++) { signde@220: _iconsole_buffer[i]=NULL; signde@220: _iconsole_cbuffer[i]=0; signde@220: } signde@220: IConsoleStdLibRegister(); signde@220: #if defined(WITH_REV) signde@220: IConsolePrintF(13,"OpenTTD Game Console Revision 3 - %s",_openttd_revision); signde@220: #else signde@220: IConsolePrint(13,"OpenTTD Game Console Revision 3"); signde@220: #endif signde@220: IConsolePrint(12,"---------------------------------"); signde@220: IConsolePrint(12,"use \"help\" for more info"); signde@220: IConsolePrint(12,""); signde@220: IConsoleClearCommand(); signde@220: IConsoleCmdBufferAdd(""); darkvater@135: } darkvater@135: darkvater@135: void IConsoleClear() darkvater@135: { signde@220: int i; signde@220: for (i=0;i<80;i++) if (_iconsole_buffer[i]!=NULL) { signde@220: free(_iconsole_buffer[i]); signde@220: } darkvater@135: } darkvater@135: darkvater@135: void IConsoleFree() darkvater@135: { signde@220: _iconsole_inited=false; signde@220: IConsoleClear(); darkvater@135: } darkvater@135: signde@220: void IConsoleResize() signde@220: { darkvater@135: if (_iconsole_win!=NULL) { darkvater@135: _iconsole_win->height = _screen.height / 3; darkvater@135: _iconsole_win->width= _screen.width; darkvater@135: } darkvater@135: } darkvater@135: darkvater@135: void IConsoleSwitch() darkvater@135: { darkvater@135: if (_iconsole_mode==ICONSOLE_CLOSED) { darkvater@135: _iconsole_win = AllocateWindowDesc(&_iconsole_window_desc); darkvater@135: _iconsole_win->height = _screen.height / 3; darkvater@135: _iconsole_win->width= _screen.width; dominik@136: _iconsole_mode=ICONSOLE_OPENED; darkvater@135: } else darkvater@135: if (_iconsole_mode==ICONSOLE_OPENED) { signde@209: DeleteWindowById(WC_CONSOLE,0); darkvater@135: _iconsole_win=NULL; darkvater@135: _iconsole_mode=ICONSOLE_CLOSED; darkvater@135: } darkvater@135: MarkWholeScreenDirty(); darkvater@135: MarkAllViewportsDirty(0,0,_screen.width,_screen.height); darkvater@135: _video_driver->make_dirty(0,0,_screen.width,_screen.height); darkvater@135: } darkvater@135: signde@220: void IConsoleClose() signde@220: { signde@220: if (_iconsole_mode==ICONSOLE_OPENED) IConsoleSwitch(); signde@220: _iconsole_mode=ICONSOLE_CLOSED; darkvater@135: } darkvater@135: signde@220: void IConsoleOpen() signde@220: { signde@220: if (_iconsole_mode==ICONSOLE_CLOSED) IConsoleSwitch(); darkvater@141: } darkvater@141: signde@220: void IConsoleCmdBufferAdd(byte * cmd) signde@220: { signde@220: int i; signde@220: if (_iconsole_cmdbufferpos != 19) return; signde@220: if (_iconsole_cmdbuffer[18]!=NULL) free(_iconsole_cmdbuffer[18]); signde@220: for (i=18; i>0; i--) _iconsole_cmdbuffer[i]=_iconsole_cmdbuffer[i-1]; signde@220: i=strlen((char *)cmd); signde@220: _iconsole_cmdbuffer[0]=malloc(i+1); signde@220: memset(((void *)_iconsole_cmdbuffer[0]),0,i+1); signde@220: memcpy(((void *)_iconsole_cmdbuffer[0]),(void *)cmd,i); signde@220: _iconsole_cmdbuffer[0][i]=0; signde@220: _iconsole_cmdbufferpos = 19; signde@220: } signde@220: signde@220: void IConsoleCmdBufferNavigate(signed char direction) signde@220: { signde@220: int i; signde@220: i=_iconsole_cmdbufferpos + direction; signde@220: if (i<0) i=19; darkvater@141: if (i>19) i=0; signde@220: if (direction>0) while (_iconsole_cmdbuffer[i]==NULL) { signde@220: i++; signde@220: if (i>19) i=0; signde@220: } signde@220: if (direction<0) while (_iconsole_cmdbuffer[i]==NULL) { signde@220: i--; signde@220: if (i<0) i=19; signde@220: } signde@220: _iconsole_cmdbufferpos = i; signde@220: IConsoleClearCommand(); signde@220: memcpy((void *)_iconsole_cmdline,(void *)_iconsole_cmdbuffer[i],strlen(_iconsole_cmdbuffer[i])); signde@220: _iconsole_cmdpos =strlen(_iconsole_cmdbuffer[i]); darkvater@141: } darkvater@141: darkvater@135: void IConsolePrint(byte color_code, byte* string) darkvater@135: { signde@220: byte * _ex; signde@220: byte * _new; signde@220: byte _exc; signde@220: byte _newc; signde@220: int i,j; darkvater@135: signde@220: if (!_iconsole_inited) return; darkvater@135: signde@220: _newc=color_code; signde@220: i=strlen((char *)string); signde@220: _new=malloc(i+1); signde@220: memset(_new,0,i+1); signde@220: memcpy(_new,string,i); darkvater@135: signde@220: for (j=0;j=0) { signde@220: _ex=_iconsole_buffer[i]; signde@220: _exc=_iconsole_cbuffer[i]; signde@220: _iconsole_buffer[i]=_new; signde@220: _iconsole_cbuffer[i]=_newc; signde@220: _new=_ex; signde@220: _newc=_exc; signde@220: i--; signde@220: } signde@220: if (_ex!=NULL) free(_ex); signde@220: signde@220: if (_iconsole_win!=NULL) SetWindowDirty(_iconsole_win); darkvater@135: } darkvater@135: darkvater@135: darkvater@169: void CDECL IConsolePrintF(byte color_code, const char *s, ...) darkvater@135: { darkvater@135: va_list va; darkvater@135: char buf[1024]; darkvater@135: va_start(va, s); darkvater@135: vsprintf(buf, s, va); darkvater@135: va_end(va); darkvater@135: IConsolePrint(color_code, (byte *) &buf); darkvater@135: } darkvater@135: signde@220: void IConsoleDebug(byte* string) signde@220: { signde@220: if (_stdlib_developer>1) IConsolePrintF(_iconsole_color_debug, "DEBUG: %s", string); darkvater@135: } darkvater@135: signde@220: void IConsoleError(byte* string) signde@220: { signde@220: if (_stdlib_developer>0) IConsolePrintF(_iconsole_color_error, "ERROR: %s", string); darkvater@135: } darkvater@135: signde@220: void IConsoleCmdRegister(byte * name, void * addr) signde@220: { signde@220: byte * _new; signde@220: _iconsole_cmd * item; signde@220: _iconsole_cmd * item_new; signde@220: int i; darkvater@135: signde@220: i=strlen((char *)name); signde@220: _new=malloc(i+1); signde@220: memset(_new,0,i+1); signde@220: memcpy(_new,name,i); darkvater@135: signde@220: item_new = malloc(sizeof(_iconsole_cmd)); darkvater@135: signde@220: item_new->_next = NULL; signde@220: item_new->addr = addr; signde@220: item_new->name = _new; signde@220: signde@220: item_new->hook_access = NULL; signde@220: item_new->hook_after_exec = NULL; signde@220: item_new->hook_before_exec = NULL; signde@220: signde@220: item = _iconsole_cmds; signde@220: if (item == NULL) { signde@220: _iconsole_cmds = item_new; signde@220: } else { signde@220: while (item->_next != NULL) { item = item->_next; }; signde@220: item->_next = item_new; signde@220: } signde@220: } signde@220: signde@220: void* IConsoleCmdGet(byte * name) signde@220: { signde@220: _iconsole_cmd * item; signde@220: signde@220: item = _iconsole_cmds; signde@220: while (item != NULL) { signde@220: if (strcmp(item->name,name)==0) return item; signde@220: item = item->_next; signde@220: } signde@220: return NULL; signde@220: } signde@220: signde@220: void IConsoleVarRegister(byte * name, void * addr, byte type) signde@220: { signde@220: byte * _new; signde@220: _iconsole_var * item; signde@220: _iconsole_var * item_new; signde@220: int i; signde@220: signde@220: i=strlen((char *)name)+1; signde@220: _new=malloc(i+1); signde@220: memset(_new,0,i+1); signde@220: _new[0]='*'; signde@220: memcpy(_new+1,name,i); signde@220: signde@220: item_new = malloc(sizeof(_iconsole_var)); signde@220: signde@220: item_new->_next = NULL; signde@220: item_new->addr = addr; signde@220: item_new->name = _new; signde@220: item_new->type = type; signde@220: item_new->_malloc = false; signde@220: signde@220: item_new->hook_access = NULL; signde@220: item_new->hook_after_change = NULL; signde@220: item_new->hook_before_change = NULL; signde@220: signde@220: item = _iconsole_vars; signde@220: if (item == NULL) { signde@220: _iconsole_vars = item_new; signde@220: } else { signde@220: while (item->_next != NULL) { item = item->_next; }; signde@220: item->_next = item_new; signde@220: } signde@220: } signde@220: signde@220: void IConsoleVarMemRegister(byte * name, byte type) signde@220: { signde@220: _iconsole_var * item; signde@220: item = IConsoleVarAlloc(type); signde@220: IConsoleVarInsert(item,name); signde@220: } signde@220: signde@220: signde@220: void IConsoleVarInsert(_iconsole_var * var, byte * name) signde@220: { signde@220: byte * _new; signde@220: _iconsole_var * item; signde@220: _iconsole_var * item_new; signde@220: int i; signde@220: signde@220: item_new = var; signde@220: signde@220: // dont allow to build variable rings signde@220: if (item_new->_next != NULL) return; signde@220: signde@220: i=strlen((char *)name)+1; signde@220: _new=malloc(i+1); signde@220: memset(_new,0,i+1); signde@220: _new[0]='*'; signde@220: memcpy(_new+1,name,i); signde@220: signde@220: item_new->name = _new; signde@220: signde@220: item = _iconsole_vars; signde@220: if (item == NULL) { signde@220: _iconsole_vars = item_new; darkvater@135: } else { signde@220: while (item->_next != NULL) { item = item->_next; }; signde@220: item->_next = item_new; darkvater@135: } darkvater@135: } darkvater@135: darkvater@135: signde@220: _iconsole_var * IConsoleVarGet(byte * name) signde@220: { signde@220: _iconsole_var * item; darkvater@135: signde@220: item = _iconsole_vars; signde@220: while (item != NULL) { signde@220: if (strcmp(item->name,name)==0) return item; signde@220: item = item->_next; signde@220: } signde@220: return NULL; darkvater@135: } darkvater@135: signde@220: _iconsole_var * IConsoleVarAlloc(byte type) signde@220: { signde@220: _iconsole_var * item; signde@220: item=malloc(sizeof(_iconsole_var)); signde@220: item->_next = NULL; signde@220: item->name = ""; signde@220: item->type = type; signde@220: switch (item->type) { signde@220: case ICONSOLE_VAR_BOOLEAN: signde@220: { signde@220: item->addr=malloc(sizeof(bool)); signde@220: memset(item->addr,0,sizeof(bool)); signde@220: item->_malloc=true; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_BYTE: signde@220: { signde@220: item->addr=malloc(sizeof(byte)); signde@220: memset(item->addr,0,sizeof(byte)); signde@220: item->_malloc=true; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_UINT16: signde@220: { signde@220: item->addr=malloc(sizeof(unsigned short)); signde@220: memset(item->addr,0,sizeof(unsigned short)); signde@220: item->_malloc=true; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_UINT32: signde@220: { signde@220: item->addr=malloc(sizeof(unsigned int)); signde@220: memset(item->addr,0,sizeof(unsigned int)); signde@220: item->_malloc=true; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_INT16: signde@220: { signde@220: item->addr=malloc(sizeof(signed short)); signde@220: memset(item->addr,0,sizeof(signed short)); signde@220: item->_malloc=true; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_INT32: signde@220: { signde@220: item->addr=malloc(sizeof(signed int)); signde@220: memset(item->addr,0,sizeof(signed int)); signde@220: item->_malloc=true; signde@220: } signde@220: break; signde@220: default: signde@220: item->addr = NULL; signde@220: item->_malloc = false; signde@220: break; signde@220: } signde@220: signde@220: item->hook_access = NULL; signde@220: item->hook_after_change = NULL; signde@220: item->hook_before_change = NULL; signde@220: return item; darkvater@135: } darkvater@135: darkvater@135: signde@220: void IConsoleVarFree(_iconsole_var * var) signde@220: { signde@220: if (var ->_malloc) { signde@220: free(var ->addr); signde@220: } signde@220: free(var); darkvater@135: } darkvater@135: signde@220: void IConsoleVarSetString(_iconsole_var * var, byte * string) signde@220: { signde@220: int l; signde@220: signde@220: if (string == NULL) return; signde@220: signde@220: if (var->_malloc) { signde@220: free(var->addr); darkvater@135: } signde@220: signde@220: l=strlen((char *) string); signde@220: var->addr=malloc(l+1); signde@220: var->_malloc=true; signde@220: memset(var->addr,0,l); signde@220: memcpy((void *) var->addr,(void *) string, l); signde@220: ((byte *)var->addr)[l]=0; signde@220: } signde@220: signde@220: void IConsoleVarSetValue(_iconsole_var * var, int value) { signde@220: switch (var->type) { signde@220: case ICONSOLE_VAR_BOOLEAN: signde@220: { signde@220: (*(bool *)var->addr)=(value!=0); signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_BYTE: signde@220: { signde@220: (*(byte *)var->addr)=value; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_UINT16: signde@220: { signde@220: (*(unsigned short *)var->addr)=value; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_UINT32: signde@220: { signde@220: (*(unsigned int *)var->addr)=value; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_INT16: signde@220: { signde@220: (*(signed short *)var->addr)=value; signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_INT32: signde@220: { signde@220: (*(signed int *)var->addr)=value; signde@220: } signde@220: break; signde@220: default: signde@220: break; signde@220: } darkvater@135: } darkvater@135: signde@220: void IConsoleVarDump(_iconsole_var * var, byte * dump_desc) signde@220: { signde@220: byte var_b; // TYPE BYTE signde@220: unsigned short var_ui16; // TYPE UINT16 signde@220: unsigned int var_ui32; // TYPE UINT32 signde@220: signed short var_i16; // TYPE INT16 signde@220: signed int var_i32; // TYPE INT32 signde@220: byte * var_s; // TYPE STRING darkvater@135: darkvater@135: if (dump_desc==NULL) dump_desc = var->name; darkvater@135: darkvater@135: switch (var->type) { darkvater@135: case ICONSOLE_VAR_BOOLEAN: darkvater@135: { darkvater@135: if (*(bool *)var->addr) { darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = true",dump_desc); darkvater@135: } else { darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = false",dump_desc); darkvater@135: } darkvater@135: } darkvater@135: break; darkvater@135: case ICONSOLE_VAR_BYTE: darkvater@135: { darkvater@135: var_b=*(byte *)var->addr; darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_b); darkvater@135: } darkvater@135: break; darkvater@135: case ICONSOLE_VAR_UINT16: darkvater@135: { darkvater@135: var_ui16=*(unsigned short *)var->addr; darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_ui16); darkvater@135: } darkvater@135: break; darkvater@135: case ICONSOLE_VAR_UINT32: darkvater@135: { darkvater@135: var_ui32=*(unsigned int *)var->addr; darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_ui32); darkvater@135: } darkvater@135: break; darkvater@135: case ICONSOLE_VAR_INT16: darkvater@135: { darkvater@135: var_i16=*(signed short *)var->addr; darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_i16); darkvater@135: } darkvater@135: break; darkvater@135: case ICONSOLE_VAR_INT32: darkvater@135: { darkvater@135: var_i32=*(signed int *)var->addr; darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = %i",dump_desc,var_i32); darkvater@135: } darkvater@135: break; darkvater@135: case ICONSOLE_VAR_STRING: darkvater@135: { darkvater@135: var_s=(byte *)var->addr; darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = %s",dump_desc,var_s); darkvater@135: } darkvater@135: break; darkvater@141: case ICONSOLE_VAR_REFERENCE: darkvater@141: IConsolePrintF(_iconsole_color_default, "%s = @%s",dump_desc,((_iconsole_var *)var->addr)->name); darkvater@141: break; darkvater@135: case ICONSOLE_VAR_UNKNOWN: darkvater@135: case ICONSOLE_VAR_POINTER: darkvater@135: { darkvater@135: var_i32=(signed int)((byte *)var->addr); darkvater@135: IConsolePrintF(_iconsole_color_default, "%s = @%i",dump_desc,var_i32); darkvater@135: } darkvater@135: break; darkvater@135: } darkvater@135: } darkvater@135: signde@220: // * ************************* * // signde@220: // * hooking code * // signde@220: // * ************************* * // darkvater@135: signde@220: void IConsoleVarHook(byte * name, byte type, void * proc) signde@220: { signde@220: _iconsole_var * hook_var; signde@220: hook_var = IConsoleVarGet(name); signde@220: if (hook_var == NULL) return; signde@220: switch (type) { signde@220: case ICONSOLE_HOOK_BEFORE_CHANGE: signde@220: hook_var->hook_after_change = proc; signde@220: break; signde@220: case ICONSOLE_HOOK_AFTER_CHANGE: signde@220: hook_var->hook_after_change = proc; signde@220: break; signde@220: case ICONSOLE_HOOK_ACCESS: signde@220: hook_var->hook_access = proc; signde@220: break; signde@220: } signde@220: } darkvater@135: signde@220: bool IConsoleVarHookHandle(_iconsole_var * hook_var, byte type) signde@220: { signde@220: bool (*proc)(_iconsole_var * hook_var); signde@220: switch (type) { signde@220: case ICONSOLE_HOOK_BEFORE_CHANGE: signde@220: proc = hook_var->hook_before_change; signde@220: break; signde@220: case ICONSOLE_HOOK_AFTER_CHANGE: signde@220: proc = hook_var->hook_after_change; signde@220: break; signde@220: case ICONSOLE_HOOK_ACCESS: signde@220: proc = hook_var->hook_access; signde@220: break; signde@220: } signde@220: if (proc == NULL) return true; signde@220: return proc(hook_var); signde@220: } signde@220: signde@220: void IConsoleCmdHook(byte * name, byte type, void * proc) signde@220: { signde@220: _iconsole_cmd * hook_cmd; signde@220: hook_cmd = IConsoleCmdGet(name); signde@220: if (hook_cmd == NULL) return; signde@220: switch (type) { signde@220: case ICONSOLE_HOOK_AFTER_EXEC: signde@220: hook_cmd->hook_after_exec = proc; signde@220: break; signde@220: case ICONSOLE_HOOK_BEFORE_EXEC: signde@220: hook_cmd->hook_before_exec = proc; signde@220: break; signde@220: case ICONSOLE_HOOK_ACCESS: signde@220: hook_cmd->hook_access = proc; signde@220: break; signde@220: } signde@220: } signde@220: signde@220: bool IConsoleCmdHookHandle(_iconsole_cmd * hook_cmd, byte type) signde@220: { signde@220: bool (*proc)(_iconsole_cmd * hook_cmd); signde@220: switch (type) { signde@220: case ICONSOLE_HOOK_AFTER_EXEC: signde@220: proc = hook_cmd->hook_after_exec; signde@220: break; signde@220: case ICONSOLE_HOOK_BEFORE_EXEC: signde@220: proc = hook_cmd->hook_before_exec; signde@220: break; signde@220: case ICONSOLE_HOOK_ACCESS: signde@220: proc = hook_cmd->hook_access; signde@220: break; signde@220: } signde@220: if (proc == NULL) return true; signde@220: return proc(hook_cmd); signde@220: } signde@220: signde@220: void IConsoleCmdExec(byte * cmdstr) signde@220: { signde@220: _iconsole_var * (*function)(byte argc, byte* argv[], byte argt[]); signde@220: byte * tokens[20]; signde@220: byte tokentypes[20]; signde@220: byte * tokenstream; signde@220: byte * tokenstream_s; signde@220: byte execution_mode; signde@220: _iconsole_var * var = NULL; signde@220: _iconsole_var * result = NULL; signde@220: _iconsole_cmd * cmd = NULL; signde@220: signde@220: bool longtoken; signde@220: bool valid_token; signde@220: bool skip_lt_change; signde@220: signde@220: int c; signde@220: int i; signde@220: int l; signde@220: signde@220: //** clearing buffer **// signde@220: signde@220: for (i=0;i<20;i++) { tokens[i]=NULL; tokentypes[i]=ICONSOLE_VAR_NONE; }; signde@220: tokenstream_s=tokenstream=malloc(1024); signde@220: memset(tokenstream,0,1024); signde@220: signde@220: //** parsing **// signde@220: signde@220: longtoken=false; signde@220: valid_token=false; signde@220: skip_lt_change=false; signde@220: l=strlen((char *) cmdstr); signde@220: i=0; signde@220: c=0; signde@220: tokens[c] = tokenstream; signde@220: while (i0) if (strlen((char *) tokens[i])>0) { signde@220: if (tokens[i][0]=='*') { signde@220: if ((i==2) && (tokentypes[1]==ICONSOLE_VAR_UNKNOWN) && (strcmp(tokens[1],"<<")==0)) { signde@220: // dont change the variable to an pointer if execution_mode 4 is being prepared signde@220: // this is used to assign one variable the value of the other one [token 0 and 2] signde@220: } else { signde@220: var = IConsoleVarGet(tokens[i]); signde@220: if (var!=NULL) { signde@220: tokens[i]=(byte *)var->addr; signde@220: tokentypes[i]=var->type; signde@220: } darkvater@135: } darkvater@135: } signde@220: if (tokens[i]!=NULL) if (tokens[i][0]=='@') if (tokens[i][1]=='*') { signde@220: var = IConsoleVarGet(tokens[i]+1); darkvater@141: if (var!=NULL) { signde@220: tokens[i]=(byte *)var; signde@220: tokentypes[i]=ICONSOLE_VAR_REFERENCE; darkvater@141: } darkvater@135: } darkvater@135: } darkvater@135: } darkvater@135: signde@220: execution_mode=0; signde@220: signde@220: function = NULL; signde@220: cmd = IConsoleCmdGet(tokens[0]); signde@220: if (cmd != NULL) function = cmd->addr; signde@220: signde@220: if (function != NULL) { signde@220: execution_mode=1; // this is a command signde@220: } else { signde@220: var = IConsoleVarGet(tokens[0]); signde@220: if (var != NULL) { signde@220: execution_mode=2; // this is a variable signde@220: if (c>2) if (strcmp(tokens[1],"<<")==0) { signde@220: // this is command to variable mode [normal] signde@220: signde@220: function = NULL; signde@220: cmd = IConsoleCmdGet(tokens[2]); signde@220: if (cmd != NULL) function = cmd->addr; signde@220: signde@220: if (function != NULL) { signde@220: execution_mode=3; signde@220: } else { signde@220: result = IConsoleVarGet(tokens[2]); signde@220: if (result != NULL) { signde@220: execution_mode=4; darkvater@135: } darkvater@135: } darkvater@135: } signde@220: } signde@220: } signde@220: signde@220: //** executing **// signde@220: if (_stdlib_con_developer) IConsolePrintF(_iconsole_color_debug,"CONDEBUG: execution_mode: %i",execution_mode); signde@220: switch (execution_mode) { signde@220: case 0: signde@220: { signde@220: // not found signde@220: IConsoleError("command or variable not found"); signde@220: } signde@220: break; signde@220: case 1: signde@220: if (IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_ACCESS)) { signde@220: // execution with command syntax signde@220: IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_BEFORE_EXEC); signde@220: result = function(c,tokens,tokentypes); signde@220: if (result!=NULL) { signde@220: IConsoleVarDump(result,"result"); signde@220: IConsoleVarFree(result); signde@220: } signde@220: IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_AFTER_EXEC); signde@220: } signde@220: break; signde@220: case 2: signde@220: { signde@220: // execution with variable syntax signde@220: if (IConsoleVarHookHandle(var,ICONSOLE_HOOK_ACCESS)) if ((c==2) || (c==3)) { signde@220: // ** variable modifications ** // signde@220: IConsoleVarHookHandle(var,ICONSOLE_HOOK_BEFORE_CHANGE); signde@220: switch (var->type) { signde@220: case ICONSOLE_VAR_BOOLEAN: signde@220: { signde@220: if (strcmp(tokens[1],"=")==0) { signde@220: if (c==3) { signde@220: *(bool *)var->addr=(atoi((char *) tokens[2])!=0); signde@220: IConsoleVarDump(var,NULL); signde@220: } else { signde@220: *(bool *)var->addr=false; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: else if (strcmp(tokens[1],"++")==0) { signde@220: *(bool *)var->addr=!*(bool *)var->addr; darkvater@135: IConsoleVarDump(var,NULL); darkvater@135: } signde@220: else if (strcmp(tokens[1],"--")==0) { signde@220: *(bool *)var->addr=!*(bool *)var->addr; darkvater@135: IConsoleVarDump(var,NULL); darkvater@135: } signde@220: else { IConsoleError("operation not supported"); } darkvater@135: } signde@220: break; signde@220: case ICONSOLE_VAR_BYTE: signde@220: { signde@220: if (strcmp(tokens[1],"=")==0) { signde@220: if (c==3) { signde@220: *(byte *)var->addr=atoi((char *) tokens[2]); signde@220: IConsoleVarDump(var,NULL); signde@220: } else { signde@220: *(byte *)var->addr=0; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: else if (strcmp(tokens[1],"++")==0) { signde@220: (*(byte *)var->addr)++; darkvater@135: IConsoleVarDump(var,NULL); darkvater@135: } signde@220: else if (strcmp(tokens[1],"--")==0) { signde@220: (*(byte *)var->addr)--; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else { IConsoleError("operation not supported"); } darkvater@135: } signde@220: break; signde@220: case ICONSOLE_VAR_UINT16: signde@220: { signde@220: if (strcmp(tokens[1],"=")==0) { signde@220: if (c==3) { signde@220: *(unsigned short *)var->addr=atoi((char *) tokens[2]); signde@220: IConsoleVarDump(var,NULL); signde@220: } else { signde@220: *(unsigned short *)var->addr=0; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: else if (strcmp(tokens[1],"++")==0) { signde@220: (*(unsigned short *)var->addr)++; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else if (strcmp(tokens[1],"--")==0) { signde@220: (*(unsigned short *)var->addr)--; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else { IConsoleError("operation not supported"); } darkvater@135: } signde@220: break; signde@220: case ICONSOLE_VAR_UINT32: signde@220: { signde@220: if (strcmp(tokens[1],"=")==0) { signde@220: if (c==3) { signde@220: *(unsigned int *)var->addr=atoi((char *) tokens[2]); signde@220: IConsoleVarDump(var,NULL); signde@220: } else { signde@220: *(unsigned int *)var->addr=0; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: else if (strcmp(tokens[1],"++")==0) { signde@220: (*(unsigned int *)var->addr)++; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else if (strcmp(tokens[1],"--")==0) { signde@220: (*(unsigned int *)var->addr)--; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else { IConsoleError("operation not supported"); } signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_INT16: signde@220: { signde@220: if (strcmp(tokens[1],"=")==0) { signde@220: if (c==3) { signde@220: *(signed short *)var->addr=atoi((char *) tokens[2]); signde@220: IConsoleVarDump(var,NULL); signde@220: } else { signde@220: *(signed short *)var->addr=0; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: else if (strcmp(tokens[1],"++")==0) { signde@220: (*(signed short *)var->addr)++; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else if (strcmp(tokens[1],"--")==0) { signde@220: (*(signed short *)var->addr)--; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else { IConsoleError("operation not supported"); } signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_INT32: signde@220: { signde@220: if (strcmp(tokens[1],"=")==0) { signde@220: if (c==3) { signde@220: *(signed int *)var->addr=atoi((char *) tokens[2]); signde@220: IConsoleVarDump(var,NULL); signde@220: } else { signde@220: *(signed int *)var->addr=0; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: else if (strcmp(tokens[1],"++")==0) { signde@220: (*(signed int *)var->addr)++; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else if (strcmp(tokens[1],"--")==0) { signde@220: (*(signed int *)var->addr)--; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else { IConsoleError("operation not supported"); } signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_STRING: signde@220: { signde@220: if (strcmp(tokens[1],"=")==0) { signde@220: if (c==3) { signde@220: IConsoleVarSetString(var, tokens[2]); signde@220: IConsoleVarDump(var,NULL); signde@220: } else { signde@220: IConsoleVarSetString(var, ""); signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: else { IConsoleError("operation not supported"); } signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_POINTER: signde@220: { signde@220: if (strcmp(tokens[1],"=")==0) { signde@220: if (c==3) { signde@220: if (tokentypes[2]==ICONSOLE_VAR_UNKNOWN) { signde@220: var->addr = (void *)atoi(tokens[2]); signde@220: } else { signde@220: var->addr = (void *)tokens[2]; signde@220: } signde@220: IConsoleVarDump(var,NULL); signde@220: } else { signde@220: var->addr = NULL; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: else if (strcmp(tokens[1],"++")==0) { signde@220: var->addr = ((char *)var->addr)+1; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else if (strcmp(tokens[1],"--")==0) { signde@220: var->addr = ((char *)var->addr)-1;; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: else { IConsoleError("operation not supported"); } signde@220: } signde@220: break; signde@220: } signde@220: IConsoleVarHookHandle(var,ICONSOLE_HOOK_AFTER_CHANGE); signde@220: } signde@220: if (c==1) { signde@220: // ** variable output ** // signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: } signde@220: break; signde@220: case 3: signde@220: case 4: signde@220: { signde@220: // execute command with result or assign a variable signde@220: if (execution_mode==3) if (IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_ACCESS)) { signde@220: int i; signde@220: int diff; signde@220: void * temp; signde@220: byte temp2; signde@220: signde@220: // tokenshifting signde@220: for (diff=0; diff<2; diff++) { signde@220: temp=tokens[0]; signde@220: temp2=tokentypes[0]; signde@220: for (i=1; i<20; i++) { signde@220: tokens[i-1]=tokens[i]; signde@220: tokentypes[i-1]=tokentypes[i]; signde@220: } signde@220: tokens[19]=temp; signde@220: tokentypes[19]=temp2; signde@220: } signde@220: IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_BEFORE_EXEC); signde@220: result = function(c,tokens,tokentypes); signde@220: IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_AFTER_EXEC); signde@220: } else { signde@220: execution_mode=255; signde@220: } signde@220: signde@220: if (IConsoleVarHookHandle(var,ICONSOLE_HOOK_ACCESS)) if (result!=NULL) { signde@220: if (result ->type != var -> type) { signde@220: IConsoleError("variable type missmatch"); signde@220: } else { signde@220: IConsoleVarHookHandle(var,ICONSOLE_HOOK_BEFORE_CHANGE); signde@220: switch (result->type) { signde@220: case ICONSOLE_VAR_BOOLEAN: signde@220: { signde@220: (*(bool *)var->addr)=(*(bool *)result->addr); darkvater@135: IConsoleVarDump(var,NULL); darkvater@135: } signde@220: break; signde@220: case ICONSOLE_VAR_BYTE: signde@220: { signde@220: (*(byte *)var->addr)=(*(byte *)result->addr); darkvater@135: IConsoleVarDump(var,NULL); darkvater@135: } signde@220: break; signde@220: case ICONSOLE_VAR_UINT16: signde@220: { signde@220: (*(unsigned short *)var->addr)=(*(unsigned short *)result->addr); signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_UINT32: signde@220: { signde@220: (*(unsigned int *)var->addr)=(*(unsigned int *)result->addr); signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_INT16: signde@220: { signde@220: (*(signed short *)var->addr)=(*(signed short *)result->addr); signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_INT32: signde@220: { signde@220: (*(signed int *)var->addr)=(*(signed int *)result->addr); signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_POINTER: signde@220: { signde@220: var->addr=result->addr; signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: break; signde@220: case ICONSOLE_VAR_STRING: signde@220: { signde@220: IConsoleVarSetString(var,result->addr); signde@220: IConsoleVarDump(var,NULL); signde@220: } signde@220: break; signde@220: default: signde@220: { signde@220: IConsoleError("variable type missmatch"); signde@220: } signde@220: break; signde@220: } signde@220: IConsoleVarHookHandle(var,ICONSOLE_HOOK_AFTER_CHANGE); darkvater@135: } signde@220: signde@220: if (execution_mode==3) { signde@220: IConsoleVarFree(result); signde@220: result = NULL; darkvater@135: } darkvater@135: } darkvater@141: darkvater@135: } signde@220: break; signde@220: default: signde@220: { signde@220: // execution mode invalid signde@220: IConsoleError("invalid execution mode"); signde@220: } darkvater@135: } darkvater@135: signde@220: //** freeing the tokens **// signde@220: for (i=0;i<20;i++) tokens[i]=NULL; signde@220: free(tokenstream_s); darkvater@135: darkvater@135: }