.PHONY: check coverage
CC?=gcc
-CCFLAGS+=-std=c99 -D_DEFAULT_SOURCE -DVERSION=\"$(VERS)\" -O2 -D_FORTIFY_SOURCE=2 -fstack-protector-all $(CFLAGS)
+CCFLAGS+=-std=c99 -D_DEFAULT_SOURCE -DVERSION=\"$(VERS)\" -O2 -D_FORTIFY_SOURCE=2 -fstack-protector-all $(CFLAGS) -g
LIBS=$(shell pkg-config --libs libedit)
INC+=$(shell pkg-config --cflags libedit)
advent - Colossal Cave Adventure
== SYNOPSIS ==
-*advent* [-l logfile] [-o] [-r savefile]
+*advent* [-l logfile] [-o] [-r savefile] [script...]
== DESCRIPTION ==
The original Colossal Cave Adventure from 1976-77 was the origin of all
Also ignores new-school one-letter commands l, x, g, z, i. Also
case-smashes and truncates unrecognized text when echoed.
+Normally, game input is taken from standard input. If script file
+arguments are given, input is taken fron them instead. A script file
+argument of '-' is taken as a directive to read from standard input.
+
== BUGS ==
The binary save file format is fragile, dependent on your machine word
* which has its own meaning. */
#define STASHED(obj) (-1 - game.prop[obj])
+#define PROMPT "> "
+
/*
* DESTROY(N) = Get rid of an item by putting it in LOC_NOWHERE
* MOD(N,M) = Arithmetic modulus
FILE *logfp;
bool oldstyle;
bool prompt;
+ char **argv;
+ int argc;
+ int optind;
+ FILE *scriptfp;
};
typedef struct {
extern struct game_t game;
extern struct settings_t settings;
+extern char *myreadline(const char *);
extern bool get_command_input(command_t *);
extern void clear_command(command_t *);
extern void speak(const char*, ...);
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
+#include <editline/readline.h>
#include "advent.h"
int main(int argc, char *argv[])
return EXIT_SUCCESS;
}
+
+/*
+ * Ugh...unused, but required for linkage.
+ * See thje actually useful version of this in main.c
+ */
+
+char *myreadline(const char *prompt)
+{
+ return readline(prompt);
+}
+
#include <signal.h>
#include <string.h>
#include <ctype.h>
+#include <unistd.h>
+#include <editline/readline.h>
#include "advent.h"
#include "dungeon.h"
#ifndef ADVENT_NOSAVE
const char* opts = "l:or:";
- const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename]\n";
+ const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename] [script...]\n";
FILE *rfp = NULL;
#else
const char* opts = "l:o";
- const char* usage = "Usage: %s [-l logfilename] [-o]\n";
+ const char* usage = "Usage: %s [-l logfilename] [-o] [script...]\n";
#endif
while ((ch = getopt(argc, argv, opts)) != EOF) {
switch (ch) {
}
}
+ /* copy inncation line part after switches */
+ settings.argc = argc - optind;
+ settings.argv = argv + optind;
+ settings.optind = 0;
+
/* Initialize game variables */
int seedval = initialise();
terminate(quitgame);
}
+char *myreadline(const char *prompt)
+{
+ /*
+ * This function isbn't required for gameplay, readline() straight
+ * up would suffice for tat. It's where we interpret command-line
+ * logfiles for testing purposes.
+ */
+ /* Normal case - no script arguments */
+ if (settings.argc == 0)
+ return readline(prompt);
+
+ for (;;) {
+ if (settings.scriptfp == NULL || feof(settings.scriptfp)) {
+ if (settings.optind >= settings.argc) {
+ return NULL;
+ }
+
+ char *next = settings.argv[settings.optind++];
+
+ if (settings.scriptfp != NULL && feof(settings.scriptfp))
+ fclose(settings.scriptfp);
+ if (strcmp(next, "-") == 0)
+ settings.scriptfp = stdin;
+ else
+ settings.scriptfp = fopen(next, "r");
+ }
+
+ if (isatty(fileno(settings.scriptfp))) {
+ return readline(prompt);
+ } else {
+ char *ln = fgets(malloc(BUFSIZ), BUFSIZ-1, settings.scriptfp);
+ if (ln != NULL) {
+ fputs(PROMPT, stdout);
+ fputs(ln, stdout);
+ return ln;
+ }
+ }
+ }
+
+ return NULL;
+}
+
/* Check if this loc is eligible for any hints. If been here int
* enough, display. Ignore "HINTS" < 4 (special stuff, see database
* notes). */
static char* get_input(void)
{
// Set up the prompt
- char input_prompt[] = "> ";
+ char input_prompt[] = PROMPT;
if (!settings.prompt)
input_prompt[0] = '\0';
char* input;
while (true) {
- input = readline(input_prompt);
+ input = myreadline(input_prompt);
if (input == NULL) // Got EOF; return with it.
return (input);
#include <stdlib.h>
#include <string.h>
-#include <editline/readline.h>
#include <time.h>
#include <inttypes.h>
game.saved = game.saved + 5;
while (fp == NULL) {
- char* name = readline("\nFile name: ");
+ char* name = myreadline("\nFile name: ");
if (name == NULL)
return GO_TOP;
fp = fopen(name, WRITE_MODE);
}
while (fp == NULL) {
- char* name = readline("\nFile name: ");
+ char* name = myreadline("\nFile name: ");
// Autocomplete can leave the input with an extra traoling space.
if (name != NULL && strlen(name) > 0 && name[strlen(name) - 1] == ' ')
name[strlen(name) - 1] = '\0';