From a5b7b13a6da77d0ea766bed32191382b703c362f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 21 Jun 2007 22:31:28 +0000 Subject: [PATCH] Cleanup: Removing parser-code from kernel/eressea.[hc] and putting it into separate parser files in util/ --- src/common/gamecode/economy.c | 1 + src/common/gamecode/items.c | 1 + src/common/gamecode/laws.c | 1 + src/common/gamecode/study.c | 1 + src/common/kernel/battle.c | 1 + src/common/kernel/build.c | 1 + src/common/kernel/eressea.c | 135 ++-------------------------------- src/common/kernel/eressea.h | 10 --- src/common/kernel/magic.c | 1 + src/common/kernel/movement.c | 1 + src/common/kernel/order.c | 1 + src/common/kernel/pool.c | 2 + src/common/kernel/save.c | 3 +- src/common/kernel/spy.c | 1 + src/common/modules/gmcmd.c | 1 + src/common/modules/xecmd.c | 1 + src/common/spells/spells.c | 1 + src/common/util/Jamfile | 1 + src/common/util/parser.c | 129 ++++++++++++++++++++++++++++++++ src/common/util/parser.h | 29 ++++++++ 20 files changed, 181 insertions(+), 141 deletions(-) create mode 100644 src/common/util/parser.c create mode 100644 src/common/util/parser.h diff --git a/src/common/gamecode/economy.c b/src/common/gamecode/economy.c index 67f9f8f59..2cf6e8871 100644 --- a/src/common/gamecode/economy.c +++ b/src/common/gamecode/economy.c @@ -61,6 +61,7 @@ #include #include #include +#include #include /* libs includes */ diff --git a/src/common/gamecode/items.c b/src/common/gamecode/items.c index 07ae6b4fe..1ec0a902c 100644 --- a/src/common/gamecode/items.c +++ b/src/common/gamecode/items.c @@ -24,6 +24,7 @@ #include #include +#include #include #include diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index e2c41dcdf..785fac0b3 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -78,6 +78,7 @@ #include #include #include +#include #include #include #include diff --git a/src/common/gamecode/study.c b/src/common/gamecode/study.c index 8d0a42663..d2564900f 100644 --- a/src/common/gamecode/study.c +++ b/src/common/gamecode/study.c @@ -46,6 +46,7 @@ /* util includes */ #include #include +#include #include /* libc includes */ diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index 65849feb4..69732fe30 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -58,6 +58,7 @@ #include #include #include +#include #include #include diff --git a/src/common/kernel/build.c b/src/common/kernel/build.c index cb19e224c..e38836222 100644 --- a/src/common/kernel/build.c +++ b/src/common/kernel/build.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index 8dc8676c9..9bd7f582f 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -64,6 +64,7 @@ #include #include #include +#include #include #include #include @@ -1288,87 +1289,11 @@ count_maxmigrants(const faction * f) return x; } -/*------------------------------------------------------------------*/ - -/* GET STR, I zur Eingabe von Daten liest diese aus dem Buffer, der beim ersten - * Aufruf inititialisiert wird? */ - -typedef struct parser_state { - const unsigned char *current_token; - char * current_cmd; - struct parser_state * next; -} parser_state; - -static parser_state * state; - -void -init_tokens_str(const char * initstr) -{ - if (state==NULL) { - state = malloc(sizeof(parser_state)); - state->current_cmd = NULL; - } - state->current_token = (const unsigned char *)initstr; -} - void init_tokens(const struct order * ord) { - if (state==NULL) state = malloc(sizeof(parser_state)); - else if (state->current_cmd!=NULL) free(state->current_cmd); - state->current_cmd = getcommand(ord); - init_tokens_str(state->current_cmd); -} - -void -parser_pushstate(void) -{ - parser_state * new_state = malloc(sizeof(parser_state)); - new_state->current_cmd = NULL; - new_state->current_token = NULL; - new_state->next = state; - state = new_state; -} - -void -parser_popstate(void) -{ - parser_state * new_state = state->next; - if (state->current_cmd!=NULL) free(state->current_cmd); - free(state); - state = new_state; -} - -boolean -parser_end(void) -{ - while (isspace(*state->current_token)) ++state->current_token; - return *state->current_token == 0; -} - -void -skip_token(void) -{ - char quotechar = 0; - - while (isspace(*state->current_token)) ++state->current_token; - while (*state->current_token) { - if (isspace(*state->current_token) && quotechar==0) { - return; - } else { - switch(*state->current_token) { - case '"': - case '\'': - if (*state->current_token==quotechar) return; - quotechar = *state->current_token; - break; - case ESCAPE_CHAR: - ++state->current_token; - break; - } - } - ++state->current_token; - } + char * cmd = getcommand(ord); + init_tokens_str(cmd, cmd); } void @@ -1396,64 +1321,14 @@ parse(keyword_t kword, int (*dofun)(unit *, struct order *), boolean thisorder) } } -const char * -parse_token(const char ** str) -{ - static char lbuf[DISPLAYSIZE + 1]; - char * cursor = lbuf; - char quotechar = 0; - boolean escape = false; - const unsigned char * ctoken = (const unsigned char*)*str; - - assert(ctoken); - - while (isspace(*ctoken)) ++ctoken; - while (*ctoken && cursor-lbuf < DISPLAYSIZE) { - if (escape) { - *cursor++ = *ctoken++; - } else if (isspace(*ctoken)) { - if (quotechar==0) break; - *cursor++ = *ctoken++; - } else if (*ctoken=='"' || *ctoken=='\'') { - if (*ctoken==quotechar) { - ++ctoken; - break; - } else if (quotechar==0) { - quotechar = *ctoken; - ++ctoken; - } else { - *cursor++ = *ctoken++; - } - } else if (*ctoken==SPACE_REPLACEMENT) { - *cursor++ = ' '; - ++ctoken; - } else if (*ctoken==ESCAPE_CHAR) { - escape = true; - ++ctoken; - } else { - *cursor++ = *ctoken++; - } - } - - *cursor = '\0'; - *str = (const char *)ctoken; - return lbuf; -} - const char * igetstrtoken(const char * initstr) { if (initstr!=NULL) { - init_tokens_str(initstr); + init_tokens_str(initstr, NULL); } - return parse_token((const char**)&state->current_token); -} - -const char * -getstrtoken(void) -{ - return parse_token((const char**)&state->current_token); + return getstrtoken(); } int diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h index 72f585a94..d7bdae1fb 100644 --- a/src/common/kernel/eressea.h +++ b/src/common/kernel/eressea.h @@ -94,8 +94,6 @@ extern "C" { */ #define ENCCHANCE 10 /* %-Chance für einmalige Zufallsbegegnung */ -#define SPACE_REPLACEMENT '~' -#define ESCAPE_CHAR '\\' #define DISPLAYSIZE 8191 /* max. Länge einer Beschreibung, ohne trailing 0 */ #define NAMESIZE 127 /* max. Länge eines Namens, ohne trailing 0 */ @@ -206,16 +204,8 @@ int geti(void); extern int findstr(const char **v, const char *s, unsigned char n); extern const char *igetstrtoken(const char *s); -extern const char *getstrtoken(void); -extern void init_tokens_str(const char * initstr); /* initialize token parsing */ extern void init_tokens(const struct order * ord); /* initialize token parsing */ -extern void skip_token(void); -extern const char * parse_token(const char ** str); -extern void parser_pushstate(void); -extern void parser_popstate(void); -extern boolean parser_end(void); - extern skill_t findskill(const char *s, const struct locale * lang); extern keyword_t findkeyword(const char *s, const struct locale * lang); diff --git a/src/common/kernel/magic.c b/src/common/kernel/magic.c index 99f3094fe..be5c536c7 100644 --- a/src/common/kernel/magic.c +++ b/src/common/kernel/magic.c @@ -54,6 +54,7 @@ /* util includes */ #include #include +#include #include #include #include diff --git a/src/common/kernel/movement.c b/src/common/kernel/movement.c index 6ec53b262..b4ec71953 100644 --- a/src/common/kernel/movement.c +++ b/src/common/kernel/movement.c @@ -51,6 +51,7 @@ #include #include #include +#include #include #include diff --git a/src/common/kernel/order.c b/src/common/kernel/order.c index adcd773b2..35e865de6 100644 --- a/src/common/kernel/order.c +++ b/src/common/kernel/order.c @@ -18,6 +18,7 @@ #include #include +#include /* libc includes */ #include diff --git a/src/common/kernel/pool.c b/src/common/kernel/pool.c index 529932354..60b4a8bf8 100644 --- a/src/common/kernel/pool.c +++ b/src/common/kernel/pool.c @@ -31,6 +31,8 @@ #include "race.h" #include "unit.h" +#include + #include #include diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index 2764aff54..3692dbea9 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -533,7 +534,7 @@ unitorders(FILE * F, struct faction * f) if (!getbuf(F)) break; - init_tokens_str(buf); + init_tokens_str(buf, NULL); s = getstrtoken(); if (findkeyword(s, u->faction->locale) == NOKEYWORD) { diff --git a/src/common/kernel/spy.c b/src/common/kernel/spy.c index 90bcd53dd..105478469 100644 --- a/src/common/kernel/spy.c +++ b/src/common/kernel/spy.c @@ -44,6 +44,7 @@ /* util includes */ #include +#include #include #include #include diff --git a/src/common/modules/gmcmd.c b/src/common/modules/gmcmd.c index f45a6c640..d6e04426b 100644 --- a/src/common/modules/gmcmd.c +++ b/src/common/modules/gmcmd.c @@ -41,6 +41,7 @@ #include #include #include +#include #include /* libc includes */ diff --git a/src/common/modules/xecmd.c b/src/common/modules/xecmd.c index a8c383f6e..754251c68 100644 --- a/src/common/modules/xecmd.c +++ b/src/common/modules/xecmd.c @@ -33,6 +33,7 @@ /* util includes */ #include #include +#include /* libc includes */ #include diff --git a/src/common/spells/spells.c b/src/common/spells/spells.c index 7a45bf71d..9c4a3fd4b 100644 --- a/src/common/spells/spells.c +++ b/src/common/spells/spells.c @@ -63,6 +63,7 @@ extern void ct_register(const struct curse_type * ct); #include #include #include +#include #include #include #include diff --git a/src/common/util/Jamfile b/src/common/util/Jamfile index 26cc6f234..adfb469b9 100644 --- a/src/common/util/Jamfile +++ b/src/common/util/Jamfile @@ -25,6 +25,7 @@ SOURCES = log.c message.c nrmessage.c + parser.c rand.c resolve.c sql.c diff --git a/src/common/util/parser.c b/src/common/util/parser.c new file mode 100644 index 000000000..b64134c3e --- /dev/null +++ b/src/common/util/parser.c @@ -0,0 +1,129 @@ +#include +#include "parser.h" + +#include +#include + +#define SPACE_REPLACEMENT '~' +#define ESCAPE_CHAR '\\' +#define MAXTOKENSIZE 8192 + +typedef struct parser_state { + const unsigned char *current_token; + char * current_cmd; + struct parser_state * next; +} parser_state; + +static parser_state * state; + +void +init_tokens_str(const char * initstr, char * cmd) +{ + if (state==NULL) { + state = malloc(sizeof(parser_state)); + } + if (state->current_cmd) free(state->current_cmd); + state->current_cmd = cmd; + state->current_token = (const unsigned char *)initstr; +} + +void +parser_pushstate(void) +{ + parser_state * new_state = malloc(sizeof(parser_state)); + new_state->current_cmd = NULL; + new_state->current_token = NULL; + new_state->next = state; + state = new_state; +} + +void +parser_popstate(void) +{ + parser_state * new_state = state->next; + if (state->current_cmd!=NULL) free(state->current_cmd); + free(state); + state = new_state; +} + +boolean +parser_end(void) +{ + while (isspace(*state->current_token)) ++state->current_token; + return *state->current_token == 0; +} + +void +skip_token(void) +{ + char quotechar = 0; + + while (isspace(*state->current_token)) ++state->current_token; + while (*state->current_token) { + if (isspace(*state->current_token) && quotechar==0) { + return; + } else { + switch(*state->current_token) { + case '"': + case '\'': + if (*state->current_token==quotechar) return; + quotechar = *state->current_token; + break; + case ESCAPE_CHAR: + ++state->current_token; + break; + } + } + ++state->current_token; + } +} + +const char * +parse_token(const char ** str) +{ + static char lbuf[MAXTOKENSIZE]; + char * cursor = lbuf; + char quotechar = 0; + boolean escape = false; + const unsigned char * ctoken = (const unsigned char*)*str; + + assert(ctoken); + + while (isspace(*ctoken)) ++ctoken; + while (*ctoken && cursor-lbuf < MAXTOKENSIZE-1) { + if (escape) { + *cursor++ = *ctoken++; + } else if (isspace(*ctoken)) { + if (quotechar==0) break; + *cursor++ = *ctoken++; + } else if (*ctoken=='"' || *ctoken=='\'') { + if (*ctoken==quotechar) { + ++ctoken; + break; + } else if (quotechar==0) { + quotechar = *ctoken; + ++ctoken; + } else { + *cursor++ = *ctoken++; + } + } else if (*ctoken==SPACE_REPLACEMENT) { + *cursor++ = ' '; + ++ctoken; + } else if (*ctoken==ESCAPE_CHAR) { + escape = true; + ++ctoken; + } else { + *cursor++ = *ctoken++; + } + } + + *cursor = '\0'; + *str = (const char *)ctoken; + return lbuf; +} + +const char * +getstrtoken(void) +{ + return parse_token((const char**)&state->current_token); +} diff --git a/src/common/util/parser.h b/src/common/util/parser.h new file mode 100644 index 000000000..fecb5ff9f --- /dev/null +++ b/src/common/util/parser.h @@ -0,0 +1,29 @@ +/* vi: set ts=2: + * +-------------------+ Christian Schlittchen + * | | Enno Rehling + * | Eressea PBEM host | Katja Zedel + * | (c) 1998 - 2007 | + * | | This program may not be used, modified or distributed + * +-------------------+ without prior permission by the authors of Eressea. + * + */ + +#ifndef UTIL_PARSER_H +#define UTIL_PARSER_H +#ifdef __cplusplus +extern "C" { +#endif + +extern void init_tokens_str(const char * initstr, char * cmd); /* initialize token parsing, take ownership of cmd */ +extern void skip_token(void); +extern const char * parse_token(const char ** str); +extern void parser_pushstate(void); +extern void parser_popstate(void); +extern boolean parser_end(void); +extern const char *getstrtoken(void); + +#ifdef __cplusplus +} +#endif + +#endif