Is there a working version of Uninform out there?

I’ve been playing with Uninform/Disinformation, but it keeps segfaulting on Not Just an Ordinary Ballerina, and the code is too much of a mess by modern standards to make debugging easy. (Global variables everywhere.)

EDIT: I’m beginning to suspect it may want smaller int’s than my system uses.

I got uninform working. Here’s my patch:

--- uninform-orig.c     2000-07-04 17:04:42.000000000 -0400
+++ uninform.c  2017-08-02 01:05:59.678259022 -0400
@@ -3,7 +3,7 @@
 #include "stdio.h"
 #include "stdlib.h"
 #include "string.h"
-#include "getopt.c"
+#include "unistd.h"
 start_of_messages      =start of all messages
@@ -13,7 +13,7 @@
 //#ifdef __STDC__
-extern int getopt (int, char *[], const char *);
+// extern int getopt (int, char *[], const char *);
 extern int getopt ();
@@ -21,7 +21,7 @@
 /* getopt linkages */
 extern int optind;
-extern const char *optarg;
+// extern const char *optarg;
 static int option_printaddress = 0;
 static int option_grammar = 1;
@@ -57,15 +57,15 @@
 //spareaddress is, er, something
 //lastroutinefound is used by untilhexchar() and backtrack, to find the last capital 'R' and thus find the number of the hex's routine name... doesn't find 'R', just sets lastroutinefound to the location of 'R' every time it finds one.
-int stack_pointer=0,opcodebytes[100];
+int stack_pointer=0,opcodebytes[1000];
 long stored_file_position,start_of_verb_names,start_of_attribute_names,start_of_messages,start_of_property_names;
 int doneelse,address_stack_pointer,maximum_objects_in_game;
 //doneelse is to prevent 'else' from printing a line early...
-long global_number,address_stack[100],address_stack_exchange_buffer[100];
-char global_small_string[500],global_huge_string[5000],storedaddress[10],parsed_line_to_print[500],stored_parsed_line[100][300],currently_parsed_opcode[20];
-int hex_bytes_to_search_for[50],linefeed_encountered;
+long global_number,address_stack[1000],address_stack_exchange_buffer[1000];
+char global_small_string[5000],global_huge_string[50000],storedaddress[100],parsed_line_to_print[5000],stored_parsed_line[1000][3000],currently_parsed_opcode[200];
+int hex_bytes_to_search_for[500],linefeed_encountered;
 FILE *txd_output_file, *uninform_output_file,*imported_stuff,*infodump_output_file,*attr_file;
 //file 'donethat' was used in 'objectloop' and referred to the uninform_output_file when it's finished and been written to disk...

Basically, there are two problems:
– the header inclusions are wrong.
– the global arrays are too small (there’s no dynamic allocation!). I naively multiplied all of them by 10.

It would be nice to update it more than this but the code style really is pretty ugly.