rename to gettoken, use more widely, add a basic test.

This commit is contained in:
Enno Rehling 2014-12-22 16:28:17 +01:00
parent 870d8001ef
commit c8b9044f78
14 changed files with 859 additions and 816 deletions

View File

@ -476,7 +476,8 @@ static void recruit(unit * u, struct order *ord, request ** recruitorders)
n = getuint();
if (u->number == 0) {
str = getstrtoken();
char token[128];
str = gettoken(token, sizeof(token));
if (str && str[0]) {
/* Monsters can RECRUIT 15 DRACOID
* also: secondary race */
@ -626,6 +627,7 @@ void give_control(unit * u, unit * u2)
int give_control_cmd(unit * u, order * ord)
{
char token[128];
region *r = u->region;
unit *u2;
const char *s;
@ -633,7 +635,7 @@ int give_control_cmd(unit * u, order * ord)
init_order(ord);
getunit(r, u->faction, &u2);
s = getstrtoken();
s = gettoken(token, sizeof(token));
if (s && isparam(s, u->faction->locale, P_CONTROL)) {
message *msg = 0;
@ -676,6 +678,7 @@ int give_control_cmd(unit * u, order * ord)
static int forget_cmd(unit * u, order * ord)
{
char token[128];
skill_t sk;
const char *s;
@ -685,7 +688,7 @@ static int forget_cmd(unit * u, order * ord)
}
init_order(ord);
s = getstrtoken();
s = gettoken(token, sizeof(token));
if ((sk = get_skill(s, u->faction->locale)) != NOSKILL) {
ADDMSG(&u->faction->msgs, msg_message("forget", "unit skill", u, sk));
@ -1499,14 +1502,14 @@ int make_cmd(unit * u, struct order *ord)
kwd = init_order(ord);
assert(kwd == K_MAKE);
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
if (s) {
m = atoi((const char *)s);
sprintf(ibuf, "%d", m);
if (!strcmp(ibuf, (const char *)s)) {
/* a quantity was given */
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
}
else {
m = INT_MAX;
@ -1522,7 +1525,7 @@ int make_cmd(unit * u, struct order *ord)
cmistake(u, ord, 275, MSG_PRODUCE);
}
else {
const char * s = getstrtok(token, sizeof(token));
const char * s = gettoken(token, sizeof(token));
direction_t d = s ? get_direction(s, u->faction->locale) : NODIRECTION;
if (d != NODIRECTION) {
build_road(r, u, m, d);
@ -1755,6 +1758,7 @@ attrib_type at_trades = {
static void buy(unit * u, request ** buyorders, struct order *ord)
{
char token[128];
region *r = u->region;
int n, k;
request *o;
@ -1838,7 +1842,7 @@ static void buy(unit * u, request ** buyorders, struct order *ord)
/* die Menge der verkauften Güter merken */
a->data.i += n;
s = getstrtoken();
s = gettoken(token, sizeof(token));
itype = s ? finditemtype(s, u->faction->locale) : 0;
if (itype != NULL) {
ltype = resource2luxury(itype->rtype);
@ -2061,6 +2065,7 @@ static void expandselling(region * r, request * sellorders, int limit)
static bool sell(unit * u, request ** sellorders, struct order *ord)
{
char token[128];
bool unlimited = true;
const item_type *itype;
const luxury_type *ltype;
@ -2078,7 +2083,7 @@ static bool sell(unit * u, request ** sellorders, struct order *ord)
kwd = init_order(ord);
assert(kwd == K_SELL);
s = getstrtoken();
s = gettoken(token, sizeof(token));
if (findparam(s, u->faction->locale) == P_ANY) {
unlimited = false;
@ -2136,7 +2141,7 @@ static bool sell(unit * u, request ** sellorders, struct order *ord)
cmistake(u, ord, 54, MSG_COMMERCE);
return false;
}
s = getstrtoken();
s = gettoken(token, sizeof(token));
itype = s ? finditemtype(s, u->faction->locale) : 0;
ltype = itype ? resource2luxury(itype->rtype) : 0;
if (ltype == NULL) {
@ -2464,6 +2469,7 @@ static void breedhorses(region * r, unit * u)
static void breed_cmd(unit * u, struct order *ord)
{
char token[128];
int m;
const char *s;
param_t p;
@ -2477,12 +2483,12 @@ static void breed_cmd(unit * u, struct order *ord)
/* züchte [<anzahl>] <parameter> */
(void)init_order(ord);
s = getstrtoken();
s = gettoken(token, sizeof(token));
m = s ? atoi((const char *)s) : 0;
if (m != 0) {
/* first came a want-paramter */
s = getstrtoken();
s = gettoken(token, sizeof(token));
}
else {
m = INT_MAX;
@ -2545,10 +2551,6 @@ static void research_cmd(unit * u, struct order *ord)
kwd = init_order(ord);
assert(kwd == K_RESEARCH);
/*
const char *s = getstrtoken();
if (findparam(s, u->faction->locale) == P_HERBS) { */
if (eff_skill(u, SK_HERBALISM, r) < 7) {
cmistake(u, ord, 227, MSG_EVENT);

View File

@ -531,6 +531,7 @@ bool can_give_to(unit *u, unit *u2) {
void give_cmd(unit * u, order * ord)
{
char token[128];
region *r = u->region;
unit *u2;
const char *s;
@ -544,7 +545,7 @@ void give_cmd(unit * u, order * ord)
kwd = init_order(ord);
assert(kwd == K_GIVE);
err = getunit(r, u->faction, &u2);
s = getstrtoken();
s = gettoken(token, sizeof(token));
n = s ? atoip(s) : 0;
p = (n > 0) ? NOPARAM : findparam(s, u->faction->locale);
@ -652,7 +653,7 @@ void give_cmd(unit * u, order * ord)
feedback_give_not_allowed(u, ord);
return;
}
s = getstrtoken();
s = gettoken(token, sizeof(token));
if (!s || *s == 0) { /* GIVE ALL items that you have */
/* do these checks once, not for each item we have: */
@ -732,11 +733,11 @@ void give_cmd(unit * u, order * ord)
msg_feedback(u, ord, "peasants_give_invalid", ""));
return;
}
s = getstrtoken(); /* skip one ahead to get the amount. */
n = atoip(s); /* n: Anzahl */
s = gettoken(token, sizeof(token)); /* skip one ahead to get the amount. */
n = s ? atoip(s) : 0; /* n: Anzahl */
n *= u2->number;
}
s = getstrtoken();
s = gettoken(token, sizeof(token));
if (s == NULL) {
cmistake(u, ord, 113, MSG_COMMERCE);

View File

@ -35,9 +35,10 @@ use_studypotion(struct unit *u, const struct item_type *itype, int amount,
struct order *ord)
{
if (init_order(u->thisorder) == K_STUDY) {
char token[128];
skill_t sk = NOSKILL;
skill *sv = 0;
const char * s = getstrtoken();
const char * s = gettoken(token, sizeof(token));
if (s) {
sk = get_skill(s, u->faction->locale);

File diff suppressed because it is too large Load Diff

View File

@ -73,10 +73,11 @@ const char *str, parser fun)
static int do_command_i(const void *keys, struct unit *u, struct order *ord)
{
char token[128];
const char *c;
variant var;
c = getstrtoken();
c = gettoken(token, sizeof(token));
if (findtoken(keys, c, &var) == E_TOK_SUCCESS) {
command *cmd = (command *)var.v;
if (cmd->nodes && *c) {

View File

@ -796,13 +796,15 @@ parse(keyword_t kword, int(*dofun) (unit *, struct order *), bool thisorder)
unsigned int getuint(void)
{
const char *s = getstrtoken();
char token[16];
const char *s = gettoken(token, sizeof(token));
return s ? atoip(s) : 0;
}
int getint(void)
{
const char * s = getstrtoken();
char token[16];
const char * s = gettoken(token, sizeof(token));
return s ? atoi(s) : 0;
}
@ -875,7 +877,8 @@ bool isparam(const char *s, const struct locale * lang, param_t param)
param_t getparam(const struct locale * lang)
{
const char *s = getstrtoken();
char token[64];
const char *s = gettoken(token, sizeof(token));
return s ? findparam(s, lang) : NOPARAM;
}
@ -909,7 +912,8 @@ static int read_newunitid(const faction * f, const region * r)
int read_unitid(const faction * f, const region * r)
{
const char *s = getstrtoken();
char token[8];
const char *s = gettoken(token, sizeof(token));
/* Da s nun nur einen string enthaelt, suchen wir ihn direkt in der
* paramliste. machen wir das nicht, dann wird getnewunit in s nach der

View File

@ -225,7 +225,7 @@ static faction *factionorders(void)
if (f != NULL && !fval(f, FFL_NPC)) {
char token[128];
const char *pass = getstrtok(token, sizeof(token));
const char *pass = gettoken(token, sizeof(token));
if (!checkpasswd(f, (const char *)pass)) {
log_debug("Invalid password for faction %s\n", itoa36(fid));
@ -273,7 +273,7 @@ int readorders(const char *filename)
param_t p;
const char *s;
init_tokens_str(b);
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
p = s ? findparam(s, lang) : NOPARAM;
switch (p) {
#undef LOCALE_CHANGE

View File

@ -491,16 +491,19 @@ void usetprivate(unit * u, const char *str)
{
attrib *a = a_find(u->attribs, &at_private);
if (str == NULL) {
if (a)
if (str == NULL || *str == 0) {
if (a) {
a_remove(&u->attribs, a);
}
return;
}
if (!a)
if (!a) {
a = a_add(&u->attribs, a_new(&at_private));
if (a->data.v)
}
if (a->data.v) {
free(a->data.v);
a->data.v = _strdup((const char *)str);
}
a->data.v = _strdup(str);
}
/*********************/

View File

@ -953,7 +953,7 @@ int quit_cmd(unit * u, struct order *ord)
kwd = init_order(ord);
assert(kwd == K_QUIT);
passwd = getstrtok(token, sizeof(token));
passwd = gettoken(token, sizeof(token));
if (checkpasswd(f, (const char *)passwd)) {
if (EnhancedQuit()) {
int f2_id = getid();
@ -1167,7 +1167,7 @@ void do_enter(struct region *r, bool is_final_attempt)
const char * s;
init_order(ord);
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
p = findparam_ex(s, u->faction->locale);
id = getid();
@ -1357,7 +1357,7 @@ int ally_cmd(unit * u, struct order *ord)
if (f == u->faction)
return 0;
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
if (!s[0])
keyword = P_ANY;
@ -1495,6 +1495,7 @@ static void init_prefixnames(void)
int prefix_cmd(unit * u, struct order *ord)
{
char token[128];
attrib **ap;
const char *s;
local_names *in = pnames;
@ -1512,7 +1513,7 @@ int prefix_cmd(unit * u, struct order *ord)
}
init_order(ord);
s = getstrtoken();
s = gettoken(token, sizeof(token));
if (!s || !*s) {
attrib *a = NULL;
@ -1559,13 +1560,14 @@ static cmp_building_cb get_cmp_region_owner(void)
int display_cmd(unit * u, struct order *ord)
{
char token[128];
char **s = NULL;
const char *str;
region *r = u->region;
init_order(ord);
str = getstrtoken();
str = gettoken(token, sizeof(token));
switch (findparam_ex(str, u->faction->locale)) {
case P_BUILDING:
case P_GEBAEUDE:
@ -1601,15 +1603,7 @@ int display_cmd(unit * u, struct order *ord)
break;
case P_PRIVAT:
{
const char *d = getstrtoken();
if (d == NULL || *d == 0) {
usetprivate(u, NULL);
}
else {
usetprivate(u, d);
}
}
usetprivate(u, getstrtoken());
break;
case P_REGION:
@ -1732,6 +1726,7 @@ rename_building(unit * u, order * ord, building * b, const char *name)
int name_cmd(struct unit *u, struct order *ord)
{
char token[128];
building *b = u->building;
region *r = u->region;
char **s = NULL;
@ -1740,11 +1735,11 @@ int name_cmd(struct unit *u, struct order *ord)
const char *str;
init_order(ord);
str = getstrtoken();
str = gettoken(token, sizeof(token));
p = findparam_ex(str, u->faction->locale);
if (p == P_FOREIGN) {
str = getstrtoken();
str = gettoken(token, sizeof(token));
foreign = true;
p = findparam_ex(str, u->faction->locale);
}
@ -1994,13 +1989,14 @@ static void mailfaction(unit * u, int n, struct order *ord, const char *s)
int mail_cmd(unit * u, struct order *ord)
{
char token[128];
region *r = u->region;
unit *u2;
const char *s;
int n, cont;
init_order(ord);
s = getstrtoken();
s = gettoken(token, sizeof(token));
/* Falls kein Parameter, ist das eine Einheitsnummer;
* das Füllwort "AN" muß wegfallen, da gültige Nummer! */
@ -2185,7 +2181,7 @@ int email_cmd(unit * u, struct order *ord)
}
else {
faction *f = u->faction;
if (set_email(&f->email, (const char *)s) != 0) {
if (set_email(&f->email, s) != 0) {
log_error("Invalid email address for faction %s: %s\n", itoa36(f->no), s);
ADDMSG(&f->msgs, msg_message("changemail_invalid", "value", s));
}
@ -2204,7 +2200,7 @@ int password_cmd(unit * u, struct order *ord)
bool pwok = true;
init_order(ord);
s = getstrtoken();
s = gettoken(pwbuf, sizeof(pwbuf));
if (!s || !*s) {
for (i = 0; i < 6; i++)
@ -2213,14 +2209,10 @@ int password_cmd(unit * u, struct order *ord)
}
else {
char *c;
strlcpy(pwbuf, (const char *)s, 31);
pwbuf[31] = 0;
c = pwbuf;
while (*c && pwok) {
if (!isalnum(*(unsigned char *)c))
for (c = pwbuf; *c && pwok; ++c) {
if (!isalnum(*(unsigned char *)c)) {
pwok = false;
c++;
}
}
}
free(u->faction->passw);
@ -2238,11 +2230,12 @@ int password_cmd(unit * u, struct order *ord)
int send_cmd(unit * u, struct order *ord)
{
char token[128];
const char *s;
int option;
init_order(ord);
s = getstrtoken();
s = gettoken(token, sizeof(token));
option = findoption(s, u->faction->locale);
@ -2579,14 +2572,11 @@ int promotion_cmd(unit * u, struct order *ord)
int group_cmd(unit * u, struct order *ord)
{
const char *s;
keyword_t kwd;
kwd = init_order(ord);
assert(kwd == K_GROUP);
s = getstrtoken();
join_group(u, s);
join_group(u, getstrtoken());
return 0;
}
@ -2621,7 +2611,7 @@ int reshow_cmd(unit * u, struct order *ord)
param_t p = NOPARAM;
init_order(ord);
s = getstrtok(lbuf, sizeof(lbuf));
s = gettoken(lbuf, sizeof(lbuf));
if (s && isparam(s, u->faction->locale, P_ANY)) {
p = getparam(u->faction->locale);
@ -2634,12 +2624,12 @@ int reshow_cmd(unit * u, struct order *ord)
int status_cmd(unit * u, struct order *ord)
{
const char *param;
char token[128];
const char *s;
init_order(ord);
param = getstrtoken();
switch (findparam(param, u->faction->locale)) {
s = gettoken(token, sizeof(token));
switch (findparam(s, u->faction->locale)) {
case P_NOT:
setstatus(u, ST_AVOID);
break;
@ -2667,7 +2657,7 @@ int status_cmd(unit * u, struct order *ord)
}
break;
default:
if (param && param[0]) {
if (s && s[0]) {
add_message(&u->faction->msgs,
msg_feedback(u, ord, "unknown_status", ""));
}
@ -2686,7 +2676,7 @@ int combatspell_cmd(unit * u, struct order *ord)
spell *sp = 0;
init_order(ord);
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
/* KAMPFZAUBER [NICHT] löscht alle gesetzten Kampfzauber */
if (!s || *s == 0 || findparam(s, u->faction->locale) == P_NOT) {
@ -2699,7 +2689,7 @@ int combatspell_cmd(unit * u, struct order *ord)
/* Merken, setzen kommt erst später */
level = getint();
level = _max(0, level);
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
}
sp = unit_getspell(u, s, u->faction->locale);
@ -2708,7 +2698,7 @@ int combatspell_cmd(unit * u, struct order *ord)
return 0;
}
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
if (findparam(s, u->faction->locale) == P_NOT) {
/* KAMPFZAUBER "<Spruchname>" NICHT löscht diesen speziellen
@ -2933,7 +2923,7 @@ void restack_units(void)
unit *v;
init_order(ord);
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
p = findparam(s, u->faction->locale);
id = getid();
v = findunit(id);
@ -3009,11 +2999,11 @@ int renumber_cmd(unit * u, order * ord)
faction *f = u->faction;
init_order(ord);
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
switch (findparam_ex(s, u->faction->locale)) {
case P_FACTION:
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
if (s && *s) {
int id = atoi36((const char *)s);
attrib *a = a_find(f->attribs, &at_number);
@ -3024,7 +3014,7 @@ int renumber_cmd(unit * u, order * ord)
break;
case P_UNIT:
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
if (s == NULL || *s == 0) {
i = newunitid();
}
@ -3067,7 +3057,7 @@ int renumber_cmd(unit * u, order * ord)
cmistake(u, ord, 116, MSG_EVENT);
break;
}
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
if (s == NULL || *s == 0) {
i = newcontainerid();
}
@ -3096,7 +3086,7 @@ int renumber_cmd(unit * u, order * ord)
cmistake(u, ord, 148, MSG_EVENT);
break;
}
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
if (*s == 0) {
i = newcontainerid();
}
@ -3397,7 +3387,7 @@ void new_units(void)
init_order(makeord);
alias = getid();
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
if (s && s[0]) {
name = _strdup(s);
}
@ -3707,7 +3697,7 @@ void defaultorders(void)
order *new_order = 0;
const char *s;
init_order(ord);
s = getstrtok(lbuf, sizeof(lbuf));
s = gettoken(lbuf, sizeof(lbuf));
if (s) {
new_order = parse_order(s, u->faction->locale);
}
@ -3823,13 +3813,13 @@ int use_cmd(unit * u, struct order *ord)
init_order(ord);
t = getstrtok(token, sizeof(token));
t = gettoken(token, sizeof(token));
n = atoi((const char *)t);
if (n == 0) {
if (isparam(t, u->faction->locale, P_ANY)) {
/* BENUTZE ALLES Yanxspirit */
n = INT_MAX;
t = getstrtok(token, sizeof(token));
t = gettoken(token, sizeof(token));
}
else {
/* BENUTZE Yanxspirit */
@ -3838,7 +3828,7 @@ int use_cmd(unit * u, struct order *ord)
}
else {
/* BENUTZE 42 Yanxspirit */
t = getstrtok(token, sizeof(token));
t = gettoken(token, sizeof(token));
}
itype = t ? finditemtype(t, u->faction->locale) : NULL;
@ -3920,20 +3910,21 @@ int pay_cmd(unit * u, struct order *ord)
static int reserve_i(unit * u, struct order *ord, int flags)
{
char token[128];
if (u->number > 0 && (urace(u)->ec_flags & GETITEM)) {
int use, count, para;
const item_type *itype;
const char *s;
init_order(ord);
s = getstrtoken();
s = gettoken(token, sizeof(token));
count = s ? atoip(s) : 0;
para = findparam(s, u->faction->locale);
if (count == 0 && para == P_EACH) {
count = getint() * u->number;
}
s = getstrtoken();
s = gettoken(token, sizeof(token));
itype = s ? finditemtype(s, u->faction->locale) : 0;
if (itype == NULL)
return 0;
@ -3963,19 +3954,20 @@ int reserve_self(unit * u, struct order *ord) {
int claim_cmd(unit * u, struct order *ord)
{
char token[128];
const char *t;
int n;
const item_type *itype;
init_order(ord);
t = getstrtoken();
t = gettoken(token, sizeof(token));
n = atoi((const char *)t);
if (n == 0) {
n = 1;
}
else {
t = getstrtoken();
t = gettoken(token, sizeof(token));
}
itype = finditemtype(t, u->faction->locale);

View File

@ -2519,7 +2519,7 @@ static castorder *cast_cmd(unit * u, order * ord)
level = eff_skill(u, SK_MAGIC, r);
init_order(ord);
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
param = findparam(s, u->faction->locale);
/* für Syntax ' STUFE x REGION y z ' */
if (param == P_LEVEL) {
@ -2530,7 +2530,7 @@ static castorder *cast_cmd(unit * u, order * ord)
cmistake(u, ord, 10, MSG_MAGIC);
return 0;
}
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
param = findparam(s, u->faction->locale);
}
if (param == P_REGION) {
@ -2547,7 +2547,7 @@ static castorder *cast_cmd(unit * u, order * ord)
"unit region command", u, u->region, ord));
return 0;
}
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
param = findparam(s, u->faction->locale);
}
/* für Syntax ' REGION x y STUFE z '
@ -2560,7 +2560,7 @@ static castorder *cast_cmd(unit * u, order * ord)
cmistake(u, ord, 10, MSG_MAGIC);
return 0;
}
s = getstrtok(token, sizeof(token));
s = gettoken(token, sizeof(token));
}
if (!s || !s[0] || strlen(s) == 0) {
/* Fehler "Es wurde kein Zauber angegeben" */
@ -2693,7 +2693,7 @@ static castorder *cast_cmd(unit * u, order * ord)
char **params = (char**)malloc(2 * sizeof(char *));
int p = 0, size = 2;
for (;;) {
s = getstrtoken();
s = gettoken(token, sizeof(token));
if (!s || *s == 0)
break;
if (p + 1 >= size) {

View File

@ -1156,7 +1156,7 @@ static void cycle_route(order * ord, unit * u, int gereist)
int bytes, cm = 0;
char tail[1024], *bufp = tail;
char neworder[2048];
const char *token;
char token[128];
direction_t d = NODIRECTION;
bool paused = false;
bool pause;
@ -1171,11 +1171,12 @@ static void cycle_route(order * ord, unit * u, int gereist)
neworder[0] = 0;
for (cm = 0;; ++cm) {
const char *s;
const struct locale *lang = u->faction->locale;
pause = false;
token = getstrtoken();
if (token && *token) {
d = get_direction(token, lang);
s = gettoken(token, sizeof(token));
if (s && *s) {
d = get_direction(s, lang);
if (d == D_PAUSE) {
pause = true;
}
@ -1448,11 +1449,12 @@ static void make_route(unit * u, order * ord, region_list ** routep)
region_list **iroute = routep;
region *current = u->region;
region *next = NULL;
const char *token = getstrtoken();
int error = movewhere(u, token, current, &next);
char token[128];
const char *s = gettoken(token, sizeof(token));
int error = movewhere(u, s, current, &next);
if (error != E_MOVE_OK) {
message *msg = movement_error(u, token, ord, error);
message *msg = movement_error(u, s, ord, error);
if (msg != NULL) {
add_message(&u->faction->msgs, msg);
msg_release(msg);
@ -1471,10 +1473,10 @@ static void make_route(unit * u, order * ord, region_list ** routep)
iroute = &(*iroute)->next;
current = next;
token = getstrtoken();
error = movewhere(u, token, current, &next);
s = gettoken(token, sizeof(token));
error = movewhere(u, s, current, &next);
if (error) {
message *msg = movement_error(u, token, ord, error);
message *msg = movement_error(u, s, ord, error);
if (msg != NULL) {
add_message(&u->faction->msgs, msg);
msg_release(msg);

View File

@ -132,6 +132,9 @@ char *parse_token(const char **str, char *lbuf, size_t len)
}
eatwhitespace_c(&ctoken);
if (!*ctoken) {
if (len > 0) {
*cursor = 0;
}
return 0;
}
while (*ctoken && cursor-len < lbuf-1) {
@ -209,7 +212,7 @@ const char *getstrtoken(void)
return parse_token((const char **)&states->current_token, lbuf, MAXTOKENSIZE);
}
const char *getstrtok(char *lbuf, size_t bufsize)
const char *gettoken(char *lbuf, size_t bufsize)
{
return parse_token((const char **)&states->current_token, lbuf, bufsize);
}
@ -217,7 +220,7 @@ const char *getstrtok(char *lbuf, size_t bufsize)
int getid(void)
{
char token[16];
const char *str = getstrtok(token, sizeof(token));
const char *str = gettoken(token, sizeof(token));
int i = str ? atoi36(str) : 0;
if (i < 0) {
return -1;

View File

@ -22,7 +22,7 @@ extern "C" {
void parser_popstate(void);
bool parser_end(void);
const char *getstrtoken(void);
const char *getstrtok(char *lbuf, size_t bufsize);
const char *gettoken(char *lbuf, size_t bufsize);
int getid(void);
#define getshipid() getid()
#define getfactionid() getid()

View File

@ -3,13 +3,21 @@
#include <CuTest.h>
static void test_parser(CuTest *tc) {
static void test_gettoken(CuTest *tc) {
char token[128];
init_tokens_str("HELP ONE TWO THREE");
CuAssertStrEquals(tc, "HELP", gettoken(token, sizeof(token)));
CuAssertStrEquals(tc, "HELP", token);
CuAssertStrEquals(tc, "ONE", gettoken(token, sizeof(token)));
CuAssertStrEquals(tc, "TWO", gettoken(token, sizeof(token)));
CuAssertStrEquals(tc, "THREE", gettoken(token, sizeof(token)));
CuAssertPtrEquals(tc, NULL, (void *)gettoken(token, sizeof(token)));
CuAssertStrEquals(tc, "", token);
}
CuSuite *get_parser_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_parser);
SUITE_ADD_TEST(suite, test_gettoken);
return suite;
}