parsing von LEHRE vereinfacht, parser_end() Befehl prüft ob letzte Einheit geparsed.

This commit is contained in:
Enno Rehling 2005-05-01 16:33:27 +00:00
parent ed99053282
commit 48b597e972
3 changed files with 24 additions and 36 deletions

View File

@ -243,7 +243,6 @@ teach(unit * u, struct order * ord)
region * r = u->region; region * r = u->region;
int teaching, i, j, count, academy=0; int teaching, i, j, count, academy=0;
unit *u2; unit *u2;
const char *s;
skill_t sk = NOSKILL; skill_t sk = NOSKILL;
if ((u->race->flags & RCF_NOTEACH) || fval(u, UFL_WERE)) { if ((u->race->flags & RCF_NOTEACH) || fval(u, UFL_WERE)) {
@ -340,69 +339,50 @@ teach(unit * u, struct order * ord)
skip_token(); skip_token();
strcpy(zOrder, locale_string(u->faction->locale, keywords[K_TEACH])); strcpy(zOrder, locale_string(u->faction->locale, keywords[K_TEACH]));
for (;;) {
u2 = getunit(r, u->faction); while (!parser_end()) {
unit * u2 = getunit(r, u->faction);
++count;
/* Falls keine Unit gefunden, abbrechen - außer es gibt überhaupt keine /* Falls die Unit nicht gefunden wird, Fehler melden */
* Unit, dann gibt es zusätzlich noch einen Fehler */
if (!u2) { if (!u2) {
const char * token;
/* Finde den string, der den Fehler verursacht hat */ /* Finde den string, der den Fehler verursacht hat */
parser_pushstate(); parser_pushstate();
init_tokens(ord); init_tokens(ord);
skip_token(); skip_token();
for (j = count; j; j--) {
for (j=0; j!=count-1; ++j) {
/* skip over the first 'count' units */ /* skip over the first 'count' units */
getunit(r, u->faction); getunit(r, u->faction);
} }
s = getstrtoken(); token = getstrtoken();
if (!s[0]) {
/* Falls es keinen String gibt, ist einfach nur die Liste der Einheiten
* zu ende. dann raus hier */
parser_popstate();
break;
}
/* Beginne die Fehlermeldung */ /* Beginne die Fehlermeldung */
strcpy(buf, "Die Einheit '"); strcpy(buf, "Die Einheit '");
if (findparam(s, u->faction->locale) == P_TEMP) { if (findparam(token, u->faction->locale) == P_TEMP) {
/* Für: "Die Einheit 'TEMP ZET' wurde nicht gefunden" oder "Die Einheit /* Für: "Die Einheit 'TEMP ZET' wurde nicht gefunden" oder "Die Einheit
* 'TEMP' wurde nicht gefunden" */ * 'TEMP' wurde nicht gefunden" */
scat(token);
scat(s); token = getstrtoken();
s = getstrtoken(); if (*token) scat(" ");
if (s[0])
scat(" ");
/* count++; -- unnötig/alt? Um nachher weiter einlesen zu koennen */
} }
scat(s); scat(token);
scat("' wurde nicht gefunden"); scat("' wurde nicht gefunden");
mistake(u, ord, buf, MSG_EVENT); mistake(u, ord, buf, MSG_EVENT);
count++;
parser_popstate(); parser_popstate();
continue; continue;
} }
/* Defaultorder zusammenbauen. TEMP-Einheiten werden automatisch in
* ihre neuen Nummern übersetzt. */ /* Neuen Befehl zusammenbauen. TEMP-Einheiten werden automatisch in
* ihre neuen Nummern übersetzt. */
strcat(zOrder, " "); strcat(zOrder, " ");
strcat(zOrder, unitid(u2)); strcat(zOrder, unitid(u2));
/* Wir müssen nun hochzählen, wieviele Einheiten wir schon abgearbeitet
* haben, damit mit getstrtoken() die richtige Einheit geholt werden kann.
* Falls u2 ein Alias hat, ist sie neu, und es wurde ein TEMP verwendet, um
* sie zu beschreiben. */
count++;
if (get_keyword(u2->thisorder) != K_STUDY) { if (get_keyword(u2->thisorder) != K_STUDY) {
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
msg_feedback(u, ord, "teach_nolearn", "student", u2)); msg_feedback(u, ord, "teach_nolearn", "student", u2));

View File

@ -1303,6 +1303,13 @@ parser_popstate(void)
state = new_state; state = new_state;
} }
boolean
parser_end(void)
{
while (isspace(*state->current_token)) ++state->current_token;
return *state->current_token == NULL;
}
void void
skip_token(void) skip_token(void)
{ {

View File

@ -947,6 +947,7 @@ extern void skip_token(void);
extern const char * parse_token(const char ** str); extern const char * parse_token(const char ** str);
extern void parser_pushstate(void); extern void parser_pushstate(void);
extern void parser_popstate(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);