mirror of https://github.com/OpenTTD/OpenTTD
(svn r1065) -Add: [Console] Alias support. Type 'list_aliases' to show them all (sign_de)
parent
92b8ec9ff8
commit
551d0622c5
184
console.c
184
console.c
|
@ -22,6 +22,7 @@
|
||||||
#define ICON_LINE_HEIGHT 12
|
#define ICON_LINE_HEIGHT 12
|
||||||
#define ICON_RIGHT_BORDERWIDTH 10
|
#define ICON_RIGHT_BORDERWIDTH 10
|
||||||
#define ICON_BOTTOM_BORDERWIDTH 12
|
#define ICON_BOTTOM_BORDERWIDTH 12
|
||||||
|
#define ICON_MAX_ALIAS_LINES 40
|
||||||
|
|
||||||
// ** main console ** //
|
// ** main console ** //
|
||||||
static bool _iconsole_inited;
|
static bool _iconsole_inited;
|
||||||
|
@ -261,9 +262,9 @@ void IConsoleInit(void)
|
||||||
}
|
}
|
||||||
IConsoleStdLibRegister();
|
IConsoleStdLibRegister();
|
||||||
#if defined(WITH_REV)
|
#if defined(WITH_REV)
|
||||||
IConsolePrintF(13, "OpenTTD Game Console Revision 5 - %s", _openttd_revision);
|
IConsolePrintF(13, "OpenTTD Game Console Revision 6 - %s", _openttd_revision);
|
||||||
#else
|
#else
|
||||||
IConsolePrint(13, "OpenTTD Game Console Revision 5");
|
IConsolePrint(13, "OpenTTD Game Console Revision 6");
|
||||||
#endif
|
#endif
|
||||||
IConsolePrint(12, "---------------------------------");
|
IConsolePrint(12, "---------------------------------");
|
||||||
IConsolePrint(12, "use \"help\" for more info");
|
IConsolePrint(12, "use \"help\" for more info");
|
||||||
|
@ -505,6 +506,164 @@ _iconsole_cmd* IConsoleCmdGet(const char* name)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IConsoleAliasRegister(const char* name, const char* cmdline)
|
||||||
|
{
|
||||||
|
char* _new;
|
||||||
|
char* _newcmd;
|
||||||
|
_iconsole_alias* item;
|
||||||
|
_iconsole_alias* item_new;
|
||||||
|
_iconsole_alias* item_before;
|
||||||
|
|
||||||
|
_new = strdup(name);
|
||||||
|
_newcmd = strdup(cmdline);
|
||||||
|
|
||||||
|
item_new = malloc(sizeof(_iconsole_alias));
|
||||||
|
|
||||||
|
item_new->_next = NULL;
|
||||||
|
item_new->cmdline = _newcmd;
|
||||||
|
item_new->name = _new;
|
||||||
|
|
||||||
|
item_before = NULL;
|
||||||
|
item = _iconsole_aliases;
|
||||||
|
|
||||||
|
if (item == NULL) {
|
||||||
|
_iconsole_aliases = item_new;
|
||||||
|
} else {
|
||||||
|
while ((item->_next != NULL) && (strcmp(item->name,item_new->name)<=0)) {
|
||||||
|
item_before = item;
|
||||||
|
item = item->_next;
|
||||||
|
}
|
||||||
|
// insertion sort
|
||||||
|
if (item_before==NULL) {
|
||||||
|
if (strcmp(item->name,item_new->name)<=0) {
|
||||||
|
// appending
|
||||||
|
item ->_next = item_new;
|
||||||
|
} else {
|
||||||
|
// inserting as startitem
|
||||||
|
_iconsole_aliases = item_new;
|
||||||
|
item_new ->_next = item;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (strcmp(item->name,item_new->name)<=0) {
|
||||||
|
// appending
|
||||||
|
item ->_next = item_new;
|
||||||
|
} else {
|
||||||
|
// inserting
|
||||||
|
item_new ->_next = item_before->_next;
|
||||||
|
item_before ->_next = item_new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// insertion sort end
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
_iconsole_alias* IConsoleAliasGet(const char* name)
|
||||||
|
{
|
||||||
|
_iconsole_alias* item;
|
||||||
|
|
||||||
|
item = _iconsole_aliases;
|
||||||
|
while (item != NULL) {
|
||||||
|
if (strcmp(item->name, name) == 0) return item;
|
||||||
|
item = item->_next;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IConsoleAliasExec(const char* cmdline, char* tokens[20], byte tokentypes[20]) {
|
||||||
|
char* lines[ICON_MAX_ALIAS_LINES];
|
||||||
|
char* linestream;
|
||||||
|
char* linestream_s;
|
||||||
|
|
||||||
|
int c;
|
||||||
|
int i;
|
||||||
|
int l;
|
||||||
|
int x;
|
||||||
|
byte t;
|
||||||
|
|
||||||
|
//** clearing buffer **//
|
||||||
|
|
||||||
|
for (i = 0; i < 40; i++) {
|
||||||
|
lines[0] = NULL;
|
||||||
|
}
|
||||||
|
linestream_s = linestream = malloc(1024*ICON_MAX_ALIAS_LINES);
|
||||||
|
memset(linestream, 0, 1024*ICON_MAX_ALIAS_LINES);
|
||||||
|
|
||||||
|
//** parsing **//
|
||||||
|
|
||||||
|
l = strlen(cmdline);
|
||||||
|
i = 0;
|
||||||
|
c = 0;
|
||||||
|
x = 0;
|
||||||
|
t = 0;
|
||||||
|
lines[c] = linestream;
|
||||||
|
|
||||||
|
while (i < l && c < ICON_MAX_ALIAS_LINES - 1) {
|
||||||
|
if (cmdline[i] == '%') {
|
||||||
|
i++;
|
||||||
|
if (cmdline[i] == '+') {
|
||||||
|
t=1;
|
||||||
|
while ((tokens[t]!=NULL) && (t<20)) {
|
||||||
|
int l2 = strlen(tokens[t]);
|
||||||
|
*linestream = '"';
|
||||||
|
linestream++;
|
||||||
|
memcpy(linestream,tokens[t],l2);
|
||||||
|
linestream += l2;
|
||||||
|
*linestream = '"';
|
||||||
|
linestream++;
|
||||||
|
*linestream = ' ';
|
||||||
|
linestream++;
|
||||||
|
x += l2+3;
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int l2;
|
||||||
|
t = ((byte)cmdline[i]) - 64;
|
||||||
|
if ((t<20) && (tokens[t]!=NULL)) {
|
||||||
|
l2 = strlen(tokens[t]);
|
||||||
|
memcpy(linestream,tokens[t],l2);
|
||||||
|
x += l2;
|
||||||
|
linestream += l2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (cmdline[i] == '\\') {
|
||||||
|
i++;
|
||||||
|
if (cmdline[i] == '\\') {
|
||||||
|
*linestream = '\\';
|
||||||
|
linestream++;
|
||||||
|
} else if (cmdline[i] == '\'') {
|
||||||
|
*linestream = '\'';
|
||||||
|
linestream++;
|
||||||
|
}
|
||||||
|
} else if (cmdline[i] == '\'') {
|
||||||
|
*linestream = '"';
|
||||||
|
linestream++;
|
||||||
|
} else if (cmdline[i] == ';') {
|
||||||
|
c++;
|
||||||
|
*linestream = '\0';
|
||||||
|
linestream += 1024 - (x % 1024);
|
||||||
|
x += 1024 - (x % 1024);
|
||||||
|
lines[c] = linestream;
|
||||||
|
} else {
|
||||||
|
*linestream = cmdline[i];
|
||||||
|
linestream++;
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
linestream--;
|
||||||
|
if (*linestream != '\0') {
|
||||||
|
c++;
|
||||||
|
linestream++;
|
||||||
|
*linestream = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
free(linestream_s);
|
||||||
|
|
||||||
|
for (i=0; i<c; i++) IConsoleCmdExec(lines[i]);
|
||||||
|
}
|
||||||
|
|
||||||
void IConsoleVarInsert(_iconsole_var* item_new, const char* name)
|
void IConsoleVarInsert(_iconsole_var* item_new, const char* name)
|
||||||
{
|
{
|
||||||
_iconsole_var* item;
|
_iconsole_var* item;
|
||||||
|
@ -863,9 +1022,10 @@ void IConsoleCmdExec(const char* cmdstr)
|
||||||
char* tokenstream;
|
char* tokenstream;
|
||||||
char* tokenstream_s;
|
char* tokenstream_s;
|
||||||
byte execution_mode;
|
byte execution_mode;
|
||||||
_iconsole_var* var = NULL;
|
_iconsole_var* var = NULL;
|
||||||
_iconsole_var* result = NULL;
|
_iconsole_var* result = NULL;
|
||||||
_iconsole_cmd* cmd = NULL;
|
_iconsole_cmd* cmd = NULL;
|
||||||
|
_iconsole_alias* alias = NULL;
|
||||||
|
|
||||||
bool longtoken;
|
bool longtoken;
|
||||||
bool valid_token;
|
bool valid_token;
|
||||||
|
@ -983,7 +1143,12 @@ void IConsoleCmdExec(const char* cmdstr)
|
||||||
|
|
||||||
function = NULL;
|
function = NULL;
|
||||||
cmd = IConsoleCmdGet(tokens[0]);
|
cmd = IConsoleCmdGet(tokens[0]);
|
||||||
if (cmd != NULL) function = cmd->addr;
|
if (cmd != NULL) {
|
||||||
|
function = cmd->addr;
|
||||||
|
} else {
|
||||||
|
alias = IConsoleAliasGet(tokens[0]);
|
||||||
|
if (alias != NULL) execution_mode = 5; // alias handling
|
||||||
|
}
|
||||||
|
|
||||||
if (function != NULL) {
|
if (function != NULL) {
|
||||||
execution_mode = 1; // this is a command
|
execution_mode = 1; // this is a command
|
||||||
|
@ -1003,7 +1168,7 @@ void IConsoleCmdExec(const char* cmdstr)
|
||||||
} else {
|
} else {
|
||||||
result = IConsoleVarGet(tokens[2]);
|
result = IConsoleVarGet(tokens[2]);
|
||||||
if (result != NULL)
|
if (result != NULL)
|
||||||
execution_mode=4;
|
execution_mode = 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1280,6 +1445,11 @@ void IConsoleCmdExec(const char* cmdstr)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 5: {
|
||||||
|
// execute an alias
|
||||||
|
IConsoleAliasExec(alias->cmdline, tokens,tokentypes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// execution mode invalid
|
// execution mode invalid
|
||||||
IConsoleError("invalid execution mode");
|
IConsoleError("invalid execution mode");
|
||||||
|
|
10
console.h
10
console.h
|
@ -76,10 +76,20 @@ typedef struct _iconsole_cmd {
|
||||||
void* _next;
|
void* _next;
|
||||||
} _iconsole_cmd;
|
} _iconsole_cmd;
|
||||||
|
|
||||||
|
void IConsoleAliasRegister(const char* name, const char* cmdline);
|
||||||
|
|
||||||
|
typedef struct _iconsole_alias {
|
||||||
|
// -------------- //
|
||||||
|
char * cmdline;
|
||||||
|
char* name;
|
||||||
|
void* _next;
|
||||||
|
} _iconsole_alias;
|
||||||
|
|
||||||
// ** console parser ** //
|
// ** console parser ** //
|
||||||
|
|
||||||
_iconsole_cmd* _iconsole_cmds; // list of registred commands
|
_iconsole_cmd* _iconsole_cmds; // list of registred commands
|
||||||
_iconsole_var* _iconsole_vars; // list of registred vars
|
_iconsole_var* _iconsole_vars; // list of registred vars
|
||||||
|
_iconsole_alias* _iconsole_aliases; // list of registred aliases
|
||||||
|
|
||||||
// ** console colors ** //
|
// ** console colors ** //
|
||||||
VARDEF byte _iconsole_color_default;
|
VARDEF byte _iconsole_color_default;
|
||||||
|
|
|
@ -364,6 +364,13 @@ DEF_CONSOLE_CMD(ConPrintFC)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEF_CONSOLE_CMD(ConAlias)
|
||||||
|
{
|
||||||
|
if (argc < 3) return NULL;
|
||||||
|
IConsoleAliasRegister(argv[1],argv[2]);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
DEF_CONSOLE_CMD(ConScreenShot)
|
DEF_CONSOLE_CMD(ConScreenShot)
|
||||||
{
|
{
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
|
@ -489,6 +496,20 @@ DEF_CONSOLE_CMD(ConListVariables)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEF_CONSOLE_CMD(ConListAliases)
|
||||||
|
{
|
||||||
|
const _iconsole_alias* item;
|
||||||
|
size_t l = 0;
|
||||||
|
|
||||||
|
if (argv[1] != NULL) l = strlen(argv[1]);
|
||||||
|
|
||||||
|
for (item = _iconsole_aliases; item != NULL; item = item->_next)
|
||||||
|
if (argv[1] == NULL || strncmp(item->name, argv[1], l) == 0)
|
||||||
|
IConsolePrintF(_iconsole_color_default, "%s => %s", item->name, item->cmdline);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
DEF_CONSOLE_CMD(ConListDumpVariables)
|
DEF_CONSOLE_CMD(ConListDumpVariables)
|
||||||
{
|
{
|
||||||
const _iconsole_var* item;
|
const _iconsole_var* item;
|
||||||
|
@ -740,6 +761,8 @@ void IConsoleDebugLibRegister()
|
||||||
IConsoleVarMemRegister("temp_uint16_2", ICONSOLE_VAR_UINT16);
|
IConsoleVarMemRegister("temp_uint16_2", ICONSOLE_VAR_UINT16);
|
||||||
IConsoleVarMemRegister("temp_uint32", ICONSOLE_VAR_UINT32);
|
IConsoleVarMemRegister("temp_uint32", ICONSOLE_VAR_UINT32);
|
||||||
IConsoleCmdRegister("resettile", ConResetTile);
|
IConsoleCmdRegister("resettile", ConResetTile);
|
||||||
|
IConsoleAliasRegister("dbg_echo","echo %A; echo %B");
|
||||||
|
IConsoleAliasRegister("dbg_echo2","echo %+");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -764,10 +787,8 @@ void IConsoleStdLibRegister(void)
|
||||||
IConsoleCmdRegister("info_var", ConInfoVar);
|
IConsoleCmdRegister("info_var", ConInfoVar);
|
||||||
IConsoleCmdRegister("list_cmds", ConListCommands);
|
IConsoleCmdRegister("list_cmds", ConListCommands);
|
||||||
IConsoleCmdRegister("list_vars", ConListVariables);
|
IConsoleCmdRegister("list_vars", ConListVariables);
|
||||||
|
IConsoleCmdRegister("list_aliases", ConListAliases);
|
||||||
IConsoleCmdRegister("newgame", ConNewGame);
|
IConsoleCmdRegister("newgame", ConNewGame);
|
||||||
IConsoleCmdRegister("new_game", ConNewGame);
|
|
||||||
IConsoleCmdRegister("newmap", ConNewGame);
|
|
||||||
IConsoleCmdRegister("new_map", ConNewGame);
|
|
||||||
IConsoleCmdRegister("printf", ConPrintF);
|
IConsoleCmdRegister("printf", ConPrintF);
|
||||||
IConsoleCmdRegister("printfc", ConPrintFC);
|
IConsoleCmdRegister("printfc", ConPrintFC);
|
||||||
IConsoleCmdRegister("quit", ConExit);
|
IConsoleCmdRegister("quit", ConExit);
|
||||||
|
@ -778,6 +799,10 @@ void IConsoleStdLibRegister(void)
|
||||||
IConsoleCmdRegister("script", ConScript);
|
IConsoleCmdRegister("script", ConScript);
|
||||||
IConsoleCmdRegister("scrollto", ConScrollToTile);
|
IConsoleCmdRegister("scrollto", ConScrollToTile);
|
||||||
IConsoleCmdRegister("set", ConSet);
|
IConsoleCmdRegister("set", ConSet);
|
||||||
|
IConsoleCmdRegister("alias", ConAlias);
|
||||||
|
IConsoleAliasRegister("new_game", "newgame");
|
||||||
|
IConsoleAliasRegister("newmap", "newgame");
|
||||||
|
IConsoleAliasRegister("new_map", "newgame");
|
||||||
|
|
||||||
IConsoleVarRegister("developer", &_stdlib_developer, ICONSOLE_VAR_BYTE);
|
IConsoleVarRegister("developer", &_stdlib_developer, ICONSOLE_VAR_BYTE);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue