[BACK]Return to util.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

Diff for /OpenXM_contrib2/asir2000/parse/util.c between version 1.2 and 1.21

version 1.2, 2000/08/21 08:31:47 version 1.21, 2018/03/29 01:32:54
Line 23 
Line 23 
  * shall be made on your publication or presentation in any form of the   * shall be made on your publication or presentation in any form of the
  * results obtained by use of the SOFTWARE.   * results obtained by use of the SOFTWARE.
  * (4) In the event that you modify the SOFTWARE, you shall notify FLL by   * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
  * e-mail at risa-admin@flab.fujitsu.co.jp of the detailed specification   * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
  * for such modification or the source code of the modified part of the   * for such modification or the source code of the modified part of the
  * SOFTWARE.   * SOFTWARE.
  *   *
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/parse/util.c,v 1.1.1.1 1999/12/03 07:39:12 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/parse/util.c,v 1.20 2018/03/27 06:29:19 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
 #include "parse.h"  #include "parse.h"
 #if defined(THINK_C) || defined(VISUAL)  #if defined(__GNUC__) || defined(VISUAL) || defined(__MINGW32__) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__)
 #include <stdarg.h>  #include <stdarg.h>
 #else  #else
 #include <varargs.h>  #include <varargs.h>
 #endif  #endif
 #include <ctype.h>  #include <ctype.h>
   
 int length(n)  int length(NODE n)
 NODE n;  
 {  {
         int i;    int i;
   
         for ( i = 0; n; n = NEXT(n), i++ );    for ( i = 0; n; n = NEXT(n), i++ );
         return i;    return i;
 }  }
   
 int argc(a)  int argc(NODE a)
 NODE a;  
 {  {
         int i;    int i;
   
         for ( i = 0; a; i++, a = NEXT(a) );    for ( i = 0; a; i++, a = NEXT(a) );
         return ( i );    return ( i );
 }  }
   
 void stoarg(s,acp,av)  void stoarg(char *s,int *acp,char **av)
 char *s;  
 int *acp;  
 char **av;  
 {  {
         int i;    int i;
   
         for ( i = 0; ; i++ ) {    for ( i = 0; ; i++ ) {
                 for ( ; *s && isspace(*s); s++ );      for ( ; *s && isspace((unsigned char)*s); s++ );
                 if ( *s ) {      if ( *s ) {
                         for ( av[i] = s; *s && !isspace(*s); s++ );        for ( av[i] = s; *s &&
                         if ( *s )          !isspace((unsigned char)*s); s++ );
                                 *s++ = 0;        if ( *s )
                 } else {          *s++ = 0;
                         *acp = i;      } else {
                         return;        *acp = i;
                 }        return;
         }      }
     }
 }  }
   
 #if 0  #if 0
 unsigned int ator(addr,r)  unsigned int ator(unsigned int addr,Obj *r)
 unsigned int addr;  
 Obj *r;  
 {  {
         N n;    N n;
         Q q;    Q q;
   
         if ( !addr )    if ( !addr )
                 q = 0;      q = 0;
         if ( addr < BASE )    if ( addr < BASE )
                 STOQ(addr,q);      STOQ(addr,q);
         else {    else {
                 n = NALLOC(2); PL(n) = 2;      n = NALLOC(2); PL(n) = 2;
                 BD(n)[0] = addr-BASE; BD(n)[1] = addr>>BSH; NTOQ(n,1,q);      BD(n)[0] = addr-BASE; BD(n)[1] = addr>>BSH; NTOQ(n,1,q);
         }    }
         *r = (Obj)q;    *r = (Obj)q;
 }  }
 #endif  #endif
   
 void getarray(a,ind,vp)  void getarray(pointer a,NODE ind,pointer *vp)
 pointer a;  
 NODE ind;  
 pointer *vp;  
 {  {
         Obj len,row,col;    Obj len,row,col,trg;
         int i,l;    int i;
         NODE n,n0;    NODE n,n0;
         VECT v;    VECT v;
     Q q;
   
         for ( ; ind; ind = NEXT(ind) ) {    if ( a && OID(a) == O_BYTEARRAY ) {
                 if ( !a )      len = (Obj)BDY(ind);
                         error("getarray : array or list expected");      if ( !rangecheck(len,((BYTEARRAY)a)->len) )
                 switch ( OID(a) ) {        error("getarray : Out of range");
                         case O_VECT:      else if ( NEXT(ind) )
                                 len = (Obj)BDY(ind);        error("getarray : invalid index");
                                 if ( !rangecheck(len,((VECT)a)->len) )      else {
                                         error("getarray : Out of range");        i = (int)BDY((BYTEARRAY)a)[QTOS((Q)len)];
                                 else        STOQ(i,q);
                                         a = (pointer)(BDY((VECT)a)[QTOS((Q)len)]);        *vp = (pointer)q;
                                 break;      }
                         case O_MAT:      return;
                                 row = (Obj)BDY(ind);    }
                                 if ( !rangecheck(row,((MAT)a)->row) )    for ( ; ind; ind = NEXT(ind) ) {
                                         error("getarray : Out of range");      if ( !a )
                                 else if ( NEXT(ind) ) {        error("getarray : array or list expected");
                                         ind = NEXT(ind);      switch ( OID(a) ) {
                                         col = (Obj)BDY(ind);        case O_VECT:
                                         if ( !rangecheck(col,((MAT)a)->col) )          len = (Obj)BDY(ind);
                                                 error("getarray : Out of range");          if ( !rangecheck(len,((VECT)a)->len) )
                                         else            error("getarray : Out of range");
                                                 a = (pointer)(BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)]);          else
                                 } else {            a = (pointer)(BDY((VECT)a)[QTOS((Q)len)]);
                                         NEWVECT(v); v->len = ((MAT)a)->col;          break;
                                         v->body = (pointer *)BDY((MAT)a)[QTOS((Q)row)];        case O_MAT:
                                         a = (pointer)v;          row = (Obj)BDY(ind);
                                 }          if ( !rangecheck(row,((MAT)a)->row) )
                                 break;            error("getarray : Out of range");
                         case O_LIST:          else if ( NEXT(ind) ) {
                                 n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));            ind = NEXT(ind);
                                 for ( l = 0, n = n0; n; n = NEXT(n), l++ );            col = (Obj)BDY(ind);
                                 if ( i < 0 || i >= l )            if ( !rangecheck(col,((MAT)a)->col) )
                                         error("getarray : Out of range");              error("getarray : Out of range");
                                 else {            else
                                         for ( n = n0, l = 0; l < i; l++, n = NEXT(n) );              a = (pointer)(BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)]);
                                         a = (pointer)BDY(n);          } else {
                                 }            NEWVECT(v); v->len = ((MAT)a)->col;
                                 break;            v->body = (pointer *)BDY((MAT)a)[QTOS((Q)row)];
                         default:            a = (pointer)v;
                                 error("getarray : array or list expected");          }
                                 break;          break;
                 }        case O_IMAT:
         }          row = (Obj)BDY(ind);
         *vp = a;          ind = NEXT(ind);
           col = (Obj)BDY(ind);
           if ( ((IMAT)a)->row < QTOS((Q)row) ||
             ((IMAT)a)->col < QTOS((Q)col) ||
             (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0))
               error("putarray : Out of range");
           GetIbody((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj*)&trg);
           a = (pointer)trg;
           break;
         case O_LIST:
           n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
           if ( i < 0 )
             error("getarray : Out of range");
           for ( n = n0; i > 0 && n; n = NEXT(n), i-- );
           if ( i || !n )
             error("getarray : Out of range");
           else
             a = (pointer)BDY(n);
           break;
         default:
           error("getarray : array or list expected");
           break;
       }
     }
     *vp = a;
 }  }
   
 void putarray(a,ind,b)  void putarray(pointer a,NODE ind,pointer b)
 pointer a;  
 NODE ind;  
 pointer b;  
 {  {
         Obj len,row,col;    Obj len,row,col;
         int i,l;    int i;
         NODE n,n0;    NODE n,n0;
   
         for ( ; ind; ind = NEXT(ind) ) {    if ( a && OID(a) == O_BYTEARRAY ) {
                 if ( !a )      len = (Obj)BDY(ind);
                         error("putarray : array expected");      if ( !rangecheck(len,((BYTEARRAY)a)->len) )
                 switch ( OID(a) ) {        error("putarray : Out of range");
                         case O_VECT:      else if ( NEXT(ind) )
                                 len = (Obj)BDY(ind);        error("putarray : invalid index");
                                 if ( !rangecheck(len,((VECT)a)->len) )      else
                                         error("putarray : Out of range");        BDY((BYTEARRAY)a)[QTOS((Q)len)] = (unsigned char)QTOS((Q)b);
                                 else if ( NEXT(ind) )      return;
                                         a = BDY((VECT)a)[QTOS((Q)len)];    }
                                 else    for ( ; ind; ind = NEXT(ind) ) {
                                         BDY((VECT)a)[QTOS((Q)len)] = b;      if ( !a )
                                 break;        error("putarray : array expected");
                         case O_MAT:      switch ( OID(a) ) {
                                 row = (Obj)BDY(ind);        case O_VECT:
                                 if ( !rangecheck(row,((MAT)a)->row) )          len = (Obj)BDY(ind);
                                         error("putarray : Out of range");          if ( !rangecheck(len,((VECT)a)->len) )
                                 else if ( NEXT(ind) ) {            error("putarray : Out of range");
                                         ind = NEXT(ind);          else if ( NEXT(ind) )
                                         col = (Obj)BDY(ind);            a = BDY((VECT)a)[QTOS((Q)len)];
                                         if ( !rangecheck(col,((MAT)a)->col) )          else
                                                 error("putarray : Out of range");            BDY((VECT)a)[QTOS((Q)len)] = b;
                                         else if ( NEXT(ind) )          break;
                                                 a = BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)];        case O_MAT:
                                         else          row = (Obj)BDY(ind);
                                                 BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)] = b;          if ( !rangecheck(row,((MAT)a)->row) )
                                 } else            error("putarray : Out of range");
                                         error("putarray : invalid assignment");          else if ( NEXT(ind) ) {
                                 break;            ind = NEXT(ind);
                         case O_LIST:            col = (Obj)BDY(ind);
                                 if ( NEXT(ind) ) {            if ( !rangecheck(col,((MAT)a)->col) )
                                         n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));              error("putarray : Out of range");
                                         for ( l = 0, n = n0; n; n = NEXT(n), l++ );            else if ( NEXT(ind) )
                                         if ( i < 0 || i >= l )              a = BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)];
                                                 error("putarray : Out of range");            else
                                         else {              BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)] = b;
                                                 for ( n = n0, l = 0; l < i; l++, n = NEXT(n) );          } else
                                                 a = (pointer)BDY(n);            error("putarray : invalid assignment");
                                         }          break;
                                 } else        case O_IMAT:
                                         error("putarray : invalid assignment");          row = (Obj)BDY(ind);
                                 break;          ind = NEXT(ind);
                         default:          col = (Obj)BDY(ind);
                                 error("putarray : array expected");          if ( ((IMAT)a)->row < QTOS((Q)row) ||
                                 break;            ((IMAT)a)->col < QTOS((Q)col) ||
                 }            (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0))
         }              error("putarray : Out of range");
           PutIent((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj)b);
           break;
         case O_LIST:
           if ( NEXT(ind) ) {
             n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
             if ( i < 0 )
               error("putarray : Out of range");
             for ( n = n0; i > 0 && n; n = NEXT(n), i-- );
             if ( i || !n )
               error("puarray : Out of range");
             else
               a = (pointer)BDY(n);
           } else
             error("putarray : invalid assignment");
           break;
         default:
           error("putarray : array expected");
           break;
       }
     }
 }  }
   
 int rangecheck(a,n)  int rangecheck(Obj a,int n)
 Obj a;  
 int n;  
 {  {
         N m;    N m;
   
         if ( !a )    if ( !a )
                 return 1;      return 1;
         if ( OID(a) != O_N || !RATN(a) || !INT(a) || SGN((Q)a) < 0 )    if ( OID(a) != O_N || !RATN(a) || !INT(a) || SGN((Q)a) < 0 )
                 return 0;      return 0;
         m = NM((Q)a);    m = NM((Q)a);
         if ( PL(m) > 1 || BD(m)[0] >= (unsigned int)n )    if ( PL(m) > 1 || BD(m)[0] >= (unsigned int)n )
                 return 0;      return 0;
         return 1;    return 1;
 }  }
   
 int zp(p)  int zp(P p)
 P p;  
 {  {
         int r;    int r;
         DCP dc;    DCP dc;
   
         if ( !p )    if ( !p )
                 r = 1;      r = 1;
         else if ( NUM(p) )    else if ( NUM(p) )
                 r = INT((Q)p)?1:0;      r = INT((Q)p)?1:0;
         else    else
                 for ( dc = DC(p), r = 1; dc && r; dc = NEXT(dc) )      for ( dc = DC(p), r = 1; dc && r; dc = NEXT(dc) )
                         r &= zp(COEF(dc));        r &= zp(COEF(dc));
         return ( r );    return ( r );
 }  }
   
 #if defined(THINK_C) || defined(VISUAL)  #if defined(__GNUC__) || defined(VISUAL) || defined(__MINGW32__) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__)
 NODE mknode(int ac,...)  NODE mknode(int ac,...)
 {  {
         va_list ap;    va_list ap;
         int i;    int i;
         NODE n0,n;    NODE n0,n;
   
         va_start(ap,ac);    va_start(ap,ac);
         for ( i = 0, n0 = 0; i < ac; i++ ) {    for ( i = 0, n0 = 0; i < ac; i++ ) {
                 NEXTNODE(n0,n);      NEXTNODE(n0,n);
                 BDY(n)=va_arg(ap, pointer);      BDY(n)=va_arg(ap, pointer);
         }    }
         va_end(ap);    va_end(ap);
         if ( n0 )    if ( n0 )
                 NEXT(n)=0;      NEXT(n)=0;
         return n0;    return n0;
 }  }
   
 FNODE mkfnode(int ac,fid id,...)  FNODE mkfnode(int ac,fid id,...)
 {  {
         va_list ap;    va_list ap;
         int i;    int i;
         FNODE r;    FNODE r;
   
         va_start(ap,id);    va_start(ap,id);
         NEWFNODE(r,ac); ID(r) = id;    NEWFNODE(r,ac); ID(r) = id;
         for ( i = 0; i < ac; i++ )    for ( i = 0; i < ac; i++ )
                 r->arg[i] = va_arg(ap, pointer);      r->arg[i] = va_arg(ap, pointer);
         va_end(ap);    va_end(ap);
         return r;    return r;
 }  }
   
 SNODE mksnode(int ac,sid id,...)  SNODE mksnode(int ac,sid id,...)
 {  {
         va_list ap;    va_list ap;
         int i;    int i;
         SNODE r;    SNODE r;
   
         va_start(ap,id);    va_start(ap,id);
         NEWSNODE(r,ac); ID(r) = id;    NEWSNODE(r,ac); ID(r) = id;
         for ( i = 0; i < ac; i++ )    for ( i = 0; i < ac; i++ )
                 r->arg[i] = va_arg(ap, pointer);      r->arg[i] = va_arg(ap, pointer);
         va_end(ap);    va_end(ap);
         return r;    return r;
 }  }
 #else  #else
 NODE mknode(va_alist)  NODE mknode(va_alist)
 va_dcl  va_dcl
 {  {
         va_list ap;    va_list ap;
         int ac,i;    int ac,i;
         NODE n0,n;    NODE n0,n;
   
         va_start(ap);    va_start(ap);
         ac = va_arg(ap,int);    ac = va_arg(ap,int);
         for ( i = 0, n0 = 0; i < ac; i++ ) {    for ( i = 0, n0 = 0; i < ac; i++ ) {
                 NEXTNODE(n0,n);      NEXTNODE(n0,n);
                 BDY(n)=va_arg(ap, pointer);      BDY(n)=va_arg(ap, pointer);
         }    }
         va_end(ap);    va_end(ap);
         if ( n0 )    if ( n0 )
                 NEXT(n)=0;      NEXT(n)=0;
         return n0;    return n0;
 }  }
   
 FNODE mkfnode(va_alist)  FNODE mkfnode(va_alist)
 va_dcl  va_dcl
 {  {
         va_list ap;    va_list ap;
         int ac,i;    int ac,i;
         FNODE r;    FNODE r;
   
         va_start(ap);    va_start(ap);
         ac = va_arg(ap, int);    ac = va_arg(ap, int);
         NEWFNODE(r,ac); ID(r) = va_arg(ap, fid);    NEWFNODE(r,ac); ID(r) = va_arg(ap, fid);
         for ( i = 0; i < ac; i++ )    for ( i = 0; i < ac; i++ )
                 r->arg[i] = va_arg(ap, pointer);      r->arg[i] = va_arg(ap, pointer);
         va_end(ap);    va_end(ap);
         return r;    return r;
 }  }
   
 SNODE mksnode(va_alist)  SNODE mksnode(va_alist)
 va_dcl  va_dcl
 {  {
         va_list ap;    va_list ap;
         int ac,i;    int ac,i;
         SNODE r;    SNODE r;
   
         va_start(ap);    va_start(ap);
         ac = va_arg(ap, int);    ac = va_arg(ap, int);
         NEWSNODE(r,ac); ID(r) = va_arg(ap, sid);    NEWSNODE(r,ac); ID(r) = va_arg(ap, sid);
         for ( i = 0; i < ac; i++ )    for ( i = 0; i < ac; i++ )
                 r->arg[i] = va_arg(ap, pointer);      r->arg[i] = va_arg(ap, pointer);
         va_end(ap);    va_end(ap);
         return r;    return r;
 }  }
 #endif  #endif
   
 void makevar(str,p)  V searchvar(char *str)
 char *str;  
 P *p;  
 {  {
         VL vl;    VL vl;
         V v;  
         P t;  
   
         for ( vl = CO; ; )    for ( vl = CO; vl ;vl = NEXT(vl) )
                 if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {      if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) )
                         MKV(VR(vl),t); *p = t;        return VR(vl);
                         return;    return 0;
                 } else if ( !NEXT(vl) ) {  
                         NEWV(v); v->attr = (pointer)V_IND;  
                         NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));  
                         strcpy(NAME(v),str);  
                         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;  
                         MKV(v,t); *p = t;  
                         return;  
                 } else  
                         vl = NEXT(vl);  
 }  }
   
 void makesrvar(f,p)  void update_LASTCO()
 FUNC f;  
 P *p;  
 {  {
         VL vl;    VL vl;
         V v;  
         P t;  
         char *str;  
   
         for ( vl = CO, str = NAME(f); ; )    for ( vl = CO; NEXT(vl); vl = NEXT(vl) );
                 if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {    LASTCO = vl;
                         VR(vl)->attr = (pointer)V_SR; VR(vl)->priv = (pointer)f;  
                         MKV(VR(vl),t); *p = t;  
                         return;  
                 } else if ( !NEXT(vl) ) {  
                         NEWV(v); v->attr = (pointer)V_SR; v->priv = (pointer)f;  
                         NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));  
                         strcpy(NAME(v),str);  
                         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;  
                         MKV(v,t); *p = t;  
                         return;  
                 } else  
                         vl = NEXT(vl);  
 }  }
   
 void appendtonode(n,a,nrp)  void makevar(char *str,P *p)
 NODE n;  
 pointer a;  
 NODE *nrp;  
 {  {
         NODE tn;    VL vl;
     V v;
     P t;
   
         if ( !n )    for ( vl = CO; ; )
                 MKNODE(*nrp,a,0);      if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
         else {        MKV(VR(vl),t); *p = t;
                 for ( tn = n; NEXT(tn); tn = NEXT(tn) );        return;
                 MKNODE(NEXT(tn),a,0); *nrp = n;      } else if ( !NEXT(vl) ) {
         }        NEWV(v); v->attr = (pointer)V_IND;
         NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
         strcpy(NAME(v),str);
         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
         MKV(v,t); *p = t;
         LASTCO = NEXT(vl);
         return;
       } else
         vl = NEXT(vl);
 }  }
   
 void appendtonode2(n,a,b,nrp)  void makesrvar(FUNC f,P *p)
 NODE2 n;  
 pointer a,b;  
 NODE2 *nrp;  
 {  {
         NODE2 tn;    VL vl;
     V v;
     P t;
     char *str;
   
         if ( !n )    for ( vl = CO, str = f->fullname; ; )
                 MKNODE2(*nrp,a,b,0);      if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
         else {        VR(vl)->attr = (pointer)V_SR; VR(vl)->priv = (pointer)f;
                 for ( tn = n; NEXT(tn); tn = NEXT(tn) );        MKV(VR(vl),t); *p = t;
                 MKNODE2(NEXT(tn),a,b,0); *nrp = n;        return;
         }      } else if ( !NEXT(vl) ) {
         NEWV(v); v->attr = (pointer)V_SR; v->priv = (pointer)f;
         NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
         strcpy(NAME(v),str);
         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
         LASTCO = NEXT(vl);
         MKV(v,t); *p = t;
         return;
       } else
         vl = NEXT(vl);
 }  }
   
 void appendvar(vl,v)  void appendtonode(NODE n,pointer a,NODE *nrp)
 VL vl;  
 V v;  
 {  {
         while (1)    NODE tn;
                 if ( vl->v == v )  
                         return;    if ( !n )
                 else if ( !NEXT(vl) ) {      MKNODE(*nrp,a,0);
                         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;    else {
                         return;      for ( tn = n; NEXT(tn); tn = NEXT(tn) );
                 } else      MKNODE(NEXT(tn),a,0); *nrp = n;
                         vl = NEXT(vl);    }
 }  }
   
 void reallocarray(arrayp,sizep,indexp,esize)  void appendtonode2(NODE2 n,pointer a,pointer b,NODE2 *nrp)
 char **arrayp;  
 int *sizep,*indexp;  
 int esize;  
 {  {
         char *new;    NODE2 tn;
   
         if ( *arrayp ) {    if ( !n )
                 *sizep *= 2;      MKNODE2(*nrp,a,b,0);
                 new = (char *)MALLOC((*sizep)*esize);    else {
                 bcopy(*arrayp,new,*indexp*esize);      for ( tn = n; NEXT(tn); tn = NEXT(tn) );
                 *arrayp = new;      MKNODE2(NEXT(tn),a,b,0); *nrp = n;
         } else {    }
                 *sizep = DEFSIZE; *indexp = 0;  
                 new = (char *)MALLOC((*sizep)*esize);  
                 bzero(new,DEFSIZE*esize);  
                 *arrayp = new;  
         }  
 }  }
   
 #if defined(THINK_C)  void appendvar(VL vl,V v)
 void bzero(p,len)  
 register char *p;  
 register int len;  
 {  {
         for ( ; len; len-- )    while (1)
                 *p++ = 0;      if ( vl->v == v )
         return;
       else if ( !NEXT(vl) ) {
         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
         LASTCO = NEXT(vl);
         return;
       } else
         vl = NEXT(vl);
 }  }
   
 void bcopy(s,d,len)  void asir_reallocarray(char **arrayp,int *sizep,int *indexp,int esize)
 register char *s;  
 register char *d;  
 int len;  
 {  {
         for ( ; len; len-- )    char *new;
                 *d++ = *s++;  
 }  
   
 char *index(char *s,char c)    if ( *arrayp ) {
 {      *sizep *= 2;
         for ( ; *s && *s != c; s++ );      new = (char *)MALLOC((*sizep)*esize);
         if ( *s )      bcopy(*arrayp,new,*indexp*esize);
                 return s;      *arrayp = new;
         else    } else {
                 return 0;      *sizep = DEFSIZE; *indexp = 0;
       new = (char *)MALLOC((*sizep)*esize);
       bzero(new,DEFSIZE*esize);
       *arrayp = new;
     }
 }  }
   
 void printap(p)  
 P p;  
 {  
         DCP dc;  
   
         for ( dc = DC(p); dc; dc = NEXT(dc) ) {  
                 printf("(c=0x%lx c->nm=0x%lx c->nm->p=%ld) ",  
                         (int *)dc->c,(int *)((Q)dc->c)->nm,(int)((Q)dc->c)->nm->p);  
         }  
         printf("\n");  
 }  
 #endif  

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.21

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>