Home Manual Packages Global Index Keywords Quick Reference |
    /*
       TESTP.I
       Test of Yorick parser

       $Id: testp.i,v 1.1 1993/08/27 18:50:06 munro Exp munro $
     */
    /*    Copyright (c) 1994.  The Regents of the University of California.
                        All rights reserved.  */

    goofs= 0;  /* cumulative tally of errors detected */
    write, "Begin Yorick parser test...";

    if (do_stats) "A "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    /* First function is pure parser test, exercising many yucky language
       features, but not producing any usable procedure.  Check disassembled
       function to be sure code is correct.  */
    func parser_test(pos1, pos2, pos3, .., key1=, key2=, key3=)
    {
      pos1= '\0';
      pos2= 1s;
      pos3= 2n;
      loc1= 3L;
      loc2= 4.0e0F;
      loc3= 5.0;
      loc4= 6.0i;
      loc5= "A string with ' and /* inside.";

      /* Blank lines, then a short comment with imbedded " character */

      /* A multiline comment with blank lines and various types of
         quote characters,

         such as " and ',

         all of which should be completely ignored... */

    #if 0
    Try commenting something out with #if 0/#endif sequence
    #  if 0
         These should nest properly...
    #  endif
    ...So this line should still be commented out.
    #endif
    #  if 0
      Be sure indented style works.
    #  endif

    // Comment out something with C++-style comment
                // ... and another comment
    /*
    // Nested comment test
    terrible syntax error
    */
    //  first commented out line;  /* nested normal comment */
    //  second bad line;
    //   third bad line;
    //   fourth bad line;   /* final nested comment

      key1= pos3;   // C++ comment
      /* initial comment */ key2 /* imbedded comment */ = 0 /* repeated

         constant */ + 6.;  /* followed by a second repeated constant */

      key3= ext1;  /* first example of an external variable // nest test */

      local loc6;  local loc7, loc8, loc9;  // C++ style comment /* nesting */
      extern ext2, ext3;  extern ext4;

      ext2= -1;  /* negative of existing constant */
      loc6= - /* nasty imbedded
    	     comment */ 7.0;

      ext3= "multiline string also tests escape sequences: \
    \\n\n, \\t\t, \\a\a, \\f\f, \\r\r, \\v\v, \\b\b, \', \"\n\
    \?, \q, C-a\1, C-b\02, C-c\003, C-d\0041 (should C-d1), C-z\x1A,\
    DEL\x7f";  /* Note: \? and \q should just give ? and q */

      loc7= ext4+1;
      loc8= ext5();   /* should push nil argument */
      ext5(pos1);
      ext5(pos1, key1, loc1);
      ext5(pos1, key1, .., loc1);
      ext5;
      ext5, pos1;
      ext5, pos1, key1, loc1, ext1, /* final argument nil */;

      /* Try lines with implicit semi-colon terminators: */
      loc7(3:, 6*loc1+loc2, ::loc2+loc3)=
        5
      loc8= loc7 + 7*
        loc6(3,
    	 )

      if (loc1) ext5
      else ext5, 1

      if (loc1) ext5
      ext5, 1

      /* Try several popular styles */
      if (loc1) {
        ext3;
      } else if (!loc2) {
        ext3, 1;
      } else if (loc3) {
        ext3, 1;
        ext3, 2;
      } else {
        ext3, 3;
      }

      if (loc1)
      {
        ext4;
      }
      else if (loc2)
      {
        ext4, 1;
      }
      else if (!loc3)
      {
        ext4, 1;
        ext4, 2;
      }
      else
      {
        ext4, 3;
      }

      if (!loc1) ext5;
      else if (loc2) ext5, 1;
      else if (loc3) { ext5, 1; ext5, 2; }
      else ext5, 3;

      while (loc1--) {
        ext6;
        ext6, 2;
      };            /* check that extraneous trailing semi-colon is OK */

     backward:
      do {
        ext6;
        if (ext1) break;
        if (ext2) continue;
        ext6, 2;
      } while (--loc1);

      if (ext6) goto forward;
      if (ext3) goto backward;

      for (loc1=0 ; loc1<8 ; loc1++) {
        ext5;
        ext5, 2;
      }

     forward:
      for (loc1=0, loc2=loc3=0 ;
           loc1<8 ;
           loc1++, loc2+=2, loc3+=3) {
        if (ext4>=9) continue;
        ext5;
        do {
          ext6;
          if (ext1!=3) break;
          for (loc1=0 ; loc1<8 ; loc1++) {
    	ext5;
    	if (ext3<=2) break;
    	if (ext4==7) continue;
    	if (!ext1) goto inloop;
    	ext5, 2;
          }
          if (ext2) continue;
          ext6, 2;
        } while (--loc1);
        if (ext3>3) break;
        ext5, 2;
      inloop:
      }

      if (loc1 || loc2 && loc3) goto backward;

      return 3*loc1(3:12:3, ptp, avg:9:21)? 3+ext1 : 2-ext2;
    }

    if (do_stats) "B "+print(yorick_stats());

    #if 0

    Here is the correct disassemble output for parser_test:
    func parser_test(pos1,pos2,pos3,..,key1=,key2=,key3=)
      17 sp->1    PushChar(0x00)
      19 sp0>1    Define(pos1)
      21 sp->0    DropTop
      22 sp+>1    PushShort(1)
      24 sp0>1    Define(pos2)
      26 sp->0    DropTop
      27 sp+>1    PushInt(2)
      29 sp0>1    Define(pos3)
      31 sp->0    DropTop
      32 sp+>1    PushLong(3)
      34 sp0>1    Define(loc1)
      36 sp->0    DropTop
      37 sp+>1    PushFloat(4)
      39 sp0>1    Define(loc2)
      41 sp->0    DropTop
      42 sp+>1    PushDouble(5)
      44 sp0>1    Define(loc3)
      46 sp->0    DropTop
      47 sp+>1    PushImaginary(6i)
      49 sp0>1    Define(loc4)
      51 sp->0    DropTop
      52 sp+>1    PushString("A string with ' and /* i"...)
      54 sp0>1    Define(loc5)
      56 sp->0    DropTop
      57 sp+>1    PushVariable(pos3)
      59 sp0>1    Define(key1)
      61 sp->0    DropTop
      62 sp+>1    PushLong(0)
      64 sp+>2    PushDouble(6)
      66 sp->1    Add
      67 sp0>1    Define(key2)
      69 sp->0    DropTop
      70 sp+>1    PushVariable(ext1)
      72 sp0>1    Define(key3)
      74 sp->0    DropTop
      75 sp+>1    PushLong(-1)
      77 sp0>1    Define(ext2)
      79 sp->0    DropTop
      80 sp+>1    PushDouble(-7)
      82 sp0>1    Define(loc6)
      84 sp->0    DropTop
      85 sp+>1    PushString("multiline string also te"...)
      87 sp0>1    Define(ext3)
      89 sp->0    DropTop
      90 sp+>1    PushVariable(ext4)
      92 sp+>2    PushLong(1)
      94 sp->1    Add
      95 sp0>1    Define(loc7)
      97 sp->0    DropTop
      98 sp+>1    PushVariable(ext5)
     100 sp+>2    PushNil
     101 sp->1    Eval(1)
     103 sp0>1    Define(loc8)
     105 sp->0    DropTop
     106 sp+>1    PushVariable(ext5)
     108 sp+>2    PushReference(pos1)
     110 sp->1    Eval(1)
     112 sp0>1    Print
     113 sp->0    DropTop
     114 sp+>1    PushVariable(ext5)
     116 sp+>2    PushReference(pos1)
     118 sp+>3    PushReference(key1)
     120 sp+>4    PushReference(loc1)
     122 sp->1    Eval(3)
     124 sp0>1    Print
     125 sp->0    DropTop
     126 sp+>1    PushVariable(ext5)
     128 sp+>2    PushReference(pos1)
     130 sp+>3    PushReference(key1)
     132 sp+>4    FormRangeFlag(..)
     134 sp+>5    PushReference(loc1)
     136 sp->1    Eval(4)
     138 sp0>1    Print
     139 sp->0    DropTop
     140 sp+>1    PushVariable(ext5)
     142 sp0>1    Print
     143 sp->0    DropTop
     144 sp+>1    PushVariable(ext5)
     146 sp+>2    PushReference(pos1)
     148 sp->1    Eval(1)
     150 sp->0    DropTop
     151 sp+>1    PushVariable(ext5)
     153 sp+>2    PushReference(pos1)
     155 sp+>3    PushReference(key1)
     157 sp+>4    PushReference(loc1)
     159 sp+>5    PushReference(ext1)
     161 sp+>6    PushNil
     162 sp->1    Eval(5)
     164 sp->0    DropTop
     165 sp+>1    PushVariable(loc7)
     167 sp+>2    PushLong(3)
     169 sp+>3    PushNil
     170 sp->2    FormRange(2)
     172 sp+>3    PushLong(6)
     174 sp+>4    PushVariable(loc1)
     176 sp->3    Multiply
     177 sp+>4    PushVariable(loc2)
     179 sp->3    Add
     180 sp+>4    PushNil
     181 sp+>5    PushNil
     182 sp+>6    PushVariable(loc2)
     184 sp+>7    PushVariable(loc3)
     186 sp->6    Add
     187 sp->4    FormRange(3)
     189 sp->1    Eval(3)
     191 sp+>2    PushLong(5)
     193 sp->1    Assign
     194 sp->0    DropTop
     195 sp+>1    PushVariable(loc7)
     197 sp+>2    PushLong(7)
     199 sp+>3    PushVariable(loc6)
     201 sp+>4    PushLong(3)
     203 sp+>5    PushNil
     204 sp->3    Eval(2)
     206 sp->2    Multiply
     207 sp->1    Add
     208 sp0>1    Define(loc8)
     210 sp->0    DropTop
     211 sp+>1    PushVariable(loc1)
     213 sp->0    BranchFalse to pc= 221
     215 sp+>1    PushVariable(ext5)
     217 sp0>1    Print
     218 sp->0    DropTop
     219 sp0>0    Branch to pc= 228
     221 sp+>1    PushVariable(ext5)
     223 sp+>2    PushLong(1)
     225 sp->1    Eval(1)
     227 sp->0    DropTop
     228 sp+>1    PushVariable(loc1)
     230 sp->0    BranchFalse to pc= 236
     232 sp+>1    PushVariable(ext5)
     234 sp0>1    Print
     235 sp->0    DropTop
     236 sp+>1    PushVariable(ext5)
     238 sp+>2    PushLong(1)
     240 sp->1    Eval(1)
     242 sp->0    DropTop
     243 sp+>1    PushVariable(loc1)
     245 sp->0    BranchFalse to pc= 253
     247 sp+>1    PushVariable(ext3)
     249 sp0>1    Print
     250 sp->0    DropTop
     251 sp0>0    Branch to pc= 293
     253 sp+>1    PushVariable(loc2)
     255 sp->0    BranchTrue to pc= 266
     257 sp+>1    PushVariable(ext3)
     259 sp+>2    PushLong(1)
     261 sp->1    Eval(1)
     263 sp->0    DropTop
     264 sp0>0    Branch to pc= 293
     266 sp+>1    PushVariable(loc3)
     268 sp->0    BranchFalse to pc= 286
     270 sp+>1    PushVariable(ext3)
     272 sp+>2    PushLong(1)
     274 sp->1    Eval(1)
     276 sp->0    DropTop
     277 sp+>1    PushVariable(ext3)
     279 sp+>2    PushLong(2)
     281 sp->1    Eval(1)
     283 sp->0    DropTop
     284 sp0>0    Branch to pc= 293
     286 sp+>1    PushVariable(ext3)
     288 sp+>2    PushLong(3)
     290 sp->1    Eval(1)
     292 sp->0    DropTop
     293 sp+>1    PushVariable(loc1)
     295 sp->0    BranchFalse to pc= 303
     297 sp+>1    PushVariable(ext4)
     299 sp0>1    Print
     300 sp->0    DropTop
     301 sp0>0    Branch to pc= 343
     303 sp+>1    PushVariable(loc2)
     305 sp->0    BranchFalse to pc= 316
     307 sp+>1    PushVariable(ext4)
     309 sp+>2    PushLong(1)
     311 sp->1    Eval(1)
     313 sp->0    DropTop
     314 sp0>0    Branch to pc= 343
     316 sp+>1    PushVariable(loc3)
     318 sp->0    BranchTrue to pc= 336
     320 sp+>1    PushVariable(ext4)
     322 sp+>2    PushLong(1)
     324 sp->1    Eval(1)
     326 sp->0    DropTop
     327 sp+>1    PushVariable(ext4)
     329 sp+>2    PushLong(2)
     331 sp->1    Eval(1)
     333 sp->0    DropTop
     334 sp0>0    Branch to pc= 343
     336 sp+>1    PushVariable(ext4)
     338 sp+>2    PushLong(3)
     340 sp->1    Eval(1)
     342 sp->0    DropTop
     343 sp+>1    PushVariable(loc1)
     345 sp->0    BranchTrue to pc= 353
     347 sp+>1    PushVariable(ext5)
     349 sp0>1    Print
     350 sp->0    DropTop
     351 sp0>0    Branch to pc= 393
     353 sp+>1    PushVariable(loc2)
     355 sp->0    BranchFalse to pc= 366
     357 sp+>1    PushVariable(ext5)
     359 sp+>2    PushLong(1)
     361 sp->1    Eval(1)
     363 sp->0    DropTop
     364 sp0>0    Branch to pc= 393
     366 sp+>1    PushVariable(loc3)
     368 sp->0    BranchFalse to pc= 386
     370 sp+>1    PushVariable(ext5)
     372 sp+>2    PushLong(1)
     374 sp->1    Eval(1)
     376 sp->0    DropTop
     377 sp+>1    PushVariable(ext5)
     379 sp+>2    PushLong(2)
     381 sp->1    Eval(1)
     383 sp->0    DropTop
     384 sp0>0    Branch to pc= 393
     386 sp+>1    PushVariable(ext5)
     388 sp+>2    PushLong(3)
     390 sp->1    Eval(1)
     392 sp->0    DropTop
     393 sp+>1    PushVariable(loc1)
     395 sp+>2    Push1
     396 sp+>3    DupUnder
     397 sp->2    Subtract
     398 sp0>2    Define(loc1)
     400 sp->1    DropTop
     401 sp->0    BranchFalse to pc= 416
     403 sp+>1    PushVariable(ext6)
     405 sp0>1    Print
     406 sp->0    DropTop
     407 sp+>1    PushVariable(ext6)
     409 sp+>2    PushLong(2)
     411 sp->1    Eval(1)
     413 sp->0    DropTop
     414 sp0>0    Branch to pc= 393
     416 sp+>1    PushVariable(ext6)
     418 sp0>1    Print
     419 sp->0    DropTop
     420 sp+>1    PushVariable(ext1)
     422 sp->0    BranchFalse to pc= 426
     424 sp0>0    Branch to pc= 447
     426 sp+>1    PushVariable(ext2)
     428 sp->0    BranchFalse to pc= 432
     430 sp0>0    Branch to pc= 439
     432 sp+>1    PushVariable(ext6)
     434 sp+>2    PushLong(2)
     436 sp->1    Eval(1)
     438 sp->0    DropTop
     439 sp+>1    PushVariable(loc1)
     441 sp+>2    Push1
     442 sp->1    Subtract
     443 sp0>1    Define(loc1)
     445 sp->0    BranchTrue to pc= 416
     447 sp+>1    PushVariable(ext6)
     449 sp->0    BranchFalse to pc= 453
     451 sp0>0    Branch to pc= 493
     453 sp+>1    PushVariable(ext3)
     455 sp->0    BranchFalse to pc= 459
     457 sp0>0    Branch to pc= 416
     459 sp+>1    PushLong(0)
     461 sp0>1    Define(loc1)
     463 sp->0    DropTop
     464 sp+>1    PushVariable(loc1)
     466 sp+>2    PushLong(8)
     468 sp->1    Less
     469 sp->0    BranchFalse to pc= 493
     471 sp+>1    PushVariable(ext5)
     473 sp0>1    Print
     474 sp->0    DropTop
     475 sp+>1    PushVariable(ext5)
     477 sp+>2    PushLong(2)
     479 sp->1    Eval(1)
     481 sp->0    DropTop
     482 sp+>1    PushVariable(loc1)
     484 sp+>2    Push1
     485 sp+>3    DupUnder
     486 sp->2    Add
     487 sp0>2    Define(loc1)
     489 sp->1    DropTop
     490 sp->0    DropTop
     491 sp0>0    Branch to pc= 464
     493 sp+>1    PushLong(0)
     495 sp0>1    Define(loc1)
     497 sp->0    DropTop
     498 sp+>1    PushLong(0)
     500 sp0>1    Define(loc3)
     502 sp0>1    Define(loc2)
     504 sp->0    DropTop
     505 sp+>1    PushVariable(loc1)
     507 sp+>2    PushLong(8)
     509 sp->1    Less
     510 sp->0    BranchFalse to pc= 660
     512 sp+>1    PushVariable(ext4)
     514 sp+>2    PushLong(9)
     516 sp->1    GreaterEQ
     517 sp->0    BranchFalse to pc= 521
     519 sp0>0    Branch to pc= 633
     521 sp+>1    PushVariable(ext5)
     523 sp0>1    Print
     524 sp->0    DropTop
     525 sp+>1    PushVariable(ext6)
     527 sp0>1    Print
     528 sp->0    DropTop
     529 sp+>1    PushVariable(ext1)
     531 sp+>2    PushLong(3)
     533 sp->1    NotEqual
     534 sp->0    BranchFalse to pc= 538
     536 sp0>0    Branch to pc= 617
     538 sp+>1    PushLong(0)
     540 sp0>1    Define(loc1)
     542 sp->0    DropTop
     543 sp+>1    PushVariable(loc1)
     545 sp+>2    PushLong(8)
     547 sp->1    Less
     548 sp->0    BranchFalse to pc= 596
     550 sp+>1    PushVariable(ext5)
     552 sp0>1    Print
     553 sp->0    DropTop
     554 sp+>1    PushVariable(ext3)
     556 sp+>2    PushLong(2)
     558 sp->1    LessEQ
     559 sp->0    BranchFalse to pc= 563
     561 sp0>0    Branch to pc= 596
     563 sp+>1    PushVariable(ext4)
     565 sp+>2    PushLong(7)
     567 sp->1    Equal
     568 sp->0    BranchFalse to pc= 572
     570 sp0>0    Branch to pc= 585
     572 sp+>1    PushVariable(ext1)
     574 sp->0    BranchTrue to pc= 578
     576 sp0>0    Branch to pc= 633
     578 sp+>1    PushVariable(ext5)
     580 sp+>2    PushLong(2)
     582 sp->1    Eval(1)
     584 sp->0    DropTop
     585 sp+>1    PushVariable(loc1)
     587 sp+>2    Push1
     588 sp+>3    DupUnder
     589 sp->2    Add
     590 sp0>2    Define(loc1)
     592 sp->1    DropTop
     593 sp->0    DropTop
     594 sp0>0    Branch to pc= 543
     596 sp+>1    PushVariable(ext2)
     598 sp->0    BranchFalse to pc= 602
     600 sp0>0    Branch to pc= 609
     602 sp+>1    PushVariable(ext6)
     604 sp+>2    PushLong(2)
     606 sp->1    Eval(1)
     608 sp->0    DropTop
     609 sp+>1    PushVariable(loc1)
     611 sp+>2    Push1
     612 sp->1    Subtract
     613 sp0>1    Define(loc1)
     615 sp->0    BranchTrue to pc= 525
     617 sp+>1    PushVariable(ext3)
     619 sp+>2    PushLong(3)
     621 sp->1    Greater
     622 sp->0    BranchFalse to pc= 626
     624 sp0>0    Branch to pc= 660
     626 sp+>1    PushVariable(ext5)
     628 sp+>2    PushLong(2)
     630 sp->1    Eval(1)
     632 sp->0    DropTop
     633 sp+>1    PushVariable(loc1)
     635 sp+>2    Push1
     636 sp+>3    DupUnder
     637 sp->2    Add
     638 sp0>2    Define(loc1)
     640 sp->1    DropTop
     641 sp->0    DropTop
     642 sp+>1    PushVariable(loc2)
     644 sp+>2    PushLong(2)
     646 sp->1    Add
     647 sp0>1    Define(loc2)
     649 sp->0    DropTop
     650 sp+>1    PushVariable(loc3)
     652 sp+>2    PushLong(3)
     654 sp->1    Add
     655 sp0>1    Define(loc3)
     657 sp->0    DropTop
     658 sp0>0    Branch to pc= 505
     660 sp+>1    PushVariable(loc1)
     662 sp->0    BranchTrue to pc= 673
     664 sp+>1    PushVariable(loc2)
     666 sp->0    BranchFalse to pc= 671
     668 sp+>1    PushVariable(loc3)
     670 sp==0    AndOrLogical for &&
     671 sp+>1    Push0
     672 sp==0    AndOrLogical for ||
     673 sp+>1    Push1
     674 sp->0    BranchFalse to pc= 678
     676 sp0>0    Branch to pc= 416
     678 sp+>1    PushLong(3)
     680 sp+>2    PushVariable(loc1)
     682 sp+>3    PushLong(3)
     684 sp+>4    PushLong(12)
     686 sp+>5    PushLong(3)
     688 sp->3    FormRange(3)
     690 sp+>4    FormRangeFunc(ptp:)
     692 sp+>5    PushLong(9)
     694 sp+>6    PushLong(21)
     696 sp->5    FormRange(2)
     698 sp0>5    AddRangeFunc(avg:)
     700 sp->2    Eval(3)
     702 sp->1    Multiply
     703 sp->0    BranchFalse to pc= 712
     705 sp+>1    PushLong(3)
     707 sp+>2    PushVariable(ext1)
     709 sp->1    Add
     710 sp0>1    Branch to pc= 717
     712 sp+>1    PushLong(2)
     714 sp+>2    PushVariable(ext2)
     716 sp->1    Subtract
     717 sp->0    Return
     718 sp==0    Halt-Virtual-Machine
    #endif

    /* Try reinstated line */
    junk= 1;
    #if 1
    junk= 0;
    #  if 0
    junk= 2;
    #  endif
    #endif
    if (junk) {
      goofs++;
      "**FAILURE** #if / #endif construction broken";
    }

    /* ------------------------------------------------------------------------- */

    f= open("../i/testp.i", "r", 1);

    if (is_void(f)) f= open(Y_SITE+"i/testp.i", "r", 1);
    if (f) {

      while (!strmatch((line= rdline(f)), "Here is the correct disassemble"));
      correct= [];

      while (!strmatch((line= rdline(f)), "#endif")) grow, correct, line;
      close, f;

      if (anyof(disassemble(parser_test)!=correct)) {
        goofs++;
        "**FAILURE** of the parser_test disassembly";
        "            -- writing disassmbly of parser_test to pjunk.jnk";
        f= open("pjunk.jnk", "w");

        write, f, format="%s\n", disassemble(parser_test);
        close, f;
      }
      correct= [];
    } else {

      "WARNING-- skipping disassembly check, include/testp.i not present";
    }
    parser_test= [];

    /* Check for limitation on yacc-parser stack depth.

       If this fails with a SYNTAX error like "yacc stack overflow", see
       top of yorick.y source-- your yacc may have a switch to fix it.  */
    { if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2];
      else x= [1,2]; }

    x= [];

    /* If following lines give syntax errors, something is wrong with
       the NumberValue routine in Yorick/yorick.c */

    if (abs(100000000000000000000.0-1.e20)>1.e11)

      write, "**WARNING** problem with numeric conversions";
    if (0xffffffff != ((0xffff<<16)|0xffff))

      write, "**WARNING** problem with strtoul?";

    /* test basic flow control statements */
    i= 0;
    do { i++; } while (i<20);
    if (i!=20)

      error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized";
    for (i=0 ; i<20 ; ++i);
    if (i!=20)

      error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized";
    i= 0;
    while (i<20) ++i;
    if (i!=20)

      error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized";
    i= j= 0;

    do { i++; if (i>15) break; else if (i>5) continue; j++; } while (i<20);
    if (i!=16 || j!=5)

      error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized";
    for (i=j=0 ; i<20 ; ++i) { if (i>15) break; if (i>10) continue; ++j; }
    if (i!=16 || j!=11)

      error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized";
    i= j= 0;
    while (i<20) { ++i; if (i>15) break; if (i>10) continue; ++j; }
    if (i!=16 || j!=10)

      error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized";

    if (do_stats) "C "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test 17x10x10 binary operators...";

    /* Test all binary operations.  There are 10 data types and
       17 operators, so the complete test involves 1700 function calls... */
    iS= 1n;  lS= 1;  dS= 1.0
    cA= ['\1', '\2'];  sA= [1s, 2s];  iA= [1n, 2n];  lA= [1, 2];
    fA= [1.0f, 2.0f];  dA= [1., 2.];  zA= [1+0i, 2+0i];

    func op_test(SS, AS, SA, AA, op_name) /* SS, .. AA are correct answers */
    {
      extern op;               /* the function to be tested */

      goof= array(1, 10, 10);  /* array to hold any mistakes */

      except_complex= only_integer= goof;
      except_complex(10,)= except_complex(,10)= 0;
      only_integer(3,)= only_integer(,3)= 0;
      only_integer(8:,)= 0;  only_integer(,8:)= 0;

      answer= SS;
      op,iS,iS,1,1; op,lS,iS,2,1; op,dS,iS,3,1;
      op,iS,lS,1,2; op,lS,lS,2,2; op,dS,lS,3,2;
      op,iS,dS,1,3; op,lS,dS,2,3; op,dS,dS,3,3;

      answer= AS;
      op,cA,iS,4,1; op,sA,iS,5,1; op,iA,iS,6,1; op,lA,iS,7,1;
      op,fA,iS,8,1; op,dA,iS,9,1; op,zA,iS,10,1;
      op,cA,lS,4,2; op,sA,lS,5,2; op,iA,lS,6,2; op,lA,lS,7,2;
      op,fA,lS,8,2; op,dA,lS,9,2; op,zA,lS,10,2;
      op,cA,dS,4,3; op,sA,dS,5,3; op,iA,dS,6,3; op,lA,dS,7,3;
      op,fA,dS,8,3; op,dA,dS,9,3; op,zA,dS,10,3;

      answer= SA;
      op,iS,cA,1,4; op,iS,sA,1,5; op,iS,iA,1,6; op,iS,lA,1,7;
      op,iS,fA,1,8; op,iS,dA,1,9; op,iS,zA,1,10;
      op,lS,cA,2,4; op,lS,sA,2,5; op,lS,iA,2,6; op,lS,lA,2,7;
      op,lS,fA,2,8; op,lS,dA,2,9; op,lS,zA,2,10;
      op,dS,cA,3,4; op,dS,sA,3,5; op,dS,iA,3,6; op,dS,lA,3,7;
      op,dS,fA,3,8; op,dS,dA,3,9; op,dS,zA,3,10;

      answer= AA;
      op,cA,cA,4,4; op,cA,sA,4,5; op,cA,iA,4,6; op,cA,lA,4,7;
      op,cA,fA,4,8; op,cA,dA,4,9; op,cA,zA,4,10;
      op,sA,cA,5,4; op,sA,sA,5,5; op,sA,iA,5,6; op,sA,lA,5,7;
      op,sA,fA,5,8; op,sA,dA,5,9; op,sA,zA,5,10;
      op,iA,cA,6,4; op,iA,sA,6,5; op,iA,iA,6,6; op,iA,lA,6,7;
      op,iA,fA,6,8; op,iA,dA,6,9; op,iA,zA,6,10;
      op,lA,cA,7,4; op,lA,sA,7,5; op,lA,iA,7,6; op,lA,lA,7,7;
      op,lA,fA,7,8; op,lA,dA,7,9; op,lA,zA,7,10;
      op,fA,cA,8,4; op,fA,sA,8,5; op,fA,iA,8,6; op,fA,lA,8,7;
      op,fA,fA,8,8; op,fA,dA,8,9; op,fA,zA,8,10;
      op,dA,cA,9,4; op,dA,sA,9,5; op,dA,iA,9,6; op,dA,lA,9,7;
      op,dA,fA,9,8; op,dA,dA,9,9; op,dA,zA,9,10;
      op,zA,cA,10,4; op,zA,sA,10,5; op,zA,iA,10,6; op,zA,lA,10,7;
      op,zA,fA,10,8; op,zA,dA,10,9; op,zA,zA,10,10;

      if (anyof(goof)) {
        goofs++;
        "**FAILURE** of the following operations "+op_name+":";
        where2(goof);
      }
    }

    if (do_stats) "D "+print(yorick_stats());

    func op(l, r, il, ir)

    { goof(il, ir)= anyof((l + r)!=answer); }
    op_test, 2, [2, 3], [2, 3], [2, 4], "+";

    func op(l, r, il, ir)

    { goof(il, ir)= anyof((l - r)!=answer); }
    op_test, 0, [0, 1], [0, -1], [0, 0], "-";

    func op(l, r, il, ir)

    { goof(il, ir)= anyof((l * r)!=answer); }
    op_test, 1, [1, 2], [1, 2], [1, 4], "*";

    func op(l, r, il, ir)
    {

      if (structof(l+r)!=structof(l+r+0.0f))

        goof(il, ir)= anyof((l / r)!=structof(l+r)(answer));
      else /* otherwise fails on Crays because division is inexact */

        goof(il, ir)= anyof(abs((l / r) - answer) > 1.e-6);
    }
    op_test, 1, [1, 2], [1, 0.5], [1, 1], "/";

    func op(l, r, il, ir)
    {

      if (structof(r)!=structof(r+0.0f))

        goof(il, ir)= anyof((l ^ r)!=answer);
      else /* otherwise fails on MacIntosh for unknown reason */

        goof(il, ir)= anyof(abs((l ^ r) - answer) > 1.e-6);
    }
    op_test, 1, [1, 2], [1, 1], [1, 4], "^";

    func op(l, r, il, ir)

    { goof(il, ir)= anyof((l == r)!=answer); }
    op_test, 1, [1, 0], [1, 0], [1, 1], "==";

    func op(l, r, il, ir)

    { goof(il, ir)= anyof((l != r)!=answer); }
    op_test, 0, [0, 1], [0, 1], [0, 0], "!=";

    func op(l, r, il, ir)

    { goof(il, ir)= except_complex(il, ir) && anyof((l % r)!=answer); }
    op_test, 0, [0, 0], [0, 1], [0, 0], "%";

    func op(l, r, il, ir)

    { goof(il, ir)= except_complex(il, ir) && anyof((l > r)!=answer); }
    op_test, 0, [0, 1], [0, 0], [0, 0], ">";

    func op(l, r, il, ir)

    { goof(il, ir)= except_complex(il, ir) && anyof((l <= r)!=answer); }
    op_test, 1, [1, 0], [1, 1], [1, 1], "<=";

    func op(l, r, il, ir)

    { goof(il, ir)= except_complex(il, ir) && anyof((l < r)!=answer); }
    op_test, 0, [0, 0], [0, 1], [0, 0], "<";

    func op(l, r, il, ir)

    { goof(il, ir)= except_complex(il, ir) && anyof((l >= r)!=answer); }
    op_test, 1, [1, 1], [1, 0], [1, 1], ">=";

    func op(l, r, il, ir)

    { goof(il, ir)= only_integer(il, ir) && anyof((l << r)!=answer); }
    op_test, 2, [2, 4], [2, 4], [2, 8], "<<";

    func op(l, r, il, ir)

    { goof(il, ir)= only_integer(il, ir) && anyof((l >> r)!=answer); }
    op_test, 0, [0, 1], [0, 0], [0, 0], ">>";

    func op(l, r, il, ir)

    { goof(il, ir)= only_integer(il, ir) && anyof((l & r)!=answer); }
    op_test, 1, [1, 0], [1, 0], [1, 2], "&";

    func op(l, r, il, ir)

    { goof(il, ir)= only_integer(il, ir) && anyof((l | r)!=answer); }
    op_test, 1, [1, 3], [1, 3], [1, 2], "|";

    func op(l, r, il, ir)

    { goof(il, ir)= only_integer(il, ir) && anyof((l ~ r)!=answer); }
    op_test, 0, [0, 3], [0, 3], [0, 0], "~";

    op= op_test= [];

    if (do_stats) "E "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test unary operators...";

    /* Test all unary operators. */

    func op_test(SS, AA, op_name) /* SS, AA are correct answers */
    {
      extern op;               /* the function to be tested */

      goof= array(1, 10);      /* array to hold any mistakes */

      except_complex= only_integer= goof;
      except_complex(10)= 0;
      only_integer(3)= 0;
      only_integer(8:)= 0;

      answer= SS;
      op,iS,1; op,lS,2; op,dS,3;

      answer= AA&0xff;
      op,cA,4;
      answer= AA;
      op,sA,5; op,iA,6; op,lA,7; op,fA,8; op,dA,9; op,zA,10;

      if (anyof(goof)) {
        goofs++;
        "**FAILURE** of the following operations "+op_name+":";
        where2(goof);
      }
    }

    if (do_stats) "F "+print(yorick_stats());

    func op(l, il)
    { goof(il)= anyof((+ l)!=answer); }
    op_test, 1, [1, 2], "+";

    func op(l, il)
    { goof(il)= anyof((- l)!=answer); }
    op_test, -1, [-1, -2], "-";

    func op(l, il)

    { goof(il)= anyof((! (l-1))!=answer); }
    op_test, 1, [1, 0], "!";

    func op(l, il)

    { goof(il)= only_integer(il) && anyof((~ l)!=answer); }
    op_test, -2, [-2, -3], "~";

    op= op_test= [];

    if (do_stats) "G "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test array manipulation functions...";

    /* Test array manipulation functions. */

    func not_near (x,y)
    {

      return anyof(abs(x-y)>1.e-9);
    }

    x= [0,1](-,) + [0,10,20](-,-,) + [0,100,200,300](-,-,-,) +
       [0,1000,2000,3000,4000](-,-,-,-,) +
       [0,10000,20000,30000,40000,50000](-,-,-,-,-,);
    if (x(1,2,3,4,5,6)!=54321 || x(1,2,1,1,3,4)!=32001) {
      goofs++;
      "**FAILURE** of - subscript or broadcasting";
    }

    y= [];
    grow, y, -2;
    if (anyof(y!=-2)) {
      goofs++;
      "**FAILURE** of grow test 1";
    }
    grow, y, [1,2,3];
    if (anyof(y!=[-2,1,2,3])) {
      goofs++;
      "**FAILURE** of grow test 2";
    }
    grow, y, [6,5,4];
    if (anyof(y!=[-2,1,2,3,6,5,4])) {
      goofs++;
      "**FAILURE** of grow test 3";
    }
    y= [[1,2,3],[4,5,6]];
    grow, y, -1;

    if (anyof(y!=[[1,2,3],[4,5,6],[-1,-1,-1]])) {
      goofs++;
      "**FAILURE** of grow test 4";
    }
    grow, y, [6,5,4];

    if (anyof(y!=[[1,2,3],[4,5,6],[-1,-1,-1],[6,5,4]])) {
      goofs++;
      "**FAILURE** of grow test 5";
    }

    if (indgen(0)!=orgsof([1])(1) ||

        anyof(indgen(5)!=[0,1,2,3,4]+indgen(0))) {
      goofs++;
      "**FAILURE** of indgen function";
    }

    if (not_near(span(1,4,4), [1,2,3,4]) ||

        not_near(span(0,[2,4],3), [[0,1,2],[0,2,4]]) ||

        not_near(span(0,[2,4],3,0), [[0,0],[1,2],[2,4]]) ||

        not_near(spanl(1,8,4), [1,2,4,8]) ||

        not_near(spanl(1,[4,16],3,0), [[1,1],[2,4],[4,16]])) {
      goofs++;

      "**FAILURE** of span or spanl function";
    }

    y= [0., 1, 2, 3, 4, 5, 6, 7, 8, 9];
    if (digitize(3.5, y)!=5 ||

        anyof(digitize([[-5, 8.5],[11,5],[.5,-.5]],y)!=[[1,10],[11,7],[2,1]]) ||

        anyof(digitize([[-5, 8.5],[11,5],[.5,-.5]],y(::-1))!=
    	  [[11,2],[1,5],[10,11]])) {
      goofs++;

      "**FAILURE** of digitize function";
    }

    if (interp(y, y, 3.5)!=3.5 ||

        anyof(interp(y,y,[[-5, 8.5],[11,5],[.5,-.5]])!=[[0,8.5],[9,5],[.5,0]]) ||

        anyof(interp([y,y],y,[[-5, 8.5],[11,5],[.5,-.5]])!=
    	  [[[0,8.5],[9,5],[.5,0]],[[0,8.5],[9,5],[.5,0]]]) ||

        anyof(interp(transpose([y,y]),y,[[-5, 8.5],[11,5],[.5,-.5]],0)!=
    	  [[[0,0],[8.5,8.5]],[[9,9],[5,5]],[[.5,.5],[0,0]]])) {
      goofs++;
      "**FAILURE** of interp function";
    }

    if (not_near(integ(y, y, 3.5), 0.5*3.5^2) ||

        not_near(integ(y,y,[[-5, 8.5],[11,5],[.5,-.5]]),
    	     0.5*[[0,8.5],[9,5],[.5,0]]^2)) {
      goofs++;
      "**FAILURE** of integ function";
    }

    if (anyof(histogram([1,5,2,1,1,5,2,1,4,5])!=[4,2,0,1,3]) ||

        anyof(histogram([1,5,2,1,1,5,2,1,4,5],top=7)!=[4,2,0,1,3,0,0]) ||

        anyof(histogram([1,5,2,1,1,5,2,1,4,5],y,top=7)!=
    	  [14.,8.,0.,8.,15.,0.,0.])) {
      goofs++;

      "**FAILURE** of histogram function";
    }

    if (anyof(poly([0.,1.,2.], 1,-2,1)!=[1.,0.,1.]) ||

        anyof(poly([0.,1.,2.], 1,[-2,-1,0],1)!=[1.,1.,5.])) {
      goofs++;
      "**FAILURE** of poly function";
    }

    if (anyof(sort([5,1,7,3])!=[2,4,1,3]) ||

        anyof(sort([5.,1.,7.,3.])!=[2,4,1,3]) ||

        anyof(sort(["go", "a", "stay", "abc"])!=[2,4,1,3]) ||

        median([5.,1.,7.,3.])!=4 || median([5.,1.,7.,3.,-2500.])!=3 ||

        anyof(median([[5.,1.,7.,3.],[5.,1.,99.,3.]])!=[4,4]) ||

        anyof(median([[5.,5.],[-55.,1.],[7.,99.],[3.,3.]],0)!=[4,4])) {
      goofs++;

      "**FAILURE** of sort or median function";
    }

    if (anyof(dimsof(x)                          != [6, 1,2,3,4,5,6]) ||

        anyof(dimsof(transpose(x))               != [6, 6,2,3,4,5,1]) ||

        anyof(dimsof(transpose(x,[1,2]))         != [6, 2,1,3,4,5,6]) ||

        anyof(dimsof(transpose(x,[1,0]))         != [6, 6,2,3,4,5,1]) ||

        anyof(dimsof(transpose(x,2))             != [6, 6,1,2,3,4,5]) ||

        anyof(dimsof(transpose(x,0))             != [6, 2,3,4,5,6,1]) ||

        anyof(dimsof(transpose(x,3))             != [6, 5,6,1,2,3,4]) ||

        anyof(dimsof(transpose(x,[4,6,3],[2,5])) != [6, 1,5,6,3,2,4])) {
      goofs++;

      "**FAILURE** of transpose test 1";
    }
    y= transpose(x,[4,6,3],[2,5]);
    if (y(1,5,6,3,2,4)!=x(1,2,3,4,5,6) || y(1,3,4,1,2,1)!=x(1,2,1,1,3,4)) {
      goofs++;

      "**FAILURE** of transpose test 2";
    }

    x= y= [];

    if (do_stats) "H "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test struct instancing and indexing...";

    /* Test structs. */

    struct Stest {
      char a;
      short b;
      double c(4);
      int d(2,3), e(5);
      complex f(2);
    }

    x= Stest(a='A', b=13, c=[2,-4,6,-8],
    	 d=[[-1,2],[-3,4],[-5,6]], e=[10,20,30,40,50], f=[1i,2-2i]);

    if (x.a!='A' || x.b!=13 || anyof(x.c!=[2.,-4.,6.,-8.]) ||

        anyof(x.d!=[[-1,2],[-3,4],[-5,6]]) || anyof(x.e!=[10,20,30,40,50]) ||
        anyof(x.f!=[1i,2-2i])) {
      goofs++;
      "**FAILURE** of - struct instance declaration";
    }

    y= array(Stest, 2);
    y(..)= x;
    y.a(2)= 'B';
    y(2).b= -x.b;
    y.c(..,2)= x.c(::-1);

    y(2).d(,1:2)= transpose(x.d(,1:2));
    y.e(::-1,2)= x.e;
    y(2).f= conj(x.f);

    if (x!=y(1) || y(2).a!='B' || y(2).b!=-13 || anyof(y(2).c!=[-8.,6.,-4.,2.]) ||

        anyof(y(2).d!=[[-1,-3],[2,4],[-5,6]]) ||

        anyof(y(2).e!=[50,40,30,20,10]) || anyof(y(2).f!=[-1i,2+2i])) {
      goofs++;

      "**FAILURE** of - struct instance array indexing";
    }

    x= y= [];

    if (do_stats) "I "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test range functions...";

    /* Test range functions. */

    x= [[[3,7,5],[-4,2,-6]], [[-1,-4,-2],[0,4,8]],
        [[-1,-5,2],[1,0,0]], [[9,8,7],[-9,9,-6]]];
    y= x+0.5;

    if (anyof(x(,-:1:2,,1)!=[[[3,7,5],[3,7,5]],[[-4,2,-6],[-4,2,-6]]])) {
      goofs++;

      "**FAILURE** of - pseudo range function (-)";
    }

    if (anyof(x(,..)!=x) || anyof(x(..,:)!=x) || anyof(x(,*)!=x(,1:8)) ||
        anyof(x(*,)!=x(1:6,1,))) {
      goofs++;

      "**FAILURE** of - rubber range function (.. or *)";
    }

    if (anyof(x(,pcen,)(,uncp,)!=x) || anyof(y(,pcen,)(,uncp,)!=y)) {
      goofs++;

      "**FAILURE** of - uncp range function";
    }

    if (anyof(x(,pcen,)(,2:-1,)!=x(,zcen,)) ||

        anyof(x(,pcen,)(,1,)!=x(,1,)) || anyof(x(,pcen,)(,0,)!=x(,0,)) ||
        anyof(y(,pcen,)!=x(,pcen,)+0.5)) {
      goofs++;

      "**FAILURE** of - pcen range function";
    }

    if (anyof(x(,zcen,)!=[[[-.5,4.5,-.5]],[[-.5,0,3]],
    		      [[0,-2.5,1]],[[0,8.5,.5]]]) ||

        anyof(y(,zcen,)!=[[[-.5,4.5,-.5]],[[-.5,0,3]],
    		      [[0,-2.5,1]],[[0,8.5,.5]]] + 0.5)) {
      goofs++;

      "**FAILURE** of - zcen range function";
    }

    if (anyof(x(,dif,)!=[[[-7,-5,-11]],[[1,8,10]],[[2,5,-2]],[[-18,1,-13]]]) ||

        anyof(y(,dif,)!=[[[-7,-5,-11]],[[1,8,10]],[[2,5,-2]],[[-18,1,-13]]])) {
      goofs++;

      "**FAILURE** of - dif range function";
    }

    if (anyof(x(,psum,)!=[[[3,7,5],[-1,9,-1]], [[-1,-4,-2],[-1,0,6]],
    		      [[-1,-5,2],[0,-5,2]], [[9,8,7],[0,17,1]]]) ||

        anyof(y(,psum,)!=[[[3,7,5],[-1,9,-1]], [[-1,-4,-2],[-1,0,6]],
    		      [[-1,-5,2],[0,-5,2]], [[9,8,7],[0,17,1]]] +
    	  [0.5,1.0](-,))) {
      goofs++;

      "**FAILURE** of - psum range function";
    }

    if (anyof(x(,cum,)!=[[[0,0,0],[3,7,5],[-1,9,-1]],
    		     [[0,0,0],[-1,-4,-2],[-1,0,6]],
    		     [[0,0,0],[-1,-5,2],[0,-5,2]],
    		     [[0,0,0],[9,8,7],[0,17,1]]]) ||

        anyof(y(,cum,)!=[[[0,0,0],[3,7,5],[-1,9,-1]],
    		     [[0,0,0],[-1,-4,-2],[-1,0,6]],
    		     [[0,0,0],[-1,-5,2],[0,-5,2]],
    		     [[0,0,0],[9,8,7],[0,17,1]]] +
    	  [0.0,0.5,1.0](-,))) {
      goofs++;

      "**FAILURE** of - cum range function";
    }

    if (anyof(x(zcen,dif,)!=[[[-6,-8]],[[4.5,9]],[[3.5,1.5]],[[-8.5,-6]]]) ||

        anyof(y(zcen,dif,)!=[[[-6,-8]],[[4.5,9]],[[3.5,1.5]],[[-8.5,-6]]])) {
      goofs++;

      "**FAILURE** of - zcen,dif multiple range function";
    }

    if (anyof(x(min,,max)!=[7,0]) || anyof(y(,,max)(min,)!=[7,1]+0.5)) {
      goofs++;

      "**FAILURE** of - min or max range function";
    }

    if (anyof(x(,ptp,)!=[[-7,-5,-11],[1,8,10],[2,5,-2],[-18,1,-13]]) ||

        anyof(y(,ptp,)!=[[-7,-5,-11],[1,8,10],[2,5,-2],[-18,1,-13]])) {
      goofs++;

      "**FAILURE** of - ptp range function";
    }

    if (anyof(x(,mnx,)!=[[2, 2, 2], [1, 1, 1], [1, 1, 2], [2, 1, 2]]) ||

        anyof(y(,mnx,)!=[[2, 2, 2], [1, 1, 1], [1, 1, 2], [2, 1, 2]])) {
      goofs++;

      "**FAILURE** of - mnx range function";
    }

    if (anyof(x(,mxx,)!=3-x(,mnx,)) ||
        anyof(y(,mxx,)!=3-y(,mnx,))) {
      goofs++;

      "**FAILURE** of - mxx range function";
    }

    if (anyof(x(,sum,)!=x(,1,)+x(,2,)) ||

        anyof(y(,sum,)!=y(,1,)+y(,2,))) {
      goofs++;

      "**FAILURE** of - sum range function";
    }

    if (anyof(x(,avg,)!=0.5*(x(,1,)+x(,2,))) ||

        anyof(y(,avg,)!=0.5*(y(,1,)+y(,2,)))) {
      goofs++;

      "**FAILURE** of - avg range function";
    }

    if (anyof(abs(x(,rms,)-0.5*abs(x(,1,)-x(,2,)))>1.e-10) ||

        anyof(abs(y(,rms,)-0.5*abs(y(,1,)-y(,2,)))>1.e-10)) {
      goofs++;

      "**FAILURE** of - rms range function";
    }

    x= [[1,2,3],[-5,5,-8]];
    y= [[1,1],[-1,-1],[0,1]];

    if (anyof(x(+,)*y(,+) != [[-1,-10],[2,-18]]) ||

        anyof(x(,+)*y(+,) != [[-4,7,-5],[4,-7,5],[-5,5,-8]])) {
      goofs++;
      "**FAILURE** of + matrix multiply function";
    }

    x+= 0i;

    if (anyof(x(+,)*y(,+) != [[-1,-10],[2,-18]]) ||

        anyof(x(,+)*y(+,) != [[-4,7,-5],[4,-7,5],[-5,5,-8]])) {
      goofs++;
      "**FAILURE** of + complex matrix multiply function";
    }

    /* first test matrix multiply conformability rules
       -- this will just blow up if there's a problem */
    rop= lop= array(0., 4, 3, 2);

    dst= lop(+,,)*rop(+,,) + array(0., 3,2,3,2);

    dst= lop(,+,)*rop(,+,) + array(0., 4,2,4,2);

    dst= lop(,,+)*rop(,,+) + array(0., 4,3,4,3);
    rop= transpose(rop, 2);

    dst= lop(+,,)*rop(,+,) + array(0., 3,2,2,3);

    dst= lop(,+,)*rop(,,+) + array(0., 4,2,2,4);

    dst= lop(,,+)*rop(+,,) + array(0., 4,3,4,3);
    rop= transpose(rop, 2);

    dst= lop(+,,)*rop(,,+) + array(0., 3,2,3,2);

    dst= lop(,+,)*rop(+,,) + array(0., 4,2,2,4);

    dst= lop(,,+)*rop(,+,) + array(0., 4,3,3,4);

    /* next, try to exercise all the branches of the matrix
       multiply routines -- test all five dimensions,

       plus unit length leading dimension (special branch) */
    lop= [[[1,2],[3,4]],[[5,6],[7,8]]];
    rop= lop+10;
    dst1= lop(,+,)*rop(,+,);
    dst2= lop(1,+,)*rop(,+,);
    if (anyof(dst1!=
    	  [[[[50,74],[146,170]],[[54,80], [158,184]]],
    	  [[[66,98],[194,226]],[[70,104],[206,240]]]]) ||
        anyof(dst2!=
    	  [[[50,146],[54,158]],[[66,194],[70,206]]])) {
      goofs++;
      "**FAILURE** of + matrix multiply function";
    }

    lop+= 0i;
    rop+= 0i;

    dst1= lop(,+,)*rop(,+,);
    dst2= lop(1,+,)*rop(,+,);
    if (anyof(dst1!=
    	  [[[[50,74],[146,170]],[[54,80], [158,184]]],
    	  [[[66,98],[194,226]],[[70,104],[206,240]]]]) ||
        anyof(dst2!=
    	  [[[50,146],[54,158]],[[66,194],[70,206]]])) {
      goofs++;
      "**FAILURE** of + complex matrix multiply function";
    }

    x= y= lop= rop= dst1= dst2= [];

    if (do_stats) "J "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test math functions...";

    /* Test math functions. */

    x= pi/4;  y= [3*pi/4, pi/6];

    if (not_near(sin(x),sqrt(0.5)) || not_near(sin(y),[sqrt(0.5),0.5]) ||

        not_near(cos(x),sqrt(0.5)) || not_near(cos(y),[-sqrt(0.5),sqrt(.75)]) ||

        not_near(tan(x),1) || not_near(tan(y),[-1,1/sqrt(3)])) {
      goofs++;

      "**FAILURE** of - sin, cos, tan, or sqrt function";
    }

    if (not_near(asin(sqrt(0.5)),x) ||

        not_near(asin([sqrt(0.5),0.5]),y-[pi/2,0]) ||

        not_near(acos(sqrt(0.5)),x) || not_near(acos([-sqrt(0.5),sqrt(.75)]),y) ||

        not_near(atan(1),x) || not_near(atan([-1,1/sqrt(3)]),y-[pi,0])) {
      goofs++;

      "**FAILURE** of - asin, acos, atan, or sqrt function";
    }

    if (not_near(atan(5,5),x) || not_near(atan([.1,1],[-.1,sqrt(3)]),y)) {
      goofs++;

      "**FAILURE** of - 2 argument atan function";
    }

    if (not_near(exp(1i*x),cos(x)+1i*sin(x)) ||

        not_near(exp(1i*y),cos(y)+1i*sin(y)) ||

        not_near(cos(1i*x), 0.5*(exp(-x)+exp(x))) ||

        not_near(cos(1i*y), 0.5*(exp(-y)+exp(y))) ||

        not_near(sin(1i*x), 0.5i*(exp(x)-exp(-x))) ||

        not_near(sin(1i*y), 0.5i*(exp(y)-exp(-y))) ||

        not_near(tan(1i*x), 1i*(exp(x)-exp(-x))/(exp(-x)+exp(x))) ||

        not_near(tan(1i*y), 1i*(exp(y)-exp(-y))/(exp(-y)+exp(y)))) {
      goofs++;

      "**FAILURE** of - (complex) exp, sin, cos, or tan function";
    }

    if (not_near(exp(1),2.718281828459) ||

        not_near(exp([-.5,2.5]), [1,exp(1)^3]/sqrt(exp(1))) ||

        not_near(exp(x),cosh(x)+sinh(x)) ||

        not_near(exp(y),cosh(y)+sinh(y)) ||

        not_near(cosh(x), 0.5*(exp(-x)+exp(x))) ||

        not_near(cosh(y), 0.5*(exp(-y)+exp(y))) ||

        not_near(sinh(x), 0.5*(exp(x)-exp(-x))) ||

        not_near(sinh(y), 0.5*(exp(y)-exp(-y))) ||

        not_near(tanh(x), (exp(x)-exp(-x))/(exp(-x)+exp(x))) ||

        not_near(tanh(y), (exp(y)-exp(-y))/(exp(-y)+exp(y)))) {
      goofs++;

      "**FAILURE** of -  exp, sinh, cosh, or tanh function";
    }

    if (not_near(sech(x), 2/(exp(-x)+exp(x))) ||

        not_near(sech(y), 2/(exp(-y)+exp(y))) ||

        not_near(csch(x), 2/(exp(x)-exp(-x))) ||

        not_near(csch(y), 2/(exp(y)-exp(-y))) ||

        anyof(sech([1.e6,-1.e6])) || anyof(csch([1.e6,-1.e6]))) {
      goofs++;

      "**FAILURE** of -  sech or csch function";
    }

    if (not_near(acosh(cosh(x)), x) || not_near(acosh(cosh(y)), y) ||

        not_near(asinh(sinh(x)), x) || not_near(asinh(sinh(y)), y) ||

        not_near(atanh(tanh(x)), x) || not_near(atanh(tanh(y)), y)) {
      goofs++;

      "**FAILURE** of -  acosh, asinh, or atanh function";
    }

    if (not_near(exp(1i*x),cosh(1i*x)+sinh(1i*x)) ||

        not_near(exp(1i*y),cosh(1i*y)+sinh(1i*y)) ||

        not_near(cosh(1i*x), 0.5*(exp(-1i*x)+exp(1i*x))) ||

        not_near(cosh(1i*y), 0.5*(exp(-1i*y)+exp(1i*y))) ||

        not_near(sinh(1i*x), 0.5*(exp(1i*x)-exp(-1i*x))) ||

        not_near(sinh(1i*y), 0.5*(exp(1i*y)-exp(-1i*y))) ||

        not_near(tanh(1i*x), (exp(1i*x)-exp(-1i*x))/(exp(-1i*x)+exp(1i*x))) ||

        not_near(tanh(1i*y), (exp(1i*y)-exp(-1i*y))/(exp(-1i*y)+exp(1i*y)))) {
      goofs++;

      "**FAILURE** of -  (complex) exp, sinh, cosh, or tanh function";
    }

    if (not_near(log(exp(x)), x) || not_near(log(exp(y)), y) ||

        not_near(log10(10^x), x) || not_near(log10(10^y), y) ||

        not_near(log10(x*y),log10(x)+log10(y)) ||

        not_near(log(x*y),log(x)+log(y)) ||

        not_near(exp(x+y),exp(x)*exp(y)) ||

        not_near(log10([1.e5,1.e-7]),[5,-7]) ||

        not_near(log(10),1/log10(exp(1))) ||

        not_near(log(10)*log10(x),log(x)) || not_near(log(10)*log10(y),log(y))) {
      goofs++;

      "**FAILURE** of -  log, log10, or exp function";
    }

    if (anyof(abs(x)!=x) || anyof(abs(-x)!=x) ||

        anyof(abs(y)!=y) || anyof(abs(-y)!=y)) {
      goofs++;
      "**FAILURE** of -  abs function";
    }

    if (anyof(ceil(3.7)!=4) || anyof(ceil([-3.7,2.1])!=[-3,3]) ||

        anyof(floor(3.7)!=3) || anyof(floor([-3.7,2.1])!=[-4,2])) {
      goofs++;

      "**FAILURE** of -  ceil or floor function";
    }

    if (not_near(abs(x,y,x,y),sqrt(2*(x^2+y^2)))) {
      goofs++;

      "**FAILURE** of -  multiargument abs function";
    }

    if (anyof(sign(x)!=1) || anyof(sign(-x)!=-1) ||

        anyof(sign(y)!=1) || anyof(sign(-y)!=-1) ||

        sign(0)!=1 || sign(0.0)!=1 || sign(0i)!=1 ||

        not_near(sign(exp(1i*y+x)),exp(1i*y))) {
      goofs++;
      "**FAILURE** of -  sign function";
    }

    if (conj(x+1i)!=x-1i || anyof(conj(y+1i)!=y-1i)) {
      goofs++;
      "**FAILURE** of -  conj function";
    }

    if (random()<0.0 || random()>1.0 ||

        anyof(dimsof(random(3,4,2))!=[3,3,4,2])) {
      goofs++;

      "**FAILURE** of -  random function";
    }

    if (min(x)!=x || min(y)!=pi/6 || anyof(min(x,y)!=[pi/4,pi/6]) ||

        max(x)!=x || max(y)!=3*pi/4 || anyof(max(x,y)!=[3*pi/4,pi/4])) {
      goofs++;

      "**FAILURE** of -  min or max function";
    }

    if (sum(x)!=x || not_near(sum(y), 11*pi/12) ||

        avg(x)!=x || not_near(avg(y), 11*pi/24)) {
      goofs++;

      "**FAILURE** of -  sum or avg function";
    }

    if (allof([1,0]) || !allof([1,1]) || anyof([0,0]) || !anyof([1,0]) ||

        noneof([1,0]) || !noneof([0,0]) || nallof([1,1]) || !nallof([1,0])) {
      goofs++;

      "**FAILURE** of -  allof, anyof, noneof, or nallof function";
    }

    if (anyof(where([[0,1,0,0],[0,0,0,1]])!=[2,8]) ||

        anyof(where2([[0,1,0,0],[0,0,0,1]])!=[[2,1],[4,2]])) {
      goofs++;

      "**FAILURE** of -  where or where2 function";
    }

    x= Stest(a='A', b=13, c=[2,-4,6,-8],
    	 d=[[-1,2],[-3,4],[-5,6]], e=[10,20,30,40,50], f=[1i,2-2i]);
    y= array(x, 2);
    y(1).b= 8;  y(2).b=19;

    if (anyof(merge(cA,iS,[1,1,0])!=[1,2,1]) ||

        anyof(merge(lS,sA,[0,0,1])!=[1,2,1]) ||

        anyof(merge(iA,dS,[1,0,1])!=[1,1,2]) ||

        anyof(merge(lA,fA,[[1,1],[0,0]])!=[[1,2],[1,2]]) ||

        anyof(merge(zA,dA,[[1,0],[0,1]])!=[[1,1],[2,2]]) ||

        anyof(merge(cA,cA,[[1,0],[0,1]])!=[[1,1],[2,2]]) ||

        anyof(merge(sA,sA,[[1,0],[0,1]])!=[[1,1],[2,2]]) ||

        anyof(merge(y,x,[1,0,1])!=[y(1),x,y(2)]) ||

        anyof(merge(dA,[],[1,1])!=dA) ||

        anyof(merge([],lA,[0,0])!=lA) ||

        anyof(merge2(lA,zA(::-1),[1,0])!=[1,1])) {
      goofs++;

      "**FAILURE** of -  merge or merge2 function";
    }
    x= y= [];

    if (do_stats) "K "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test informational functions...";

    /* Test informational functions. */

    if (structof(3.5)!=double || structof('\61')!=char ||

        structof([4,5,6])!=long || structof([1n,-1n])!=int ||

        structof([3s,4s])!=short || structof(4.4f)!=float ||

        structof(1i)!=complex || structof(array(Stest,2,2))!=Stest ||

        structof([&[1,2,3],&[],&[3.5,1.2]])!=pointer || structof("yo")!=string) {
      goofs++;

      "**FAILURE** of - structof function or structure != operation";
    }

    if (anyof(dimsof([[2,4,6],[1,3,5]])!=[2,3,2]) || anyof(dimsof(5)!=[0]) ||

        anyof(dimsof(array(short,5,-4:-1,3:5,0:1))!=[4,5,4,3,2]) ||

        anyof(dimsof([1,2,3](-,),[1,2])!=[2,2,3])) {
      goofs++;
      "**FAILURE** of - dimsof function";
    }

    dummy= use_origins(1);

    if (anyof(orgsof([[2,4,6],[1,3,5]])!=[2,indgen(0),indgen(0)]) ||

        anyof(orgsof(array(short,5,-4:-1,3:5,0:1))!=[4,indgen(0),-4,3,0])) {
      goofs++;
      "**FAILURE** of - orgsof function";
    }
    dummy= [];

    if (numberof([[2,4,6],[1,3,5]])!=6 || numberof(3.5)!=1 || numberof([])!=0 ||

        numberof(array(short,5,-4:-1,3:5,0:1))!=120) {
      goofs++;

      "**FAILURE** of - numberof function";
    }

    if (sizeof([[2,4,6],[1,3,5]])!=6*sizeof(long) || sizeof(3.5)!=sizeof(double) ||

        sizeof(array(short,5,-4:-1,3:5,0:1))!=120*sizeof(short)) {
      goofs++;
      "**FAILURE** of - sizeof function";
    }

    if (typeof(3.5)!="double" || typeof('\61')!="char" ||

        typeof([4,5,6])!="long" || typeof([1n,-1n])!="int" ||

        typeof([3s,4s])!="short" || typeof(4.4f)!="float" ||

        typeof(1i)!="complex" || typeof(array(Stest,2,2))!="struct_instance" ||

        typeof(Stest)!="struct_definition" || typeof(3:52:4)!="range" ||

        typeof([])!="void" || typeof()!="void" || typeof("yo")!="string" ||
        typeof(&[3,4])!="pointer") {
      goofs++;
      "**FAILURE** of - typeof function";
    }

    if (nameof(Stest)!="Stest" || nameof(not_near)!="not_near") {
      goofs++;
      "**FAILURE** of - nameof function";
    }

    if (!is_array([3,4]) || !is_array(0) || is_array() || is_array(not_near) ||

        is_array(Stest)) {
      goofs++;

      "**FAILURE** of - is_array function";
    }

    if (is_void(7) || !is_void() || !is_void([]) || is_void(not_near)) {
      goofs++;

      "**FAILURE** of - is_void function";
    }

    if (is_func(7) || is_func() || !is_func(not_near) || is_func(Stest)) {
      goofs++;

      "**FAILURE** of - is_func function";
    }

    if (is_struct(7) || is_struct() || is_struct(not_near) ||

        !is_struct(Stest)) {
      goofs++;

      "**FAILURE** of - is_struct function";
    }

    if (is_range(7) || is_range() || is_range(not_near) ||

        is_range(Stest) || !is_range(3:4)) {
      goofs++;

      "**FAILURE** of - is_range function";
    }

    func junk(x)
    {
      extern junk_test;

      return junk_test= am_subroutine();
    }
    junk_test= 0;
    junk;
    if (!junk_test || junk()) {
      goofs++;

      "**FAILURE** of - am_subroutine function";
    }

    if (do_stats) "L "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test func declarations...";

    /* Test func declarations. */

    func junk(&w,x,&y,z,..,k=,l=,m=)
    {
      rslt= [w,x,y,z,k,l,m];

      while (more_args()) grow, rslt, next_arg();
      w=x=y=z=k=l=m=16;
      return rslt;
    }
    a= b= c= d= -2;

    if (anyof(junk(k=5,a,b,m=c,3,4,8,9,l=d,10,11)!=[-2,-2,3,4,5,-2,-2,8,9,10,11])
        || a!=16 || b!=-2 || c!=-2 || d!=-2) {
      goofs++;
      "**FAILURE** of - complicated func declaration";
    }
    junk= [];

    /* ------------------------------------------------------------------------- */

    write, "Test binary I/O functions...";

    /* Test binary I/O functions. */

    f= createb("junkb.pdb");

    if (is_stream(7) || is_stream() || is_stream(not_near) ||

        is_stream(Stest) || !is_stream(f)) {
      goofs++;

      "**FAILURE** of - is_stream function";
    }

    x= ["whoa", "okay"];
    y= [&(1+0), &[1.5,2.5,3.5], &[]];
    z= Stest(a='A', b=13, c=[2,-4,6,-8],
    	 d=[[-1,2],[-3,4],[-5,6]], e=[10,20,30,40,50], f=[1i,2-2i]);

    save, f, x, y, z;
    close, f;
    f= updateb("junkb.pdb");
    save, f, iS, lS, dS;
    save, f, cA, sA, iA, lA, fA, dA, zA;
    f.sA= [-91,57];
    close, f;

    f= openb("junkb.pdb");
    x= y= z= [];
    restore, f, x, y, z;

    if (typeof(x)!="string" || typeof(y)!="pointer" ||

        anyof(dimsof(x)!=[1,2]) || anyof(dimsof(y)!=[1,3]) ||

        anyof(x!=["whoa", "okay"]) || typeof(*y(1))!="long" ||

        !is_void(*y(3)) || anyof(*y(2)!=[1.5,2.5,3.5]) ||

        structof(z)!=Stest || z.a!='A' || anyof(dimsof(z.d)!=[2,2,3]) ||

        anyof(dimsof(z.f)!=[1,2]) || anyof(z.f!=[1i,2-2i])) {
      goofs++;

      "**FAILURE** of - restore or save function";
    }
    if (f.iS!=iS || f.lS!=lS || f.dS!=dS ||

        anyof(f.cA!=cA) || anyof(f.sA!=[-91,57]) || anyof(f.iA!=iA) ||

        anyof(f.lA!=lA) || anyof(f.fA!=fA) || anyof(f.dA!=dA) ||

        anyof(f.zA!=zA) || typeof(f.cA)!="char" || typeof(f.sA)!="short" ||

        typeof(f.iA)!="int" || typeof(f.lA)!="long" || typeof(f.fA)!="float" ||

        typeof(f.dA)!="double" || typeof(f.zA)!="complex") {
      goofs++;

      "**FAILURE** of - f.var syntax or save function";
    }
    close, f;

    remove, "junkb.pdb";

    /* try reading and writing a netCDF file */
    write, "Test binary I/O to netCDF...";

    require, "netcdf.i";
    f= nc_create("junkb.nc");

    nc_vardef,f, "lS", template=lS, record=1;
    nc_vardef,f, "dS", template=dS;
    nc_vardef,f, "cA", template=cA;
    nc_vardef,f, "sA", template=sA;

    nc_vardef,f, "lA", template=lA, record=1;
    nc_vardef,f, "fA", template=fA;

    nc_vardef,f, "dA", template=dA, record=1;
    f= nc_enddef(f);
    f.dS= dS;  f.cA= cA;  f.sA= sA;  f.fA= fA;
    nc_addrec, f;
    save,f, lS,lA,dA;
    nc_addrec, f;
    save,f, lS,lA,dA;
    nc_addrec, f;
    save,f, lS,lA,dA;
    close, f;
    remove, "junkb.ncL";

    f= openb("junkb.nc");
    if (f.lS!=lS || f.dS!=dS ||

        anyof(f.cA!=cA) || anyof(f.sA!=sA) ||

        anyof(f.lA!=lA) || anyof(f.fA!=fA) || anyof(f.dA!=dA) ||

        typeof(f.cA)!="char" || typeof(f.sA)!="short" ||

        typeof(f.lA)!="long" || typeof(f.fA)!="float" ||
        typeof(f.dA)!="double") {
      goofs++;

      "**FAILURE** of - f.var syntax or save to netCDF";
    }

    jr,f, 3;

    if (f.lS!=lS ||  anyof(f.lA!=lA) || anyof(f.dA!=dA)) {
      goofs++;

      "**FAILURE** of - f.var syntax or save to netCDF";
    }

    close, f;
    remove, "junkb.nc";

    if (do_stats) "M "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test ASCII I/O functions...";

    /* Test ASCII I/O functions. */

    f= open("junkt.txt", "w");
    write,f, "The first line.";
    write,f, dA;
    write,f, sA-7, fA+5;

    write,f, format="blah %s %d %e\n", "wow", lA+6, dA-20;
    close,f;

    f= open("junkt.txt", "r+");
    if (rdline(f)!=" The first line.") {
      goofs++;

      "**FAILURE** of - rdline or write function";
    }
    backup, f;
    if (rdline(f)!=" The first line.") {
      goofs++;
      "**FAILURE** of - backup function";
    }
    mark= bookmark(f);
    x= 0*dA;

    if (read(f,x)!=2 || anyof(x!=dA)) {
      goofs++;

      "**FAILURE** of - read or write function";
    }
    y= 0*sA;

    if (read(f,y,x)!=4 || anyof(y!=sA-7) || anyof(x!=fA+5)) {
      goofs++;

      "**FAILURE** of - read or write function ";
    }
    y= 0*lA;
    mark2= bookmark(f);

    if (read(f, format="blah wow %d %e\n", y,x)!=4 ||

        anyof(y!=lA+6) || anyof(x!=dA-20)) {
      backup, f, mark2;

      if (read(f, format="blah wow %d %e", y,x)!=4 ||

          anyof(y!=lA+6) || anyof(x!=dA-20)) {
        goofs++;

        "**FAILURE** of -  formatted read or write function";
      } else {

        /* this OS does not like trailing \n in read formats */

        "**WARNING** Yorick formatted read peculiarity -- see testp.i";
      }
    }
    backup, f, mark;

    if (read(f,x)!=2 || anyof(x!=dA)) {
      goofs++;

      "**FAILURE** of -  bookmark or backup function";
    }
    write,f, "Last line.";
    close, f;
    f= open("junkt.txt");
    if (rdline(f,7)(7)!=" Last line.") {
      goofs++;

      "**FAILURE** of -  write to append to end of text";
    }
    close, f;

    remove, "junkt.txt";

    if (do_stats) "N "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test string manipulation functions...";

    /* Test string manipulation functions. */

    if (strlen("abc")!=3 ||

        anyof(strlen([[string(),"","a"],["axx","ab","abcd"]])!=
    	  [[0,0,1],[3,2,4]])) {
      goofs++;
      "**FAILURE** of - strlen function";
    }

    if (anyof(strtok("abc    1.23    xxx")!=["abc", "   1.23    xxx"]) ||

        anyof(strtok(["abc    1.23    xxx","c","1.5"], "\t c")!=
    	  [["ab", "    1.23    xxx"],string(),["1.5",string()]])) {
      goofs++;
      "**FAILURE** of - strtok function";
    }

    if (!strmatch("abc", "b") || strmatch("abc", "B") ||
        !strmatch("abc", "B", 1) ||

        anyof(strmatch(["abc","aBC"], "B")!=[0,1])) {
      goofs++;

      "**FAILURE** of - strmatch function";
    }

    if (strpart("abc", 1:1)!="a" || strpart("abc", 2:10)!="bc" ||

        strpart("abc", :-1)!="ab" || strpart("abc", :-5)!="" ||

        anyof(strpart(["abc","yowza"],3:)!=["c","wza"])) {
      goofs++;

      "**FAILURE** of - strpart function";
    }

    if (do_stats) "O "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test list functions...";

    l= _lst(1.5, structof(z), _lst([],z), _prt);
    #if 0

    write, "<Begin output from _prt list (15 lines gibberish)>";
    _prt, l;

    write, "<End output from _prt list (15 lines gibberish)>";
    #endif
    if (_len(l)!=4) {
      goofs++;

      "**FAILURE** of - _lst or _len function";
    }

    if (_car(l)!=1.5 || _car(l,1)!=1.5 || _car(l,2)!=Stest ||

        typeof(_car(l,3))!="list" || _car(l,4)!=_prt ||

        !is_void(_car(_car(l,3)))) {
      goofs++;

      "**FAILURE** of - _lst or _car function";
    }

    if (_car(_cdr(l))!=Stest || _car(_cdr(l,3))!=_prt ||

        !is_void(_cdr(l,4))) {
      goofs++;
      "**FAILURE** of - _cdr function";
    }
    m= _cpy(l,2);

    if (_len(m)!=2 || _car(m)!=1.5 || _car(m,2)!=Stest || _len(_cpy(l))!=4) {
      goofs++;
      "**FAILURE** of - _cpy function";
    }

    if (_car(m,2,2.5)!=Stest || _car(l,2)!=Stest || _car(m,2)!=2.5) {
      goofs++;
      "**FAILURE** of - _car set function";
    }

    n= _cat(m, _cpy(_cdr(l,2)));

    if (n!=m || _len(m)!=4 || _len(n)!=4 || _car(n,4)!=_prt) {
      goofs++;
      "**FAILURE** of - _cat function";
    }

    if (_car(_cdr(m,3,[]))!=_prt || !is_void(_cdr(n,3)) ||

        !is_void(_cdr(n,3,_lst(_len))) || _car(m,4)!=_len ||

        _car(l,4)!=_prt) {
      goofs++;
      "**FAILURE** of - _cdr set function";
    }

    n= _map(typeof, m);

    if (_car(n)!="double" || _car(n,2)!="double" ||

        _car(n,3)!="list" || _car(n,4)!="builtin") {
      goofs++;
      "**FAILURE** of - _map set function";
    }
    m= _rev(m);

    if (_car(m,4)!=1.5 || _car(m,3)!=2.5 ||

        typeof(_car(m,2))!="list" || _car(m)!=_len ||

        !is_void(_car(_car(m,2)))) {
      goofs++;
      "**FAILURE** of - _rev function";
    }
    l= m= n= [];

    if (do_stats) "P "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    write, "Test catch function...";

    func junk(type)
    {
      if (catch(0x01)) {
        if (type!=0x01) {
          goofs++;

          "**FAILURE** of - catch function - misidentified error as math";
        }
        return 0x01;
      }
      if (catch(0x02)) {
        if (type!=0x02) {
          goofs++;

          "**FAILURE** of - catch function - misidentified error as io";
        }
        return 0x02;
      }
      if (catch(0x04)) {
        if (type!=0x04) {
          goofs++;

          "**FAILURE** of - catch function - misidentified error as C-c";
        }
        return 0x04;
      }
      if (catch(0x08)) {
        if (type!=0x08) {
          goofs++;

          "**FAILURE** of - catch function - misidentified error as YError";
        }
        return 0x08;
      }
      if (catch(0x10)) {
        if (type!=0x10) {
          goofs++;

          "**FAILURE** of - catch function - misidentified error as interpreted";

        } else if (catch_message!="---test error, should be caught---") {
          goofs++;

          "**FAILURE** of - catch function - catch_message set incorrectly";
        }
        return 0x10;
      }
      if (type==0x01) x= 1.0/0.0;

      if (type==0x02) f= open("no-such-file-ever-existed");

      if (type==0x04) return 0x04; /* need user to hit C-c */
      if (type==0x08) x= 1.0*[];

      if (type==0x10) error, "---test error, should be caught---";
      return 0;
    }

    if (!junk(0x01)) "**WARNING** 1.0/0.0 does not trigger SIGFPE";
    if (!junk(0x02)) {
      goofs++;

      "**FAILURE** of - catch function - I/O error not caught";
    }
    if (!junk(0x08)) {
      goofs++;

      "**FAILURE** of - catch function - compiled error not caught";
    }
    if (!junk(0x10)) {
      goofs++;

      "**FAILURE** of - catch function - interpreted error not caught";
    }

    junk= [];

    if (do_stats) "Q "+print(yorick_stats());

    /* ------------------------------------------------------------------------- */

    iS= lS= dS= cA= sA= iA= lA= fA= dA= zA= [];

    write, format= "End of Yorick parser test, %d goofs\n", goofs;

    if (!skip_testb) {
      require, "testb.i";

      write,"\n Zeroth test is pdtest files:";  pdcheck2;  write,"";
      testb;
    }

    /* write if tests twice so that include actually takes place */
    if (!skip_test1) include, "test1.i";

    if (!skip_test1) { write,"\nShock tracker timing test:";  test1, 20; }

    if (!skip_test2) include, "test2.i";

    if (!skip_test2) { write,"\nEscape factor timing test:";  test2, 15; }

    if (!skip_test3) include, "test3.i";

    if (!skip_test3) { write,"\nZone generator timing test:";  test3, 100; }