X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=misc.c;h=09244625cfe0c536bb866fcf17eccf21356d5e48;hp=26bb3325fce1b5a3402beaca1566da5cf47563e0;hb=67ed99b29cfe5c32b3db72091de3fb174195e032;hpb=fd02259c7f5d3b0fb245575981031a63bfb8b6de diff --git a/misc.c b/misc.c index 26bb332..0924462 100644 --- a/misc.c +++ b/misc.c @@ -50,6 +50,35 @@ void packed_to_token(long packed, char token[6]) } } +void token_to_packed(char token[6], long* packed) +{ + *packed = 0; + for (size_t i = 0; i < 5; ++i) + { + if (token[4 - i] == '\0') + continue; + char mapped = ascii_to_advent[(int) token[4 - i]]; + *packed |= (mapped << (6 * i)); + } +} + +/* Hide the fact that wods are corrently packed longs */ + +bool wordeq(token_t a, token_t b) +{ + return a == b; +} + +bool wordempty(token_t a) +{ + return a == 0; +} + +void wordclear(token_t *v) +{ + *v = 0; +} + /* I/O routines (SPEAK, PSPEAK, RSPEAK, SETPRM, GETIN, YES) */ void speak(const char* msg) @@ -228,8 +257,8 @@ char* get_input() IGNORE(getline(&input, &n, stdin)); } - if (input == NULL) // Got EOF; quit. - exit(EXIT_SUCCESS); + if (input == NULL) // Got EOF; return with it. + return(input); else if (input[0] == '#') // Ignore comments. continue; else // We have a 'normal' line; leave the loop. @@ -250,7 +279,7 @@ char* get_input() return (input); } -bool YES(vocab_t question, vocab_t yes_response, vocab_t no_response) +bool YES(const char* question, const char* yes_response, const char* no_response) /* Print message X, wait for yes/no answer. If yes, print Y and return true; * if no, print Z and return false. */ { @@ -258,11 +287,15 @@ bool YES(vocab_t question, vocab_t yes_response, vocab_t no_response) bool outcome; for (;;) { - RSPEAK(question); + speak(question); reply = get_input(); + if (reply == NULL) { + linenoiseFree(reply); + exit(EXIT_SUCCESS); + } - char* firstword = (char*) xmalloc(strlen(reply)); + char* firstword = (char*) xmalloc(strlen(reply)+1); sscanf(reply, "%s", firstword); for (int i = 0; i < (int)strlen(firstword); ++i) @@ -276,11 +309,11 @@ bool YES(vocab_t question, vocab_t yes_response, vocab_t no_response) free(firstword); if (yes == 0 || y == 0) { - RSPEAK(yes_response); + speak(yes_response); outcome = true; break; } else if (no == 0 || n == 0) { - RSPEAK(no_response); + speak(no_response); outcome = false; break; } else @@ -417,7 +450,7 @@ void MOVE(long object, long where) from = game.fixed[object - NOBJECTS]; else from = game.place[object]; - if (from != NOWHERE && from != CARRIED && !SPECIAL(from)) + if (from != LOC_NOWHERE && from != CARRIED && !SPECIAL(from)) CARRY(object, from); DROP(object, where); } @@ -634,10 +667,10 @@ bool MAPLIN(FILE *fp) * If the data file uses a character other than space (e.g., tab) to * separate numbers, that character should also translate to 0. * - * This procedure may use the map1,map2 arrays to maintain static data for - * the mapping. MAP2(1) is set to 0 when the program starts - * and is not changed thereafter unless the routines on this page choose - * to do so. */ + * This procedure may use the map1,map2 arrays to maintain + * static data for he mapping. MAP2(1) is set to 0 when the + * program starts and is not changed thereafter unless the + * routines in this module choose to do so. */ LNLENG = 0; for (long i = 1; i <= (long)sizeof(INLINE) && INLINE[i] != 0; i++) { long val = INLINE[i]; @@ -658,4 +691,10 @@ void DATIME(long* d, long* t) *t = (long) tv.tv_usec; } +void bug(enum bugtype num, const char *error_string) +{ + fprintf(stderr, "Fatal error %d, %s.\n", num, error_string); + exit(EXIT_FAILURE); +} + /* end */