Add Glulxe and Git. They compile but don't work yet.
[rodin/chimara.git] / interpreters / git / git_unix.c
diff --git a/interpreters/git/git_unix.c b/interpreters/git/git_unix.c
new file mode 100644 (file)
index 0000000..04cfe60
--- /dev/null
@@ -0,0 +1,106 @@
+// $Id: git_unix.c,v 1.5 2004/01/25 18:44:51 iain Exp $
+
+// unixstrt.c: Unix-specific code for Glulxe.
+// Designed by Andrew Plotkin <erkyrath@eblong.com>
+// http://www.eblong.com/zarf/glulx/index.html
+
+#include "git.h"
+#include <glk.h>
+#include <glkstart.h> // This comes with the Glk library.
+
+#ifdef USE_MMAP
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <errno.h>
+#endif
+
+// The only command-line argument is the filename.
+glkunix_argumentlist_t glkunix_arguments[] =
+{
+    { "", glkunix_arg_ValueFollows, "filename: The game file to load." },
+    { NULL, glkunix_arg_End, NULL }
+};
+
+#define CACHE_SIZE (256 * 1024L)
+#define UNDO_SIZE (512 * 1024L)
+
+void fatalError (const char * s)
+{
+    fprintf (stderr, "*** fatal error: %s ***\n", s);
+    exit (1);
+}
+
+#ifdef USE_MMAP
+// Fast loader that uses some fancy Unix features.
+
+const char * gFilename = 0;
+
+int glkunix_startup_code(glkunix_startup_t *data)
+{
+    if (data->argc <= 1)
+    {
+        printf ("usage: git gamefile.ulx\n");
+        return 0;
+    }
+    gFilename = data->argv[1];
+    return 1;
+}
+
+void glk_main ()
+{
+    int          file;
+    struct stat  info;
+    const char * ptr;
+    
+    file = open (gFilename, O_RDONLY);
+    if (file < 0)
+        goto error;
+
+    if (fstat (file, &info) != 0)
+        goto error;
+    
+    if (info.st_size < 256)
+    {
+        fprintf (stderr, "This is too small to be a glulx file.\n");
+        exit (1);
+    }
+
+    ptr = mmap (NULL, info.st_size, PROT_READ, MAP_PRIVATE, file, 0);
+    if (ptr == MAP_FAILED)
+        goto error;
+        
+    git (ptr, info.st_size, CACHE_SIZE, UNDO_SIZE);
+    munmap ((void*) ptr, info.st_size);
+    return;
+    
+error:
+    perror ("git");
+    exit (errno);
+}
+
+#else
+// Generic loader that should work anywhere.
+
+strid_t gStream = 0;
+
+int glkunix_startup_code(glkunix_startup_t *data)
+{
+    if (data->argc <= 1)
+    {
+        printf ("usage: git gamefile.ulx\n");
+        return 0;
+    }
+    gStream = glkunix_stream_open_pathname ((char*) data->argv[1], 0, 0);
+    return 1;
+}
+
+void glk_main ()
+{
+    if (gStream == NULL)
+        fatalError ("could not open game file");
+
+    gitWithStream (gStream, CACHE_SIZE, UNDO_SIZE);
+}
+
+#endif // USE_MMAP