diff --git a/bin/mkpeep.pike b/bin/mkpeep.pike
index b52d5d295fb4d21de269e21641bdfd2e57dcac0f..1c6a994604befd72e46547b9a9a7c91808b1d4a9 100755
--- a/bin/mkpeep.pike
+++ b/bin/mkpeep.pike
@@ -2,7 +2,7 @@
 
 #pragma strict_types
 
-// $Id: mkpeep.pike,v 1.32 2003/04/01 00:52:02 nilsson Exp $
+// $Id: mkpeep.pike,v 1.33 2003/04/07 02:16:25 nilsson Exp $
 
 #define SKIPWHITE(X) sscanf(X, "%*[ \t\n]%s", X)
 
@@ -11,6 +11,35 @@ void err(string e, mixed ... a) {
   exit(1);
 }
 
+array(string) linebreak(array(string) tokens, int width) {
+  array(string) out = ({});
+  string line = "";
+  foreach(tokens, string token)
+    if(sizeof(line)+sizeof(token)<=width)
+      line += token;
+    else {
+      out += ({ line });
+      SKIPWHITE(token);
+      line = token;
+    }
+  if(line!="")
+    out += ({ line });
+  return out;
+}
+
+void make_multiline(string prefix, array(string)|string tokens,
+		    string suffix) {
+  if(stringp(tokens))
+    tokens = ((tokens/" ")/1)*({" "});
+  tokens += ({ suffix });
+  tokens = linebreak([array(string)]tokens, 80-sizeof(prefix));
+  foreach(tokens; int r; string line)
+    if(!r)
+      write("%s%s\n", prefix, line);
+    else
+      write("%*n%s\n", sizeof(prefix), line);
+}
+
 // Find the matching parenthesis
 int find_end(string s)
 {
@@ -196,6 +225,10 @@ class Rule {
 
     from = nt;
   }
+
+  string _sprintf(int t) {
+    return t=='O' ? ("Rule("+line+")") : 0;
+  }
 }
 
 // Replace $[0-9]+(o|a|b) with something a C compiler can understand.
@@ -292,22 +325,19 @@ void dump(array(Rule) data, int ind)
     write("%*n}\n", ind);
   }
 
-  /* Take care of whatever is left */
+  // Take care of whatever is left
   if(sizeof(data))
   {
     foreach(data, Rule d)
     {
-      write("%*n/* %s */\n", ind, d->line);
+      make_multiline(" "*ind+"/* ", d->line, " */");
 
       if(sizeof(d->from))
-      {
-	string test;
-	test=treat(d->from*" && ");
-	write("%*nif(%s)\n", ind, test);
-      }
+	make_multiline(" "*ind+"if(", treat(d->from*" && "), ")");
+
       write("%*n{\n", ind);
-      ind+=2;
-      write("%*ndo_optimization(%d,\n", ind, d->opcodes);
+      ind += 2;
+      array(string) opargs = ({ d->opcodes+", " });
 
       for(int i=0; i<sizeof(d->to); i++)
       {
@@ -319,17 +349,13 @@ void dump(array(Rule) data, int ind)
 	  args=explode_comma_expr(tmp[1..sizeof(tmp)-2]);
 	  i++;
 	}
-	write("%*n                %d,%s,%{(%s), %}\n",
-	      ind,
-	      sizeof(args)+1,
-	      fcode,
-	      Array.map(args,treat));
-
+	opargs += ({ sizeof(args)+1+", ", fcode+", " });
+	opargs += map(args,treat)[*]+", ";
       }
-      write("%*n                0);\n",ind);
+      make_multiline(" "*ind+"do_optimization(", opargs, "0);");
 
       write("%*ncontinue;\n", ind);
-      ind-=2;
+      ind -= 2;
       write("%*n}\n", ind, test);
     }
   }