From b92fb66c44fd6f41bd16914a845e18ab09ac39d5 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 10 Jun 2017 13:43:17 -0400 Subject: [PATCH] Last goto removed from actions.c --- actions.c | 185 +++++++++++++++++++++++++++--------------------------- 1 file changed, 92 insertions(+), 93 deletions(-) diff --git a/actions.c b/actions.c index 276c0cb..df76463 100644 --- a/actions.c +++ b/actions.c @@ -888,105 +888,15 @@ static int wave(token_t obj) } } -/* We're called with a number that says what label the caller wanted - * to "goto", and we return a similar label number for the caller to - * "goto". - */ - int action(FILE *input, enum speechpart part, long verb, long obj) /* Analyse a verb. Remember what it was, go back for object if second word * unless verb is "say", which snarfs arbitrary second word. */ { int kk; - switch(part) + + if (part == unknown) { - case intransitive: - SPK=ACTSPK[verb]; - if (WD2 > 0 && verb != SAY) return(2800); - if (verb == SAY)obj=WD2; - if (obj == 0) { - /* Analyse an intransitive verb (ie, no object given yet). */ - switch (verb-1) { - case 0: /* CARRY */ return carry(INTRANSITIVE); - case 1: /* DROP */ return(8000); - case 2: /* SAY */ return(8000); - case 3: /* UNLOC */ return lock(verb, INTRANSITIVE); - case 4: /* NOTHI */ return(2009); - case 5: /* LOCK */ return lock(verb, INTRANSITIVE); - case 6: /* LIGHT */ return light(INTRANSITIVE); - case 7: /* EXTIN */ return extinguish(INTRANSITIVE); - case 8: /* WAVE */ return(8000); - case 9: /* CALM */ return(8000); - case 10: /* WALK */ return(2011); - case 11: /* ATTAC */ return attack(input, verb, obj); - case 12: /* POUR */ return pour(obj); - case 13: /* EAT */ return eat(INTRANSITIVE); - case 14: /* DRINK */ return drink(obj); - case 15: /* RUB */ return(8000); - case 16: /* TOSS */ return(8000); - case 17: /* QUIT */ return quit(input); - case 18: /* FIND */ return(8000); - case 19: /* INVEN */ return inven(obj); - case 20: /* FEED */ return(8000); - case 21: /* FILL */ return fill(obj); - case 22: /* BLAST */ return blast(); - case 23: /* SCOR */ return vscore(); - case 24: /* FOO */ return bigwords(WD1); - case 25: /* BRIEF */ return brief(); - case 26: /* READ */ return read(input, INTRANSITIVE); - case 27: /* BREAK */ return(8000); - case 28: /* WAKE */ return(8000); - case 29: /* SUSP */ return saveresume(input, false); - case 30: /* RESU */ return saveresume(input, true); - case 31: /* FLY */ return fly(INTRANSITIVE); - case 32: /* LISTE */ return listen(); - case 33: /* ZZZZ */ return reservoir(); - } - BUG(23); - } - /* FALLTHRU */ - case transitive: - L4090: - /* Analyse a transitive verb. */ - switch (verb-1) { - case 0: /* CARRY */ return carry(obj); - case 1: /* DROP */ return discard(obj, false); - case 2: /* SAY */ return say(); - case 3: /* UNLOC */ return lock(verb, obj); - case 4: /* NOTHI */ return(2009); - case 5: /* LOCK */ return lock(verb, obj); - case 6: /* LIGHT */ return light(obj); - case 7: /* EXTI */ return extinguish(obj); - case 8: /* WAVE */ return wave(obj); - case 9: /* CALM */ return(2011); - case 10: /* WALK */ return(2011); - case 11: /* ATTAC */ return attack(input, verb, obj); - case 12: /* POUR */ return pour(obj); - case 13: /* EAT */ return eat(obj); - case 14: /* DRINK */ return drink(obj); - case 15: /* RUB */ return rub(obj); - case 16: /* TOSS */ return throw(input, verb, obj); - case 17: /* QUIT */ return(2011); - case 18: /* FIND */ return find(obj); - case 19: /* INVEN */ return find(obj); - case 20: /* FEED */ return feed(obj); - case 21: /* FILL */ return fill(obj); - case 22: /* BLAST */ return blast(); - case 23: /* SCOR */ return(2011); - case 24: /* FOO */ return(2011); - case 25: /* BRIEF */ return(2011); - case 26: /* READ */ return read(input, obj); - case 27: /* BREAK */ return vbreak(obj); - case 28: /* WAKE */ return wake(obj); - case 29: /* SUSP */ return(2011); - case 30: /* RESU */ return(2011); - case 31: /* FLY */ return fly(obj); - case 32: /* LISTE */ return(2011); - case 33: /* ZZZZ */ return reservoir(); - } - BUG(24); - case unknown: /* Analyse an object word. See if the thing is here, whether * we've got a verb yet, and so on. Object must be here * unless verb is "find" or "invent(ory)" (and no new verb @@ -1036,7 +946,96 @@ int action(FILE *input, enum speechpart part, long verb, long obj) if (WD2 > 0) return(2800); if (verb != 0) - goto L4090; + part = transitive; + } + + switch(part) + { + case intransitive: + SPK=ACTSPK[verb]; + if (WD2 > 0 && verb != SAY) return(2800); + if (verb == SAY)obj=WD2; + if (obj == 0) { + /* Analyse an intransitive verb (ie, no object given yet). */ + switch (verb-1) { + case 0: /* CARRY */ return carry(INTRANSITIVE); + case 1: /* DROP */ return(8000); + case 2: /* SAY */ return(8000); + case 3: /* UNLOC */ return lock(verb, INTRANSITIVE); + case 4: /* NOTHI */ return(2009); + case 5: /* LOCK */ return lock(verb, INTRANSITIVE); + case 6: /* LIGHT */ return light(INTRANSITIVE); + case 7: /* EXTIN */ return extinguish(INTRANSITIVE); + case 8: /* WAVE */ return(8000); + case 9: /* CALM */ return(8000); + case 10: /* WALK */ return(2011); + case 11: /* ATTAC */ return attack(input, verb, obj); + case 12: /* POUR */ return pour(obj); + case 13: /* EAT */ return eat(INTRANSITIVE); + case 14: /* DRINK */ return drink(obj); + case 15: /* RUB */ return(8000); + case 16: /* TOSS */ return(8000); + case 17: /* QUIT */ return quit(input); + case 18: /* FIND */ return(8000); + case 19: /* INVEN */ return inven(obj); + case 20: /* FEED */ return(8000); + case 21: /* FILL */ return fill(obj); + case 22: /* BLAST */ return blast(); + case 23: /* SCOR */ return vscore(); + case 24: /* FOO */ return bigwords(WD1); + case 25: /* BRIEF */ return brief(); + case 26: /* READ */ return read(input, INTRANSITIVE); + case 27: /* BREAK */ return(8000); + case 28: /* WAKE */ return(8000); + case 29: /* SUSP */ return saveresume(input, false); + case 30: /* RESU */ return saveresume(input, true); + case 31: /* FLY */ return fly(INTRANSITIVE); + case 32: /* LISTE */ return listen(); + case 33: /* ZZZZ */ return reservoir(); + } + BUG(23); + } + /* FALLTHRU */ + case transitive: + /* Analyse a transitive verb. */ + switch (verb-1) { + case 0: /* CARRY */ return carry(obj); + case 1: /* DROP */ return discard(obj, false); + case 2: /* SAY */ return say(); + case 3: /* UNLOC */ return lock(verb, obj); + case 4: /* NOTHI */ return(2009); + case 5: /* LOCK */ return lock(verb, obj); + case 6: /* LIGHT */ return light(obj); + case 7: /* EXTI */ return extinguish(obj); + case 8: /* WAVE */ return wave(obj); + case 9: /* CALM */ return(2011); + case 10: /* WALK */ return(2011); + case 11: /* ATTAC */ return attack(input, verb, obj); + case 12: /* POUR */ return pour(obj); + case 13: /* EAT */ return eat(obj); + case 14: /* DRINK */ return drink(obj); + case 15: /* RUB */ return rub(obj); + case 16: /* TOSS */ return throw(input, verb, obj); + case 17: /* QUIT */ return(2011); + case 18: /* FIND */ return find(obj); + case 19: /* INVEN */ return find(obj); + case 20: /* FEED */ return feed(obj); + case 21: /* FILL */ return fill(obj); + case 22: /* BLAST */ return blast(); + case 23: /* SCOR */ return(2011); + case 24: /* FOO */ return(2011); + case 25: /* BRIEF */ return(2011); + case 26: /* READ */ return read(input, obj); + case 27: /* BREAK */ return vbreak(obj); + case 28: /* WAKE */ return wake(obj); + case 29: /* SUSP */ return(2011); + case 30: /* RESU */ return(2011); + case 31: /* FLY */ return fly(obj); + case 32: /* LISTE */ return(2011); + case 33: /* ZZZZ */ return reservoir(); + } + BUG(24); + case unknown: SETPRM(1,WD1,WD1X); RSPEAK(255); return(2600);