-
-#undef WORD1
-#undef WORD1X
-#undef WORD2
-#undef WORD2X
-#define GETIN(SRC,WORD1,WORD1X,WORD2,WORD2X) fGETIN(SRC,&WORD1,&WORD1X,&WORD2,&WORD2X)
-
-long YES(FILE *input, long X, long Y, long Z) {
-long YEAH, REPLY, JUNK1, JUNK2, JUNK3;
-
-/* Print message X, wait for yes/no answer. If yes, print Y and return true;
- * if no, print Z and return false. */
-
-L1: RSPEAK(X);
- GETIN(input, REPLY,JUNK1,JUNK2,JUNK3);
- if(REPLY == MAKEWD(250519) || REPLY == MAKEWD(25)) goto L10;
- if(REPLY == MAKEWD(1415) || REPLY == MAKEWD(14)) goto L20;
- RSPEAK(185);
- goto L1;
-L10: YEAH=true;
- RSPEAK(Y);
- return(YEAH);
-L20: YEAH=false;
- RSPEAK(Z);
- return(YEAH);
-}
-
-
-/* Line-parsing routines (GETTXT, MAKEWD, PUTTXT, SHFTXT, TYPE0)
- */
-/* The routines on this page handle all the stuff that would normally be
- * taken care of by format statements. We do it this way instead so that
- * we can handle textual data in a machine independent fashion. All the
- * machine dependent i/o stuff is on the following page. See that page
- * for a description of MAPCOM's inline array. */
-
-long GETTXT(long SKIP,long ONEWRD, long UPPER) {
-/* Take characters from an input line and pack them into 30-bit words.
- * Skip says to skip leading blanks. ONEWRD says stop if we come to a
- * blank. UPPER says to map all letters to uppercase. If we reach the
- * end of the line, the word is filled up with blanks (which encode as 0's).
- * If we're already at end of line when TEXT is called, we return -1. */
-
- long TEXT;
- static long SPLITTING = -1;
-
- if(LNPOSN != SPLITTING)
- SPLITTING = -1;
- TEXT= -1;
- while (true) {
- if(LNPOSN > LNLENG)
- return(TEXT);
- if((!SKIP) || INLINE[LNPOSN] != 0)
- break;
- LNPOSN=LNPOSN+1;
+#include "advent.h"
+#include "linenoise/linenoise.h"
+#include "newdb.h"
+
+const char new_advent_to_ascii[] = {
+ ' ', '!', '"', '#', '$', '%', '&', '\'',
+ '(', ')', '*', '+', ',', '-', '.', '/',
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', ':', ';', '<', '=', '>', '?',
+ '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', '\0', '\0', '\0', '\0', '\0',
+};
+
+const char new_ascii_to_advent[] = {
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63,
+};
+
+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);