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;
int teaching, i, j, count, academy=0;
unit *u2;
const char *s;
skill_t sk = NOSKILL;
if ((u->race->flags & RCF_NOTEACH) || fval(u, UFL_WERE)) {
@ -340,69 +339,50 @@ teach(unit * u, struct order * ord)
skip_token();
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
* Unit, dann gibt es zusätzlich noch einen Fehler */
/* Falls die Unit nicht gefunden wird, Fehler melden */
if (!u2) {
const char * token;
/* Finde den string, der den Fehler verursacht hat */
parser_pushstate();
init_tokens(ord);
skip_token();
for (j = count; j; j--) {
for (j=0; j!=count-1; ++j) {
/* skip over the first 'count' units */
getunit(r, u->faction);
}
s = getstrtoken();
if (!s[0]) {
/* Falls es keinen String gibt, ist einfach nur die Liste der Einheiten
* zu ende. dann raus hier */
parser_popstate();
break;
}
token = getstrtoken();
/* Beginne die Fehlermeldung */
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
* 'TEMP' wurde nicht gefunden" */
scat(s);
s = getstrtoken();
if (s[0])
scat(" ");
/* count++; -- unnötig/alt? Um nachher weiter einlesen zu koennen */
scat(token);
token = getstrtoken();
if (*token) scat(" ");
}
scat(s);
scat(token);
scat("' wurde nicht gefunden");
mistake(u, ord, buf, MSG_EVENT);
count++;
parser_popstate();
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, 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) {
add_message(&u->faction->msgs,
msg_feedback(u, ord, "teach_nolearn", "student", u2));

View File

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

View File

@ -947,6 +947,7 @@ 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);