forked from github/server
Cleanup: Removing parser-code from kernel/eressea.[hc] and putting it into
separate parser files in util/
This commit is contained in:
parent
5dbeb63531
commit
a5b7b13a6d
|
@ -61,6 +61,7 @@
|
||||||
#include <util/goodies.h>
|
#include <util/goodies.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
#include <util/message.h>
|
#include <util/message.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
|
|
||||||
/* libs includes */
|
/* libs includes */
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include <util/attrib.h>
|
#include <util/attrib.h>
|
||||||
#include <util/functions.h>
|
#include <util/functions.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
|
@ -78,6 +78,7 @@
|
||||||
#include <util/goodies.h>
|
#include <util/goodies.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
#include <util/log.h>
|
#include <util/log.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
#include <util/sql.h>
|
#include <util/sql.h>
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
/* util includes */
|
/* util includes */
|
||||||
#include <util/attrib.h>
|
#include <util/attrib.h>
|
||||||
#include <util/base36.h>
|
#include <util/base36.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
|
|
||||||
/* libc includes */
|
/* libc includes */
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
#include <util/cvector.h>
|
#include <util/cvector.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
#include <util/log.h>
|
#include <util/log.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
#include <base36.h>
|
#include <base36.h>
|
||||||
#include <event.h>
|
#include <event.h>
|
||||||
#include <goodies.h>
|
#include <goodies.h>
|
||||||
|
#include <parser.h>
|
||||||
#include <resolve.h>
|
#include <resolve.h>
|
||||||
#include <xml.h>
|
#include <xml.h>
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,7 @@
|
||||||
#include <util/functions.h>
|
#include <util/functions.h>
|
||||||
#include <util/log.h>
|
#include <util/log.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
#include <util/sql.h>
|
#include <util/sql.h>
|
||||||
#include <util/translation.h>
|
#include <util/translation.h>
|
||||||
|
@ -1288,87 +1289,11 @@ count_maxmigrants(const faction * f)
|
||||||
return x;
|
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
|
void
|
||||||
init_tokens(const struct order * ord)
|
init_tokens(const struct order * ord)
|
||||||
{
|
{
|
||||||
if (state==NULL) state = malloc(sizeof(parser_state));
|
char * cmd = getcommand(ord);
|
||||||
else if (state->current_cmd!=NULL) free(state->current_cmd);
|
init_tokens_str(cmd, 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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 *
|
const char *
|
||||||
igetstrtoken(const char * initstr)
|
igetstrtoken(const char * initstr)
|
||||||
{
|
{
|
||||||
if (initstr!=NULL) {
|
if (initstr!=NULL) {
|
||||||
init_tokens_str(initstr);
|
init_tokens_str(initstr, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return parse_token((const char**)&state->current_token);
|
return getstrtoken();
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
getstrtoken(void)
|
|
||||||
{
|
|
||||||
return parse_token((const char**)&state->current_token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -94,8 +94,6 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define ENCCHANCE 10 /* %-Chance für einmalige Zufallsbegegnung */
|
#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 DISPLAYSIZE 8191 /* max. Länge einer Beschreibung, ohne trailing 0 */
|
||||||
#define NAMESIZE 127 /* max. Länge eines Namens, 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 int findstr(const char **v, const char *s, unsigned char n);
|
||||||
|
|
||||||
extern const char *igetstrtoken(const char *s);
|
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 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 skill_t findskill(const char *s, const struct locale * lang);
|
||||||
|
|
||||||
extern keyword_t findkeyword(const char *s, const struct locale * lang);
|
extern keyword_t findkeyword(const char *s, const struct locale * lang);
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
/* util includes */
|
/* util includes */
|
||||||
#include <util/attrib.h>
|
#include <util/attrib.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/resolve.h>
|
#include <util/resolve.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#include <util/goodies.h>
|
#include <util/goodies.h>
|
||||||
#include <util/language.h>
|
#include <util/language.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include <util/bsdstring.h>
|
#include <util/bsdstring.h>
|
||||||
#include <util/language.h>
|
#include <util/language.h>
|
||||||
|
#include <util/parser.h>
|
||||||
|
|
||||||
/* libc includes */
|
/* libc includes */
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
#include "race.h"
|
#include "race.h"
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
|
|
||||||
|
#include <util/parser.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,7 @@
|
||||||
#include <util/event.h>
|
#include <util/event.h>
|
||||||
#include <util/goodies.h>
|
#include <util/goodies.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/resolve.h>
|
#include <util/resolve.h>
|
||||||
#include <util/sql.h>
|
#include <util/sql.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
|
@ -533,7 +534,7 @@ unitorders(FILE * F, struct faction * f)
|
||||||
|
|
||||||
if (!getbuf(F)) break;
|
if (!getbuf(F)) break;
|
||||||
|
|
||||||
init_tokens_str(buf);
|
init_tokens_str(buf, NULL);
|
||||||
s = getstrtoken();
|
s = getstrtoken();
|
||||||
|
|
||||||
if (findkeyword(s, u->faction->locale) == NOKEYWORD) {
|
if (findkeyword(s, u->faction->locale) == NOKEYWORD) {
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
|
|
||||||
/* util includes */
|
/* util includes */
|
||||||
#include <util/attrib.h>
|
#include <util/attrib.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
#include <util/vset.h>
|
#include <util/vset.h>
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include <util/goodies.h>
|
#include <util/goodies.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
#include <util/umlaut.h>
|
#include <util/umlaut.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
|
|
||||||
/* libc includes */
|
/* libc includes */
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
/* util includes */
|
/* util includes */
|
||||||
#include <util/attrib.h>
|
#include <util/attrib.h>
|
||||||
#include <util/base36.h>
|
#include <util/base36.h>
|
||||||
|
#include <util/parser.h>
|
||||||
|
|
||||||
/* libc includes */
|
/* libc includes */
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
|
@ -63,6 +63,7 @@ extern void ct_register(const struct curse_type * ct);
|
||||||
#include <util/base36.h>
|
#include <util/base36.h>
|
||||||
#include <util/umlaut.h>
|
#include <util/umlaut.h>
|
||||||
#include <util/message.h>
|
#include <util/message.h>
|
||||||
|
#include <util/parser.h>
|
||||||
#include <util/event.h>
|
#include <util/event.h>
|
||||||
#include <util/functions.h>
|
#include <util/functions.h>
|
||||||
#include <util/lists.h>
|
#include <util/lists.h>
|
||||||
|
|
|
@ -25,6 +25,7 @@ SOURCES =
|
||||||
log.c
|
log.c
|
||||||
message.c
|
message.c
|
||||||
nrmessage.c
|
nrmessage.c
|
||||||
|
parser.c
|
||||||
rand.c
|
rand.c
|
||||||
resolve.c
|
resolve.c
|
||||||
sql.c
|
sql.c
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
#include <config.h>
|
||||||
|
#include "parser.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* vi: set ts=2:
|
||||||
|
* +-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
* | | Enno Rehling <enno@eressea.de>
|
||||||
|
* | Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||||
|
* | (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
|
Loading…
Reference in New Issue