X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=misc.c;h=c8cf9f13521ed1cb8ebba744977d42759ed00d3f;hb=f52a78a1f8ce3f2bbf6728d6d1e4fc517afeddac;hp=b1c50d18ee76e6b4425fff5fd6943f0159cfdfef;hpb=63152e67145eb22371a45a4ae6d3ba35bd221847;p=open-adventure.git diff --git a/misc.c b/misc.c index b1c50d1..c8cf9f1 100644 --- a/misc.c +++ b/misc.c @@ -35,7 +35,7 @@ void* xmalloc(size_t size) return (ptr); } -void packed_to_token(long packed, char token[6]) +void packed_to_token(long packed, char token[TOKLEN+1]) { // The advent->ascii mapping. const char advent_to_ascii[] = { @@ -68,7 +68,7 @@ void packed_to_token(long packed, char token[6]) } } -long token_to_packed(const char token[6]) +long token_to_packed(const char token[TOKLEN+1]) { const char ascii_to_advent[] = { 63, 63, 63, 63, 63, 63, 63, 63, @@ -100,20 +100,15 @@ long token_to_packed(const char token[6]) return (packed); } -void tokenize(char* raw, long tokens[4]) +void tokenize(char* raw, struct command_t *cmd) { - // set each token to 0 - for (int i = 0; i < 4; ++i) - tokens[i] = 0; + memset(cmd, '\0', sizeof(struct command_t)); - // grab the first two words - char* words[2]; - words[0] = (char*) xmalloc(strlen(raw) + 1); - words[1] = (char*) xmalloc(strlen(raw) + 1); - int word_count = sscanf(raw, "%s%s", words[0], words[1]); + /* FIXME: put a bound prefix on the %s to prevent buffer overflow */ + int word_count = sscanf(raw, "%s%s", cmd->raw1, cmd->raw2); // make space for substrings and zero it out - char chunk_data[][6] = { + char chunk_data[][TOKLEN+1] = { {"\0\0\0\0\0"}, {"\0\0\0\0\0"}, {"\0\0\0\0\0"}, @@ -121,11 +116,9 @@ void tokenize(char* raw, long tokens[4]) }; // break the words into up to 4 5-char substrings - sscanf(words[0], "%5s%5s", chunk_data[0], chunk_data[1]); + sscanf(cmd->raw1, "%5s%5s", chunk_data[0], chunk_data[1]); if (word_count == 2) - sscanf(words[1], "%5s%5s", chunk_data[2], chunk_data[3]); - free(words[0]); - free(words[1]); + sscanf(cmd->raw2, "%5s%5s", chunk_data[2], chunk_data[3]); // uppercase all the substrings for (int i = 0; i < 4; ++i) @@ -133,8 +126,8 @@ void tokenize(char* raw, long tokens[4]) chunk_data[i][j] = (char) toupper(chunk_data[i][j]); // pack the substrings - for (int i = 0; i < 4; ++i) - tokens[i] = token_to_packed(chunk_data[i]); + cmd->wd1 = token_to_packed(chunk_data[0]); + cmd->wd2 = token_to_packed(chunk_data[2]); } /* Hide the fact that wods are corrently packed longs */ @@ -154,7 +147,7 @@ void wordclear(token_t *v) *v = 0; } -/* I/O routines (speak, pspeak, rspeak, get_input, yes) */ +/* I/O routines (speak, pspeak, rspeak, sspeak, get_input, yes) */ void vspeak(const char* msg, bool blank, va_list ap) { @@ -258,6 +251,16 @@ void speak(const char* msg, ...) va_end(ap); } +void sspeak(const long msg, ...) +{ + va_list ap; + va_start(ap, msg); + fputc('\n', stdout); + vprintf(arbitrary_messages[msg], ap); + fputc('\n', stdout); + va_end(ap); +} + void pspeak(vocab_t msg, enum speaktype mode, int skip, bool blank, ...) /* Find the skip+1st message from msg and print it. Modes are: * feel = for inventory, what you can touch @@ -679,7 +682,7 @@ long randrange(long range) return range * get_next_lcg_value() / game.lcg_m; } -void make_zzword(char zzword[6]) +void make_zzword(char zzword[TOKLEN+1]) { for (int i = 0; i < 5; ++i) { zzword[i] = 'A' + randrange(26);