home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / language / xlisp_21.zoo / xlspeed.dif < prev    next >
Text File  |  1990-02-28  |  47KB  |  1,853 lines

  1. From sce!mitel!uunet!lll-winken!ames!haven!umd5!jonnyg Tue May 23 15:37:24 EDT 1989
  2. Article: 91 of comp.lang.lisp.x
  3. Path: cognos!sce!mitel!uunet!lll-winken!ames!haven!umd5!jonnyg
  4. From: jonnyg@umd5.umd.edu (Jon Greenblatt)
  5. Newsgroups: comp.lang.lisp.x
  6. Subject: Xlisp2.0 speedups... (Part 1 of 3)
  7. Message-ID: <4912@umd5.umd.edu>
  8. Date: 18 May 89 16:58:56 GMT
  9. Reply-To: jonnyg@umd5.umd.edu (Jon Greenblatt)
  10. Organization: University of Maryland, College Park
  11. Lines: 910
  12.  
  13. The following are changes I have made to xlisp 2.0 source. Most of these
  14. changes produce considerable speed ups. This distribution is very
  15. rough but maybe someone can wade through it and come of with a cleaned
  16. up version of the speed ups. Note this is a striaght context diff so
  17. more than just the speed ups are included, BEWARE! If you are able to
  18. clean up or enhance these speed ups in any way I would apreciate the
  19. feedback.
  20.  
  21.                 JonnyG.
  22.  
  23. diff -c ../xlisp.org/xlbfun.c ../xlisp/xlbfun.c
  24. *** ../xlisp.org/xlbfun.c    Sun May  7 22:25:38 1989
  25. --- ../xlisp/xlbfun.c    Wed Apr  5 16:18:23 1989
  26. ***************
  27. *** 558,563 ****
  28. --- 558,578 ----
  29.       return (val);
  30.   }
  31.   
  32. + LVAL xcopyarray()
  33. + {
  34. +     LVAL src, dest;
  35. +     int num;
  36. +     register int i;
  37. +     src = xlgavector();
  38. +     dest = xlgavector();
  39. +     xllastarg();
  40. +     num = (getsize(src) < getsize(dest)) ? getsize(src) : getsize(dest);
  41. +     for (i = 0; i < num; i++)
  42. +         setelement(dest,i,getelement(src,i));
  43. +     return(dest);
  44. + }
  45.   /* xerror - special form 'error' */
  46.   LVAL xerror()
  47.   {
  48. diff -c ../xlisp.org/xldbug.c ../xlisp/xldbug.c
  49. *** ../xlisp.org/xldbug.c    Sun May  7 22:25:43 1989
  50. --- ../xlisp/xldbug.c    Wed Apr  5 16:18:24 1989
  51. ***************
  52. *** 14,20 ****
  53.   extern char buf[];
  54.   
  55.   /* external routines */
  56. ! extern char *malloc();
  57.   
  58.   /* forward declarations */
  59.   FORWARD LVAL stacktop();
  60. --- 14,20 ----
  61.   extern char buf[];
  62.   
  63.   /* external routines */
  64. ! extern char *xlmalloc();
  65.   
  66.   /* forward declarations */
  67.   FORWARD LVAL stacktop();
  68. diff -c ../xlisp.org/xldmem.c ../xlisp/xldmem.c
  69. *** ../xlisp.org/xldmem.c    Sun May  7 22:25:46 1989
  70. --- ../xlisp/xldmem.c    Wed Apr  5 16:18:25 1989
  71. ***************
  72. *** 6,13 ****
  73.   #include "xlisp.h"
  74.   
  75.   /* node flags */
  76. ! #define MARK    1
  77. ! #define LEFT    2
  78.   
  79.   /* macro to compute the size of a segment */
  80.   #define segsize(n) (sizeof(SEGMENT)+((n)-1)*sizeof(struct node))
  81. --- 6,13 ----
  82.   #include "xlisp.h"
  83.   
  84.   /* node flags */
  85. ! #define MARK    0x20
  86. ! #define LEFT    0x40
  87.   
  88.   /* macro to compute the size of a segment */
  89.   #define segsize(n) (sizeof(SEGMENT)+((n)-1)*sizeof(struct node))
  90. ***************
  91. *** 21,37 ****
  92.   SEGMENT *segs,*lastseg,*fixseg,*charseg;
  93.   int anodes,nsegs,gccalls;
  94.   long nnodes,nfree,total;
  95. ! LVAL fnodes;
  96.   
  97.   /* external procedures */
  98. ! extern char *malloc();
  99. ! extern char *calloc();
  100.   
  101.   /* forward declarations */
  102. ! FORWARD LVAL newnode();
  103.   FORWARD unsigned char *stralloc();
  104.   FORWARD SEGMENT *newsegment();
  105.   
  106.   /* cons - construct a new cons node */
  107.   LVAL cons(x,y)
  108.     LVAL x,y;
  109. --- 21,50 ----
  110.   SEGMENT *segs,*lastseg,*fixseg,*charseg;
  111.   int anodes,nsegs,gccalls;
  112.   long nnodes,nfree,total;
  113. ! LVAL fnodes = NIL;
  114.   
  115.   /* external procedures */
  116. ! extern char *xlmalloc();
  117. ! extern char *xlcalloc();
  118.   
  119.   /* forward declarations */
  120. ! FORWARD LVAL Newnode();
  121.   FORWARD unsigned char *stralloc();
  122.   FORWARD SEGMENT *newsegment();
  123.   
  124. + LVAL _nnode;
  125. + FIXTYPE _tfixed;
  126. + int _tint;
  127. + #define    newnode(type) (((_nnode = fnodes) != NIL) ? \
  128. +             ((fnodes = cdr(_nnode)), \
  129. +              nfree--, \
  130. +              (_nnode->n_type = type), \
  131. +              rplacd(_nnode,NIL), \
  132. +              _nnode) \
  133. +             : (_nnode = Newnode(type)))
  134.   /* cons - construct a new cons node */
  135.   LVAL cons(x,y)
  136.     LVAL x,y;
  137. ***************
  138. *** 129,140 ****
  139.   }
  140.   
  141.   /* cvfixnum - convert an integer to a fixnum node */
  142. ! LVAL cvfixnum(n)
  143.     FIXTYPE n;
  144.   {
  145.       LVAL val;
  146. -     if (n >= SFIXMIN && n <= SFIXMAX)
  147. -     return (&fixseg->sg_nodes[(int)n-SFIXMIN]);
  148.       val = newnode(FIXNUM);
  149.       val->n_fixnum = n;
  150.       return (val);
  151. --- 142,151 ----
  152.   }
  153.   
  154.   /* cvfixnum - convert an integer to a fixnum node */
  155. ! LVAL Cvfixnum(n)
  156.     FIXTYPE n;
  157.   {
  158.       LVAL val;
  159.       val = newnode(FIXNUM);
  160.       val->n_fixnum = n;
  161.       return (val);
  162. ***************
  163. *** 151,157 ****
  164.   }
  165.   
  166.   /* cvchar - convert an integer to a character node */
  167. ! LVAL cvchar(n)
  168.     int n;
  169.   {
  170.       if (n >= CHARMIN && n <= CHARMAX)
  171. --- 162,168 ----
  172.   }
  173.   
  174.   /* cvchar - convert an integer to a character node */
  175. ! LVAL Cvchar(n)
  176.     int n;
  177.   {
  178.       if (n >= CHARMIN && n <= CHARMAX)
  179. ***************
  180. *** 180,185 ****
  181. --- 191,225 ----
  182.       return (val);
  183.   }
  184.   
  185. + #ifdef    WINDOWS
  186. + LVAL newwinobj(size)
  187. + int size;
  188. + {
  189. +     LVAL val;
  190. +     val = newnode(WINOBJ);
  191. +     if (size > 0) {
  192. +         xlprot1(val);
  193. +         if ((val->n_winobj = xldcalloc(1,size)) == NULL) {
  194. +             findmem();
  195. +             if ((val->n_winobj = xldcalloc(1,size)) == NULL)
  196. +                 xlfail("insufficient memory");
  197. +             }
  198. +         xlpop();
  199. +         }
  200. +     else val->n_winobj = NULL;
  201. +     return(val);
  202. + }
  203. + LVAL cvwinobj(p)
  204. + char *p;
  205. +     {
  206. +     LVAL val;
  207. +     val = newnode(WINOBJ);
  208. +     val->n_winobj = p;
  209. +     return(val);
  210. +     }
  211. + #endif
  212.   /* newclosure - allocate and initialize a new closure */
  213.   LVAL newclosure(name,type,env,fenv)
  214.     LVAL name,type,env,fenv;
  215. ***************
  216. *** 204,212 ****
  217.       vect = newnode(VECTOR);
  218.       vect->n_vsize = 0;
  219.       if (bsize = size * sizeof(LVAL)) {
  220. !     if ((vect->n_vdata = (LVAL *)calloc(1,bsize)) == NULL) {
  221.           findmem();
  222. !         if ((vect->n_vdata = (LVAL *)calloc(1,bsize)) == NULL)
  223.           xlfail("insufficient vector space");
  224.       }
  225.       vect->n_vsize = size;
  226. --- 244,252 ----
  227.       vect = newnode(VECTOR);
  228.       vect->n_vsize = 0;
  229.       if (bsize = size * sizeof(LVAL)) {
  230. !     if ((vect->n_vdata = (LVAL *)xldcalloc(1,bsize)) == NULL) {
  231.           findmem();
  232. !         if ((vect->n_vdata = (LVAL *)xldcalloc(1,bsize)) == NULL)
  233.           xlfail("insufficient vector space");
  234.       }
  235.       vect->n_vsize = size;
  236. ***************
  237. *** 217,223 ****
  238.   }
  239.   
  240.   /* newnode - allocate a new node */
  241. ! LOCAL LVAL newnode(type)
  242.     int type;
  243.   {
  244.       LVAL nnode;
  245. --- 257,263 ----
  246.   }
  247.   
  248.   /* newnode - allocate a new node */
  249. ! LVAL Newnode(type)
  250.     int type;
  251.   {
  252.       LVAL nnode;
  253. ***************
  254. *** 248,256 ****
  255.       unsigned char *sptr;
  256.   
  257.       /* allocate memory for the string copy */
  258. !     if ((sptr = (unsigned char *)malloc(size)) == NULL) {
  259.       gc();  
  260. !     if ((sptr = (unsigned char *)malloc(size)) == NULL)
  261.           xlfail("insufficient string space");
  262.       }
  263.       total += (long)size;
  264. --- 288,296 ----
  265.       unsigned char *sptr;
  266.   
  267.       /* allocate memory for the string copy */
  268. !     if ((sptr = (unsigned char *)xldmalloc(size)) == NULL) {
  269.       gc();  
  270. !     if ((sptr = (unsigned char *)xldmalloc(size)) == NULL)
  271.           xlfail("insufficient string space");
  272.       }
  273.       total += (long)size;
  274. ***************
  275. *** 330,336 ****
  276.     LVAL ptr;
  277.   {
  278.       register LVAL this,prev,tmp;
  279. !     int type,i,n;
  280.   
  281.       /* initialize */
  282.       prev = NIL;
  283. --- 370,376 ----
  284.     LVAL ptr;
  285.   {
  286.       register LVAL this,prev,tmp;
  287. !     register int i,n;
  288.   
  289.       /* initialize */
  290.       prev = NIL;
  291. ***************
  292. *** 340,380 ****
  293.       for (;;) {
  294.   
  295.       /* descend as far as we can */
  296. !     while (!(this->n_flags & MARK))
  297.   
  298.           /* check cons and symbol nodes */
  299. !         if ((type = ntype(this)) == CONS) {
  300. !         if (tmp = car(this)) {
  301. !             this->n_flags |= MARK|LEFT;
  302. !             rplaca(this,prev);
  303. !         }
  304. !         else if (tmp = cdr(this)) {
  305. !             this->n_flags |= MARK;
  306.               rplacd(this,prev);
  307. !         }
  308. !         else {                /* both sides nil */
  309. !             this->n_flags |= MARK;
  310.               break;
  311. !         }
  312. !         prev = this;            /* step down the branch */
  313. !         this = tmp;
  314. !         }
  315. !         /* mark other node types */
  316.           else {
  317. !         this->n_flags |= MARK;
  318. !         switch (type) {
  319. !         case SYMBOL:
  320. !         case OBJECT:
  321. !         case VECTOR:
  322. !         case CLOSURE:
  323. !             for (i = 0, n = getsize(this); --n >= 0; ++i)
  324. !             if (tmp = getelement(this,i))
  325. !                 mark(tmp);
  326. !             break;
  327. !         }
  328. !         break;
  329. !         }
  330.   
  331.       /* backup to a point where we can continue descending */
  332.       for (;;)
  333. --- 380,409 ----
  334.       for (;;) {
  335.   
  336.       /* descend as far as we can */
  337. !     while (!(this->n_type & MARK))
  338.   
  339.           /* check cons and symbol nodes */
  340. !         if ((i = (this->n_type |= MARK) & TYPEFIELD) == CONS) {
  341. !           if (tmp = car(this)) {
  342. !             this->n_type |= LEFT;
  343. !             rplaca(this,prev);}
  344. !           else if (tmp = cdr(this))
  345.               rplacd(this,prev);
  346. !           else                /* both sides nil */
  347.               break;
  348. !           prev = this;            /* step down the branch */
  349. !           this = tmp;
  350. !           }
  351.           else {
  352. !           if ((i & ARRAY) != 0)
  353. !         for (i = 0, n = getsize(this); i < n;)
  354. !           if (tmp = getelement(this,i++))
  355. !             if ((tmp->n_type & (ARRAY|MARK)) == ARRAY ||
  356. !              tmp->n_type == CONS)
  357. !                 mark(tmp);
  358. !             else tmp->n_type |= MARK;
  359. !           break;
  360. !           }
  361.   
  362.       /* backup to a point where we can continue descending */
  363.       for (;;)
  364. ***************
  365. *** 381,388 ****
  366.   
  367.           /* make sure there is a previous node */
  368.           if (prev) {
  369. !         if (prev->n_flags & LEFT) {    /* came from left side */
  370. !             prev->n_flags &= ~LEFT;
  371.               tmp = car(prev);
  372.               rplaca(prev,this);
  373.               if (this = cdr(prev)) {
  374. --- 410,417 ----
  375.   
  376.           /* make sure there is a previous node */
  377.           if (prev) {
  378. !         if (prev->n_type & LEFT) {    /* came from left side */
  379. !             prev->n_type &= ~LEFT;
  380.               tmp = car(prev);
  381.               rplaca(prev,this);
  382.               if (this = cdr(prev)) {
  383. ***************
  384. *** 399,406 ****
  385.           }
  386.   
  387.           /* no previous node, must be done */
  388. !         else
  389. !         return;
  390.       }
  391.   }
  392.   
  393. --- 428,434 ----
  394.           }
  395.   
  396.           /* no previous node, must be done */
  397. !         else return;
  398.       }
  399.   }
  400.   
  401. ***************
  402. *** 407,434 ****
  403.   /* sweep - sweep all unmarked nodes and add them to the free list */
  404.   LOCAL sweep()
  405.   {
  406. !     SEGMENT *seg;
  407. !     LVAL p;
  408. !     int n;
  409.   
  410. -     /* empty the free list */
  411.       fnodes = NIL;
  412. !     nfree = 0L;
  413.   
  414.       /* add all unmarked nodes */
  415.       for (seg = segs; seg; seg = seg->sg_next) {
  416. !     if (seg == fixseg)     /* don't sweep the fixnum segment */
  417.           continue;
  418. -     else if (seg == charseg) /* don't sweep the character segment */
  419. -         continue;
  420.       p = &seg->sg_nodes[0];
  421. !     for (n = seg->sg_size; --n >= 0; ++p)
  422. !         if (!(p->n_flags & MARK)) {
  423.           switch (ntype(p)) {
  424.           case STRING:
  425.               if (getstring(p) != NULL) {
  426.                   total -= (long)getslength(p);
  427. !                 free(getstring(p));
  428.               }
  429.               break;
  430.           case STREAM:
  431. --- 435,463 ----
  432.   /* sweep - sweep all unmarked nodes and add them to the free list */
  433.   LOCAL sweep()
  434.   {
  435. !     register SEGMENT *seg;
  436. !     register LVAL p;
  437. !     register int n;
  438.   
  439.       fnodes = NIL;
  440. !     nfree = 0l;
  441.   
  442.       /* add all unmarked nodes */
  443.       for (seg = segs; seg; seg = seg->sg_next) {
  444. !     if (seg == fixseg || seg == charseg)
  445. !          /* don't sweep the fixed segments */
  446.           continue;
  447.       p = &seg->sg_nodes[0];
  448. !     for (n = seg->sg_size; --n >= 0;)
  449. !         if (p->n_type & MARK)
  450. !         (p++)->n_type &= ~MARK;
  451. !         else {
  452.           switch (ntype(p)) {
  453.           case STRING:
  454.               if (getstring(p) != NULL) {
  455.                   total -= (long)getslength(p);
  456. !            /* Using getstring here breaks VMEM (JonnyG) */
  457. !                 xldfree(p->n_string);
  458.               }
  459.               break;
  460.           case STREAM:
  461. ***************
  462. *** 435,440 ****
  463. --- 464,474 ----
  464.               if (getfile(p))
  465.                   osclose(getfile(p));
  466.               break;
  467. + #ifdef    WINDOWS
  468. +         case WINOBJ:
  469. +             free_winobj(p);
  470. +             break;
  471. + #endif
  472.           case SYMBOL:
  473.           case OBJECT:
  474.           case VECTOR:
  475. ***************
  476. *** 441,447 ****
  477.           case CLOSURE:
  478.               if (p->n_vsize) {
  479.                   total -= (long) (p->n_vsize * sizeof(LVAL));
  480. !                 free(p->n_vdata);
  481.               }
  482.               break;
  483.           }
  484. --- 475,481 ----
  485.           case CLOSURE:
  486.               if (p->n_vsize) {
  487.                   total -= (long) (p->n_vsize * sizeof(LVAL));
  488. !                 xldfree(p->n_vdata);
  489.               }
  490.               break;
  491.           }
  492. ***************
  493. *** 448,458 ****
  494.           p->n_type = FREE;
  495.           rplaca(p,NIL);
  496.           rplacd(p,fnodes);
  497. !         fnodes = p;
  498. !         nfree += 1L;
  499.           }
  500. -         else
  501. -         p->n_flags &= ~MARK;
  502.       }
  503.   }
  504.   
  505. --- 482,490 ----
  506.           p->n_type = FREE;
  507.           rplaca(p,NIL);
  508.           rplacd(p,fnodes);
  509. !         fnodes = p++;
  510. !         nfree++;
  511.           }
  512.       }
  513.   }
  514.   
  515. ***************
  516. *** 485,491 ****
  517.       SEGMENT *newseg;
  518.   
  519.       /* allocate the new segment */
  520. !     if ((newseg = (SEGMENT *)calloc(1,segsize(n))) == NULL)
  521.       return (NULL);
  522.   
  523.       /* initialize the new segment */
  524. --- 517,524 ----
  525.       SEGMENT *newseg;
  526.   
  527.       /* allocate the new segment */
  528. !     if ((newseg = (SEGMENT *)xlcalloc(1,segsize(n))) == NULL)
  529.       return (NULL);
  530.   
  531.       /* initialize the new segment */
  532. ***************
  533. *** 666,677 ****
  534.       s_gcflag = s_gchook = NIL;
  535.   
  536.       /* allocate the evaluation stack */
  537. !     if ((xlstkbase = (LVAL **)malloc(EDEPTH * sizeof(LVAL *))) == NULL)
  538.       xlfatal("insufficient memory");
  539.       xlstack = xlstktop = xlstkbase + EDEPTH;
  540.   
  541.       /* allocate the argument stack */
  542. !     if ((xlargstkbase = (LVAL *)malloc(ADEPTH * sizeof(LVAL))) == NULL)
  543.       xlfatal("insufficient memory");
  544.       xlargstktop = xlargstkbase + ADEPTH;
  545.       xlfp = xlsp = xlargstkbase;
  546. --- 699,710 ----
  547.       s_gcflag = s_gchook = NIL;
  548.   
  549.       /* allocate the evaluation stack */
  550. !     if ((xlstkbase = (LVAL **)xlmalloc(EDEPTH * sizeof(LVAL *))) == NULL)
  551.       xlfatal("insufficient memory");
  552.       xlstack = xlstktop = xlstkbase + EDEPTH;
  553.   
  554.       /* allocate the argument stack */
  555. !     if ((xlargstkbase = (LVAL *)xlmalloc(ADEPTH * sizeof(LVAL))) == NULL)
  556.       xlfatal("insufficient memory");
  557.       xlargstktop = xlargstkbase + ADEPTH;
  558.       xlfp = xlsp = xlargstkbase;
  559. diff -c ../xlisp.org/xldmem.h ../xlisp/xldmem.h
  560. *** ../xlisp.org/xldmem.h    Sun May  7 22:25:47 1989
  561. --- ../xlisp/xldmem.h    Wed Apr  5 16:45:38 1989
  562. ***************
  563. *** 13,21 ****
  564.   #define CHARMAX        255
  565.   #define CHARSIZE    256
  566.   
  567. - /* new node access macros */
  568. - #define ntype(x)    ((x)->n_type)
  569.   /* cons access macros */
  570.   #define car(x)        ((x)->n_car)
  571.   #define cdr(x)        ((x)->n_cdr)
  572. --- 13,18 ----
  573. ***************
  574. *** 23,72 ****
  575.   #define rplacd(x,y)    ((x)->n_cdr = (y))
  576.   
  577.   /* symbol access macros */
  578. ! #define getvalue(x)     ((x)->n_vdata[0])
  579. ! #define setvalue(x,v)     ((x)->n_vdata[0] = (v))
  580. ! #define getfunction(x)     ((x)->n_vdata[1])
  581. ! #define setfunction(x,v) ((x)->n_vdata[1] = (v))
  582. ! #define getplist(x)     ((x)->n_vdata[2])
  583. ! #define setplist(x,v)     ((x)->n_vdata[2] = (v))
  584. ! #define getpname(x)     ((x)->n_vdata[3])
  585. ! #define setpname(x,v)     ((x)->n_vdata[3] = (v))
  586.   #define SYMSIZE        4
  587.   
  588.   /* closure access macros */
  589. ! #define getname(x)         ((x)->n_vdata[0])
  590. ! #define setname(x,v)       ((x)->n_vdata[0] = (v))
  591. ! #define gettype(x)        ((x)->n_vdata[1])
  592. ! #define settype(x,v)      ((x)->n_vdata[1] = (v))
  593. ! #define getargs(x)         ((x)->n_vdata[2])
  594. ! #define setargs(x,v)       ((x)->n_vdata[2] = (v))
  595. ! #define getoargs(x)        ((x)->n_vdata[3])
  596. ! #define setoargs(x,v)      ((x)->n_vdata[3] = (v))
  597. ! #define getrest(x)         ((x)->n_vdata[4])
  598. ! #define setrest(x,v)       ((x)->n_vdata[4] = (v))
  599. ! #define getkargs(x)        ((x)->n_vdata[5])
  600. ! #define setkargs(x,v)      ((x)->n_vdata[5] = (v))
  601. ! #define getaargs(x)        ((x)->n_vdata[6])
  602. ! #define setaargs(x,v)      ((x)->n_vdata[6] = (v))
  603. ! #define getbody(x)         ((x)->n_vdata[7])
  604. ! #define setbody(x,v)       ((x)->n_vdata[7] = (v))
  605. ! #define getenv(x)    ((x)->n_vdata[8])
  606. ! #define setenv(x,v)    ((x)->n_vdata[8] = (v))
  607. ! #define getfenv(x)    ((x)->n_vdata[9])
  608. ! #define setfenv(x,v)    ((x)->n_vdata[9] = (v))
  609. ! #define getlambda(x)    ((x)->n_vdata[10])
  610. ! #define setlambda(x,v)    ((x)->n_vdata[10] = (v))
  611.   #define CLOSIZE        11
  612.   
  613.   /* vector access macros */
  614.   #define getsize(x)    ((x)->n_vsize)
  615. ! #define getelement(x,i)    ((x)->n_vdata[i])
  616. ! #define setelement(x,i,v) ((x)->n_vdata[i] = (v))
  617.   
  618.   /* object access macros */
  619. ! #define getclass(x)    ((x)->n_vdata[0])
  620. ! #define getivar(x,i)    ((x)->n_vdata[i+1])
  621. ! #define setivar(x,i,v)    ((x)->n_vdata[i+1] = (v))
  622.   
  623.   /* subr/fsubr access macros */
  624.   #define getsubr(x)    ((x)->n_subr)
  625. --- 20,69 ----
  626.   #define rplacd(x,y)    ((x)->n_cdr = (y))
  627.   
  628.   /* symbol access macros */
  629. ! #define getvalue(x)     (ACESSV(x,0))
  630. ! #define setvalue(x,v)     (ACESSV(x,0) = (v))
  631. ! #define getfunction(x)     (ACESSV(x,1))
  632. ! #define setfunction(x,v) (ACESSV(x,1) = (v))
  633. ! #define getplist(x)     (ACESSV(x,2))
  634. ! #define setplist(x,v)     (ACESSV(x,2) = (v))
  635. ! #define getpname(x)     (ACESSV(x,3))
  636. ! #define setpname(x,v)     (ACESSV(x,3) = (v))
  637.   #define SYMSIZE        4
  638.   
  639.   /* closure access macros */
  640. ! #define getname(x)         (ACESSV(x,0))
  641. ! #define setname(x,v)       (ACESSV(x,0) = (v))
  642. ! #define gettype(x)        (ACESSV(x,1))
  643. ! #define settype(x,v)      (ACESSV(x,1) = (v))
  644. ! #define getargs(x)         (ACESSV(x,2))
  645. ! #define setargs(x,v)       (ACESSV(x,2) = (v))
  646. ! #define getoargs(x)        (ACESSV(x,3))
  647. ! #define setoargs(x,v)      (ACESSV(x,3) = (v))
  648. ! #define getrest(x)         (ACESSV(x,4))
  649. ! #define setrest(x,v)       (ACESSV(x,4) = (v))
  650. ! #define getkargs(x)        (ACESSV(x,5))
  651. ! #define setkargs(x,v)      (ACESSV(x,5) = (v))
  652. ! #define getaargs(x)        (ACESSV(x,6))
  653. ! #define setaargs(x,v)      (ACESSV(x,6) = (v))
  654. ! #define getbody(x)         (ACESSV(x,7))
  655. ! #define setbody(x,v)       (ACESSV(x,7) = (v))
  656. ! #define getenv(x)    (ACESSV(x,8))
  657. ! #define setenv(x,v)    (ACESSV(x,8) = (v))
  658. ! #define getfenv(x)    (ACESSV(x,9))
  659. ! #define setfenv(x,v)    (ACESSV(x,9) = (v))
  660. ! #define getlambda(x)    (ACESSV(x,10))
  661. ! #define setlambda(x,v)    (ACESSV(x,10) = (v))
  662.   #define CLOSIZE        11
  663.   
  664.   /* vector access macros */
  665.   #define getsize(x)    ((x)->n_vsize)
  666. ! #define getelement(x,i)    (ACESSV(x,i))
  667. ! #define setelement(x,i,v) (ACESSV(x,i) = (v))
  668.   
  669.   /* object access macros */
  670. ! #define getclass(x)    (ACESSV(x,0))
  671. ! #define getivar(x,i)    (ACESSV(x,i+1))
  672. ! #define setivar(x,i,v)    (ACESSV(x,i+1) = (v))
  673.   
  674.   /* subr/fsubr access macros */
  675.   #define getsubr(x)    ((x)->n_subr)
  676. ***************
  677. *** 78,84 ****
  678.   #define getchcode(x)    ((x)->n_chcode)
  679.   
  680.   /* string access macros */
  681. ! #define getstring(x)    ((x)->n_string)
  682.   #define getslength(x)    ((x)->n_strlen)
  683.   
  684.   /* file stream access macros */
  685. --- 75,81 ----
  686.   #define getchcode(x)    ((x)->n_chcode)
  687.   
  688.   /* string access macros */
  689. ! #define getstring(x)    (ACESSS((x)->n_string))
  690.   #define getslength(x)    ((x)->n_strlen)
  691.   
  692.   /* file stream access macros */
  693. ***************
  694. *** 93,114 ****
  695.   #define gettail(x)    ((x)->n_cdr)
  696.   #define settail(x,v)    ((x)->n_cdr = (v))
  697.   
  698.   /* node types */
  699.   #define FREE    0
  700.   #define SUBR    1
  701.   #define FSUBR    2
  702.   #define CONS    3
  703. ! #define SYMBOL    4
  704. ! #define FIXNUM    5
  705. ! #define FLONUM    6
  706. ! #define STRING    7
  707. ! #define OBJECT    8
  708. ! #define STREAM    9
  709. ! #define VECTOR    10
  710. ! #define CLOSURE    11
  711. ! #define CHAR    12
  712. ! #define USTREAM    13
  713.   
  714.   /* subr/fsubr node */
  715.   #define n_subr        n_info.n_xsubr.xs_subr
  716.   #define n_offset    n_info.n_xsubr.xs_offset
  717. --- 90,121 ----
  718.   #define gettail(x)    ((x)->n_cdr)
  719.   #define settail(x,v)    ((x)->n_cdr = (v))
  720.   
  721. + #define    getwinobj(x)    (ACESSS((x)->n_winobj))
  722. + #define    setwinobj(x,v)    ((x)->n_winobj = (v))
  723.   /* node types */
  724.   #define FREE    0
  725. + #define SYMBOL    17
  726. + #define OBJECT    18
  727. + #define VECTOR    19
  728. + #define CLOSURE    20
  729.   #define SUBR    1
  730.   #define FSUBR    2
  731.   #define CONS    3
  732. ! #define FIXNUM    4
  733. ! #define FLONUM    5
  734. ! #define STRING    6
  735. ! #define STREAM    7
  736. ! #define CHAR    8
  737. ! #define USTREAM    9
  738. ! #define    WINOBJ    10
  739.   
  740. + #define    ARRAY    16
  741. + #define TYPEFIELD 0x1f
  742. + /* new node access macros */
  743. + #define ntype(x)    ((x)->n_type & TYPEFIELD)
  744.   /* subr/fsubr node */
  745.   #define n_subr        n_info.n_xsubr.xs_subr
  746.   #define n_offset    n_info.n_xsubr.xs_offset
  747. ***************
  748. *** 137,146 ****
  749.   #define n_vsize        n_info.n_xvector.xv_size
  750.   #define n_vdata        n_info.n_xvector.xv_data
  751.   
  752.   /* node structure */
  753.   typedef struct node {
  754.       char n_type;        /* type of node */
  755. -     char n_flags;        /* flag bits */
  756.       union ninfo {         /* value */
  757.       struct xsubr {        /* subr/fsubr node */
  758.           struct node *(*xs_subr)();    /* function pointer */
  759. --- 144,155 ----
  760.   #define n_vsize        n_info.n_xvector.xv_size
  761.   #define n_vdata        n_info.n_xvector.xv_data
  762.   
  763. + /* window/font node */
  764. + #define    n_winobj    n_info.n_xwinobj.xw_ptr
  765.   /* node structure */
  766.   typedef struct node {
  767.       char n_type;        /* type of node */
  768.       union ninfo {         /* value */
  769.       struct xsubr {        /* subr/fsubr node */
  770.           struct node *(*xs_subr)();    /* function pointer */
  771. ***************
  772. *** 171,176 ****
  773. --- 180,188 ----
  774.           int xv_size;        /* vector size */
  775.           struct node **xv_data;    /* vector data */
  776.       } n_xvector;
  777. +     struct xwinobj {    /* window/font object */
  778. +         char *xw_ptr;        /* Generic structure pointer */
  779. +     } n_xwinobj;
  780.       } n_info;
  781.   } *LVAL;
  782.   
  783. ***************
  784. *** 187,195 ****
  785.   extern LVAL cvstring();           /* convert a string */
  786.   extern LVAL cvfile();        /* convert a FILE * to a file */
  787.   extern LVAL cvsubr();        /* convert a function to a subr/fsubr */
  788. ! extern LVAL cvfixnum();           /* convert a fixnum */
  789.   extern LVAL cvflonum();           /* convert a flonum */
  790. ! extern LVAL cvchar();        /* convert a character */
  791.   
  792.   extern LVAL newstring();    /* create a new string */
  793.   extern LVAL newvector();    /* create a new vector */
  794. --- 199,207 ----
  795.   extern LVAL cvstring();           /* convert a string */
  796.   extern LVAL cvfile();        /* convert a FILE * to a file */
  797.   extern LVAL cvsubr();        /* convert a function to a subr/fsubr */
  798. ! extern LVAL Cvfixnum();           /* convert a fixnum */
  799.   extern LVAL cvflonum();           /* convert a flonum */
  800. ! extern LVAL Cvchar();        /* convert a character */
  801.   
  802.   extern LVAL newstring();    /* create a new string */
  803.   extern LVAL newvector();    /* create a new vector */
  804. ***************
  805. *** 196,198 ****
  806. --- 208,249 ----
  807.   extern LVAL newobject();    /* create a new object */
  808.   extern LVAL newclosure();    /* create a new closure */
  809.   extern LVAL newustream();    /* create a new unnamed stream */
  810. + /* Speed ups, reduce function calls for fixed characters and numbers       */
  811. + /* Speed is exeptionaly noticed on machines with large a instruction cache */
  812. + /* No size effects here (JonnyG) */
  813. + extern SEGMENT *fixseg,*charseg;
  814. + extern FIXTYPE _tfixed;
  815. + extern int _tint;
  816. + #define cvfixnum(n) ((_tfixed = n), \
  817. +         ((_tfixed > SFIXMIN && _tfixed < SFIXMAX) ? \
  818. +         &fixseg->sg_nodes[(int)_tfixed-SFIXMIN] : \
  819. +         Cvfixnum(_tfixed)))
  820. + #define cvchar(c) ((_tint = c), \
  821. +         ((_tint >= CHARMIN && _tint <= CHARMIN) ? \
  822. +             &charseg->sg_nodes[_tint-CHARMIN] : \
  823. +         Cvchar(_tint)))
  824. + extern    char *xldmalloc();
  825. + extern    char *xldcalloc();
  826. + #ifdef    VMEM
  827. + extern char *vload();
  828. + extern    unsigned char *vaccess();
  829. + #define    ACESSV(x,i)    (((LVAL *)vaccess((x)->n_vdata))[i])
  830. + #define    ACESSS(x)    (vaccess(x))
  831. + #else
  832. + #define    xlfcalloc    xlcalloc
  833. + #define ACESSV(x,i)    (x)->n_vdata[i]
  834. + #define    ACESSS(x)    x
  835. + #endif
  836. diff -c ../xlisp.org/xlfio.c ../xlisp/xlfio.c
  837. *** ../xlisp.org/xlfio.c    Sun May  7 22:25:52 1989
  838. --- ../xlisp/xlfio.c    Wed Apr  5 16:18:27 1989
  839. ***************
  840. *** 349,355 ****
  841.   
  842.       /* copy the substring into the stream */
  843.       for (i = start; i < end; ++i)
  844. !     xlputc(val,str[i]);
  845.   
  846.       /* restore the stack */
  847.       xlpop();
  848. --- 349,355 ----
  849.   
  850.       /* copy the substring into the stream */
  851.       for (i = start; i < end; ++i)
  852. !     xlputc(val,getstring(string) + i);
  853.   
  854.       /* restore the stack */
  855.       xlpop();
  856. ***************
  857. *** 450,456 ****
  858.   LOCAL LVAL getstroutput(stream)
  859.     LVAL stream;
  860.   {
  861. !     unsigned char *str;
  862.       LVAL next,val;
  863.       int len,ch;
  864.   
  865. --- 450,456 ----
  866.   LOCAL LVAL getstroutput(stream)
  867.     LVAL stream;
  868.   {
  869. !     int i;
  870.       LVAL next,val;
  871.       int len,ch;
  872.   
  873. ***************
  874. *** 462,471 ****
  875.       val = newstring(len + 1);
  876.       
  877.       /* copy the characters into the new string */
  878. !     str = getstring(val);
  879.       while ((ch = xlgetc(stream)) != EOF)
  880. !     *str++ = ch;
  881. !     *str = '\0';
  882.   
  883.       /* return the string */
  884.       return (val);
  885. --- 462,471 ----
  886.       val = newstring(len + 1);
  887.       
  888.       /* copy the characters into the new string */
  889. !     i = 0;
  890.       while ((ch = xlgetc(stream)) != EOF)
  891. !     getstring(val)[i++] = ch;
  892. !     getstring(val)[i] = '\0';
  893.   
  894.       /* return the string */
  895.       return (val);
  896.  
  897.  
  898. From sce!mitel!uunet!lll-winken!ames!haven!umd5!jonnyg Tue May 23 15:37:32 EDT 1989
  899. Article: 92 of comp.lang.lisp.x
  900. Path: cognos!sce!mitel!uunet!lll-winken!ames!haven!umd5!jonnyg
  901. From: jonnyg@umd5.umd.edu (Jon Greenblatt)
  902. Newsgroups: comp.lang.lisp.x
  903. Subject: Xlisp 2.0 speedups (Part 2 of 3)
  904. Message-ID: <4913@umd5.umd.edu>
  905. Date: 18 May 89 16:59:37 GMT
  906. Reply-To: jonnyg@umd5.umd.edu (Jon Greenblatt)
  907. Organization: University of Maryland, College Park
  908. Lines: 913
  909.  
  910. diff -c ../xlisp.org/xlftab.c ../xlisp/xlftab.c
  911. *** ../xlisp.org/xlftab.c    Sun May  7 22:25:54 1989
  912. --- ../xlisp/xlftab.c    Wed Apr  5 16:18:28 1989
  913. ***************
  914. *** 11,17 ****
  915.       rmhash(),rmquote(),rmdquote(),rmbquote(),rmcomma(),
  916.       clnew(),clisnew(),clanswer(),
  917.       obisnew(),obclass(),obshow(),
  918. !     rmlpar(),rmrpar(),rmsemi(),
  919.       xeval(),xapply(),xfuncall(),xquote(),xfunction(),xbquote(),
  920.       xlambda(),xset(),xsetq(),xsetf(),xdefun(),xdefmacro(),
  921.       xgensym(),xmakesymbol(),xintern(),
  922. --- 11,17 ----
  923.       rmhash(),rmquote(),rmdquote(),rmbquote(),rmcomma(),
  924.       clnew(),clisnew(),clanswer(),
  925.       obisnew(),obclass(),obshow(),
  926. !     rmlpar(),rmrpar(),rmlbrace(),rmrbrace(),rmsemi(),
  927.       xeval(),xapply(),xfuncall(),xquote(),xfunction(),xbquote(),
  928.       xlambda(),xset(),xsetq(),xsetf(),xdefun(),xdefmacro(),
  929.       xgensym(),xmakesymbol(),xintern(),
  930. ***************
  931. *** 70,76 ****
  932.       xcharp(),xcharint(),xintchar(),
  933.       xmkstrinput(),xmkstroutput(),xgetstroutput(),xgetlstoutput(),
  934.       xgetlambda(),xmacroexpand(),x1macroexpand(),
  935. !     xtrace(),xuntrace();
  936.   
  937.   /* functions specific to xldmem.c */
  938.   LVAL xgc(),xexpand(),xalloc(),xmem();
  939. --- 70,76 ----
  940.       xcharp(),xcharint(),xintchar(),
  941.       xmkstrinput(),xmkstroutput(),xgetstroutput(),xgetlstoutput(),
  942.       xgetlambda(),xmacroexpand(),x1macroexpand(),
  943. !     xtrace(),xuntrace(),xcopyarray();
  944.   
  945.   /* functions specific to xldmem.c */
  946.   LVAL xgc(),xexpand(),xalloc(),xmem();
  947. ***************
  948. *** 90,96 ****
  949.   
  950.   /* the function table */
  951.   FUNDEF funtab[] = {
  952.       /* read macro functions */
  953.   {    NULL,                S, rmhash        }, /*   0 */
  954.   {    NULL,                S, rmquote        }, /*   1 */
  955. --- 90,95 ----
  956. ***************
  957. *** 100,107 ****
  958.   {    NULL,                S, rmlpar        }, /*   5 */
  959.   {    NULL,                S, rmrpar        }, /*   6 */
  960.   {    NULL,                S, rmsemi        }, /*   7 */
  961. ! {    NULL,                S, xnotimp        }, /*   8 */
  962. ! {    NULL,                S, xnotimp        }, /*   9 */
  963.   
  964.       /* methods */
  965.   {    NULL,                S, clnew        }, /*  10 */
  966. --- 99,106 ----
  967.   {    NULL,                S, rmlpar        }, /*   5 */
  968.   {    NULL,                S, rmrpar        }, /*   6 */
  969.   {    NULL,                S, rmsemi        }, /*   7 */
  970. ! {    NULL,                S, rmlbrace        }, /*   8 */
  971. ! {    NULL,                S, rmrbrace        }, /*   9 */
  972.   
  973.       /* methods */
  974.   {    NULL,                S, clnew        }, /*  10 */
  975. ***************
  976. *** 426,432 ****
  977.   {    "SORT",                S, xsort        }, /* 284 */
  978.   
  979.       /* extra table entries */
  980. ! {    NULL,                S, xnotimp        }, /* 285 */
  981.   {    NULL,                S, xnotimp        }, /* 286 */
  982.   {    NULL,                S, xnotimp        }, /* 287 */
  983.   {    NULL,                S, xnotimp        }, /* 288 */
  984. --- 425,431 ----
  985.   {    "SORT",                S, xsort        }, /* 284 */
  986.   
  987.       /* extra table entries */
  988. ! {    "COPY-ARRAY",            S, xcopyarray        }, /* 285 */
  989.   {    NULL,                S, xnotimp        }, /* 286 */
  990.   {    NULL,                S, xnotimp        }, /* 287 */
  991.   {    NULL,                S, xnotimp        }, /* 288 */
  992. ***************
  993. *** 447,453 ****
  994.   
  995.   {0,0,0} /* end of table marker */
  996.   
  997. ! };            
  998.   
  999.   /* xnotimp - function table entries that are currently not implemented */
  1000.   LOCAL LVAL xnotimp()
  1001. --- 446,452 ----
  1002.   
  1003.   {0,0,0} /* end of table marker */
  1004.   
  1005. ! };
  1006.   
  1007.   /* xnotimp - function table entries that are currently not implemented */
  1008.   LOCAL LVAL xnotimp()
  1009. diff -c ../xlisp.org/xlglob.c ../xlisp/xlglob.c
  1010. *** ../xlisp.org/xlglob.c    Sun May  7 22:25:55 1989
  1011. --- ../xlisp/xlglob.c    Wed Apr  5 16:18:28 1989
  1012. ***************
  1013. *** 22,27 ****
  1014. --- 22,28 ----
  1015.   LVAL s_1plus=NIL,s_2plus=NIL,s_3plus=NIL;
  1016.   LVAL s_1star=NIL,s_2star=NIL,s_3star=NIL;
  1017.   LVAL s_minus=NIL,s_printcase=NIL;
  1018. + LVAL s_send=NIL,s_sendsuper=NIL;
  1019.   
  1020.   /* keywords */
  1021.   LVAL k_test=NIL,k_tnot=NIL;
  1022. diff -c ../xlisp.org/xlimage.c ../xlisp/xlimage.c
  1023. *** ../xlisp.org/xlimage.c    Sun May  7 22:25:57 1989
  1024. --- ../xlisp/xlimage.c    Wed Apr  5 16:18:28 1989
  1025. ***************
  1026. *** 22,28 ****
  1027.   /* external procedures */
  1028.   extern SEGMENT *newsegment();
  1029.   extern FILE *osbopen();
  1030. ! extern char *malloc();
  1031.   
  1032.   /* forward declarations */
  1033.   OFFTYPE readptr();
  1034. --- 22,28 ----
  1035.   /* external procedures */
  1036.   extern SEGMENT *newsegment();
  1037.   extern FILE *osbopen();
  1038. ! extern char *xlmalloc();
  1039.   
  1040.   /* forward declarations */
  1041.   OFFTYPE readptr();
  1042. ***************
  1043. *** 170,176 ****
  1044.       case USTREAM:
  1045.           p = cviptr(off);
  1046.           p->n_type = type;
  1047. -         p->n_flags = 0;
  1048.           rplaca(p,cviptr(readptr()));
  1049.           rplacd(p,cviptr(readptr()));
  1050.           off += 2;
  1051. --- 170,175 ----
  1052. ***************
  1053. *** 192,198 ****
  1054.           case VECTOR:
  1055.           case CLOSURE:
  1056.           max = getsize(p);
  1057. !         if ((p->n_vdata = (LVAL *)malloc(max * sizeof(LVAL))) == NULL)
  1058.               xlfatal("insufficient memory - vector");
  1059.           total += (long)(max * sizeof(LVAL));
  1060.           for (i = 0; i < max; ++i)
  1061. --- 191,197 ----
  1062.           case VECTOR:
  1063.           case CLOSURE:
  1064.           max = getsize(p);
  1065. !         if ((p->n_vdata = (LVAL *)xlmalloc(max * sizeof(LVAL))) == NULL)
  1066.               xlfatal("insufficient memory - vector");
  1067.           total += (long)(max * sizeof(LVAL));
  1068.           for (i = 0; i < max; ++i)
  1069. ***************
  1070. *** 200,206 ****
  1071.           break;
  1072.           case STRING:
  1073.           max = getslength(p);
  1074. !         if ((p->n_string = (unsigned char *)malloc(max)) == NULL)
  1075.               xlfatal("insufficient memory - string");
  1076.           total += (long)max;
  1077.           for (cp = getstring(p); --max >= 0; )
  1078. --- 199,205 ----
  1079.           break;
  1080.           case STRING:
  1081.           max = getslength(p);
  1082. !         if ((p->n_string = (unsigned char *)xlmalloc(max)) == NULL)
  1083.               xlfatal("insufficient memory - string");
  1084.           total += (long)max;
  1085.           for (cp = getstring(p); --max >= 0; )
  1086. ***************
  1087. *** 247,257 ****
  1088.           case VECTOR:
  1089.           case CLOSURE:
  1090.           if (p->n_vsize)
  1091. !             free(p->n_vdata);
  1092.           break;
  1093.           case STRING:
  1094.           if (getslength(p))
  1095. !             free(getstring(p));
  1096.           break;
  1097.           case STREAM:
  1098.           if ((fp = getfile(p)) && (fp != stdin && fp != stdout))
  1099. --- 246,256 ----
  1100.           case VECTOR:
  1101.           case CLOSURE:
  1102.           if (p->n_vsize)
  1103. !             xlfree(p->n_vdata);
  1104.           break;
  1105.           case STRING:
  1106.           if (getslength(p))
  1107. !             xlfree(getstring(p));
  1108.           break;
  1109.           case STREAM:
  1110.           if ((fp = getfile(p)) && (fp != stdin && fp != stdout))
  1111. ***************
  1112. *** 259,265 ****
  1113.           break;
  1114.           }
  1115.       next = seg->sg_next;
  1116. !     free(seg);
  1117.       }
  1118.   }
  1119.   
  1120. --- 258,264 ----
  1121.           break;
  1122.           }
  1123.       next = seg->sg_next;
  1124. !     xlfree(seg);
  1125.       }
  1126.   }
  1127.   
  1128. ***************
  1129. *** 302,308 ****
  1130.       char *p = (char *)&node->n_info;
  1131.       int n = sizeof(union ninfo);
  1132.       node->n_type = type;
  1133. -     node->n_flags = 0;
  1134.       while (--n >= 0)
  1135.       *p++ = osbgetc(fp);
  1136.   }
  1137. --- 301,306 ----
  1138. diff -c ../xlisp.org/xlinit.c ../xlisp/xlinit.c
  1139. *** ../xlisp.org/xlinit.c    Sun May  7 22:25:59 1989
  1140. --- ../xlisp/xlinit.c    Wed Apr  5 16:18:29 1989
  1141. ***************
  1142. *** 27,32 ****
  1143. --- 27,33 ----
  1144.   extern LVAL a_fixnum,a_flonum,a_string,a_stream,a_object;
  1145.   extern LVAL a_vector,a_closure,a_char,a_ustream;
  1146.   extern LVAL s_gcflag,s_gchook;
  1147. + extern LVAL s_send,s_sendsuper;
  1148.   extern FUNDEF funtab[];
  1149.   
  1150.   /* xlinit - xlisp initialization routine */
  1151. ***************
  1152. *** 106,111 ****
  1153. --- 107,114 ----
  1154.       s_eql    = xlenter("EQL");
  1155.       s_ifmt    = xlenter("*INTEGER-FORMAT*");
  1156.       s_ffmt    = xlenter("*FLOAT-FORMAT*");
  1157. +     s_send    = xlenter("SEND");
  1158. +     s_sendsuper = xlenter("SEND-SUPER");
  1159.   
  1160.       /* symbols set by the read-eval-print loop */
  1161.       s_1plus    = xlenter("+");
  1162. diff -c ../xlisp.org/xlisp.c ../xlisp/xlisp.c
  1163. *** ../xlisp.org/xlisp.c    Sun May  7 22:26:02 1989
  1164. --- ../xlisp/xlisp.c    Thu Apr  6 10:06:46 1989
  1165. ***************
  1166. *** 6,12 ****
  1167.   #include "xlisp.h"
  1168.   
  1169.   /* define the banner line string */
  1170. ! #define BANNER    "XLISP version 2.0, Copyright (c) 1988, by David Betz"
  1171.   
  1172.   /* global variables */
  1173.   jmp_buf top_level;
  1174. --- 6,12 ----
  1175.   #include "xlisp.h"
  1176.   
  1177.   /* define the banner line string */
  1178. ! #define BANNER    "XLISP version 2.0w, Copyright (c) 1988, by David Betz"
  1179.   
  1180.   /* global variables */
  1181.   jmp_buf top_level;
  1182. ***************
  1183. *** 52,60 ****
  1184.           }
  1185.   #endif
  1186.   
  1187.       /* initialize and print the banner line */
  1188.       osinit(BANNER);
  1189.       /* setup initialization error handler */
  1190.       xlbegin(&cntxt,CF_TOPLEVEL|CF_CLEANUP|CF_BRKLEVEL,(LVAL)1);
  1191.       if (setjmp(cntxt.c_jmpbuf))
  1192. --- 52,63 ----
  1193.           }
  1194.   #endif
  1195.   
  1196. + #ifdef    X11
  1197. +     parse_args(&argc,argv);
  1198. + #endif
  1199.       /* initialize and print the banner line */
  1200.       osinit(BANNER);
  1201.       /* setup initialization error handler */
  1202.       xlbegin(&cntxt,CF_TOPLEVEL|CF_CLEANUP|CF_BRKLEVEL,(LVAL)1);
  1203.       if (setjmp(cntxt.c_jmpbuf))
  1204. ***************
  1205. *** 61,67 ****
  1206.       xlfatal("fatal initialization error");
  1207.       if (setjmp(top_level))
  1208.       xlfatal("RESTORE not allowed during initialization");
  1209.       /* initialize xlisp */
  1210.       xlinit();
  1211.       xlend(&cntxt);
  1212. --- 64,69 ----
  1213. diff -c ../xlisp.org/xlisp.h ../xlisp/xlisp.h
  1214. *** ../xlisp.org/xlisp.h    Sun May  7 22:26:12 1989
  1215. --- ../xlisp/xlisp.h    Wed Apr  5 16:23:51 1989
  1216. ***************
  1217. *** 4,10 ****
  1218.       Permission is granted for unrestricted non-commercial use    */
  1219.   
  1220.   /* system specific definitions */
  1221. ! /* #define UNIX */
  1222.   
  1223.   #include <stdio.h>
  1224.   #include <ctype.h>
  1225. --- 4,11 ----
  1226.       Permission is granted for unrestricted non-commercial use    */
  1227.   
  1228.   /* system specific definitions */
  1229. ! #define X11
  1230. ! /* #define    ADEBUG */
  1231.   
  1232.   #include <stdio.h>
  1233.   #include <ctype.h>
  1234. ***************
  1235. *** 24,29 ****
  1236. --- 25,35 ----
  1237.   /* OFFTYPE    number the size of an address (int) */
  1238.   
  1239.   /* for the BSD 4.3 system.  Might work for AT&T garbage */
  1240. + #ifdef    X11
  1241. + #define    UNIX
  1242. + #define WINDOWS
  1243. + #endif
  1244.   #ifdef UNIX
  1245.   #define NNODES        2000
  1246.   #define SAVERESTORE
  1247. ***************
  1248. *** 82,87 ****
  1249. --- 88,105 ----
  1250.   #define OFFTYPE        long
  1251.   #endif
  1252.   
  1253. + #ifdef MSW
  1254. + #define NNODES        1000
  1255. + #define AFMT        "%lx"
  1256. + #define OFFTYPE        long
  1257. + #define    WINDOWS
  1258. + #define    VMEM
  1259. + #define    MSC
  1260. + #define    xlmalloc    WMalloc
  1261. + #define    xlcalloc    WCalloc
  1262. + #define    xlfree        WFree
  1263. + #endif
  1264.   /* for the Mark Williams C compiler - Atari ST */
  1265.   #ifdef MWC
  1266.   #define AFMT        "%lx"
  1267. ***************
  1268. *** 148,153 ****
  1269. --- 166,176 ----
  1270.   #ifndef UCHAR
  1271.   #define UCHAR        unsigned char
  1272.   #endif
  1273. + #ifndef    xlmalloc
  1274. + #define    xlmalloc    malloc
  1275. + #define    xlcalloc    calloc
  1276. + #define    xlfree        free
  1277. + #endif
  1278.   
  1279.   /* useful definitions */
  1280.   #define TRUE    1
  1281. ***************
  1282. *** 160,166 ****
  1283.   #include "xldmem.h"
  1284.   
  1285.   /* program limits */
  1286. ! #define STRMAX        100        /* maximum length of a string constant */
  1287.   #define HSIZE        199        /* symbol hash table size */
  1288.   #define SAMPLE        100        /* control character sample rate */
  1289.   
  1290. --- 183,189 ----
  1291.   #include "xldmem.h"
  1292.   
  1293.   /* program limits */
  1294. ! #define STRMAX        512        /* maximum length of a string constant */
  1295.   #define HSIZE        199        /* symbol hash table size */
  1296.   #define SAMPLE        100        /* control character sample rate */
  1297.   
  1298. ***************
  1299. *** 173,178 ****
  1300. --- 196,203 ----
  1301.   #define FT_RMLPAR    5
  1302.   #define FT_RMRPAR    6
  1303.   #define FT_RMSEMI    7
  1304. + #define    FT_RMLBRACE    8
  1305. + #define    FT_RMRBRACE    9
  1306.   #define FT_CLNEW    10
  1307.   #define FT_CLISNEW    11
  1308.   #define FT_CLANSWER    12
  1309. ***************
  1310. *** 179,191 ****
  1311.   #define FT_OBISNEW    13
  1312.   #define FT_OBCLASS    14
  1313.   #define FT_OBSHOW    15
  1314. !     
  1315.   /* macro to push a value onto the argument stack */
  1316.   #define pusharg(x)    {if (xlsp >= xlargstktop) xlargstkoverflow();\
  1317. !              *xlsp++ = (x);}
  1318.   
  1319.   /* macros to protect pointers */
  1320. ! #define xlstkcheck(n)    {if (xlstack - (n) < xlstkbase) xlstkoverflow();}
  1321.   #define xlsave(n)    {*--xlstack = &n; n = NIL;}
  1322.   #define xlprotect(n)    {*--xlstack = &n;}
  1323.   
  1324. --- 204,216 ----
  1325.   #define FT_OBISNEW    13
  1326.   #define FT_OBCLASS    14
  1327.   #define FT_OBSHOW    15
  1328.   /* macro to push a value onto the argument stack */
  1329.   #define pusharg(x)    {if (xlsp >= xlargstktop) xlargstkoverflow();\
  1330. !              *(xlsp++) = (x);}
  1331.   
  1332.   /* macros to protect pointers */
  1333. ! #define xlstkcheck(n)    {if ((xlstack - (n)) < xlstkbase) xlstkoverflow();}
  1334.   #define xlsave(n)    {*--xlstack = &n; n = NIL;}
  1335.   #define xlprotect(n)    {*--xlstack = &n;}
  1336.   
  1337. ***************
  1338. *** 230,235 ****
  1339. --- 255,261 ----
  1340.   #define ustreamp(x)    ((x) && ntype(x) == USTREAM)
  1341.   #define boundp(x)    (getvalue(x) != s_unbound)
  1342.   #define fboundp(x)    (getfunction(x) != s_unbound)
  1343. + #define    winobjp(x)    ((x) && ntype(x) == WINOBJ)
  1344.   
  1345.   /* shorthand functions */
  1346.   #define consa(x)    cons(x,NIL)
  1347. ***************
  1348. *** 323,326 ****
  1349.   /* error reporting functions (don't *really* return at all) */
  1350.   extern LVAL xltoofew();        /* report "too few arguments" error */
  1351.   extern LVAL xlbadtype();    /* report "bad argument type" error */
  1352. --- 349,351 ----
  1353. diff -c ../xlisp.org/xlobj.c ../xlisp/xlobj.c
  1354. *** ../xlisp.org/xlobj.c    Sun May  7 22:26:20 1989
  1355. --- ../xlisp/xlobj.c    Wed Apr  5 16:18:40 1989
  1356. ***************
  1357. *** 41,47 ****
  1358.   /* xsendsuper - send a message to the superclass of an object */
  1359.   LVAL xsendsuper()
  1360.   {
  1361. !     LVAL env,p;
  1362.       for (env = xlenv; env; env = cdr(env))
  1363.       if ((p = car(env)) && objectp(car(p)))
  1364.           return (sendmsg(car(p),
  1365. --- 41,47 ----
  1366.   /* xsendsuper - send a message to the superclass of an object */
  1367.   LVAL xsendsuper()
  1368.   {
  1369. !     register LVAL env,p;
  1370.       for (env = xlenv; env; env = cdr(env))
  1371.       if ((p = car(env)) && objectp(car(p)))
  1372.           return (sendmsg(car(p),
  1373. ***************
  1374. *** 97,104 ****
  1375.   int xlobgetvalue(pair,sym,pval)
  1376.     LVAL pair,sym,*pval;
  1377.   {
  1378. !     LVAL cls,names;
  1379. !     int ivtotal,n;
  1380.   
  1381.       /* find the instance or class variable */
  1382.       for (cls = cdr(pair); objectp(cls); cls = getivar(cls,SUPERCLASS)) {
  1383. --- 97,104 ----
  1384.   int xlobgetvalue(pair,sym,pval)
  1385.     LVAL pair,sym,*pval;
  1386.   {
  1387. !     register LVAL cls,names;
  1388. !     register int ivtotal,n;
  1389.   
  1390.       /* find the instance or class variable */
  1391.       for (cls = cdr(pair); objectp(cls); cls = getivar(cls,SUPERCLASS)) {
  1392. ***************
  1393. *** 133,140 ****
  1394.   int xlobsetvalue(pair,sym,val)
  1395.     LVAL pair,sym,val;
  1396.   {
  1397. !     LVAL cls,names;
  1398. !     int ivtotal,n;
  1399.   
  1400.       /* find the instance or class variable */
  1401.       for (cls = cdr(pair); objectp(cls); cls = getivar(cls,SUPERCLASS)) {
  1402. --- 133,140 ----
  1403.   int xlobsetvalue(pair,sym,val)
  1404.     LVAL pair,sym,val;
  1405.   {
  1406. !     register LVAL cls,names;
  1407. !     register int ivtotal,n;
  1408.   
  1409.       /* find the instance or class variable */
  1410.       for (cls = cdr(pair); objectp(cls); cls = getivar(cls,SUPERCLASS)) {
  1411. ***************
  1412. *** 309,315 ****
  1413.   LOCAL LVAL sendmsg(obj,cls,sym)
  1414.     LVAL obj,cls,sym;
  1415.   {
  1416. !     LVAL msg,msgcls,method,val,p;
  1417.   
  1418.       /* look for the message in the class or superclasses */
  1419.       for (msgcls = cls; msgcls; ) {
  1420. --- 309,316 ----
  1421.   LOCAL LVAL sendmsg(obj,cls,sym)
  1422.     LVAL obj,cls,sym;
  1423.   {
  1424. !     LVAL method,val;
  1425. !     register LVAL msg,msgcls,p;
  1426.   
  1427.       /* look for the message in the class or superclasses */
  1428.       for (msgcls = cls; msgcls; ) {
  1429. ***************
  1430. *** 316,322 ****
  1431.   
  1432.       /* lookup the message in this class */
  1433.       for (p = getivar(msgcls,MESSAGES); p; p = cdr(p))
  1434. !         if ((msg = car(p)) && car(msg) == sym)
  1435.           goto send_message;
  1436.   
  1437.       /* look in class's superclass */
  1438. --- 317,323 ----
  1439.   
  1440.       /* lookup the message in this class */
  1441.       for (p = getivar(msgcls,MESSAGES); p; p = cdr(p))
  1442. !         if ((msg = car(p)) ? car(msg) == sym : 0)
  1443.           goto send_message;
  1444.   
  1445.       /* look in class's superclass */
  1446. ***************
  1447. *** 363,369 ****
  1448.   LOCAL LVAL evmethod(obj,msgcls,method)
  1449.     LVAL obj,msgcls,method;
  1450.   {
  1451. !     LVAL oldenv,oldfenv,cptr,name,val;
  1452.       CONTEXT cntxt;
  1453.   
  1454.       /* protect some pointers */
  1455. --- 364,370 ----
  1456.   LOCAL LVAL evmethod(obj,msgcls,method)
  1457.     LVAL obj,msgcls,method;
  1458.   {
  1459. !     LVAL oldenv,oldfenv,name,cptr,val;
  1460.       CONTEXT cntxt;
  1461.   
  1462.       /* protect some pointers */
  1463. ***************
  1464. *** 420,428 ****
  1465.   
  1466.   /* listlength - find the length of a list */
  1467.   LOCAL int listlength(list)
  1468. !   LVAL list;
  1469.   {
  1470. !     int len;
  1471.       for (len = 0; consp(list); len++)
  1472.       list = cdr(list);
  1473.       return (len);
  1474. --- 421,429 ----
  1475.   
  1476.   /* listlength - find the length of a list */
  1477.   LOCAL int listlength(list)
  1478. ! register LVAL list;
  1479.   {
  1480. !     register int len;
  1481.       for (len = 0; consp(list); len++)
  1482.       list = cdr(list);
  1483.       return (len);
  1484. ***************
  1485. *** 470,473 ****
  1486.       xladdmsg(object,":CLASS",FT_OBCLASS);
  1487.       xladdmsg(object,":SHOW",FT_OBSHOW);
  1488.   }
  1489. --- 471,473 ----
  1490. diff -c ../xlisp.org/xlprin.c ../xlisp/xlprin.c
  1491. *** ../xlisp.org/xlprin.c    Sun May  7 22:26:23 1989
  1492. --- ../xlisp/xlprin.c    Fri May  5 13:35:51 1989
  1493. ***************
  1494. *** 33,38 ****
  1495. --- 33,41 ----
  1496.       case FSUBR:
  1497.           putsubr(fptr,"FSubr",vptr);
  1498.           break;
  1499. +     case WINOBJ:
  1500. +         putsymbol(fptr,"<Windows object>",flag);
  1501. +         break;
  1502.       case CONS:
  1503.           xlputc(fptr,'(');
  1504.           for (nptr = vptr; nptr != NIL; nptr = next) {
  1505. diff -c ../xlisp.org/xlread.c ../xlisp/xlread.c
  1506. *** ../xlisp.org/xlread.c    Sun May  7 22:26:26 1989
  1507. --- ../xlisp/xlread.c    Wed Apr  5 16:18:41 1989
  1508. ***************
  1509. *** 15,20 ****
  1510. --- 15,21 ----
  1511.   extern LVAL s_quote,s_function,s_bquote,s_comma,s_comat;
  1512.   extern LVAL s_rtable,k_wspace,k_const,k_nmacro,k_tmacro;
  1513.   extern LVAL k_sescape,k_mescape;
  1514. + extern LVAL s_send, s_sendsuper;
  1515.   extern char buf[];
  1516.   
  1517.   /* external routines */
  1518. ***************
  1519. *** 29,35 ****
  1520.   /* forward declarations */
  1521.   FORWARD LVAL callmacro();
  1522.   FORWARD LVAL psymbol(),punintern();
  1523. ! FORWARD LVAL pnumber(),pquote(),plist(),pvector();
  1524.   FORWARD LVAL tentry();
  1525.   
  1526.   /* xlload - load a file of xlisp expressions */
  1527. --- 30,36 ----
  1528.   /* forward declarations */
  1529.   FORWARD LVAL callmacro();
  1530.   FORWARD LVAL psymbol(),punintern();
  1531. ! FORWARD LVAL pnumber(),pquote(),plist(),pmessage(),pvector();
  1532.   FORWARD LVAL tentry();
  1533.   
  1534.   /* xlload - load a file of xlisp expressions */
  1535. ***************
  1536. *** 366,371 ****
  1537. --- 367,386 ----
  1538.       return (consa(plist(fptr)));
  1539.   }
  1540.   
  1541. + /* rmlbrace - read macro for '{' */
  1542. + LVAL rmlbrace()
  1543. + {
  1544. +     LVAL fptr,mch;
  1545. +     /* get the file and macro character */
  1546. +     fptr = xlgetfile();
  1547. +     mch = xlgachar();
  1548. +     xllastarg();
  1549. +     /* make the return value */
  1550. +     return (consa(pmessage(fptr)));
  1551. + }
  1552.   /* rmrpar - read macro for ')' */
  1553.   LVAL rmrpar()
  1554.   {
  1555. ***************
  1556. *** 372,377 ****
  1557. --- 387,398 ----
  1558.       xlfail("misplaced right paren");
  1559.   }
  1560.   
  1561. + /* rmbrace - read macro for '}' */
  1562. + LVAL rmrbrace()
  1563. + {
  1564. +     xlfail("misplaced right brace");
  1565. + }
  1566.   /* rmsemi - read macro for ';' */
  1567.   LVAL rmsemi()
  1568.   {
  1569. ***************
  1570. *** 485,490 ****
  1571. --- 506,555 ----
  1572.       return (val);
  1573.   }
  1574.   
  1575. + /* plist - parse a message */
  1576. + LOCAL LVAL pmessage(fptr)
  1577. +   LVAL fptr;
  1578. + {
  1579. +     LVAL val,expr,lastnptr,nptr;
  1580. +     LVAL mess = s_send;
  1581. +     /* protect some pointers */
  1582. +     xlstkcheck(2);
  1583. +     xlsave(val);
  1584. +     xlsave(expr);
  1585. +     if (nextch(fptr) == '+') { /* Look for super class message */
  1586. +     mess = s_sendsuper;
  1587. +     xlgetc(fptr);
  1588. +     }
  1589. +     /* keep appending nodes until a closing paren is found */
  1590. +     for (lastnptr = NIL; nextch(fptr) != '}'; )
  1591. +     /* get the next expression */
  1592. +     if (readone(fptr,&expr) == EOF)
  1593. +         badeof(fptr);
  1594. +     else {
  1595. +         nptr = consa(expr);
  1596. +         if (lastnptr == NIL)
  1597. +         val = nptr;
  1598. +         else
  1599. +         rplacd(lastnptr,nptr);
  1600. +         lastnptr = nptr;
  1601. +         }
  1602. +     /* skip the closing bracket */
  1603. +     xlgetc(fptr);
  1604. +     val = cons(mess,val);
  1605. +     /* restore the stack */
  1606. +     xlpopn(2);
  1607. +     /* return successfully */
  1608. +     return (val);
  1609. + }
  1610.   /* pvector - parse a vector */
  1611.   LOCAL LVAL pvector(fptr)
  1612.     LVAL fptr;
  1613. ***************
  1614. *** 807,811 ****
  1615. --- 872,878 ----
  1616.       defmacro('(', k_tmacro,FT_RMLPAR);
  1617.       defmacro(')', k_tmacro,FT_RMRPAR);
  1618.       defmacro(';', k_tmacro,FT_RMSEMI);
  1619. +     defmacro('{', k_tmacro,FT_RMLBRACE);
  1620. +     defmacro('}', k_tmacro,FT_RMRBRACE);
  1621.   }
  1622.   
  1623. diff -c ../xlisp.org/xlsym.c ../xlisp/xlsym.c
  1624. *** ../xlisp.org/xlsym.c    Sun May  7 22:26:32 1989
  1625. --- ../xlisp/xlsym.c    Wed Apr  5 16:18:43 1989
  1626. ***************
  1627. *** 4,10 ****
  1628.       Permission is granted for unrestricted non-commercial use    */
  1629.   
  1630.   #include "xlisp.h"
  1631.   /* external variables */
  1632.   extern LVAL obarray,s_unbound;
  1633.   extern LVAL xlenv,xlfenv,xldenv;
  1634. --- 4,11 ----
  1635.       Permission is granted for unrestricted non-commercial use    */
  1636.   
  1637.   #include "xlisp.h"
  1638. ! #undef HSIZE
  1639. ! #define HSIZE 399
  1640.   /* external variables */
  1641.   extern LVAL obarray,s_unbound;
  1642.   extern LVAL xlenv,xlfenv,xldenv;
  1643. ***************
  1644. *** 16,22 ****
  1645.   LVAL xlenter(name)
  1646.     char *name;
  1647.   {
  1648. !     LVAL sym,array;
  1649.       int i;
  1650.   
  1651.       /* check for nil */
  1652. --- 17,24 ----
  1653.   LVAL xlenter(name)
  1654.     char *name;
  1655.   {
  1656. !     register LVAL sym,array;
  1657. !     LVAL sym2;
  1658.       int i;
  1659.   
  1660.       /* check for nil */
  1661. ***************
  1662. *** 31,44 ****
  1663.           return (car(sym));
  1664.   
  1665.       /* make a new symbol node and link it into the list */
  1666. !     xlsave1(sym);
  1667. !     sym = consd(getelement(array,i));
  1668. !     rplaca(sym,xlmakesym(name));
  1669. !     setelement(array,i,sym);
  1670.       xlpop();
  1671.       /* return the new symbol */
  1672. !     return (car(sym));
  1673.   }
  1674.   
  1675.   /* xlmakesym - make a new symbol node */
  1676. --- 33,45 ----
  1677.           return (car(sym));
  1678.   
  1679.       /* make a new symbol node and link it into the list */
  1680. !     xlsave1(sym2);
  1681. !     sym2 = consd(getelement(array,i));
  1682. !     rplaca(sym2,xlmakesym(name));
  1683. !     setelement(array,i,sym2);
  1684.       xlpop();
  1685.       /* return the new symbol */
  1686. !     return (car(sym2));
  1687.   }
  1688.   
  1689.   /* xlmakesym - make a new symbol node */
  1690. ***************
  1691. *** 68,74 ****
  1692.   
  1693.   /* xlxgetvalue - get the value of a symbol */
  1694.   LVAL xlxgetvalue(sym)
  1695. !   LVAL sym;
  1696.   {
  1697.       register LVAL fp,ep;
  1698.       LVAL val;
  1699. --- 69,75 ----
  1700.   
  1701.   /* xlxgetvalue - get the value of a symbol */
  1702.   LVAL xlxgetvalue(sym)
  1703. ! register LVAL sym;
  1704.   {
  1705.       register LVAL fp,ep;
  1706.       LVAL val;
  1707. ***************
  1708. *** 95,101 ****
  1709.   
  1710.   /* xlsetvalue - set the value of a symbol */
  1711.   xlsetvalue(sym,val)
  1712. !   LVAL sym,val;
  1713.   {
  1714.       register LVAL fp,ep;
  1715.   
  1716. --- 96,103 ----
  1717.   
  1718.   /* xlsetvalue - set the value of a symbol */
  1719.   xlsetvalue(sym,val)
  1720. !   register LVAL sym;
  1721. !   LVAL val;
  1722.   {
  1723.       register LVAL fp,ep;
  1724.   
  1725. ***************
  1726. *** 137,143 ****
  1727.   
  1728.   /* xlxgetfunction - get the functional value of a symbol */
  1729.   LVAL xlxgetfunction(sym)
  1730. !   LVAL sym;
  1731.   {
  1732.       register LVAL fp,ep;
  1733.   
  1734. --- 139,145 ----
  1735.   
  1736.   /* xlxgetfunction - get the functional value of a symbol */
  1737.   LVAL xlxgetfunction(sym)
  1738. ! register  LVAL sym;
  1739.   {
  1740.       register LVAL fp,ep;
  1741.   
  1742. ***************
  1743. *** 192,198 ****
  1744.   xlremprop(sym,prp)
  1745.     LVAL sym,prp;
  1746.   {
  1747. !     LVAL last,p;
  1748.       last = NIL;
  1749.       for (p = getplist(sym); consp(p) && consp(cdr(p)); p = cdr(last)) {
  1750.       if (car(p) == prp)
  1751. --- 194,200 ----
  1752.   xlremprop(sym,prp)
  1753.     LVAL sym,prp;
  1754.   {
  1755. !     register LVAL last,p;
  1756.       last = NIL;
  1757.       for (p = getplist(sym); consp(p) && consp(cdr(p)); p = cdr(last)) {
  1758.       if (car(p) == prp)
  1759. ***************
  1760. *** 208,214 ****
  1761.   LOCAL LVAL findprop(sym,prp)
  1762.     LVAL sym,prp;
  1763.   {
  1764. !     LVAL p;
  1765.       for (p = getplist(sym); consp(p) && consp(cdr(p)); p = cdr(cdr(p)))
  1766.       if (car(p) == prp)
  1767.           return (cdr(p));
  1768. --- 210,216 ----
  1769.   LOCAL LVAL findprop(sym,prp)
  1770.     LVAL sym,prp;
  1771.   {
  1772. !     register LVAL p;
  1773.       for (p = getplist(sym); consp(p) && consp(cdr(p)); p = cdr(cdr(p)))
  1774.       if (car(p) == prp)
  1775.           return (cdr(p));
  1776. ***************
  1777. *** 217,226 ****
  1778.   
  1779.   /* hash - hash a symbol name string */
  1780.   int hash(str,len)
  1781. !   char *str;
  1782.   {
  1783. !     int i;
  1784. !     for (i = 0; *str; )
  1785.       i = (i << 2) ^ *str++;
  1786.       i %= len;
  1787.       return (i < 0 ? -i : i);
  1788. --- 219,228 ----
  1789.   
  1790.   /* hash - hash a symbol name string */
  1791.   int hash(str,len)
  1792. ! register char *str;
  1793.   {
  1794. !     register int i = 0;
  1795. !     while (*str)
  1796.       i = (i << 2) ^ *str++;
  1797.       i %= len;
  1798.       return (i < 0 ? -i : i);
  1799.  
  1800.  
  1801.  
  1802.