/* 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, sspeak, get_input, yes) */
-void vspeak(const char* msg, bool blank, va_list ap)
+static void vspeak(const char* msg, bool blank, va_list ap)
{
// Do nothing if we got a null pointer.
if (msg == NULL)
long previous_arg = 0;
for (int i = 0; i < msglen; i++) {
if (msg[i] != '%') {
- *renderp++ = msg[i];
- size--;
+ /* Ugh. Least obtrusive way to deal with artifacts "on the floor"
+ * being dropped outside of both cave and building. */
+ if (strncmp(msg + i, "floor", 5) == 0 && strchr(" .", msg[i + 5]) && !INSIDE(game.loc)) {
+ strcpy(renderp, "ground");
+ renderp += 6;
+ i += 4;
+ size -= 5;
+ } else {
+ *renderp++ = msg[i];
+ size--;
+ }
} else {
long arg = va_arg(ap, long);
if (arg == -1)
{
for (int i = 0; i < NMOTIONS; ++i) {
for (int j = 0; j < motions[i].words.n; ++j) {
- if (strcasecmp(word, motions[i].words.strs[j]) == 0 && (strlen(word) > 1 ||
+ if (strncasecmp(word, motions[i].words.strs[j], TOKLEN) == 0 && (strlen(word) > 1 ||
strchr(ignore, word[0]) == NULL ||
!settings.oldstyle))
return (i);
{
for (int i = 0; i < NOBJECTS + 1; ++i) { // FIXME: the + 1 should go when 1-indexing for objects is removed
for (int j = 0; j < objects[i].words.n; ++j) {
- if (strcasecmp(word, objects[i].words.strs[j]) == 0)
+ if (strncasecmp(word, objects[i].words.strs[j], TOKLEN) == 0)
return (i);
}
}
{
for (int i = 0; i < NACTIONS; ++i) {
for (int j = 0; j < actions[i].words.n; ++j) {
- if (strcasecmp(word, actions[i].words.strs[j]) == 0 && (strlen(word) > 1 ||
+ if (strncasecmp(word, actions[i].words.strs[j], TOKLEN) == 0 && (strlen(word) > 1 ||
strchr(ignore, word[0]) == NULL ||
!settings.oldstyle))
return (i);
{
for (int i = 0; i < NSPECIALS; ++i) {
for (int j = 0; j < specials[i].words.n; ++j) {
- if (strcasecmp(word, specials[i].words.strs[j]) == 0)
+ if (strncasecmp(word, specials[i].words.strs[j], TOKLEN) == 0)
return (i);
}
}
return (WORD_NOT_FOUND);
}
-long get_vocab_id(const char* word)
-// Search the vocab categories in order for the supplied word.
+void get_vocab_metadata(const char* word, long* id, enum wordtype* type)
{
/* Check for an empty string */
- if (strncmp(word, "", sizeof("")) == 0)
- return (WORD_EMPTY);
+ if (strncmp(word, "", sizeof("")) == 0) {
+ *id = WORD_EMPTY;
+ *type = NO_WORD_TYPE;
+ return;
+ }
long ref_num;
- /* FIXME: Magic numbers related to vocabulary */
ref_num = get_motion_vocab_id(word);
- if (ref_num != WORD_NOT_FOUND)
- return MOTION_WORD(ref_num);
+ if (ref_num != WORD_NOT_FOUND) {
+ *id = ref_num;
+ *type = MOTION;
+ return;
+ }
ref_num = get_object_vocab_id(word);
- if (ref_num != WORD_NOT_FOUND)
- return OBJECT_WORD(ref_num);
+ if (ref_num != WORD_NOT_FOUND) {
+ *id = ref_num;
+ *type = OBJECT;
+ return;
+ }
ref_num = get_action_vocab_id(word);
- if (ref_num != WORD_NOT_FOUND)
- return ACTION_WORD(ref_num);
+ if (ref_num != WORD_NOT_FOUND) {
+ *id = ref_num;
+ *type = ACTION;
+ return;
+ }
ref_num = get_special_vocab_id(word);
- if (ref_num != WORD_NOT_FOUND)
- return SPECIAL_WORD(ref_num);
+ if (ref_num != WORD_NOT_FOUND) {
+ *id = ref_num;
+ *type = SPECIAL;
+ return;
+ }
// Check for the reservoir magic word.
- if (strcasecmp(word, game.zzword) == 0)
- return ACTION_WORD(PART);
+ if (strcasecmp(word, game.zzword) == 0) {
+ *id = PART;
+ *type = ACTION;
+ return;
+ }
- return (WORD_NOT_FOUND);
+ *id = WORD_NOT_FOUND;
+ *type = NO_WORD_TYPE;
+ return;
}
void juggle(obj_t object)