X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=sidebyside;f=misc.c;h=d1c68ab2d42641c0e5a36928dc1f46d6aaf21fd3;hb=df87c596fb94eed31616a827289b1a30fe83cf87;hp=5d400db7d5611e5382c7ea7b3bf532759de69714;hpb=babf08ddc426a0466517f1c750db12321de749d1;p=open-adventure.git diff --git a/misc.c b/misc.c index 5d400db..d1c68ab 100644 --- a/misc.c +++ b/misc.c @@ -94,12 +94,36 @@ void tokenize(char* raw, struct command_t *cmd) { 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->raw1[TOKLEN+TOKLEN] = '\0'; + for (int i = 0; i < strlen(cmd->raw1); i++) + cmd->raw1[i] = toupper(cmd->raw1[i]); + for (int i = 0; i < strlen(cmd->raw2); i++) + cmd->raw2[i] = toupper(cmd->raw2[i]); + } } /* Hide the fact that wods are corrently packed longs */