about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/ec_client.c11
-rw-r--r--src/engine/e_config.c2
-rw-r--r--src/engine/e_console.c478
-rw-r--r--src/engine/e_console.h9
-rw-r--r--src/engine/server/es_server.c4
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)