X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=misc.c;h=e64cad077d8d94c454bdf07db19b6e4fb99cad2b;hp=120a503351a0d899349d98c162dd7c0f35900866;hb=e8a627f964a8337caf0c71dd87b1d7533f489f57;hpb=a3c159660bb03f220b7de52ba0ac4977098f389e diff --git a/misc.c b/misc.c index 120a503..e64cad0 100644 --- a/misc.c +++ b/misc.c @@ -386,17 +386,28 @@ static int get_action_vocab_id(const char* word) return (WORD_NOT_FOUND); } -static int get_special_vocab_id(const char* word) -// Return the first special number that has 'word' as one of its words. +static bool is_valid_int(const char *str) +/* Returns true if the string passed in is represents a valid integer, + * that could then be parsed by atoi() */ { - for (int i = 0; i < NSPECIALS; ++i) { - for (int j = 0; j < specials[i].words.n; ++j) { - if (strncasecmp(word, specials[i].words.strs[j], TOKLEN) == 0) - return (i); - } + // Handle negative number + if (*str == '-') + ++str; + + // Handle empty string or just "-" + if (!*str) + return false; + + // Check for non-digit chars in the rest of the stirng. + while (*str) + { + if (!isdigit(*str)) + return false; + else + ++str; } - // If execution reaches here, we didn't find the word. - return (WORD_NOT_FOUND); + + return true; } static void get_vocab_metadata(const char* word, vocab_t* id, enum wordtype* type) @@ -431,13 +442,6 @@ static void get_vocab_metadata(const char* word, vocab_t* id, enum wordtype* typ return; } - ref_num = get_special_vocab_id(word); - if (ref_num != WORD_NOT_FOUND) { - *id = ref_num; - *type = SPECIAL; - return; - } - // Check for the reservoir magic word. if (strcasecmp(word, game.zzword) == 0) { *id = PART; @@ -445,6 +449,13 @@ static void get_vocab_metadata(const char* word, vocab_t* id, enum wordtype* typ return; } + // Check words that are actually numbers. + if (is_valid_int(word)) { + *id = WORD_EMPTY; + *type = NUMERIC; + return; + } + *id = WORD_NOT_FOUND; *type = NO_WORD_TYPE; return;