diff --git a/bin/export.pike b/bin/export.pike
index 9065cfd196da9085fbf239e500d782d4bd9af828..84cd8f675e495cd864c9b4fa009fdc4f1a258168 100755
--- a/bin/export.pike
+++ b/bin/export.pike
@@ -1,6 +1,6 @@
 #!/usr/local/bin/pike
 
-/* $Id: export.pike,v 1.13 1997/12/28 09:27:41 hubbe Exp $ */
+/* $Id: export.pike,v 1.14 1998/02/24 22:48:11 hubbe Exp $ */
 
 #include <simulate.h>
 
@@ -106,7 +106,7 @@ int main(int argc, string *argv)
 		      x->hour,
 		      x->min);
 #else
-    string tag+="-rel"+rel;
+    tag+="-rel"+rel;
 #endif
 
     werror("Creating tag "+tag+" in the background.\n");
diff --git a/bin/mktestsuite b/bin/mktestsuite
index c7805e30abd1650aa6c8b8c0a9931ecd19500d8d..380435e7588047e6e906d646e7b8baa724afc8b1 100755
--- a/bin/mktestsuite
+++ b/bin/mktestsuite
@@ -106,6 +106,46 @@ test_false($2<=$1)
 test_true($2<=$2)
 test_true($1>=$1) ]])
 
+define([[test_cmp3]],[[
+test_cmp($1,$2)
+test_cmp($2,$3)
+test_cmp($1,$3)
+ test_true(`<($1,$2,$3))
+test_false(`<($1,$3,$2))
+test_false(`<($2,$3,$1))
+test_false(`<($2,$1,$3))
+test_false(`<($3,$1,$2))
+test_false(`<($3,$2,$1))
+test_false(`<($3,$2,$2,$1))
+
+ test_true(`<=($1,$2,$3))
+test_false(`<=($1,$3,$2))
+test_false(`<=($2,$3,$1))
+test_false(`<=($2,$1,$3))
+test_false(`<=($3,$1,$2))
+test_false(`<=($3,$2,$1))
+ test_true(`<=($1,$1,$2,$2,$3,$3))
+
+test_false(`>($1,$2,$3))
+test_false(`>($1,$3,$2))
+test_false(`>($2,$3,$1))
+test_false(`>($2,$1,$3))
+test_false(`>($3,$1,$2))
+ test_true(`>($3,$2,$1))
+test_false(`>($3,$2,$2,$1))
+
+test_false(`>=($1,$2,$3))
+test_false(`>=($1,$3,$2))
+test_false(`>=($2,$3,$1))
+test_false(`>=($2,$1,$3))
+test_false(`>=($3,$1,$2))
+ test_true(`>=($3,$2,$1))
+ test_true(`>=($3,$3,$2,$2,$1,$1))
+
+test_equal(min($2,$1,$3), $1)
+test_equal(max($2,$1,$3), $3)
+ ]])
+
 EOF
 
 cat $1
diff --git a/bin/test_pike.pike b/bin/test_pike.pike
index edd8a137f12108270bca16c239f42cb56ee90905..810d017fb2e532748854632339d50136c0e2aa78 100755
--- a/bin/test_pike.pike
+++ b/bin/test_pike.pike
@@ -1,6 +1,6 @@
 #!/usr/local/bin/pike
 
-/* $Id: test_pike.pike,v 1.5 1998/01/03 07:11:24 hubbe Exp $ */
+/* $Id: test_pike.pike,v 1.6 1998/02/24 22:48:13 hubbe Exp $ */
 
 #include <simulate.h>
 
@@ -8,7 +8,11 @@
 #define _verify_internals()
 #endif
 
-
+int foo(string opt)
+{
+  if(opt=="" || !opt) return 1;
+  return (int)opt;
+}
 int main(int argc, string *argv)
 {
   int e, verbose, successes, errors, t, check;
@@ -17,265 +21,229 @@ int main(int argc, string *argv)
   int start, fail, mem;
   int loop=1;
 
-  for(e=1;e<argc;e++)
-  {
-    string opt;
-    int arg;
-    arg=1;
-    if(sscanf(argv[e],"--%s=%d",opt,arg)==2)
-      opt="--"+opt;
-    else if(sscanf(argv[e],"-%s%d",opt,arg)==2)
-      opt="-"+opt;
-    else
-      opt=argv[e];
-    
-    switch(opt)
+  foreach(Getopt.find_all_options(argv,aggregate(
+    ({"help",Getopt.NO_ARG,({"-h","--help"})}),
+    ({"verbose",Getopt.NO_ARG,({"-v","--verbose"})}),
+    ({"start",Getopt.HAS_ARG,({"-s","--start-test"})}),
+    ({"fail",Getopt.MAY_HAVE_ARG,({"-f","--fail"})}),
+    ({"loop",Getopt.MAY_HAVE_ARG,({"-l","--loop"})}),
+    ({"trace",Getopt.MAY_HAVE_ARG,({"-t","--trace"})}),
+    ({"check",Getopt.MAY_HAVE_ARG,({"-c","--check"})}),
+    ({"mem",Getopt.MAY_HAVE_ARG,({"-m","--mem","--memory"})}),
+    )),array opt)
     {
-      case "-h":
-      case "--help":
-        perror("Usage: "+argv[e]+" [-v | --verbose] [-h | --help] [-t <testno>] <testfile>\n");
-        return 0;
-
-      case "-v":
-      case "--verbose":
-        verbose+=arg;
-        break;
-
-      case "-s":
-      case "--start-test":
-	start=arg;
-	start--;
-	break;
-
-      case "-f":
-      case "--fail":
-	fail+=arg;
-	break;
-
-
-      case "-l":
-      case "--loop":
-	loop+=arg;
-	break;
-
-      case "-t":
-      case "--trace":
-	t+=arg;
-	break;
-
-      case "-c":
-      case "--check":
-	check++;
-	break;
-
-
-      case "-m":
-      case "--mem":
-      case "--memory":
-	mem++;
-	break;
-
-      default:
-	if(tests)
-	{
-	  perror("Unknown argument: "+opt+".\n");
-	  exit(1);
-	}
-	tmp=read_bytes(argv[e]);
-	if(!tmp)
-	{
-	  perror("Failed to read test file, errno="+errno()+".\n");
-	  exit(1);
-	}
+      switch(opt[0])
+      {
+	case "help":
+	  werror("Usage: "+argv[e]+" [-v | --verbose] [-h | --help] [-t <testno>] <testfile>\n");
+	  return 0;
+
+	case "verbose": verbose+=foo(opt[1]); break;
+	case "start": start=foo(opt[1]); start--; break;
+	case "fail": fail+=foo(opt[1]); break;
+	case "loop": loop+=foo(opt[1]); break;
+	case "trace": t+=foo(opt[1]); break;
+	case "check": check+=foo(opt[1]); break;
+	case "mem": mem+=foo(opt[1]); break;
+      }
     }
-  }
 
-  if(!tmp)
+  argv=Getopt.get_args(argv,1);
+  if(sizeof(argv)<1)
   {
-    tmp=Stdio.stdin->read(0x7fffffff);
     if(!tmp)
     {
-      perror("Failed to read test file, errno="+errno()+".\n");
+      werror("No tests?\n");
       exit(1);
     }
   }
 
-
-  tests=tmp/"\n....\n";
-  tests=tests[0..sizeof(tests)-2];
-
   while(loop--)
   {
     successes=errors=0;
-
-    for(e=start;e<sizeof(tests);e++)
+    for(int f=1;f<sizeof(argv);f++)
     {
-      string test,condition;
-      int type;
-      object o;
-      mixed a,b;
-      
-      if(check) _verify_internals();
-      
-      test=tests[e];	
-      if(sscanf(test,"COND %s\n%s",condition,test)==2)
+      tmp=read_bytes(argv[f]);
+      if(!tmp)
       {
-	if(!clone(compile_string("mixed c() { return "+condition+"; }","Cond "+(e+1)))->c())
-	{
-	  if(verbose)
-	    perror("Not doing test "+(e+1)+"\n");
-	  successes++;
-	  continue;
-	}
+	werror("Failed to read test file, errno="+errno()+".\n");
+	exit(1);
       }
       
-      sscanf(test,"%s\n%s",type,test);
-      sscanf(type,"%*s expected result: %s",type);
+      tests=tmp/"\n....\n";
+      tmp=0;
+      tests=tests[0..sizeof(tests)-2];
       
-      if(verbose)
-      {
-	perror("Doing test "+(e+1)+"\n");
-	if(verbose>1)
-	  perror(test+"\n");
-      }
+      werror("Doing tests in %s (%d tests)\n",argv[f],sizeof(tests));
       
-      if(check > 1) _verify_internals();
       
-      switch(type)
+      for(e=start;e<sizeof(tests);e++)
       {
-      case "COMPILE_ERROR":
-	master()->set_inhibit_compile_errors(1);
-	if(catch(compile_string(test,"Test "+(e+1))))
-	{
-	  successes++;
-	}else{
-	  perror("Test "+(e+1)+" failed.\n");
-	  perror(test+"\n");
-	  errors++;
-	}
-	master()->set_inhibit_compile_errors(0);
-	break;
+	string test,condition;
+	int type;
+	object o;
+	mixed a,b;
+	
+	if(check) _verify_internals();
 	
-      case "EVAL_ERROR":
-	master()->set_inhibit_compile_errors(1);
-	if(catch(clone(compile_string(test,"Test "+(e+1)))->a()))
+	test=tests[e];	
+	if(sscanf(test,"COND %s\n%s",condition,test)==2)
 	{
-	  successes++;
-	}else{
-	  perror("Test "+(e+1)+" failed.\n");
-	  perror(test+"\n");
-	  errors++;
+	  if(!clone(compile_string("mixed c() { return "+condition+"; }","Cond "+(e+1)))->c())
+	  {
+	    if(verbose)
+	      werror("Not doing test "+(e+1)+"\n");
+	    successes++;
+	    continue;
+	  }
 	}
-	master()->set_inhibit_compile_errors(0);
-	break;
 	
-      default:
-	o=clone(compile_string(test,"Test "+(e+1)));
-	
-	if(check > 1) _verify_internals();
+	sscanf(test,"%s\n%s",type,test);
+	sscanf(type,"%*s expected result: %s",type);
 	
-	a=b=0;
-	if(t) trace(t);
-	if(functionp(o->a)) a=o->a();
-	if(functionp(o->b)) b=o->b();
-	if(t) trace(0);
+	if(verbose)
+	{
+	  werror("Doing test "+(e+1)+"\n");
+	  if(verbose>1)
+	    werror(test+"\n");
+	}
 	
 	if(check > 1) _verify_internals();
 	
 	switch(type)
 	{
-	case "FALSE":
-	  a=!a;
-	  
-	case "TRUE":
-	  if(!a)
-	  {
-	    perror("Test "+(e+1)+" failed.\n");
-	    perror(test+"\n");
-	    errors++;
-	  }else{
-	    successes++;
-	  }
-	  break;
-	  
-	case "RUN":
-	  successes++;
-	  break;
-	  
-	case "EQ":
-	  if(a!=b)
-	  {
-	    perror("Test "+(e+1)+" failed.\n");
-	    perror(test+"\n");
-	    perror(sprintf("o->a(): %O\n",a));
-	    perror(sprintf("o->b(): %O\n",b));
-	    errors++;
-	  }else{
-	    successes++;
-	  }
-	  break;
-	  
-	case "EQUAL":
-	  if(!equal(a,b))
-	  {
-	    perror("Test "+(e+1)+" failed.\n");
-	    perror(test+"\n");
-	    perror(sprintf("o->a(): %O\n",a));
-	    perror(sprintf("o->b(): %O\n",b));
-	    errors++;
-	  }else{
-	    successes++;
-	  }
-	  break;
-	  
-	default:
-	  perror(sprintf("Unknown test type (%O).\n",type));
-	  errors++;
+	  case "COMPILE_ERROR":
+	    master()->set_inhibit_compile_errors(1);
+	    if(catch(compile_string(test,"Test "+(e+1))))
+	    {
+	      successes++;
+	    }else{
+	      werror("Test "+(e+1)+" failed.\n");
+	      werror(test+"\n");
+	      errors++;
+	    }
+	    master()->set_inhibit_compile_errors(0);
+	    break;
+	    
+	  case "EVAL_ERROR":
+	    master()->set_inhibit_compile_errors(1);
+	    if(catch(clone(compile_string(test,"Test "+(e+1)))->a()))
+	    {
+	      successes++;
+	    }else{
+	      werror("Test "+(e+1)+" failed.\n");
+	      werror(test+"\n");
+	      errors++;
+	    }
+	    master()->set_inhibit_compile_errors(0);
+	    break;
+	    
+	  default:
+	    o=clone(compile_string(test,"Test "+(e+1)));
+	    
+	    if(check > 1) _verify_internals();
+	    
+	    a=b=0;
+	    if(t) trace(t);
+	    if(functionp(o->a)) a=o->a();
+	    if(functionp(o->b)) b=o->b();
+	    if(t) trace(0);
+	    
+	    if(check > 1) _verify_internals();
+	    
+	    switch(type)
+	    {
+	      case "FALSE":
+		a=!a;
+		
+	      case "TRUE":
+		if(!a)
+		{
+		  werror("Test "+(e+1)+" failed.\n");
+		  werror(test+"\n");
+		  errors++;
+		}else{
+		  successes++;
+		}
+		break;
+		
+	      case "RUN":
+		successes++;
+		break;
+		
+	      case "EQ":
+		if(a!=b)
+		{
+		  werror("Test "+(e+1)+" failed.\n");
+		  werror(test+"\n");
+		  werror(sprintf("o->a(): %O\n",a));
+		  werror(sprintf("o->b(): %O\n",b));
+		  errors++;
+		}else{
+		  successes++;
+		}
+		break;
+		
+	      case "EQUAL":
+		if(!equal(a,b))
+		{
+		  werror("Test "+(e+1)+" failed.\n");
+		  werror(test+"\n");
+		  werror(sprintf("o->a(): %O\n",a));
+		  werror(sprintf("o->b(): %O\n",b));
+		  errors++;
+		}else{
+		  successes++;
+		}
+		break;
+		
+	      default:
+		werror(sprintf("Unknown test type (%O).\n",type));
+		errors++;
+	    }
 	}
+	
+	if(check > 2) _verify_internals();
+	
+	if(fail && errors)
+	  exit(1);
+	
+	a=b=0;
       }
       
-      if(check > 2) _verify_internals();
-      
-      if(fail && errors)
-	exit(1);
+      if(errors || verbose)
+      {
+	werror("Failed tests: "+errors+".\n");
+      }
       
-      a=b=0;
-    }
-    
-    if(errors + successes != sizeof(tests))
-    {
-      perror("Errors + Successes != number of tests!\n");
-      errors++;
     }
-    
-    if(errors || verbose)
+    if(mem)
     {
-      perror("Failed tests: "+errors+".\n");
+      int total;
+      tests=0;
+      gc();
+      mapping tmp=_memory_usage();
+      write(sprintf("%-10s: %6s %10s\n","Category","num","bytes"));
+      foreach(sort(indices(tmp)),string foo)
+	{
+	  if(sscanf(foo,"%s_bytes",foo))
+	  {
+	    write(sprintf("%-10s: %6d %10d\n",
+			  foo+"s",
+			  tmp["num_"+foo+"s"],
+			  tmp[foo+"_bytes"]));
+	    total+=tmp[foo+"_bytes"];
+	  }
+	}
+      write(sprintf("%-10s: %6s %10d\n",
+		    "Total",
+		    "",
+		    total));
     }
-    
   }
-  if(mem)
+  if(verbose)
   {
-    int total;
-    tests=0;
-    gc();
-    mapping tmp=_memory_usage();
-    write(sprintf("%-10s: %6s %10s\n","Category","num","bytes"));
-    foreach(sort(indices(tmp)),string foo)
-    {
-      if(sscanf(foo,"%s_bytes",foo))
-      {
-	write(sprintf("%-10s: %6d %10d\n",
-		      foo+"s",
-		      tmp["num_"+foo+"s"],
-		      tmp[foo+"_bytes"]));
-	total+=tmp[foo+"_bytes"];
-      }
-    }
-    write(sprintf("%-10s: %6s %10d\n",
-		  "Total",
-		  "",
-		  total));
+    werror("Total tests: %d\n",successes+errors);
   }
 
   return errors;