diff options
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/client/ec_client.c | 11 | ||||
| -rw-r--r-- | src/engine/e_config.c | 2 | ||||
| -rw-r--r-- | src/engine/e_console.c | 478 | ||||
| -rw-r--r-- | src/engine/e_console.h | 9 | ||||
| -rw-r--r-- | src/engine/server/es_server.c | 4 |
5 files changed, 161 insertions, 343 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c index 17ea72b5..6f8a1729 100644 --- a/src/engine/client/ec_client.c +++ b/src/engine/client/ec_client.c @@ -1412,9 +1412,7 @@ static void client_run() static void con_connect(void *result, void *user_data) { - const char *address; - console_result_string(result, 1, &address); - client_connect(address); + client_connect(console_arg_string(result, 0)); } static void con_disconnect(void *result, void *user_data) @@ -1454,13 +1452,18 @@ void client_save_line(const char *line) engine_config_write_line(line); } -int editor_main(int argc, char **argv); +/*int editor_main(int argc, char **argv);*/ + +/*extern void test_parser();*/ int main(int argc, char **argv) { /* init the engine */ dbg_msg("client", "starting..."); engine_init("Teewars"); + +/* test_parser(); + return 0;*/ /* register all console commands */ client_register_commands(); diff --git a/src/engine/e_config.c b/src/engine/e_config.c index 9cef342f..73993f5b 100644 --- a/src/engine/e_config.c +++ b/src/engine/e_config.c @@ -87,7 +87,7 @@ void config_save() char linebuf[512]; #define MACRO_CONFIG_INT(name,def,min,max) { str_format(linebuf, sizeof(linebuf), "%s %i", #name, config.name); engine_config_write_line(linebuf); } - #define MACRO_CONFIG_STR(name,len,def) { str_format(linebuf, sizeof(linebuf), "%s \"%s\"", #name, config.name); engine_config_write_line(linebuf); } + #define MACRO_CONFIG_STR(name,len,def) { str_format(linebuf, sizeof(linebuf), "%s %s", #name, config.name); engine_config_write_line(linebuf); } #include "e_config_variables.h" diff --git a/src/engine/e_console.c b/src/engine/e_console.c index 778fb1a4..9c4c69f1 100644 --- a/src/engine/e_console.c +++ b/src/engine/e_console.c @@ -9,265 +9,137 @@ #define CONSOLE_MAX_STR_LENGTH 255 /* the maximum number of tokens occurs in a string of length CONSOLE_MAX_STR_LENGTH with tokens size 1 separated by single spaces */ -#define MAX_TOKENS (CONSOLE_MAX_STR_LENGTH+1)/2 - -enum -{ - TOKEN_INT, - TOKEN_FLOAT, - TOKEN_STRING -}; - -typedef struct -{ - int type; - const char *stored_string; -} TOKEN; - +#define MAX_PARTS (CONSOLE_MAX_STR_LENGTH+1)/2 + typedef struct { char string_storage[CONSOLE_MAX_STR_LENGTH+1]; - char *next_string; - - TOKEN tokens[MAX_TOKENS]; - unsigned int num_tokens; -} LEXER_RESULT; + char *args_start; + + const char *command; + const char *args[MAX_PARTS]; + unsigned int num_args; +} PARSE_RESULT; -enum -{ - STATE_START, - STATE_INT, - STATE_FLOAT, - STATE_POT_FLOAT, - STATE_POT_NEGATIVE, - STATE_STRING, - STATE_QUOTED, - STATE_ESCAPE -}; - -static const char *store_string(LEXER_RESULT *res, const char *str, int len) +static char *str_skipblanks(char *str) { - const char *ptr = res->next_string; - int escaped = 0; - - while (len) - { - if (!escaped && *str == '\\') - { - escaped = 1; - } - else - { - escaped = 0; - - *res->next_string++ = *str; - } - + while(*str && (*str == ' ' || *str == '\t' || *str == '\n')) str++; - len--; - } - - *res->next_string++ = 0; - - /* - memcpy(res->next_string, str, len); - res->next_string[len] = 0; - res->next_string += len+1; - */ - - return ptr; + return str; } -static void save_token(LEXER_RESULT *res, int *index, const char **start, const char *end, int *state, int type) -{ - /* printf("Saving token with length %d\n", end - *start); */ - TOKEN *tok = &res->tokens[*index]; - tok->stored_string = store_string(res, *start, end - *start); - tok->type = type; - ++res->num_tokens; - - *start = end + 1; - *state = STATE_START; - ++*index; -} - -static int digit(char c) -{ - return '0' <= c && c <= '9'; -} - -static int lex(const char *line, LEXER_RESULT *res) -{ - int state = STATE_START, i = 0; - int length_left = CONSOLE_MAX_STR_LENGTH; - const char *start, *c; - res->num_tokens = 0; - - mem_zero(res, sizeof(*res)); - res->next_string = res->string_storage; - - for (c = start = line; *c != '\0' && res->num_tokens < MAX_TOKENS && length_left; ++c, --length_left) - { - /* printf("State: %d.. c: %c\n", state, *c); */ - switch (state) - { - case STATE_START: - if (*c == ' ') - start = c + 1; - else if (digit(*c)) - state = STATE_INT; - else if (*c == '-') - state = STATE_POT_NEGATIVE; - else if (*c == '.') - state = STATE_POT_FLOAT; - else if (*c == '"') - state = STATE_QUOTED; - else - state = STATE_STRING; - break; - - case STATE_POT_NEGATIVE: - if (digit(*c)) - state = STATE_INT; - else if (*c == '.') - state = STATE_POT_FLOAT; - else if (*c == ' ') - save_token(res, &i, &start, c, &state, TOKEN_STRING); - else - state = STATE_STRING; - break; - - case STATE_INT: - if (digit(*c)) - ; - else if (*c == '.') - state = STATE_FLOAT; - else if (*c == ' ') - save_token(res, &i, &start, c, &state, TOKEN_INT); - else - state = STATE_STRING; - break; - - case STATE_FLOAT: - if (digit(*c)) - ; - else if (*c == ' ') - save_token(res, &i, &start, c, &state, TOKEN_FLOAT); - else - state = STATE_STRING; - break; - - case STATE_POT_FLOAT: - if (digit(*c)) - state = STATE_FLOAT; - else if (*c == ' ') - save_token(res, &i, &start, c, &state, TOKEN_STRING); - else - state = STATE_STRING; - break; - - case STATE_STRING: - if (*c == ' ') - save_token(res, &i, &start, c, &state, TOKEN_STRING); - break; - - case STATE_QUOTED: - if (*c == '"') - { - ++start; - save_token(res, &i, &start, c, &state, TOKEN_STRING); - } - else if (*c == '\\') - state = STATE_ESCAPE; - break; - - case STATE_ESCAPE: - if (*c != ' ') - state = STATE_QUOTED; - break; - } - } - - switch (state) - { - case STATE_INT: - save_token(res, &i, &start, c, &state, TOKEN_INT); - break; - case STATE_FLOAT: - save_token(res, &i, &start, c, &state, TOKEN_FLOAT); - break; - case STATE_STRING: - case STATE_QUOTED: - case STATE_POT_FLOAT: - case STATE_POT_NEGATIVE: - save_token(res, &i, &start, c, &state, TOKEN_STRING); - break; - case STATE_ESCAPE: - dbg_msg("console/lexer", "Misplaced escape character"); - break; - default: - break; - } - - return 0; +static char *str_skiptoblank(char *str) +{ + while(*str && (*str != ' ' && *str != '\t' && *str != '\n')) + str++; + return str; } -int console_result_string(void *res, int index, const char **str) +/* static int digit(char c) { return '0' <= c && c <= '9'; } */ + +static int console_parse_start(PARSE_RESULT *result, const char *string) { - LEXER_RESULT *result = (LEXER_RESULT *)res; + char *str; + str_copy(result->string_storage, string, sizeof(result->string_storage)); + str = result->string_storage; - if (index < 0 || index >= result->num_tokens) - return -1; - else + /* get command */ + str = str_skipblanks(str); + result->command = str; + str = str_skiptoblank(str); + + if(*str) { - TOKEN *t = &result->tokens[index]; - *str = t->stored_string; - return 0; + str[0] = 0; + str++; } + + result->args_start = str; + result->num_args = 0; + return 0; } -int console_result_int(void *res, int index, int *i) +static int console_parse_args(PARSE_RESULT *result, const char *format) { - LEXER_RESULT *result = (LEXER_RESULT *)res; + char command; + char *str; + int optional = 0; + int error = 0; - if (index < 0 || index >= result->num_tokens) - return -1; - else - { - TOKEN *t = &result->tokens[index]; - const char *str; + str = result->args_start; - if (t->type != TOKEN_INT) - return -2; + while(1) + { + /* fetch command */ + command = *format; + format++; + + if(!command) + break; + + if(command == '?') + optional = 1; + else + { + str = str_skipblanks(str); + + if(!(*str)) /* error, non optional command needs value */ + { + if(!optional) + error = 1; + break; + } + + /* add token */ + result->args[result->num_args++] = str; + + if(command == 'r') /* rest of the string */ + break; + else if(command == 'i') /* validate int */ + str = str_skiptoblank(str); + else if(command == 'f') /* validate float */ + str = str_skiptoblank(str); + else if(command == 's') /* validate string */ + str = str_skiptoblank(str); + + if(str[0] != 0) /* check for end of string */ + { + str[0] = 0; + str++; + } + } + } - console_result_string(result, index, &str); + return error; +} - *i = atoi(str); +const char *console_arg_string(void *res, int index) +{ + PARSE_RESULT *result = (PARSE_RESULT *)res; + if (index < 0 || index >= result->num_args) + return ""; + return result->args[index]; +} +int console_arg_int(void *res, int index) +{ + PARSE_RESULT *result = (PARSE_RESULT *)res; + if (index < 0 || index >= result->num_args) return 0; - } + return atoi(result->args[index]); } -int console_result_float(void *res, int index, float *f) +float console_arg_float(void *res, int index) { - LEXER_RESULT *result = (LEXER_RESULT *)res; - - if (index < 0 || index >= result->num_tokens) - return -1; - else - { - TOKEN *t = &result->tokens[index]; - const char *str; - - if (t->type != TOKEN_INT && t->type != TOKEN_FLOAT) - return -2; - - console_result_string(result, index, &str); - - *f = atof(str); + PARSE_RESULT *result = (PARSE_RESULT *)res; + if (index < 0 || index >= result->num_args) + return 0.0f; + return atof(result->args[index]); +} - return 0; - } +int console_arg_num(void *result) +{ + return ((PARSE_RESULT *)result)->num_args; } static COMMAND *first_command = 0x0; @@ -276,8 +148,10 @@ COMMAND *console_find_command(const char *name) { COMMAND *cmd; for (cmd = first_command; cmd; cmd = cmd->next) + { if (strcmp(cmd->name, name) == 0) return cmd; + } return 0x0; } @@ -288,45 +162,6 @@ void console_register(COMMAND *cmd) first_command = cmd; } - -static int console_validate(COMMAND *command, LEXER_RESULT *result) -{ - const char *c = command->params; - int i = 1; - - const char *dummy_s; - int dummy_i; - float dummy_f; - - while (*c && *c != '?') - { - switch (*c) - { - case 's': - if (console_result_string(result, i, &dummy_s)) - return -1; - break; - case 'i': - if (console_result_int(result, i, &dummy_i)) - return -1; - break; - case 'f': - if (console_result_float(result, i, &dummy_f)) - return -1; - break; - default: - /* unknown char, so just continue... */ - c++; - continue; - } - - i++; - c++; - } - - return 0; -} - static void (*print_callback)(const char *) = 0x0; void console_register_print_callback(void (*callback)(const char *)) @@ -340,63 +175,49 @@ void console_print(const char *str) print_callback(str); } - void console_execute_line_stroked(int stroke, const char *str) { - LEXER_RESULT result; - int error; - char strokestr[8] = {'0', 0}; + PARSE_RESULT result; + COMMAND *command; + + char strokestr[2] = {'0', 0}; if(stroke) strokestr[0] = '1'; - if ((error = lex(str, &result))) - printf("ERROR: %d\n", error); - else if (result.num_tokens > 0) - { - const char *name; - COMMAND *command; - console_result_string(&result, 0, &name); + if(console_parse_start(&result, str) != 0) + return; - command = console_find_command(name); + command = console_find_command(result.command); - if(command) + if(command) + { + int is_stroke_command = 0; + if(result.command[0] == '+') { - int is_stroke_command = 0; - if(name[0] == '+') - { - /* insert the stroke direction token */ - int i; - for(i = result.num_tokens-2; i > 1; i--) - { - result.tokens[i+1] = result.tokens[i]; - } - - result.tokens[1].type = TOKEN_INT; - result.tokens[1].stored_string = strokestr; - result.num_tokens++; - - is_stroke_command = 1; - } - - if(stroke || is_stroke_command) - { - if (console_validate(command, &result)) - { - char buf[256]; - str_format(buf, sizeof(buf), "Invalid arguments... Usage: %s %s", command->name, command->params); - console_print(buf); - } - else - command->callback(&result, command->user_data); - } + /* insert the stroke direction token */ + result.args[result.num_args] = strokestr; + result.num_args++; + is_stroke_command = 1; } - else + + if(stroke || is_stroke_command) { - char buf[256]; - str_format(buf, sizeof(buf), "No such command: %s.", name); - console_print(buf); + if(console_parse_args(&result, command->params)) + { + char buf[256]; + str_format(buf, sizeof(buf), "Invalid arguments... Usage: %s %s", command->name, command->params); + console_print(buf); + } + else + command->callback(&result, command->user_data); } } + else + { + char buf[256]; + str_format(buf, sizeof(buf), "No such command: %s.", result.command); + console_print(buf); + } } void console_execute_line(const char *str) @@ -404,7 +225,6 @@ void console_execute_line(const char *str) console_execute_line_stroked(1, str); } - void console_execute_file(const char *filename) { IOHANDLE file; @@ -429,9 +249,7 @@ void console_execute_file(const char *filename) static void echo_command(void *result, void *user_data) { - const char *str; - console_result_string(result, 1, &str); - console_print(str); + console_print(console_arg_string(result, 0)); } @@ -450,40 +268,34 @@ typedef struct static void int_variable_command(void *result, void *user_data) { INT_VARIABLE_DATA *data = (INT_VARIABLE_DATA *)user_data; - int new_val; - if (console_result_int(result, 1, &new_val)) + if(console_arg_num(result)) + data->setter(&config, console_arg_int(result, 0)); + else { char buf[256]; str_format(buf, sizeof(buf), "Value: %d", data->getter(&config)); console_print(buf); } - else - { - data->setter(&config, new_val); - } } static void str_variable_command(void *result, void *user_data) { STR_VARIABLE_DATA *data = (STR_VARIABLE_DATA *)user_data; - const char *new_val; - if (console_result_string(result, 1, &new_val)) + if(console_arg_num(result)) + data->setter(&config, console_arg_string(result, 0)); + else { char buf[256]; str_format(buf, sizeof(buf), "Value: %s", data->getter(&config)); console_print(buf); } - else - { - data->setter(&config, new_val); - } } void console_init() { - MACRO_REGISTER_COMMAND("echo", "s", echo_command, 0x0); + MACRO_REGISTER_COMMAND("echo", "r", echo_command, 0x0); #define MACRO_CONFIG_INT(name,def,min,max) { static INT_VARIABLE_DATA data = { &config_get_ ## name, &config_set_ ## name }; MACRO_REGISTER_COMMAND(#name, "?i", int_variable_command, &data) } #define MACRO_CONFIG_STR(name,len,def) { static STR_VARIABLE_DATA data = { &config_get_ ## name, &config_set_ ## name }; MACRO_REGISTER_COMMAND(#name, "?s", str_variable_command, &data) } diff --git a/src/engine/e_console.h b/src/engine/e_console.h index 44df7a38..2170e8d7 100644 --- a/src/engine/e_console.h +++ b/src/engine/e_console.h @@ -24,9 +24,14 @@ void console_execute_file(const char *filename); void console_print(const char *str); void console_register_print_callback(void (*callback)(const char *)); -int console_result_string(void *result, int index, const char **str); +/*int console_result_string(void *result, int index, const char **str); int console_result_int(void *result, int index, int *i); -int console_result_float(void *result, int index, float *f); +int console_result_float(void *result, int index, float *f);*/ + +const char *console_arg_string(void *result, int index); +int console_arg_int(void *result, int index); +float console_arg_float(void *result, int index); +int console_arg_num(void *result); #define MACRO_REGISTER_COMMAND(name, params, func, ptr) { static COMMAND cmd = { name, params, func, ptr, 0x0 }; console_register(&cmd); } diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c index cf747716..83c65548 100644 --- a/src/engine/server/es_server.c +++ b/src/engine/server/es_server.c @@ -1065,9 +1065,7 @@ static int server_run() static void con_kick(void *result, void *user_data) { - int cid; - console_result_int(result, 1, &cid); - server_kick(cid, "kicked by console"); + server_kick(console_arg_int(result, 0), "kicked by console"); } static void con_status(void *result, void *user_data) |