#include <stdarg.h>
#include <sys/time.h>
#include <ctype.h>
+#include <editline/readline.h>
#include "advent.h"
-#include "linenoise/linenoise.h"
#include "dungeon.h"
char* xstrdup(const char* s)
va_end(ap);
}
-void echo_input(FILE* destination, char* input_prompt, char* input)
+void echo_input(FILE* destination, const char* input_prompt, const char* input)
{
size_t len = strlen(input_prompt) + strlen(input) + 1;
char* prompt_and_input = (char*) xmalloc(len);
char* input;
while (true) {
- if (editline)
- input = linenoise(input_prompt);
- else {
- input = NULL;
- size_t n = 0;
- if (isatty(0))
- // LCOV_EXCL_START
- // Should be unreachable in tests, as they will use a non-interactive shell.
- printf("%s", input_prompt);
- // LCOV_EXCL_STOP
- ssize_t numread = getline(&input, &n, stdin);
- if (numread == -1) { // Got EOF; return with it.
- free(input);
- return (NULL);
- }
- }
+ input = readline(input_prompt);
if (input == NULL) // Got EOF; return with it.
return (input);
else if (input[0] == '#') { // Ignore comments.
- linenoiseFree(input);
+ free(input);
continue;
} else // We have a 'normal' line; leave the loop.
break;
// Strip trailing newlines from the input
input[strcspn(input, "\n")] = 0;
- linenoiseHistoryAdd(input);
+ add_history(input);
if (!isatty(0))
echo_input(stdout, input_prompt, input);
if (logfp)
- echo_input(logfp, input_prompt, input);
+ echo_input(logfp, "", input);
return (input);
}
if (reply == NULL) {
// LCOV_EXCL_START
// Should be unreachable. Reply should never be NULL
- linenoiseFree(reply);
+ free(reply);
exit(EXIT_SUCCESS);
// LCOV_EXCL_STOP
}
char* firstword = (char*) xmalloc(strlen(reply) + 1);
sscanf(reply, "%s", firstword);
- linenoiseFree(reply);
+ free(reply);
for (int i = 0; i < (int)strlen(firstword); ++i)
firstword[i] = tolower(firstword[i]);
if (reply == NULL) {
// LCOV_EXCL_START
// Should be unreachable. Reply should never be NULL
- linenoiseFree(reply);
+ free(reply);
exit(EXIT_SUCCESS);
// LCOV_EXCL_STOP
}
char* firstword = (char*) xmalloc(strlen(reply) + 1);
sscanf(reply, "%s", firstword);
- linenoiseFree(reply);
+ free(reply);
for (int i = 0; i < (int)strlen(firstword); ++i)
firstword[i] = tolower(firstword[i]);
{
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)
+ if (strcasecmp(word, motions[i].words.strs[j]) == 0 && (strlen(word) > 1 || strchr(ignore, word[0]) == NULL || !oldstyle))
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)
+ if (strcasecmp(word, actions[i].words.strs[j]) == 0 && (strlen(word) > 1 || strchr(ignore, word[0]) == NULL || !oldstyle))
return (i);
}
}
return (at);
}
-/* Utility routines (SETBIT, TSTBIT, set_seed, get_next_lcg_value,
- * randrange, RNDVOC) */
+/* Utility routines (setbit, tstbit, set_seed, get_next_lcg_value,
+ * randrange) */
long setbit(long bit)
/* Returns 2**bit for use in constructing bit-masks. */
/* Set the LCG seed */
{
game.lcg_x = (unsigned long) seedval % game.lcg_m;
+
+ // once seed is set, we need to generate the Z`ZZZ word
+ make_zzword(game.zzword);
}
unsigned long get_next_lcg_value(void)