{
memset(cmd, '\0', sizeof(struct command_t));
- /* FIXME: put a bound prefix on the %s to prevent buffer overflow */
+ /* Bound prefix on the %s would be needed to prevent buffer
+ * overflow. but we shortstop this more simply by making each
+ * raw-input buffer as long as the enrire inout buffer. */
sscanf(raw, "%s%s", cmd->raw1, cmd->raw2);
// pack the substrings
cmd->wd1 = token_to_packed(cmd->raw1);
cmd->wd2 = token_to_packed(cmd->raw2);
+
+ /* (ESR) In oldstyle mode, simulate the uppercasing and truncating
+ * effect on raw tokens of packing them into sixbit characters, 5
+ * to a 32-bit word. This is something the FORTRAN version did
+ * becuse archaic FORTRAN had no string types. Don Wood's
+ * mechanical translation of 2.5 to C retained the packing and
+ * thus this misfeature.
+ *
+ * It's philosophically questionable whether this is the right
+ * thing to do even in oldstyle mode. On one hand, the text
+ * mangling was not authorial intent, but a result of limitations
+ * in their tools. On the other, not simulating this misbehavior
+ * goes against the goal of making oldstyle as accurate as
+ * possible an emulation of the original UI.
+ */
+ if (settings.oldstyle) {
+ cmd->raw1[TOKLEN + TOKLEN] = cmd->raw2[TOKLEN + TOKLEN] = '\0';
+ for (size_t i = 0; i < strlen(cmd->raw1); i++)
+ cmd->raw1[i] = toupper(cmd->raw1[i]);
+ for (size_t i = 0; i < strlen(cmd->raw2); i++)
+ cmd->raw2[i] = toupper(cmd->raw2[i]);
+ }
}
/* Hide the fact that wods are corrently packed longs */
bool silent_yes()
{
- char* reply;
bool outcome;
for (;;) {
- reply = get_input();
+ char* reply = get_input();
if (reply == NULL) {
// LCOV_EXCL_START
// Should be unreachable. Reply should never be NULL
/* Print message X, wait for yes/no answer. If yes, print Y and return true;
* if no, print Z and return false. */
{
- char* reply;
bool outcome;
for (;;) {
speak(question);
- reply = get_input();
+ char* reply = get_input();
if (reply == NULL) {
// LCOV_EXCL_START
// Should be unreachable. Reply should never be NULL
/* FIXME: Magic numbers related to vocabulary */
ref_num = get_motion_vocab_id(word);
if (ref_num != WORD_NOT_FOUND)
- return (ref_num + 0); // FIXME: replace with a proper hash
+ return MOTION_WORD(ref_num);
ref_num = get_object_vocab_id(word);
if (ref_num != WORD_NOT_FOUND)
- return (ref_num + 1000); // FIXME: replace with a proper hash
+ return OBJECT_WORD(ref_num);
ref_num = get_action_vocab_id(word);
if (ref_num != WORD_NOT_FOUND)
- return (ref_num + 2000); // FIXME: replace with a proper hash
+ return ACTION_WORD(ref_num);
ref_num = get_special_vocab_id(word);
if (ref_num != WORD_NOT_FOUND)
- return (ref_num + 3000); // FIXME: replace with a proper hash
+ return SPECIAL_WORD(ref_num);
// Check for the reservoir magic word.
if (strcasecmp(word, game.zzword) == 0)
- return (PART + 2000); // FIXME: replace with a proper hash
+ return ACTION_WORD(PART);
return (WORD_NOT_FOUND);
}