#include "advent.h"
#include "dungeon.h"
-char* xstrdup(const char* s)
-{
- char* ptr = strdup(s);
- if (ptr == NULL) {
- // LCOV_EXCL_START
- // exclude from coverage analysis because we can't simulate an out of memory error in testing
- fprintf(stderr, "Out of memory!\n");
- exit(EXIT_FAILURE);
- }
- return (ptr);
-}
-
-void* xmalloc(size_t size)
+static void* xmalloc(size_t size)
{
void* ptr = malloc(size);
if (ptr == NULL) {
}
}
-long token_to_packed(const char token[TOKLEN+1])
+long token_to_packed(const char token[])
{
const char ascii_to_advent[] = {
63, 63, 63, 63, 63, 63, 63, 63,
};
size_t t_len = strlen(token);
+ if (t_len > TOKLEN)
+ t_len = TOKLEN;
long packed = 0;
for (size_t i = 0; i < t_len; ++i) {
- char mapped = ascii_to_advent[(int) token[i]];
+ char mapped = ascii_to_advent[(int) toupper(token[i])];
packed |= (mapped << (6 * i));
}
return (packed);
/* 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[][TOKLEN+1] = {
- {"\0\0\0\0\0"},
- {"\0\0\0\0\0"},
- {"\0\0\0\0\0"},
- {"\0\0\0\0\0"},
- };
-
- // break the words into up to 4 5-char substrings
- sscanf(cmd->raw1, "%5s%5s", chunk_data[0], chunk_data[1]);
- if (word_count == 2)
- sscanf(cmd->raw2, "%5s%5s", chunk_data[2], chunk_data[3]);
-
- // uppercase all the substrings
- for (int i = 0; i < 4; ++i)
- for (unsigned int j = 0; j < strlen(chunk_data[i]); ++j)
- chunk_data[i][j] = (char) toupper(chunk_data[i][j]);
-
// pack the substrings
- cmd->wd1 = token_to_packed(chunk_data[0]);
- cmd->wd2 = token_to_packed(chunk_data[2]);
+ cmd->wd1 = token_to_packed(cmd->raw1);
+ cmd->wd2 = token_to_packed(cmd->raw2);
}
/* Hide the fact that wods are corrently packed longs */
size -= len;
}
- // All-lowercase specifier.
- if (msg[i] == 'L' ||
- msg[i] == 'C') {
- packed_to_token(arg, renderp); /* unpack directly to destination */
- int len = strlen(renderp);
- for (int j = 0; j < len; ++j) {
- renderp[j] = tolower(renderp[j]);
- }
- if (msg[i] == 'C') // First char uppercase, rest lowercase.
- renderp[0] = toupper(renderp[0]);
- renderp += len;
- size -= len;
- }
-
previous_arg = arg;
}
}
free(prompt_and_input);
}
-int word_count(char* s)
+int word_count(char* str)
{
- char* copy = xstrdup(s);
char delims[] = " \t";
int count = 0;
- char* word;
+ int inblanks = true;
+
+ for (char *s = str; *s; s++)
+ if (inblanks) {
+ if (strchr(delims, *s) == 0) {
+ ++count;
+ inblanks = false;
+ }
+ } else {
+ if (strchr(delims, *s) != 0) {
+ inblanks = true;
+ }
+ }
- word = strtok(copy, delims);
- while (word != NULL) {
- word = strtok(NULL, delims);
- ++count;
- }
- free(copy);
return (count);
}