--- catalog_dtd.c	2003-06-24 09:15:55.000000000 -0400
+++ catalog_dtd.c	2021-02-25 15:07:41.462399000 -0500
@@ -23,9 +23,9 @@
  */
 
-static char *xml_catalog_public_id = "-//OASIS//DTD XML Catalogs V1.0//EN";
-static char *xml_catalog_system_id = 
+static const char *xml_catalog_public_id = "-//OASIS//DTD XML Catalogs V1.0//EN";
+static const char *xml_catalog_system_id = 
     "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd";
 
-static char xml_catalog_dtd[] =
+static const char xml_catalog_dtd[] =
 "<!ENTITY % pubIdChars \"CDATA\">\n"
 "<!ENTITY % publicIdentifier \"%pubIdChars;\">\n"
--- catalog.c	2004-10-11 08:28:31.000000000 -0400
+++ catalog.c	2021-02-25 15:07:41.463274000 -0500
@@ -20,5 +20,5 @@ static Parser OpenXMLDocument(char *uri)
 static void CloseXMLDocument(Parser p);
 static int SkipElement(XBit bit, Parser p);
-static InputSource special_opener(Entity ent, void *arg);
+static EntityOpenerProc special_opener;
 
 typedef enum catalog_entry_type {
@@ -36,5 +36,5 @@ const char *PreferName[PR_enum_count] =
 /* An empty catalog file, returned if a file cannot be read because of
    a resource error */
-struct catalog_entry_file catalog_resource_error_data;
+static struct catalog_entry_file catalog_resource_error_data;
 CatalogEntryFile catalog_resource_error = &catalog_resource_error_data;
 
@@ -131,10 +131,11 @@ void FreeCatalogEntryFile(CatalogEntryFi
  */
 
-CatalogEntryFile ReadCatalogEntryFile(char *catalog_uri)
+CatalogEntryFile ReadCatalogEntryFile(const char *catalog_uri)
 {
     Parser p;
     CatalogEntryFile c;
+    char *normalized;
 
-    if(!(catalog_uri = NormalizeSystem8(catalog_uri)))
+    if(!(normalized = NormalizeSystem8(catalog_uri)))
 	return 0;
 
@@ -143,5 +144,5 @@ CatalogEntryFile ReadCatalogEntryFile(ch
 #endif
 
-    if(!(p = OpenXMLDocument(catalog_uri)))
+    if(!(p = OpenXMLDocument(normalized)))
 	return catalog_resource_error;
     
@@ -166,9 +167,9 @@ CatalogEntryFile ReadCatalogEntryFile(ch
 	{
 	case XBIT_eof:
-	    Free(catalog_uri);
+	    Free(normalized);
 	    CloseXMLDocument(p);
 	    return c;
 	case XBIT_error:
-	    Free(catalog_uri);
+	    Free(normalized);
 	    ParserPerror(p, bit);
 	    FreeXBit(bit);
@@ -183,5 +184,5 @@ CatalogEntryFile ReadCatalogEntryFile(ch
 	    {
 		c = (p->state == PS_error) ? catalog_resource_error : 0;
-		Free(catalog_uri);
+		Free(normalized);
 		FreeCatalogEntryFile(c);
 		CloseXMLDocument(p);
@@ -196,10 +197,10 @@ CatalogEntryFile ReadCatalogEntryFile(ch
 }
 
-struct entry_info
+static struct entry_info
 {
-    char *name;
+    const char *name;
     CatalogEntryType type;
-    char *match_attr;
-    char *value_attr;
+    const char *match_attr;
+    const char *value_attr;
     enum {norm_public, norm_system, norm_prefer, norm_none} norm_match;
 } elements[] =
@@ -217,5 +218,5 @@ struct entry_info
     {"group", CN_group, "prefer", 0, norm_prefer},
 };
-int nelements = sizeof(elements) / sizeof(elements[0]);
+static int nelements = sizeof(elements) / sizeof(elements[0]);
 
 static int DoElement(XBit bit, Parser p, CatalogEntryFile c, 
@@ -469,5 +470,5 @@ static Parser OpenXMLDocument(char *uri)
 #include "catalog_dtd.c"
 
-static InputSource special_opener(Entity ent, void *arg)
+static InputSource special_opener(Entity ent, void *arg __unused)
 {
     if((ent->publicid && strcmp(ent->publicid, xml_catalog_public_id) == 0) ||
@@ -607,5 +608,5 @@ void FreeCatalog(Catalog catalog)
 
 /* NB not thread safe! */
-CatalogEntryFile GetCatalogEntryFile(Catalog catalog, char *catalog_uri)
+CatalogEntryFile GetCatalogEntryFile(Catalog catalog, const char *catalog_uri)
 {
     int i;
--- catalog.h	2003-08-28 12:13:19.000000000 -0400
+++ catalog.h	2021-02-25 15:07:41.463639000 -0500
@@ -48,13 +48,13 @@ extern void FreeCatalogEntry(CatalogEntr
 
 extern CatalogEntryFile catalog_resource_error;
-extern CatalogEntryFile ReadCatalogEntryFile(char *catalog_uri);
+extern CatalogEntryFile ReadCatalogEntryFile(const char *catalog_uri);
 extern void FreeCatalogEntryFile(CatalogEntryFile c);
 
-extern CatalogEntryFile GetCatalogEntryFile(Catalog catalog, char *catalog_uri);
+extern CatalogEntryFile GetCatalogEntryFile(Catalog catalog, const char *catalog_uri);
 
 extern char *ResolveExternalIdentifier(Catalog catalog, 
 				       const char *public, const char *system,
 				       Prefer prefer);
-extern char *ResolveURI(Catalog catalog, const char *uri);
+extern const char *ResolveURI(Catalog catalog, const char *uri);
 
 extern void CatalogEnable(Parser p);
--- catutil.c	2003-06-24 11:55:27.000000000 -0400
+++ catutil.c	2021-02-25 15:07:41.464062000 -0500
@@ -35,5 +35,5 @@ char *norm_pub(const char8 *public8, con
 {
     int len = public8 ? strlen(public8) : strlen16(public16);
-    int i, j, c, in_space;
+    int i, j, in_space;
     char *new_public;
 
@@ -75,5 +75,5 @@ char *norm_pub(const char8 *public8, con
     while(j > 0)
     {
-	c = new_public[j-1];
+	int c = new_public[j-1];
 	if(c == ' ' || c == '\t' || c == '\r' || c == '\n')
 	    j--;
@@ -280,9 +280,9 @@ int percent_escape(int c, char *buf)
 int IsPublicidUrn(const char *id)
 {
-#if 0
+#if 1
     return id && strncasecmp(id, "urn:publicid:", 13) == 0;
 #else
     /* guess who doesn't provide strncasecmp */
-    static char *p = "urn:publicid:";
+    static const char *p = "urn:publicid:";
     int i;
 
--- ctype16.h	2004-03-17 10:53:21.000000000 -0500
+++ ctype16.h	2021-02-25 15:07:41.464419000 -0500
@@ -49,13 +49,13 @@ extern STD_API unsigned char xml_char_ma
 
 #define is_xml_namestart(c,map) \
-  (c < 0x10000 ? (map[c] & xml_namestart) : (map[c >> 16] & xml_nameblock))
+  ((sizeof(c) <= 2 || c < 0x10000) ? (map[c] & xml_namestart) : (map[c >> 16] & xml_nameblock))
 
 #define is_xml_namechar(c,map) \
-  (c < 0x10000 ? (map[c] & xml_namechar)  : (map[c >> 16] & xml_nameblock))
+  ((sizeof(c) <= 2 || c < 0x10000) ? (map[c] & xml_namechar)  : (map[c >> 16] & xml_nameblock))
 
 /* NB whitespace map is the same for 1.0 and 1.1 */
 
 #define is_xml_whitespace(c) \
-  (c < 0x10000 && (xml_char_map[c] & xml_whitespace))
+  ((sizeof(c) <= 2 || c < 0x10000) && (xml_char_map[c] & xml_whitespace))
 
 #endif
--- dtd.c	2004-11-02 13:20:20.000000000 -0500
+++ dtd.c	2021-02-25 15:07:41.475773000 -0500
@@ -173,12 +173,11 @@ void FreeDtd(Dtd dtd)
  */
 
-Entity NewExternalEntity(const Char *name, const char8 *publicid,
-			  const char8 *systemid, NotationDefinition notation,
-			  Entity parent)
+Entity NewExternalEntity(const Char *name, char8 *publicid,
+			 const char8 *systemid, NotationDefinition notation,
+			 Entity parent)
 {
-    if(systemid && !(systemid = strdup8(systemid)))
-	return 0;
-    if(publicid && !(publicid = strdup8(publicid)))
+    if(publicid && !(publicid = strdup8(publicid))) {
 	return 0;
+    }
     return NewExternalEntityN(name, name ? Strlen(name) : 0, publicid,
 			      systemid, notation, parent);
@@ -187,5 +186,5 @@ Entity NewExternalEntity(const Char *nam
 /* NB doesn't copy IDs */
 
-Entity NewExternalEntityN(const Char *name, int namelen, const char8 *publicid,
+Entity NewExternalEntityN(const Char *name, int namelen, char8 *publicid,
 			  const char8 *systemid, NotationDefinition notation,
 			  Entity parent)
@@ -193,11 +192,13 @@ Entity NewExternalEntityN(const Char *na
     Entity e;
 
-    if(!(e = Malloc(sizeof(*e))))
-	return 0;
-    if(name && !(name = Strndup(name, namelen)))
-	    return 0;
+    if (!(e = Malloc(sizeof(*e))))
+	return NULL;
+    if (name) {
+	if (!(e->name = Strndup(name, namelen)))
+	    return NULL;
+    } else
+    	e->name = NULL;
 
     e->type = ET_external;
-    e->name = name;
     e->base_url = 0;
     e->encoding = CE_unknown;
@@ -233,10 +234,11 @@ Entity NewInternalEntityN(const Char *na
     if(!(e = Malloc(sizeof(*e))))
 	return 0;
-    if(name)
-	if(!(name = Strndup(name, namelen)))
-	    return 0;
+    if(name) {
+	if(!(e->name = Strndup(name, namelen)))
+	    return NULL;
+    } else
+        e->name = NULL;
 
     e->type = ET_internal;
-    e->name = name;
     e->base_url = 0;
     e->encoding = InternalCharacterEncoding;
@@ -276,18 +278,19 @@ void FreeEntity(Entity e)
 	return;
 
-    Free((void *)e->name);	/* The casts are to get rid of the const */
-    Free((void *)e->base_url);
-    Free((void *)e->url);
+    if (e->name)
+	Free(e->name);
+    Free(e->base_url);
+    Free(e->url);
     
     switch(e->type)
     {
     case ET_internal:
-	Free((void *)e->text);
+	Free((void *)e->atext);
 	break;
     case ET_external:
-	Free((void *)e->systemid);
-	Free((void *)e->publicid);
-	Free((void *)e->version_decl);
-	Free((void *)e->ddb_filename);
+	/* Free((void *)e->systemid); XXX const string passed by client */
+	Free(e->publicid);
+	Free(e->version_decl);
+	Free(e->ddb_filename);
 	break;
     }
@@ -416,5 +419,5 @@ ElementDefinition DefineElementN(Dtd dtd
 {
     ElementDefinition e;
-    Char *t;
+    const Char *t;
 #ifdef FOR_LT
     RHTEntry *entry;
@@ -448,10 +451,9 @@ ElementDefinition DefineElementN(Dtd dtd
     name = (Char *)dtd->doctype->elements+entry->keyptr;
 #else
-    if(!(name = Strndup(name, namelen)))
+    if(!(e->name = Strndup(name, namelen)))
 	return 0;
 #endif
 
     e->tentative = 0;
-    e->name = name;
     e->namelen = namelen;
     e->type = type;
@@ -624,5 +626,5 @@ AttributeDefinition
     DefineAttributeN(ElementDefinition element, const Char *name, int namelen,
 		     AttributeType type, Char **allowed_values,
-		     DefaultType default_type, const Char *default_value,
+		     DefaultType default_type, Char *default_value,
 		     int declared)
 {
@@ -637,5 +639,5 @@ AttributeDefinition
     static Char xml_id[] = {'x','m','l',':','i','d',0};
     static Char xmlns[] = {'x','m','l','n','s',0};
-    Char *t;
+    const Char *t;
 
     if(!(a= Malloc(sizeof(*a))))
@@ -670,9 +672,8 @@ AttributeDefinition
     a->attrsum = FindAttrSpec(element->eltsum, doctype, name);
 #else
-    if(!(name = Strndup(name, namelen)))
+    if(!(a->name = Strndup(name, namelen)))
 	return 0;
 #endif
 
-    a->name = name;
     a->namelen = namelen;
     a->type = type;
@@ -836,13 +837,12 @@ void FreeAttributeDefinition(AttributeDe
 
 NotationDefinition DefineNotationN(Dtd dtd, const Char *name, int namelen, 
-				  const char8 *publicid, const char8 *systemid,
+				   char8 *publicid, char8 *systemid,
 				   Entity parent)
 {
     NotationDefinition n;
 
-    if(!(n = Malloc(sizeof(*n))) || !(name = Strndup(name, namelen)))
+    if(!(n = Malloc(sizeof(*n))) || !(n->name = Strndup(name, namelen)))
 	return 0;
 
-    n->name = name;
     n->tentative = 0;
     n->systemid = systemid;
@@ -870,5 +870,5 @@ NotationDefinition TentativelyDefineNota
 
 NotationDefinition RedefineNotation(NotationDefinition n,
-				  const char8 *publicid, const char8 *systemid,
+				    char8 *publicid, char8 *systemid,
 				    Entity parent)
 {
--- dtd.h	2004-11-02 12:46:07.000000000 -0500
+++ dtd.h	2021-02-25 15:07:41.465041000 -0500
@@ -48,11 +48,11 @@ struct entity {
     /* All entities */
 
-    const Char *name;		/* The name in the entity declaration */
+    Char *name;		/* The name in the entity declaration */
     EntityType type;		/* ET_external or ET_internal */
-    const char8 *base_url;	/* If different from expected */
+    char8 *base_url;	/* If different from expected */
     struct entity *next;	/* For chaining a document's entity defns */
     CharacterEncoding encoding;	/* The character encoding of the entity */
     Entity parent;		/* The entity in which it is defined */
-    const char8 *url;		/* URL of entity */
+    char8 *url;		/* URL of entity */
     int is_externally_declared;	/* True if declared outside document entity */
     int is_internal_subset;	/* True if this is the internal subset */
@@ -60,5 +60,8 @@ struct entity {
     /* Internal entities */
 
-    const Char *text;		/* Text of the entity */
+    union {
+	const Char *text;	/* Text of the entity */
+	Char *atext;	/* We may need to free() it, depending on type */
+    };
     int line_offset;		/* Line offset of definition */
     int line1_char_offset;	/* Char offset on first line */ 
@@ -67,12 +70,12 @@ struct entity {
     /* External entities */
 
-    const char8 *systemid;	/* Declared public ID */
-    const char8 *publicid;	/* Declared public ID */
+    const char8 *systemid;	/* Declared system ID */
+    char8 *publicid;	/* Declared public ID */
     NotationDefinition notation; /* Binary entity's declared notation */
     MarkupLanguage ml_decl;	/* XML, NSL or not specified */
-    const char8 *version_decl;	/* XML declarations found in entity, if any  */
+    char8 *version_decl;	/* XML declarations found in entity, if any  */
     CharacterEncoding encoding_decl;
     StandaloneDeclaration standalone_decl;
-    const char8 *ddb_filename;	/* filename in NSL declaration */
+    char8 *ddb_filename;	/* filename in NSL declaration */
     XMLVersion xml_version;
 };
@@ -133,5 +136,5 @@ struct element_definition {
     NSL_ElementSummary_I *eltsum;
 #endif
-    const Char *name;		/* The element name */
+    Char *name;		/* The element name */
     int namelen;
     int tentative;
@@ -150,5 +153,6 @@ struct element_definition {
     AttributeDefinition notation_attribute; /* NOTATION attribute, if it has one */
     NSElementDefinition cached_nsdef;
-    const Char *prefix, *local;
+    Char *prefix;
+    const Char *local;
     int is_externally_declared;	/* True if declared outside document entity */
     int eltnum;
@@ -180,14 +184,15 @@ struct attribute_definition {
     NSL_AttributeSummary attrsum;
 #endif
-    const Char *name;		/* The attribute name */
+    Char *name;		/* The attribute name */
     int namelen;
     AttributeType type;		/* The declared type */
     Char **allowed_values;	/* List of allowed values, argv style */
     DefaultType default_type;	/* The type of the declared default */
-    const Char *default_value;	/* The declared default value */
+    Char *default_value;	/* The declared default value */
     int declared;		/* Was there a declaration for this? */
     const Char *ns_attr_prefix;	/* Prefix it defines if a namespace attr */
     NSAttributeDefinition cached_nsdef;
-    const Char *prefix, *local;
+    Char *prefix;
+    const Char *local;
     int is_externally_declared;	/* True if declared outside document entity */
     int attrnum;
@@ -197,9 +202,9 @@ struct attribute_definition {
 
 struct notation_definition {
-    const Char *name;		/* The notation name */
+    Char *name;		/* The notation name */
     int tentative;
-    const char8 *systemid;	/* System identifier */
-    const char8 *publicid;	/* Public identifier */
-    const char8 *url;
+    char8 *systemid;	/* System identifier */
+    char8 *publicid;	/* Public identifier */
+    char8 *url;
     Entity parent;		/* Entity that declares it (for base URL) */
     struct notation_definition *next;
@@ -209,5 +214,5 @@ struct notation_definition {
 
 struct dtd {
-    const Char *name;		/* The doctype name */
+    Char *name;		/* The doctype name */
     Entity internal_part, external_part;
     Entity entities;
@@ -230,9 +235,9 @@ XML_API void FreeDtd(Dtd dtd);
 
 XML_API Entity NewExternalEntity(const Char *name,
-			  const char8 *publicid, const char8 *systemid,
+			  char8 *publicid, const char8 *systemid,
 			  NotationDefinition notation,
 			  Entity parent);
 XML_API Entity NewExternalEntityN(const Char *name, int namelen,
-			  const char8 *publicid, const char8 *systemid,
+			  char8 *publicid, const char8 *systemid,
 			  NotationDefinition notation,
 			  Entity parent);
@@ -281,5 +286,5 @@ XML_API AttributeDefinition DefineAttrib
 				     AttributeType type, Char **allowed_values,
 				     DefaultType default_type, 
-				     const Char *default_value,
+				     Char *default_value,
 					     int declared);
 XML_API AttributeDefinition FindAttributeN(ElementDefinition element,
@@ -295,10 +300,10 @@ XML_API void FreeAttributeDefinition(Att
 
 XML_API NotationDefinition DefineNotationN(Dtd dtd, const Char *name, int namelen,
-				 const char8 *publicid, const char8 *systemid,
+				 char8 *publicid, char8 *systemid,
 					   Entity parent);
 XML_API NotationDefinition TentativelyDefineNotationN(Dtd dtd,
 					      const Char *name, int namelen);
 XML_API NotationDefinition RedefineNotation(NotationDefinition n,
-				  const char8 *publicid, const char8 *systemid,
+				  char8 *publicid, char8 *systemid,
 					    Entity parent);
 XML_API NotationDefinition FindNotationN(Dtd dtd, const Char *name, int namelen);
--- entityopener.c	2003-11-27 09:06:38.000000000 -0500
+++ entityopener.c	2021-02-25 15:07:41.465352000 -0500
@@ -9,5 +9,5 @@
 #include "dtd.h"
 
-InputSource catalog_entity_open(Entity ent, void *arg)
+static InputSource catalog_entity_open(Entity ent, void *arg)
 {
     Catalog catalog = arg;
--- http.c	2001-05-01 10:29:34.000000000 -0400
+++ http.c	2021-02-25 15:33:16.444375000 -0500
@@ -139,5 +139,5 @@ FILE16 *http_open(const char *url,
     int server_port;
     char buf[100];
-    int i;
+    unsigned u;
     struct http_headers *hs;
 
@@ -220,5 +220,7 @@ FILE16 *http_open(const char *url,
     SetCloseUnderlying(f16, 1);
     SetFileEncoding(f16, CE_unspecified_ascii_superset);
+#if defined(WIN32)
     SetNormalizeLineEnd(f16, 0);
+#endif
 
     /* Send the request */
@@ -246,5 +248,5 @@ FILE16 *http_open(const char *url,
     /* Read the status line */
 
-    i = 0;
+    u = 0;
     while(1)
     {
@@ -252,5 +254,5 @@ FILE16 *http_open(const char *url,
 	{
 	case '\n':
-	    buf[i] = 0;
+	    buf[u] = 0;
 	    goto done_status;
 	case '\r':
@@ -263,6 +265,6 @@ FILE16 *http_open(const char *url,
 	    return 0;
 	default:
-	    if(i < sizeof(buf) - 1)
-		buf[i++] = c;
+	    if(u < sizeof(buf) - 1)
+		buf[u++] = c;
 	}
     }
@@ -307,4 +309,5 @@ FILE16 *http_open(const char *url,
     {
 	char *final_url;
+	int i;
 
 	for(i=0; i<VectorCount(hs->header); i++)
@@ -370,5 +373,5 @@ static struct http_headers *read_headers
 	    if(VectorCount(text) == 0 || VectorLast(text) == LF)
 		goto done;
-	    /* otherwise fall through */
+	    /* fall through */
 	default:
 	    if(!VectorPush(text, c))
--- infoset-print.c	2004-11-03 12:17:06.000000000 -0500
+++ infoset-print.c	2021-02-25 15:33:58.693693000 -0500
@@ -23,5 +23,5 @@ static void children(FILE16 *f, int leve
 		     HashTable id_table);
 static void notations(FILE16 *f, int level, Dtd dtd);
-static void unparsed_entities(FILE16 *f, int level, Dtd dtd, Entity docent);
+static void unparsed_entities(FILE16 *f, int level, Dtd dtd);
 static void baseURI(FILE16 *f, int level, const char8 *uri);
 static void standalone(FILE16 *f, int level, StandaloneDeclaration sd);
@@ -33,11 +33,11 @@ static void element(FILE16 *f, int level
 		    HashTable id_table);
 static void pi(FILE16 *f, int level, Dtd dtd, XBit bit);
-static void cdsect(FILE16 *f, int level, Dtd dtd, XBit bit);
-static void pcdata(FILE16 *f, int level, Dtd dtd, XBit bit);
-static void comment(FILE16 *f, int level, Dtd dtd, XBit bit);
+static void cdsect(FILE16 *f, int level, XBit bit);
+static void pcdata(FILE16 *f, int level, XBit bit);
+static void comment(FILE16 *f, int level, XBit bit);
 static void name(FILE16 *f, int level, 
 		 const Char *nsname, const Char *local, const Char *prefix);
 static void document_element(FILE16 *f, int level, XBit bit);
-static void character(FILE16 *f, int level, Dtd dtd, char *ecw, int c);
+static void character(FILE16 *f, int level, const char *ecw, int c);
 static void attributes(FILE16 *f, int level, Dtd dtd, XBit bit, 
 		       HashTable id_table);
@@ -46,5 +46,5 @@ static void attribute(FILE16 *f, int lev
 static void namespace_attributes(FILE16 *f, int level, Dtd dtd, XBit bit,
 				 HashTable id_table);
-static void inscope_namespaces(FILE16 *f, int level, Dtd dtd, XBit bit);
+static void inscope_namespaces(FILE16 *f, int level, XBit bit);
 #if 0
 static void internal_entity(FILE16 *f, int level, Entity entity);
@@ -53,7 +53,7 @@ static void external_entity(FILE16 *f, i
 static void unparsed_entity(FILE16 *f, int level, Entity entity);
 
-static void simple(FILE16 *f, int level, char *name, const char *value);
-static void Simple(FILE16 *f, int level, char *name, const Char *value);
-static void pointer(FILE16 *f, int level, char *name, Char *id);
+static void simple(FILE16 *f, int level, const char *name, const char *value);
+static void Simple(FILE16 *f, int level, const char *name, const Char *value);
+static void pointer(FILE16 *f, int level, const char *name, Char *id);
 static Char *make_id(const char *type, const Char *name, int count);
 static void indent(FILE16 *f, int level);
@@ -67,5 +67,5 @@ static void find_ids(Dtd dtd, XBit *bits
 		     int *counter);
 
-struct xbit bogus_bit;
+static struct xbit bogus_bit;
 
 static Char xmlns_ns[] = {'h','t','t','p',':','/','/','w','w','w','.','w', '3',
@@ -93,5 +93,5 @@ void infoset_print(FILE16 *f, Parser p, 
     notations(f, 1, dtd);
 
-    unparsed_entities(f, 1, dtd, p->document_entity);
+    unparsed_entities(f, 1, dtd);
 
     baseURI(f, 1, EntityBaseURL(p->document_entity));
@@ -172,5 +172,5 @@ static void notations(FILE16 *f, int lev
 }
 
-static void unparsed_entities(FILE16 *f, int level, Dtd dtd, Entity docent)
+static void unparsed_entities(FILE16 *f, int level, Dtd dtd)
 {
     Entity e;
@@ -280,5 +280,5 @@ static void version(FILE16 *f, int level
 }
 
-static void simple(FILE16 *f, int level, char *name, const char *value)
+static void simple(FILE16 *f, int level, const char *name, const char *value)
 {
     indent(f, level);
@@ -294,5 +294,5 @@ static void simple(FILE16 *f, int level,
 }
 
-static void Simple(FILE16 *f, int level, char *name, const Char *value)
+static void Simple(FILE16 *f, int level, const char *name, const Char *value)
 {
     indent(f, level);
@@ -308,5 +308,5 @@ static void Simple(FILE16 *f, int level,
 }
 
-static void pointer(FILE16 *f, int level, char *name, Char *id)
+static void pointer(FILE16 *f, int level, const char *name, Char *id)
 {
     indent(f, level);
@@ -342,11 +342,11 @@ static void item(FILE16 *f, int level, D
 	    break;
 	case XBIT_cdsect:
-	    cdsect(f, level, dtd, bit);
+	    cdsect(f, level, bit);
 	    break;
 	case XBIT_pcdata:
-	    pcdata(f, level, dtd, bit);
+	    pcdata(f, level, bit);
 	    break;
 	case XBIT_comment:
-	    comment(f, level, dtd, bit);
+	    comment(f, level, bit);
 	    break;
 	default:
@@ -396,5 +396,5 @@ static void element(FILE16 *f, int level
     namespace_attributes(f, level+1, dtd, bit, id_table);
 
-    inscope_namespaces(f, level+1, dtd, bit);
+    inscope_namespaces(f, level + 1, bit);
 
     baseURI(f, 1, EntityBaseURL(bit->entity)); /* XXX xml:base */
@@ -433,5 +433,5 @@ static void pi(FILE16 *f, int level, Dtd
 }
 
-static void cdsect(FILE16 *f, int level, Dtd dtd, XBit bit)
+static void cdsect(FILE16 *f, int level, XBit bit)
 {
     Char *p;
@@ -443,5 +443,5 @@ static void cdsect(FILE16 *f, int level,
 
     for(p=bit->pcdata_chars; *p; p++)
-	character(f, level, dtd, "false", *p);
+	character(f, level, "false", *p);
 
 #if 0
@@ -451,8 +451,8 @@ static void cdsect(FILE16 *f, int level,
 }
 
-static void pcdata(FILE16 *f, int level, Dtd dtd, XBit bit)
+static void pcdata(FILE16 *f, int level, XBit bit)
 {
     Char *p;
-    char *ecw;
+    const char *ecw;
 
     ecw = !bit->parent->element_definition->declared ? 0 :
@@ -461,8 +461,8 @@ static void pcdata(FILE16 *f, int level,
 
     for(p=bit->pcdata_chars; *p; p++)
-	character(f, level, dtd, is_xml_whitespace(*p) ? ecw : "false", *p);
+	character(f, level, is_xml_whitespace(*p) ? ecw : "false", *p);
 }
 
-static void character(FILE16 *f, int level, Dtd dtd, char *ecw, int c)
+static void character(FILE16 *f, int level, const char *ecw, int c)
 {
     indent(f, level);
@@ -478,5 +478,5 @@ static void character(FILE16 *f, int lev
 }
 
-static void comment(FILE16 *f, int level, Dtd dtd, XBit bit)
+static void comment(FILE16 *f, int level, XBit bit)
 {
     indent(f, level);
@@ -615,4 +615,5 @@ static void attribute(FILE16 *f, int lev
 	free(token);
 	free(id);
+	/* FALLTHROUGH */
     default:
 	simple(f, level+1, "references", 0);
@@ -640,5 +641,5 @@ static void attribute(FILE16 *f, int lev
 }
 
-static void inscope_namespaces(FILE16 *f, int level, Dtd dtd, XBit bit)
+static void inscope_namespaces(FILE16 *f, int level, XBit bit)
 {
     NamespaceBinding nsb, nsb2;
--- input.c	2005-01-14 11:10:00.000000000 -0500
+++ input.c	2021-02-25 15:07:41.467694000 -0500
@@ -79,5 +79,5 @@ InputSource EntityOpen(Entity e)
     else
     {
-	f16 = MakeFILE16FromString((char *)e->text, -1, "r");
+	f16 = MakeFILE16FromString(e->text, -1, "r");
     }
 
@@ -288,11 +288,5 @@ static void internal_reader(InputSource 
     struct _FILE16 *f16 = (struct _FILE16 *)s->file16;
 
-    if(!*(Char *)((char *)f16->handle + f16->handle2))
-    {
-	s->line_length = 0;
-	return;
-    }
-
-    s->line = (Char *)((char *)f16->handle + f16->handle2);
+    s->line = (void *)((char *)f16->handle + f16->handle2);
     for(p=s->line; *p && *p != '\n'; p++)
 	;
@@ -467,6 +461,4 @@ static int translate_latin(InputSource s
     }
 
-    MORE_BYTES;
-
     END_OF_LINE;
 }
@@ -495,6 +487,4 @@ static int translate_latin1(InputSource 
     }
 
-    MORE_BYTES;
-
     END_OF_LINE;
 }
--- namespaces.c	2003-06-02 12:56:35.000000000 -0400
+++ namespaces.c	2021-02-25 15:07:41.468014000 -0500
@@ -25,5 +25,5 @@ static void FreeNSElementDefinition(NSEl
 static void FreeNSAttributeDefinition(NSAttributeDefinition attribute);
 
-NamespaceUniverse global_universe = 0;
+static NamespaceUniverse global_universe = 0;
 
 int init_namespaces(void)
@@ -139,5 +139,5 @@ static void FreeNSElementDefinition(NSEl
 
     Free(element->attributes);
-    Free((Char *)element->name); /* cast to get rid of const */
+    Free(element->name);
     Free(element);
 }
@@ -182,5 +182,5 @@ NSAttributeDefinition
 static void FreeNSAttributeDefinition(NSAttributeDefinition attribute)
 {
-    Free((Char *)attribute->name); /* cast to get rid of const */
+    Free(attribute->name);
     Free(attribute);
 }
--- namespaces.h	2003-06-02 12:56:35.000000000 -0400
+++ namespaces.h	2021-02-25 15:07:41.468292000 -0500
@@ -30,5 +30,5 @@ struct RXP_NAMESPACE {
 
 struct ns_element_definition {
-    const Char *name;
+    Char *name;
     Namespace RXP_NAMESPACE;
     Vector(NSAttributeDefinition, attributes);
@@ -39,5 +39,5 @@ struct ns_attribute_definition {
     Namespace RXP_NAMESPACE;
     NSElementDefinition element;
-    const Char *name;
+    Char *name;
     int attrnum;
 };
--- nf16check.c	2003-09-02 10:02:45.000000000 -0400
+++ nf16check.c	2021-02-25 15:07:41.468701000 -0500
@@ -7,4 +7,6 @@
 
 #include <stdlib.h>
+#include <stdint.h>
+
 #include "nf16check.h"
 #include "nf16data.h"
@@ -69,11 +71,11 @@ void nf16checkNoStart (NF16Checker check
 static int recombines (unsigned int b, unsigned int f)
 {
-    int low  = 0;                     /* lowest inside non-checked area */
-    int high = recombinerCount;       /* lowest outside    checked area */
+    unsigned low  = 0;                     /* lowest inside non-checked area */
+    unsigned high = recombinerCount;       /* lowest outside    checked area */
     while (low < high) {
-        int middle  = (low+high) / 2;  /* binary search */
-        int middleB = recombiners[middle].base;
+        unsigned middle  = (low + high) / 2;  /* binary search */
+        unsigned middleB = recombiners[middle].base;
         if (b == middleB) {
-            int middleF = recombiners[middle].follow;
+            unsigned middleF = recombiners[middle].follow;
             if (f == middleF)      return 1;
             else if (f < middleF)  high = middle;
@@ -106,5 +108,5 @@ static int getclass (unsigned int c)
 }
 
-
+#if 0 /* This function is broken and unused */
 /* general check function, s is null-delimited */
 nf16res nf16check (NF16Checker checker, char16* s)
@@ -215,5 +217,5 @@ nf16res nf16check (NF16Checker checker, 
     return NF16wrong;
 }
-
+#endif
 
 /* variant of nf16check, s_length gives length of s */
@@ -226,4 +228,5 @@ nf16res nf16checkL (NF16Checker checker,
     int          lastclass   = checker->lastclass;
     char16       c;
+    uint32_t     C;
     flag         f;
     int          class;
@@ -243,18 +246,19 @@ nf16res nf16checkL (NF16Checker checker,
           case loww:  /* low surrogate */
             /* combine with high surrogate */
-            c = ((checker->high-0xD800)<<10) + (c-0xDC00) + 0x10000;
+            C = ((checker->high-0xD800)<<10) + (c-0xDC00) + 0x10000;
+	    c = C;
             /* check in pieces */
-            if      (c < 0x10900)  goto GETFLAG; /* still in main table */
-            else if (c < 0x1D000)  f = NoNo;
-            else if (c < 0x1D800)  f = getflag(c-(0x1D000-0x10900));
-            else if (c < 0x20000)  f = NoNo;
-            else if (c < 0x2A6D7)  f = simp;
-            else if (c < 0x2F800)  f = NoNo;
-            else if (c < 0x2FA1D)  f = NOFC;
-            else if (c ==0xE0001)  f = simp;
-            else if (c < 0xE0020)  f = NoNo;
-            else if (c < 0xE0080)  f = simp;
-            else if (c < 0xE0100)  f = NoNo;
-            else if (c < 0xE01F0)  f = simp;
+            if      (C < 0x10900)  goto GETFLAG; /* still in main table */
+            else if (C < 0x1D000)  f = NoNo;
+            else if (C < 0x1D800)  f = getflag(c-(0x1D000-0x10900));
+            else if (C < 0x20000)  f = NoNo;
+            else if (C < 0x2A6D7)  f = simp;
+            else if (C < 0x2F800)  f = NoNo;
+            else if (C < 0x2FA1D)  f = NOFC;
+            else if (C ==0xE0001)  f = simp;
+            else if (C < 0xE0020)  f = NoNo;
+            else if (C < 0xE0080)  f = simp;
+            else if (C < 0xE0100)  f = NoNo;
+            else if (C < 0xE01F0)  f = simp;
             else                   f = NoNo;
             goto NEWFLAG;   /* start again with switch */
--- resolve.c	2003-08-28 12:13:12.000000000 -0400
+++ resolve.c	2021-02-25 15:07:41.469245000 -0500
@@ -8,11 +8,11 @@
 #include "string.h"
 
-static char *res_ext(Catalog catalog, char *file,
+static char *res_ext(Catalog catalog, const char *file,
 		     const char *public, const char *system, Prefer prefer);
-static char *res_uri(Catalog catalog, char *file, const char *uri);
+static const char *res_uri(Catalog catalog, const char *file, const char *uri);
 static int entry_compare(const void *a, const void *b);
 
 /* used internally to indicate failure */
-static char *fail = "fail";
+static char *fail = (void *)-1;
 
 char *ResolveExternalIdentifier(Catalog catalog, 
@@ -35,16 +35,18 @@ char *ResolveExternalIdentifier(Catalog 
 	if(!(temp = UnwrapPublicidUrn(public)) ||
 	   !(public = NormalizePublic8(temp)))
-	    return 0;
+	    return NULL;
 	Free(temp);
     }
     else
 	if(public && !(public = NormalizePublic8(public)))
-	    return 0;
+	    return NULL;
 
     if(IsPublicidUrn(system))
     {
+	char *normalized_system;
+
 	if(!(temp = UnwrapPublicidUrn(system)) ||
 	   /* NB normalize as public because that's what it will end up as! */
-	   !(system = NormalizePublic8(temp)))
+	   !(normalized_system = NormalizePublic8(temp)))
 	    return 0;
 	Free(temp);
@@ -52,21 +54,18 @@ char *ResolveExternalIdentifier(Catalog 
 	if(public)
 	{
-	    if(strcmp(public, system) == 0)
+	    if(strcmp(public, normalized_system) == 0)
 	    {
-		Free((void *)system);
-		system = 0;
+		Free(normalized_system);
 	    }
 	    else
 	    {
 		Fprintf(Stderr, "Unwrapped publicid-urn system id %s does not match public id %s, discarding\n",
-			system, public);
-		Free((void *)system);
-		system = 0;
+			normalized_system, public);
+		Free(normalized_system);
 	    }
 	}
 	else
 	{
-	    public = system;
-	    system = 0;
+	    public = normalized_system;
 	}
     }
@@ -96,10 +95,10 @@ char *ResolveExternalIdentifier(Catalog 
 }
 
-static char *res_ext(Catalog catalog, char *file,
+static char *res_ext(Catalog catalog, const char *file,
 		     const char *public, const char *system, Prefer prefer)
 {
     int i;
     int len, best_length, prefix_length, nmatches;
-    char *best_value = 0, *result = 0; /* init to please gcc */
+    char *best_value = NULL, *result = NULL; /* init to please gcc */
     CatalogEntryFile cef;
     CatalogEntry entry;
@@ -114,5 +113,5 @@ static char *res_ext(Catalog catalog, ch
 
     if(!(cef = GetCatalogEntryFile(catalog, file)))
-	return fail;
+	return (char *)fail;
 
     if(!system)
@@ -157,13 +156,14 @@ static char *res_ext(Catalog catalog, ch
     if(best_length > 0)
     {
+	char *buf;
 	prefix_length = strlen(best_value);
-	if(!(result = Malloc(prefix_length + strlen(system+best_length) + 1)))
+	if(!(buf = Malloc(prefix_length + strlen(system+best_length) + 1)))
 	    return fail;
-	strcpy(result, best_value);
-	strcpy(result+prefix_length, system+best_length);
+	strcpy(buf, best_value);
+	strcpy(buf+prefix_length, system+best_length);
 	if(catalog_debug)
 	    fprintf(stderr, "best match %s (%d), returning %s\n",
-		    best_value, prefix_length, result);
-	return result;
+		    best_value, prefix_length, buf);
+	return buf; /* XXX anything ever frees this? */
     }
 
@@ -299,5 +299,5 @@ static char *res_ext(Catalog catalog, ch
 }
 
-char *ResolveURI(Catalog catalog, const char *uri)
+const char *ResolveURI(Catalog catalog, const char *uri)
 {
     int i, is_publicid_urn;
@@ -327,5 +327,5 @@ char *ResolveURI(Catalog catalog, const 
     for(i=0; i<VectorCount(catalog->path); i++)
     {
-	char *result;
+	const char *result;
 
 	if(is_publicid_urn)
@@ -333,7 +333,7 @@ char *ResolveURI(Catalog catalog, const 
 	else
 	    result = res_uri(catalog, catalog->path[i], uri);
-	if(result == fail)
-	    return 0;
-	if(result)
+	if (result == fail)
+	    return NULL;
+	if (result)
 	    return result;
     }
@@ -342,9 +342,10 @@ char *ResolveURI(Catalog catalog, const 
 }
 
-static char *res_uri(Catalog catalog, char *file, const char *uri)
+static const char *res_uri(Catalog catalog, const char *file, const char *uri)
 {
     int i;
     int len, best_length, prefix_length, nmatches;
-    char *best_value = 0, *result = 0; /* init to please gcc */
+    char *best_value = NULL;
+    const char *result = NULL; /* init to please gcc */
     CatalogEntryFile cef;
     CatalogEntry entry;
@@ -395,13 +396,14 @@ static char *res_uri(Catalog catalog, ch
     if(best_length > 0)
     {
+	char *buf;
 	prefix_length = strlen(best_value);
-	if(!(result = Malloc(prefix_length + strlen(uri+best_length) + 1)))
+	if(!(buf = Malloc(prefix_length + strlen(uri+best_length) + 1)))
 	    return fail;
-	strcpy(result, best_value);
-	strcpy(result+prefix_length, uri+best_length);
+	strcpy(buf, best_value);
+	strcpy(buf + prefix_length, uri + best_length);
 	if(catalog_debug)
 	    fprintf(stderr, "best match %s (%d), returning %s\n",
-		    best_value, prefix_length, result);
-	return result;
+		    best_value, prefix_length, buf);
+	return buf; /* XXX Is this ever freed? */
     }
 
@@ -468,5 +470,5 @@ static int entry_compare(const void *a, 
 {
     /* longest first, i.e. long < short */
-    return strlen((*(CatalogEntry *)b)->match) - 
-	   strlen((*(CatalogEntry *)a)->match);
+    return strlen((*(const CatalogEntry *)b)->match) - 
+	   strlen((*(const CatalogEntry *)a)->match);
 }
--- rxp.c	2005-01-14 11:57:49.000000000 -0500
+++ rxp.c	2021-02-25 15:07:41.469916000 -0500
@@ -32,40 +32,39 @@
 #include "catalog.h"
 
-int attr_compare(const void *a, const void *b);
-void print_tree(Parser p, XBit bit);
-void print_bit(Parser p, XBit bit);
-void print_ns_attrs(NamespaceBinding ns, int count);
-void print_namespaces(NamespaceBinding ns);
-void print_attrs(ElementDefinition e, Attribute a);
-void print_text(Char *text);
-int printable(int c);
-void print_special(int c);
-void print_text_bit(Char *text);
-void dtd_cb(XBit bit, void *arg);
-void dtd_cb2(XBit bit, void *arg);
-void print_canonical_dtd(Parser p, const Char *name);
-InputSource entity_open(Entity ent, void *arg);
+static int attr_compare(const void *a, const void *b);
+static void print_tree(Parser p, XBit bit);
+static void print_bit(Parser p, XBit bit);
+static void print_ns_attrs(NamespaceBinding ns, int count);
+static void print_namespaces(NamespaceBinding ns);
+static void print_attrs(Attribute a);
+static void print_text(const Char *text);
+static int printable(int c);
+static void print_special(int c);
+static void print_text_bit(Char *text);
+static void dtd_cb(XBit bit, void *arg);
+static void dtd_cb2(XBit bit, void *arg);
+static void print_canonical_dtd(Parser p, const Char *name);
 static const char8 *minimal_uri(const char8 *uri, const char8 *base);
 
-int verbose = 0, expand = 1, nsgml = 0,
+static int verbose = 0, expand = 1, nsgml = 0,
     attr_defaults = 0, merge = 0, strict_xml = 0, tree = 0, validate = 0,
     xml_space = 0, namespaces = 0, simple_error = 0, experiment = 0,
     read_dtd = 0, unicode_check = 0, xml_id = 0;
-enum {o_unspec, o_none, o_bits, o_plain, o_can1, o_can2, o_can3, o_infoset, o_diff} output_format = o_unspec;
-char *enc_name = 0, *base_uri = 0, *my_dtd_name, *my_dtd_sysid = 0;
-CharacterEncoding encoding = CE_unknown;
-InputSource source = 0;
-int need_canonical_dtd = 0;
-int xml_version;
+static enum {o_unspec, o_none, o_bits, o_plain, o_can1, o_can2, o_can3, o_infoset, o_diff} output_format = o_unspec;
+static char *enc_name = NULL, *base_uri = NULL, *my_dtd_name, *my_dtd_sysid = NULL;
+static CharacterEncoding encoding = CE_unknown;
+static InputSource source = NULL;
+static int need_canonical_dtd = 0;
+static int xml_version;
 
 #ifdef TIME_LIMIT
-void time_exceeded(int sig);
-int time_limit = 0;
+static void time_exceeded(int sig);
+static int time_limit = 0;
 #endif
 
 #define canonical_output (output_format >= o_can1)
 
-Vector(XBit, bits);
-Vector(XBit, dtd_bits);
+StaticVector(XBit, bits);
+StaticVector(XBit, dtd_bits);
 
 int main(int argc, char **argv)
@@ -565,5 +564,5 @@ void print_bit(Parser p, XBit bit)
 {
     const char *sys, *pub;
-    char *ws[] = {"u", "d", "p"};
+    const char *ws[] = {"u", "d", "p"};
 
     if(output_format == o_none && bit->type != XBIT_error)
@@ -601,5 +600,5 @@ void print_bit(Parser p, XBit bit)
 	    if(xml_space)
 		Printf("(ws=%s) ", ws[bit->wsm]);
-	    print_attrs(0, bit->attributes);
+	    print_attrs(bit->attributes);
 	    print_namespaces(bit->ns_dict);
 	    Printf("\n");
@@ -614,5 +613,5 @@ void print_bit(Parser p, XBit bit)
 	    if(xml_space)
 		Printf("(ws=%s) ", ws[bit->wsm]);
-	    print_attrs(0, bit->attributes);
+	    print_attrs(bit->attributes);
 	    print_namespaces(bit->ns_dict);
 	    Printf("\n");
@@ -685,5 +684,5 @@ void print_bit(Parser p, XBit bit)
 		print_canonical_dtd(p, bit->element_definition->name);
 	    Printf("<%S", bit->element_definition->name);
-	    print_attrs(bit->element_definition, bit->attributes);
+	    print_attrs(bit->attributes);
 	    print_ns_attrs(bit->ns_dict, bit->nsc);
 	    if(bit->type == XBIT_start)
@@ -732,9 +731,9 @@ void print_bit(Parser p, XBit bit)
 int attr_compare(const void *a, const void *b)
 {
-    return Strcmp((*(Attribute *)a)->definition->name,
-		  (*(Attribute *)b)->definition->name);
+    return Strcmp((*(const Attribute *)a)->definition->name,
+		  (*(const Attribute *)b)->definition->name);
 }
 
-void print_attrs(ElementDefinition e, Attribute a)
+void print_attrs(Attribute a)
 {
     Attribute b;
@@ -789,5 +788,5 @@ void dtd_cb(XBit bit, void *arg)
 }
 	
-void dtd_cb2(XBit bit, void *arg)
+void dtd_cb2(XBit bit, void *arg __unused)
 {
     XBit copy;
@@ -802,7 +801,7 @@ void dtd_cb2(XBit bit, void *arg)
 }
 	
-void print_text(Char *text)
+void print_text(const Char *text)
 {
-    Char *pc, *last;
+    const Char *pc, *last;
     
     if(output_format == o_bits  || !expand)
@@ -901,25 +900,4 @@ void print_special(int c)
 }
 
-InputSource entity_open(Entity ent, void *arg)
-{
-    if(ent->publicid && 
-       strcmp(ent->publicid, "-//RMT//DTD just a test//EN") == 0)
-    {
-	FILE *f;
-	FILE16 *f16;
-
-	if((f = fopen("/tmp/mydtd", "r")))
-	{
-	    if(!(f16 = MakeFILE16FromFILE(f, "r")))
-		return 0;
-	    SetCloseUnderlying(f16, 1);
-
-	    return NewInputSource(ent, f16);
-	}
-    }
-
-    return EntityOpen(ent);
-}
-
 void print_ns_attrs(NamespaceBinding ns, int count)
 {
@@ -969,13 +947,13 @@ void print_namespaces(NamespaceBinding n
 }
 
-int notation_compare(const void *a, const void *b)
+static int notation_compare(const void *a, const void *b)
 {
-    return Strcmp((*(NotationDefinition *)a)->name,
-		  (*(NotationDefinition *)b)->name);
+    return Strcmp((*(const NotationDefinition *)a)->name,
+		  (*(const NotationDefinition *)b)->name);
 }
 
-int entity_compare(const void *a, const void *b)
+static int entity_compare(const void *a, const void *b)
 {
-    return Strcmp((*(Entity *)a)->name, (*(Entity *)b)->name);
+    return Strcmp((*(const Entity *)a)->name, (*(const Entity *)b)->name);
 }
 
@@ -1099,5 +1077,5 @@ static const char8 *minimal_uri(const ch
 
 #ifdef TIME_LIMIT
-void time_exceeded(int sig)
+void time_exceeded(int sig __unused)
 {
     fprintf(stderr, "CPU time limit (%d seconds) exceeded, sorry\n", 
--- rxputil.h	2003-11-27 09:06:57.000000000 -0500
+++ rxputil.h	2021-02-25 15:07:41.470232000 -0500
@@ -6,4 +6,8 @@
     type *name
 
+#define StaticVector(type, name) \
+    static int name##_count, name##_alloc; \
+    static type *name
+
 #define VectorInit(v) \
     ((v##_count) = (v##_alloc) = 0, (v) = 0)
--- stdio16.c	2005-01-14 11:10:54.000000000 -0500
+++ stdio16.c	2021-02-25 15:32:25.156652000 -0500
@@ -15,4 +15,5 @@
 #include <string.h>
 #include <stdarg.h>
+#include <err.h>
 
 #ifdef FOR_LT
@@ -63,5 +64,8 @@ typedef int CloseProc(FILE16 *file);
 
 struct _FILE16 {
-    void *handle;
+    union {
+	void *handle;
+	const void *chandle;
+    };
     int handle2, handle3;
     ReadProc *read;
@@ -222,5 +226,5 @@ static int ConvertASCII(const char8 *buf
 	}
 	else
-	    return Writeu(file, (unsigned char *)buf, count);
+	    return Writeu(file, (const unsigned char *)buf, count);
 
     case CE_UTF_8:
@@ -418,5 +422,5 @@ int Readu(FILE16 *file, unsigned char *b
 #endif
 
-int Writeu(FILE16 *file, unsigned char *buf, int count)
+int Writeu(FILE16 *file, const unsigned char *buf, int count)
 {
     int ret;
@@ -548,13 +552,13 @@ CharacterEncoding GetFileEncoding(FILE16
 }
 
+#if defined(WIN32)
 void SetNormalizeLineEnd(FILE16 *file, int nle)
 {
-#if defined(WIN32)
     if(nle)
 	file->flags |= FILE16_crlf;
     else
 	file->flags &= ~FILE16_crlf;
-#endif
 }
+#endif
 
 int Fprintf(FILE16 *file, const char *format, ...)
@@ -596,5 +600,6 @@ int Vsprintf(void *buf, CharacterEncodin
 {
     int nchars;
-    FILE16 file = {0, 0, -1, 0, StringWrite, 0, StringFlush, StringClose, FILE16_write};
+    FILE16 file = {.handle3 = -1, .write = StringWrite, .flush = StringFlush,
+        .close = StringClose, .flags = FILE16_write};
 
     file.handle = buf;
@@ -611,5 +616,6 @@ int Vsnprintf(void *buf, size_t size, Ch
 {
     int nchars;
-    FILE16 file = {0, 0, -1, 0, StringWriteTrunc, 0, StringFlush, StringClose, FILE16_write};
+    FILE16 file = {.handle3 = -1, .write = StringWriteTrunc,
+        .flush = StringFlush, .close = StringClose, .flags = FILE16_write};
 
     file.handle = buf;
@@ -639,5 +645,5 @@ int Vfprintf(FILE16 *file, const char *f
     char16 cbuf[1];
 #endif
-    int mflag, pflag, sflag, hflag, zflag;
+    int mflag;
     int l, h, L, ll;
     int nchars = 0;
@@ -654,5 +660,5 @@ int Vfprintf(FILE16 *file, const char *f
 	width = 0;
 	prec = -1;
-	mflag=0, pflag=0, sflag=0, hflag=0, zflag=0;
+	mflag=0;
 	l=0, h=0, L=0, ll=0;
 
@@ -664,16 +670,4 @@ int Vfprintf(FILE16 *file, const char *f
 		mflag = 1;
 		break;
-	    case '+':
-		pflag = 1;
-		break;
-	    case ' ':
-		sflag = 1;
-		break;
-	    case '#':
-		hflag = 1;
-		break;
-	    case '0':
-		zflag = 1;
-		break;
 	    default:
 		goto flags_done;
@@ -738,5 +732,5 @@ int Vfprintf(FILE16 *file, const char *f
 	}
 
-	if(format - start + 1 > sizeof(fmt))
+	if (format - start + 1 > (int)sizeof(fmt))
 	{
 	  ERR("Printf: format specifier too long");
@@ -956,5 +950,5 @@ static int FDClose(FILE16 *file)
 }
 
-static int FDFlush(FILE16 *file)
+static int FDFlush(FILE16 *file __unused)
 {
     return 0;
@@ -1067,5 +1061,5 @@ static int FileFlush(FILE16 *file)
 }
 
-FILE16 *MakeFILE16FromString(void *buf, long size, const char *type)
+FILE16 *MakeFILE16FromString(const void *buf, long size, const char *type)
 {
     FILE16 *file;
@@ -1080,5 +1074,5 @@ FILE16 *MakeFILE16FromString(void *buf, 
     file->flush = StringFlush;
 
-    file->handle = buf;
+    file->chandle = buf;
     file->handle2 = 0;
     file->handle3 = size;
@@ -1170,5 +1164,5 @@ static int StringClose(FILE16 *file)
 }
 
-static int StringFlush(FILE16 *file)
+static int StringFlush(FILE16 *file __unused)
 {
     return 0;
@@ -1268,6 +1262,8 @@ static int GzipRead(FILE16 *file, unsign
 
     errorString = gzerror(f, &gzerr);
-    if(gzerr != 0 && gzerr != Z_STREAM_END)
+    if (gzerr != 0 && gzerr != Z_STREAM_END) {
+	warnx("%s: %s", __func__, errorString);
 	return -1;
+    }
     
     return count;
@@ -1280,14 +1276,16 @@ static int GzipWrite(FILE16 *file, const
     const char *errorString;
 
-    count = gzwrite(f, (char *)buf, count);
+    count = gzwrite(f, buf, count);
 
     errorString = gzerror(f, &gzerr);
-    if(gzerr != 0 && gzerr != Z_STREAM_END)
+    if (gzerr != 0 && gzerr != Z_STREAM_END) {
+	warnx("%s: %s", __func__, errorString);
 	return -1;
+    }
     
     return count;
 }
 
-static int GzipSeek(FILE16 *file, long offset, int ptrname)
+static int GzipSeek(FILE16 *file __unused, long offset __unused, int ptrname __unused)
 {
     return -1;
@@ -1301,5 +1299,5 @@ static int GzipClose(FILE16 *file)
 }
 
-static int GzipFlush(FILE16 *file)
+static int GzipFlush(FILE16 *file __unused)
 {
     return 0;
--- stdio16.h	2002-10-03 10:37:44.000000000 -0400
+++ stdio16.h	2021-02-25 15:28:59.692044000 -0500
@@ -5,5 +5,5 @@
 #include <stdio.h>
 #ifdef HAVE_LIBZ
-#include "zlib.h"
+#include <zlib.h>
 #endif
 #include "charset.h"
@@ -15,5 +15,5 @@ extern STD_API FILE16 *Stdin, *Stdout, *
 STD_API FILE16 *MakeFILE16FromFILE(FILE *f, const char *type);
 STD_API FILE16 *MakeFILE16FromFD(int fd, const char *type);
-STD_API FILE16 *MakeFILE16FromString(void *buf, long size, const char *type);
+STD_API FILE16 *MakeFILE16FromString(const void *buf, long size, const char *type);
 #ifdef WIN32
 #ifdef SOCKETS_IMPLEMENTED
@@ -26,5 +26,5 @@ STD_API FILE16 *MakeFILE16FromGzip(gzFil
 
 STD_API int Readu(FILE16 *file, unsigned char *buf, int max_count);
-STD_API int Writeu(FILE16 *file, unsigned char *buf, int count);
+STD_API int Writeu(FILE16 *file, const unsigned char *buf, int count);
 STD_API int Fclose(FILE16 *file);
 STD_API int Fflush(FILE16 *file);
@@ -38,5 +38,7 @@ STD_API void SetCloseUnderlying(FILE16 *
 STD_API void SetFileEncoding(FILE16 *file, CharacterEncoding encoding);
 STD_API CharacterEncoding GetFileEncoding(FILE16 *file);
+#if defined(WIN32)
 STD_API void SetNormalizeLineEnd(FILE16 *file, int nle);
+#endif
 
 STD_API int Fprintf(FILE16 *file, const char *format, ...);
--- string16.c	2004-10-11 12:18:29.000000000 -0400
+++ string16.c	2021-02-25 15:07:41.471817000 -0500
@@ -171,9 +171,9 @@ size_t strlen16(const char16 *s)
 }
 
-char16 *strchr16(const char16 *s, int c)
+const char16 *strchr16(const char16 *s, int c)
 {
     for( ; *s; s++)
 	if(*s == c)
-	    return (char16 *)s;	/* Is const bogus or what? */
+	    return s;
 
     return 0;
@@ -311,5 +311,5 @@ char16 *strncat16(char16 *s1, const char
 /* A very naive implementation */
 
-char16 *strstr16(const char16 *s1, const char16 *s2)
+const char16 *strstr16(const char16 *s1, const char16 *s2)
 {
     int len, first;
@@ -317,5 +317,5 @@ char16 *strstr16(const char16 *s1, const
     first = s2[0];
     if(first == 0)
-	return (char16 *)s1;
+	return s1;
 
     len = strlen16(s2);
@@ -324,5 +324,5 @@ char16 *strstr16(const char16 *s1, const
     {
 	if(strncmp16(s1, s2, len) == 0)
-	    return (char16 *)s1;
+	    return s1;
 	else
 	    s1++;
@@ -331,3 +331,2 @@ char16 *strstr16(const char16 *s1, const
     return 0;
 }
-
--- string16.h	1999-05-28 08:08:38.000000000 -0400
+++ string16.h	2021-02-25 15:07:41.472166000 -0500
@@ -23,5 +23,5 @@ STD_API int strncasecmp8(const char8 *, 
 
 STD_API char16 *strdup16(const char16 *s);
-STD_API char16 *strchr16(const char16 *, int);
+STD_API const char16 *strchr16(const char16 *, int);
 STD_API size_t strlen16(const char16 *);
 STD_API int strcmp16(const char16 *, const char16 *);
@@ -33,5 +33,5 @@ STD_API char16 *strncat16(char16 *, cons
 STD_API int strcasecmp16(const char16 *, const char16 *);
 STD_API int strncasecmp16(const char16 *, const char16 *, size_t);
-STD_API char16 *strstr16(const char16 *, const char16 *);
+STD_API const char16 *strstr16(const char16 *, const char16 *);
 
 STD_API void translate_latin1_utf16(const char8 *from, char16 *to);
--- system.h	2003-05-19 20:17:27.000000000 -0400
+++ system.h	2021-02-25 15:10:55.417342000 -0500
@@ -1,3 +1,6 @@
+#ifndef _RXP_SYSTEM_H
+#define _RXP_SYSTEM_H
 #define HAVE_LONG_LONG
+#define HAVE_LONG_DOUBLE
 
 #define SOCKETS_IMPLEMENTED
@@ -11,2 +14,4 @@ void *Malloc(int bytes);
 void *Realloc(void *mem, int bytes);
 void Free(void *mem);
+
+#endif
--- url.c	2004-06-11 07:39:17.000000000 -0400
+++ url.c	2021-02-25 15:07:41.472694000 -0500
@@ -80,10 +80,10 @@ static int hexval(int hex);
 /* Mapping of scheme names to opening functions */
 
-struct {
-    char *scheme; 
+static struct {
+    const char *scheme; 
     FILE16 *(*open)(const char *, const char *, int, const char *, const char *, char **);
 } schemes[] = {
-    {(char *)"http", http_open},
-    {(char *)"file", file_open},
+    {"http", http_open},
+    {"file", file_open},
 };
 #define NSCHEME (sizeof(schemes) / sizeof(schemes[0]))
@@ -372,5 +372,6 @@ FILE16 *url_open(const char *url, const 
 {
     char *scheme, *host, *path, *m_url, *r_url;
-    int port, i;
+    int port;
+    unsigned i;
     FILE16 *f;
 #ifdef HAVE_LIBZ
@@ -464,5 +465,6 @@ FILE16 *url_open(const char *url, const 
 
 static FILE16 *file_open(const char *url,
-			 const char *host, int port, const char *path, 
+			 const char *host __unused,
+			 int port __unused, const char *path, 
 			 const char *type, char **redirected_url)
 {
@@ -554,5 +556,6 @@ static void parse_url(const char *url, 
 		      char **scheme, char **host, int *port, char **path)
 {
-    char *p, *q;
+    const char *p, *q;
+    char *r;
     int warned = 0;
 
@@ -562,5 +565,5 @@ static void parse_url(const char *url, 
     /* Does it start with a scheme? */
     
-    for(p = (char *)url; *p; p++)
+    for(p = url; *p; p++)
 	if(*p == ':' || *p == '/')
 	    break;
@@ -580,5 +583,5 @@ static void parse_url(const char *url, 
 	url += 2;
 
-	for(p = (char *)url; *p; p++)
+	for(p = url; *p; p++)
 	    if(*p == '/')
 		break;
@@ -610,6 +613,6 @@ static void parse_url(const char *url, 
     /* Windoze users have a tendency to use backslashes instead of slashes */
 
-    for(p=*path; *p; p++)
-	if(*p == '\\')
+    for(r = *path; *r; r++)
+	if(*r == '\\')
 	{
 	    if(!warned)
@@ -620,5 +623,5 @@ static void parse_url(const char *url, 
 	    }
 
-	    *p = '/';
+	    *r = '/';
 	}
 }
--- version.c	2005-01-14 12:09:25.000000000 -0500
+++ version.c	2021-02-25 15:07:41.472934000 -0500
@@ -1,2 +1,4 @@
-char *rxp_version_string = 
+#include "version.h"
+
+const char *rxp_version_string = 
     "RXP 1.4.4 Copyright Richard Tobin, LTG, HCRC, University of Edinburgh";
--- version.h	1999-02-17 09:43:19.000000000 -0500
+++ version.h	2021-02-25 15:07:41.473163000 -0500
@@ -1 +1 @@
-extern char *rxp_version_string;
+extern const char *rxp_version_string;
--- xmlparser.c	2004-11-03 08:47:31.000000000 -0500
+++ xmlparser.c	2021-02-25 15:22:16.748707000 -0500
@@ -4,7 +4,7 @@
 #define DEBUG_FSM 0
 
-#ifndef lint
-static char vcid[] = "$Id: xmlparser.c,v 1.131 2004/11/03 13:47:31 richard Exp $";
-#endif /* lint */
+#include <sys/cdefs.h>
+
+__RCSID("$Id: xmlparser.c,v 1.131 2004/11/03 13:47:31 richard Exp $");
 
 /* 
@@ -140,6 +140,6 @@ enum literal_type {
 };
 static int parse_string(Parser p, const char8 *where, enum literal_type type, int *normalised);
-static int parse_pi(Parser p, Entity ent);
-static int parse_comment(Parser p, int skip, Entity ent);
+static int parse_pi(Parser p);
+static int parse_comment(Parser p, int skip);
 static int parse_pcdata(Parser p);
 static int parse_starttag(Parser p);
@@ -148,5 +148,5 @@ static int process_namespace(Parser p,
 			     AttributeDefinition d, const Char *value);
 static int parse_attribute(Parser p);
-static WhiteSpaceMode process_xml_space(Parser p, const Char *value);
+static WhiteSpaceMode process_xml_space(const Char *value);
 static int parse_endtag(Parser p);
 static int parse_markup(Parser p);
@@ -157,5 +157,7 @@ static int validate_final(Parser p);
 static HashMapRetType check_id(const HashEntryStruct *id_entry, void *p);
 static int validate_attribute(Parser p, AttributeDefinition a, ElementDefinition e, const Char *value);
+#if 0
 static int validate_xml_lang_attribute(Parser p, ElementDefinition e, const Char *value);
+#endif
 static int check_attribute_syntax(Parser p, AttributeDefinition a, ElementDefinition e, const Char *value, const char *message, int real_use);
 static int check_attribute_token(Parser p, AttributeDefinition a, ElementDefinition e, const Char *value, int length, const char *message, int real_use);
@@ -165,5 +167,5 @@ static int magically_transform_dtd(Parse
 
 static struct element_definition pcdata_element;
-const ElementDefinition Epsilon = 0, PCDataElement = &pcdata_element;
+static const ElementDefinition Epsilon = 0, PCDataElement = &pcdata_element;
 
 static FSM NewFSM(void);
@@ -1203,8 +1205,8 @@ static int parse_markup(Parser p)
 	{
 	    if(ParserGetFlag(p, ReturnComments))
-		return parse_comment(p, 0, 0);
+		return parse_comment(p, 0);
 	    else
 	    {
-		require(parse_comment(p, 1, 0));
+		require(parse_comment(p, 1));
 		/* XXX avoid recursion here */
 		return parse(p);
@@ -1224,5 +1226,5 @@ static int parse_markup(Parser p)
 
     case '?':
-	return parse_pi(p, 0);
+	return parse_pi(p);
 
     case BADCHAR:
@@ -1322,5 +1324,5 @@ static int parse_endtag(Parser p)
 static int check_qualname_syntax(Parser p, const Char *name, const char *type)
 {
-    Char *t;
+    const Char *t;
 
     t = Strchr(name, ':'); 
@@ -1354,5 +1356,8 @@ static int check_qualname_syntax(Parser 
 static int parse_starttag(Parser p)
 {
-    int c, is_top_level = 0;
+    int c;
+#if not_yet
+    is_top_level = 0;
+#endif
     ElementDefinition e;
     AttributeDefinition d;
@@ -1370,5 +1375,7 @@ static int parse_starttag(Parser p)
 	    require(validate_dtd(p));
 	}
+#if not_yet
 	is_top_level = 1;
+#endif
     }
 
@@ -1541,7 +1548,4 @@ static int parse_starttag(Parser p)
 	/* check for required attributes */
 
-	AttributeDefinition d;
-	Attribute a;
-
 	for(d=NextAttributeDefinition(e, 0);
 	    d;
@@ -1658,5 +1662,5 @@ static int parse_starttag(Parser p)
 		if(a->definition == d)
 		{
-		    p->xbit.wsm = process_xml_space(p, a->value);
+		    p->xbit.wsm = process_xml_space(a->value);
 		    goto done;
 		}
@@ -1664,5 +1668,5 @@ static int parse_starttag(Parser p)
 	    if(d->default_type == DT_none || d->default_type == DT_fixed)
 	    {
-		p->xbit.wsm = process_xml_space(p, d->default_value);
+		p->xbit.wsm = process_xml_space(d->default_value);
 		goto done;
 	    }
@@ -2086,9 +2090,8 @@ static int parse_attribute(Parser p)
 }
 
-static WhiteSpaceMode process_xml_space(Parser p, const Char *value)
+static WhiteSpaceMode process_xml_space(const Char *value)
 {
     static Char _preserve[9] = {'p','r','e','s','e','r','v','e',0};
     static Char _default[8] = {'d','e','f','a','u','l','t',0};
-    Char buf[9];
     const Char *v;
     int i;
@@ -2102,7 +2105,5 @@ static WhiteSpaceMode process_xml_space(
 	if(!v[i] || is_xml_whitespace(v[i]))
 	    break;
-	buf[i] = v[i];
     }
-    buf[i] = '\0';
     for(; v[i]; i++)
 	if(!is_xml_whitespace(v[i]))
@@ -2204,5 +2205,5 @@ static int parse_pcdata(Parser p)
 	    {
 		s->next = next + 3;
-		require(parse_comment(p, 1, 0));
+		require(parse_comment(p, 1));
                 NF16StartCheck(p);
 		buflen = s->line_length;
@@ -2348,5 +2349,5 @@ static int parse_pcdata(Parser p)
 /* Called after reading '<!--'.  Won't go over an entity end. */
 
-static int parse_comment(Parser p, int skip, Entity ent)
+static int parse_comment(Parser p, int skip)
 {
     InputSource s = p->source;
@@ -2417,5 +2418,5 @@ static int parse_comment(Parser p, int s
 }
 
-static int parse_pi(Parser p, Entity ent)
+static int parse_pi(Parser p)
 {
     InputSource s = p->source;
@@ -2998,5 +2999,5 @@ static int process_xml_decl(Parser p)
     char8 *value;
     CharacterEncoding enc = CE_unknown;
-    Char c;
+    int c;
 
     /* 
@@ -3322,5 +3323,5 @@ static int parse_markupdecl(Parser p)
 	else if(looking_at(p, "?"))
 	{
-	    require(parse_pi(p, cur_ent));
+	    require(parse_pi(p));
 	    if(p->dtd_callback)
 		p->dtd_callback(&p->xbit, p->dtd_callback_arg);
@@ -3333,5 +3334,5 @@ static int parse_markupdecl(Parser p)
 	    if(ParserGetFlag(p, ReturnComments))
 	    {
-		require(parse_comment(p, 0, cur_ent));
+		require(parse_comment(p, 0));
 		if(p->dtd_callback)
 		    p->dtd_callback(&p->xbit, p->dtd_callback_arg);
@@ -3341,5 +3342,5 @@ static int parse_markupdecl(Parser p)
 	    }
 	    else
-		return parse_comment(p, 1, cur_ent);
+		return parse_comment(p, 1);
 	}
 	else if(p->state == PS_error)	/* looking_at may have set it */
@@ -4881,5 +4882,5 @@ static HashMapRetType check_id(const Has
     Parser p = (Parser)pp;
 
-    if(!(int)hash_get_value(id_entry))
+    if (hash_get_value(id_entry) != NULL)
 	validity_error(p,
 		       "The ID %.*S was referred to but never defined",
@@ -5351,17 +5352,19 @@ static int validate_attribute(Parser p, 
 	}
 
+#if 0
     if(a == e->xml_lang_attribute)
     {
 	require(validate_xml_lang_attribute(p, e, value));
     }
+#endif
 
     return 0;
 }
 
+#if 0
 static int validate_xml_lang_attribute(Parser p, ElementDefinition e, const Char *value)
 {
     /* 1.1 will allow empty xml:lang values (and maybe 1.0 will be amended
        to), and it no longer seems worth checking anything here. */
-#if 0
     const Char *t;
 
@@ -5404,7 +5407,7 @@ static int validate_xml_lang_attribute(P
     /* Not a validity error since erratum 73 */
     warn(p, "Dubious xml:lang attribute for element %S", e->name);
-#endif
     return 0;
 }
+#endif
 
 /* Check an attribute matches Name[s] or Nmtoken[s].
@@ -5518,5 +5521,5 @@ static int check_attribute_token(Parser 
 	if(!found)
 	{
-	    hash_set_value(id_entry, (void *)(a->type == AT_id));
+	    hash_set_value(id_entry, (void *)(intptr_t)(a->type == AT_id));
 	    if(ParserGetFlag(p, XMLNamespaces))
 		for(i=0; i<length; i++)
@@ -5528,5 +5531,5 @@ static int check_attribute_token(Parser 
 	else if(a->type == AT_id)
 	{
-	    int idinfo = (int)hash_get_value(id_entry);
+	    intptr_t idinfo = (intptr_t)hash_get_value(id_entry);
 	    if(idinfo & 1)
 	    {
