Index: runtime/utilities.c
===================================================================
--- runtime/utilities.c	(revision 395)
+++ runtime/utilities.c	(working copy)
@@ -93,7 +93,7 @@
     * slot = (*p & 0xF) << 12 | (b1 & 0x3F) << 6 | (b0 & 0x3F); return 3;
 }
 
-extern int in_grouping_U(struct SN_env * z, unsigned char * s, int min, int max) {
+extern int in_grouping_U(struct SN_env * z, const unsigned char * s, int min, int max) {
     int ch;
     int w = get_utf8(z->p, z->c, z->l, & ch);
     unless (w) return 0;
@@ -101,7 +101,7 @@
     z->c += w; return 1;
 }
 
-extern int in_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max) {
+extern int in_grouping_b_U(struct SN_env * z, const unsigned char * s, int min, int max) {
     int ch;
     int w = get_b_utf8(z->p, z->c, z->lb, & ch);
     unless (w) return 0;
@@ -109,7 +109,7 @@
     z->c -= w; return 1;
 }
 
-extern int out_grouping_U(struct SN_env * z, unsigned char * s, int min, int max) {
+extern int out_grouping_U(struct SN_env * z, const unsigned char * s, int min, int max) {
     int ch;
     int w = get_utf8(z->p, z->c, z->l, & ch);
     unless (w) return 0;
@@ -117,7 +117,7 @@
     z->c += w; return 1;
 }
 
-extern int out_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max) {
+extern int out_grouping_b_U(struct SN_env * z, const unsigned char * s, int min, int max) {
     int ch;
     int w = get_b_utf8(z->p, z->c, z->lb, & ch);
     unless (w) return 0;
@@ -127,7 +127,7 @@
 
 /* Code for character groupings: non-utf8 cases */
 
-extern int in_grouping(struct SN_env * z, unsigned char * s, int min, int max) {
+extern int in_grouping(struct SN_env * z, const unsigned char * s, int min, int max) {
     int ch;
     if (z->c >= z->l) return 0;
     ch = z->p[z->c];
@@ -135,7 +135,7 @@
     z->c++; return 1;
 }
 
-extern int in_grouping_b(struct SN_env * z, unsigned char * s, int min, int max) {
+extern int in_grouping_b(struct SN_env * z, const unsigned char * s, int min, int max) {
     int ch;
     if (z->c <= z->lb) return 0;
     ch = z->p[z->c - 1];
@@ -143,7 +143,7 @@
     z->c--; return 1;
 }
 
-extern int out_grouping(struct SN_env * z, unsigned char * s, int min, int max) {
+extern int out_grouping(struct SN_env * z, const unsigned char * s, int min, int max) {
     int ch;
     if (z->c >= z->l) return 0;
     ch = z->p[z->c];
@@ -151,7 +151,7 @@
     z->c++; return 1;
 }
 
-extern int out_grouping_b(struct SN_env * z, unsigned char * s, int min, int max) {
+extern int out_grouping_b(struct SN_env * z, const unsigned char * s, int min, int max) {
     int ch;
     if (z->c <= z->lb) return 0;
     ch = z->p[z->c - 1];
@@ -159,25 +159,25 @@
     z->c--; return 1;
 }
 
-extern int eq_s(struct SN_env * z, int s_size, symbol * s) {
+extern int eq_s(struct SN_env * z, int s_size, const symbol * s) {
     if (z->l - z->c < s_size || memcmp(z->p + z->c, s, s_size * sizeof(symbol)) != 0) return 0;
     z->c += s_size; return 1;
 }
 
-extern int eq_s_b(struct SN_env * z, int s_size, symbol * s) {
+extern int eq_s_b(struct SN_env * z, int s_size, const symbol * s) {
     if (z->c - z->lb < s_size || memcmp(z->p + z->c - s_size, s, s_size * sizeof(symbol)) != 0) return 0;
     z->c -= s_size; return 1;
 }
 
-extern int eq_v(struct SN_env * z, symbol * p) {
+extern int eq_v(struct SN_env * z, const symbol * p) {
     return eq_s(z, SIZE(p), p);
 }
 
-extern int eq_v_b(struct SN_env * z, symbol * p) {
+extern int eq_v_b(struct SN_env * z, const symbol * p) {
     return eq_s_b(z, SIZE(p), p);
 }
 
-extern int find_among(struct SN_env * z, struct among * v, int v_size) {
+extern int find_among(struct SN_env * z, const struct among * v, int v_size) {
 
     int i = 0;
     int j = v_size;
@@ -185,7 +185,7 @@
     int c = z->c; int l = z->l;
     symbol * q = z->p + c;
 
-    struct among * w;
+    const struct among * w;
 
     int common_i = 0;
     int common_j = 0;
@@ -237,7 +237,7 @@
 
 /* find_among_b is for backwards processing. Same comments apply */
 
-extern int find_among_b(struct SN_env * z, struct among * v, int v_size) {
+extern int find_among_b(struct SN_env * z, const struct among * v, int v_size) {
 
     int i = 0;
     int j = v_size;
@@ -245,7 +245,7 @@
     int c = z->c; int lb = z->lb;
     symbol * q = z->p + c - 1;
 
-    struct among * w;
+    const struct among * w;
 
     int common_i = 0;
     int common_j = 0;
@@ -362,12 +362,12 @@
     return 0;
 }
 
-extern int slice_from_s(struct SN_env * z, int s_size, symbol * s) {
+extern int slice_from_s(struct SN_env * z, int s_size, const symbol * s) {
     if (slice_check(z)) return -1;
     return replace_s(z, z->bra, z->ket, s_size, s, NULL);
 }
 
-extern int slice_from_v(struct SN_env * z, symbol * p) {
+extern int slice_from_v(struct SN_env * z, const symbol * p) {
     return slice_from_s(z, SIZE(p), p);
 }
 
@@ -375,7 +375,7 @@
     return slice_from_s(z, 0, 0);
 }
 
-extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, symbol * s) {
+extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, const symbol * s) {
     int adjustment;
     if (replace_s(z, bra, ket, s_size, s, &adjustment))
         return -1;
@@ -384,7 +384,7 @@
     return 0;
 }
 
-extern int insert_v(struct SN_env * z, int bra, int ket, symbol * p) {
+extern int insert_v(struct SN_env * z, int bra, int ket, const symbol * p) {
     int adjustment;
     if (replace_s(z, bra, ket, SIZE(p), p, &adjustment))
         return -1;
Index: runtime/header.h
===================================================================
--- runtime/header.h	(revision 395)
+++ runtime/header.h	(working copy)
@@ -14,7 +14,7 @@
 
 struct among
 {   int s_size;     /* number of chars in string */
-    symbol * s;       /* search string */
+    const symbol * s;       /* search string */
     int substring_i;/* index to longest matching substring */
     int result;     /* result of the lookup */
     int (* function)(struct SN_env *);
@@ -25,31 +25,31 @@
 
 extern int skip_utf8(const symbol * p, int c, int lb, int l, int n);
 
-extern int in_grouping_U(struct SN_env * z, unsigned char * s, int min, int max);
-extern int in_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max);
-extern int out_grouping_U(struct SN_env * z, unsigned char * s, int min, int max);
-extern int out_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max);
-
-extern int in_grouping(struct SN_env * z, unsigned char * s, int min, int max);
-extern int in_grouping_b(struct SN_env * z, unsigned char * s, int min, int max);
-extern int out_grouping(struct SN_env * z, unsigned char * s, int min, int max);
-extern int out_grouping_b(struct SN_env * z, unsigned char * s, int min, int max);
-
-extern int eq_s(struct SN_env * z, int s_size, symbol * s);
-extern int eq_s_b(struct SN_env * z, int s_size, symbol * s);
-extern int eq_v(struct SN_env * z, symbol * p);
-extern int eq_v_b(struct SN_env * z, symbol * p);
+extern int in_grouping_U(struct SN_env * z, const unsigned char * s, int min, int max);
+extern int in_grouping_b_U(struct SN_env * z, const unsigned char * s, int min, int max);
+extern int out_grouping_U(struct SN_env * z, const unsigned char * s, int min, int max);
+extern int out_grouping_b_U(struct SN_env * z, const unsigned char * s, int min, int max);
+
+extern int in_grouping(struct SN_env * z, const unsigned char * s, int min, int max);
+extern int in_grouping_b(struct SN_env * z, const unsigned char * s, int min, int max);
+extern int out_grouping(struct SN_env * z, const unsigned char * s, int min, int max);
+extern int out_grouping_b(struct SN_env * z, const unsigned char * s, int min, int max);
+
+extern int eq_s(struct SN_env * z, int s_size, const symbol * s);
+extern int eq_s_b(struct SN_env * z, int s_size, const symbol * s);
+extern int eq_v(struct SN_env * z, const symbol * p);
+extern int eq_v_b(struct SN_env * z, const symbol * p);
 
-extern int find_among(struct SN_env * z, struct among * v, int v_size);
-extern int find_among_b(struct SN_env * z, struct among * v, int v_size);
+extern int find_among(struct SN_env * z, const struct among * v, int v_size);
+extern int find_among_b(struct SN_env * z, const struct among * v, int v_size);
 
 extern int replace_s(struct SN_env * z, int c_bra, int c_ket, int s_size, const symbol * s, int * adjustment);
-extern int slice_from_s(struct SN_env * z, int s_size, symbol * s);
-extern int slice_from_v(struct SN_env * z, symbol * p);
+extern int slice_from_s(struct SN_env * z, int s_size, const symbol * s);
+extern int slice_from_v(struct SN_env * z, const symbol * p);
 extern int slice_del(struct SN_env * z);
 
-extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, symbol * s);
-extern int insert_v(struct SN_env * z, int bra, int ket, symbol * p);
+extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, const symbol * s);
+extern int insert_v(struct SN_env * z, int bra, int ket, const symbol * p);
 
 extern symbol * slice_to(struct SN_env * z, symbol * p);
 extern symbol * assign_to(struct SN_env * z, symbol * p);
Index: compiler/generator.c
===================================================================
--- compiler/generator.c	(revision 395)
+++ compiler/generator.c	(working copy)
@@ -108,7 +108,7 @@
     if (SIZE(p) == 0) ws(g, "0"); else {
         struct str * s = g->outbuf;
         g->outbuf = g->declarations;
-        ws(g, "static symbol s_"); wi(g, g->literalstring_count); ws(g, "[] = ");
+        ws(g, "static const symbol s_"); wi(g, g->literalstring_count); ws(g, "[] = ");
         wlitarray(g, p);
         ws(g, ";\n");
         g->outbuf = s;
@@ -1050,13 +1050,13 @@
             g->I[2] = v->size;
             g->L[0] = v->b;
             unless (v->size == 0)
-                w(g, "static symbol s_~I0_~I1[~I2] = ~A0;~N");
+                w(g, "static const symbol s_~I0_~I1[~I2] = ~A0;~N");
             v++;
         }
     }
 
     g->I[1] = x->literalstring_count;
-    w(g, "~N~Mstatic struct among a_~I0[~I1] =~N{~N");
+    w(g, "~N~Mstatic const struct among a_~I0[~I1] =~N{~N");
 
     v = x->b;
     {
@@ -1105,7 +1105,7 @@
     {
         g->V[0] = q->name;
 
-        w(g, "static unsigned char ~V0[] = { ");
+        w(g, "static const unsigned char ~V0[] = { ");
         for (i = 0; i < size; i++) {
              wi(g, map[i]);
              if (i < size - 1) w(g, ", ");
