[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.20 and 1.21

version 1.20, 2018/03/27 06:29:19 version 1.21, 2018/03/29 01:32:54
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.19 2017/02/07 08:30:31 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"
Line 59 
Line 59 
   
 int length(NODE n)  int length(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(NODE a)  int argc(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(char *s,int *acp,char **av)  void stoarg(char *s,int *acp,char **av)
 {  {
         int i;    int i;
   
         for ( i = 0; ; i++ ) {    for ( i = 0; ; i++ ) {
                 for ( ; *s && isspace((unsigned char)*s); s++ );      for ( ; *s && isspace((unsigned char)*s); s++ );
                 if ( *s ) {      if ( *s ) {
                         for ( av[i] = s; *s &&        for ( av[i] = s; *s &&
                                 !isspace((unsigned char)*s); s++ );          !isspace((unsigned char)*s); s++ );
                         if ( *s )        if ( *s )
                                 *s++ = 0;          *s++ = 0;
                 } else {      } else {
                         *acp = i;        *acp = i;
                         return;        return;
                 }      }
         }    }
 }  }
   
 #if 0  #if 0
 unsigned int ator(unsigned int addr,Obj *r)  unsigned int ator(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(pointer a,NODE ind,pointer *vp)  void getarray(pointer a,NODE ind,pointer *vp)
 {  {
         Obj len,row,col,trg;    Obj len,row,col,trg;
         int i;    int i;
         NODE n,n0;    NODE n,n0;
         VECT v;    VECT v;
         Q q;    Q q;
   
         if ( a && OID(a) == O_BYTEARRAY ) {    if ( a && OID(a) == O_BYTEARRAY ) {
                 len = (Obj)BDY(ind);      len = (Obj)BDY(ind);
                 if ( !rangecheck(len,((BYTEARRAY)a)->len) )      if ( !rangecheck(len,((BYTEARRAY)a)->len) )
                         error("getarray : Out of range");        error("getarray : Out of range");
                 else if ( NEXT(ind) )      else if ( NEXT(ind) )
                         error("getarray : invalid index");        error("getarray : invalid index");
                 else {      else {
                         i = (int)BDY((BYTEARRAY)a)[QTOS((Q)len)];        i = (int)BDY((BYTEARRAY)a)[QTOS((Q)len)];
                         STOQ(i,q);        STOQ(i,q);
                         *vp = (pointer)q;        *vp = (pointer)q;
                 }      }
                 return;      return;
         }    }
         for ( ; ind; ind = NEXT(ind) ) {    for ( ; ind; ind = NEXT(ind) ) {
                 if ( !a )      if ( !a )
                         error("getarray : array or list expected");        error("getarray : array or list expected");
                 switch ( OID(a) ) {      switch ( OID(a) ) {
                         case O_VECT:        case O_VECT:
                                 len = (Obj)BDY(ind);          len = (Obj)BDY(ind);
                                 if ( !rangecheck(len,((VECT)a)->len) )          if ( !rangecheck(len,((VECT)a)->len) )
                                         error("getarray : Out of range");            error("getarray : Out of range");
                                 else          else
                                         a = (pointer)(BDY((VECT)a)[QTOS((Q)len)]);            a = (pointer)(BDY((VECT)a)[QTOS((Q)len)]);
                                 break;          break;
                         case O_MAT:        case O_MAT:
                                 row = (Obj)BDY(ind);          row = (Obj)BDY(ind);
                                 if ( !rangecheck(row,((MAT)a)->row) )          if ( !rangecheck(row,((MAT)a)->row) )
                                         error("getarray : Out of range");            error("getarray : Out of range");
                                 else if ( NEXT(ind) ) {          else if ( NEXT(ind) ) {
                                         ind = NEXT(ind);            ind = NEXT(ind);
                                         col = (Obj)BDY(ind);            col = (Obj)BDY(ind);
                                         if ( !rangecheck(col,((MAT)a)->col) )            if ( !rangecheck(col,((MAT)a)->col) )
                                                 error("getarray : Out of range");              error("getarray : Out of range");
                                         else            else
                                                 a = (pointer)(BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)]);              a = (pointer)(BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)]);
                                 } else {          } else {
                                         NEWVECT(v); v->len = ((MAT)a)->col;            NEWVECT(v); v->len = ((MAT)a)->col;
                                         v->body = (pointer *)BDY((MAT)a)[QTOS((Q)row)];            v->body = (pointer *)BDY((MAT)a)[QTOS((Q)row)];
                                         a = (pointer)v;            a = (pointer)v;
                                 }          }
                                 break;          break;
                         case O_IMAT:        case O_IMAT:
                                 row = (Obj)BDY(ind);          row = (Obj)BDY(ind);
                                 ind = NEXT(ind);          ind = NEXT(ind);
                                 col = (Obj)BDY(ind);          col = (Obj)BDY(ind);
                                 if ( ((IMAT)a)->row < QTOS((Q)row) ||          if ( ((IMAT)a)->row < QTOS((Q)row) ||
                                         ((IMAT)a)->col < QTOS((Q)col) ||            ((IMAT)a)->col < QTOS((Q)col) ||
                                         (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0))            (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0))
                                                 error("putarray : Out of range");              error("putarray : Out of range");
                                 GetIbody((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj*)&trg);          GetIbody((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj*)&trg);
                                 a = (pointer)trg;          a = (pointer)trg;
                                 break;          break;
                         case O_LIST:        case O_LIST:
                                 n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));          n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
                                 if ( i < 0 )          if ( i < 0 )
                                         error("getarray : Out of range");            error("getarray : Out of range");
                                 for ( n = n0; i > 0 && n; n = NEXT(n), i-- );          for ( n = n0; i > 0 && n; n = NEXT(n), i-- );
                                 if ( i || !n )          if ( i || !n )
                                         error("getarray : Out of range");            error("getarray : Out of range");
                                 else          else
                                         a = (pointer)BDY(n);            a = (pointer)BDY(n);
                                 break;          break;
                         default:        default:
                                 error("getarray : array or list expected");          error("getarray : array or list expected");
                                 break;          break;
                 }      }
         }    }
         *vp = a;    *vp = a;
 }  }
   
 void putarray(pointer a,NODE ind,pointer b)  void putarray(pointer a,NODE ind,pointer b)
 {  {
         Obj len,row,col;    Obj len,row,col;
         int i;    int i;
         NODE n,n0;    NODE n,n0;
   
         if ( a && OID(a) == O_BYTEARRAY ) {    if ( a && OID(a) == O_BYTEARRAY ) {
                 len = (Obj)BDY(ind);      len = (Obj)BDY(ind);
                 if ( !rangecheck(len,((BYTEARRAY)a)->len) )      if ( !rangecheck(len,((BYTEARRAY)a)->len) )
                         error("putarray : Out of range");        error("putarray : Out of range");
                 else if ( NEXT(ind) )      else if ( NEXT(ind) )
                         error("putarray : invalid index");        error("putarray : invalid index");
                 else      else
                         BDY((BYTEARRAY)a)[QTOS((Q)len)] = (unsigned char)QTOS((Q)b);        BDY((BYTEARRAY)a)[QTOS((Q)len)] = (unsigned char)QTOS((Q)b);
                 return;      return;
         }    }
         for ( ; ind; ind = NEXT(ind) ) {    for ( ; ind; ind = NEXT(ind) ) {
                 if ( !a )      if ( !a )
                         error("putarray : array expected");        error("putarray : array expected");
                 switch ( OID(a) ) {      switch ( OID(a) ) {
                         case O_VECT:        case O_VECT:
                                 len = (Obj)BDY(ind);          len = (Obj)BDY(ind);
                                 if ( !rangecheck(len,((VECT)a)->len) )          if ( !rangecheck(len,((VECT)a)->len) )
                                         error("putarray : Out of range");            error("putarray : Out of range");
                                 else if ( NEXT(ind) )          else if ( NEXT(ind) )
                                         a = BDY((VECT)a)[QTOS((Q)len)];            a = BDY((VECT)a)[QTOS((Q)len)];
                                 else          else
                                         BDY((VECT)a)[QTOS((Q)len)] = b;            BDY((VECT)a)[QTOS((Q)len)] = b;
                                 break;          break;
                         case O_MAT:        case O_MAT:
                                 row = (Obj)BDY(ind);          row = (Obj)BDY(ind);
                                 if ( !rangecheck(row,((MAT)a)->row) )          if ( !rangecheck(row,((MAT)a)->row) )
                                         error("putarray : Out of range");            error("putarray : Out of range");
                                 else if ( NEXT(ind) ) {          else if ( NEXT(ind) ) {
                                         ind = NEXT(ind);            ind = NEXT(ind);
                                         col = (Obj)BDY(ind);            col = (Obj)BDY(ind);
                                         if ( !rangecheck(col,((MAT)a)->col) )            if ( !rangecheck(col,((MAT)a)->col) )
                                                 error("putarray : Out of range");              error("putarray : Out of range");
                                         else if ( NEXT(ind) )            else if ( NEXT(ind) )
                                                 a = BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)];              a = BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)];
                                         else            else
                                                 BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)] = b;              BDY((MAT)a)[QTOS((Q)row)][QTOS((Q)col)] = b;
                                 } else          } else
                                         error("putarray : invalid assignment");            error("putarray : invalid assignment");
                                 break;          break;
                         case O_IMAT:        case O_IMAT:
                                 row = (Obj)BDY(ind);          row = (Obj)BDY(ind);
                                 ind = NEXT(ind);          ind = NEXT(ind);
                                 col = (Obj)BDY(ind);          col = (Obj)BDY(ind);
                                 if ( ((IMAT)a)->row < QTOS((Q)row) ||          if ( ((IMAT)a)->row < QTOS((Q)row) ||
                                         ((IMAT)a)->col < QTOS((Q)col) ||            ((IMAT)a)->col < QTOS((Q)col) ||
                                         (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0))            (QTOS((Q)row) < 0) || (QTOS((Q)col) < 0))
                                                 error("putarray : Out of range");              error("putarray : Out of range");
                                 PutIent((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj)b);          PutIent((IMAT)a, QTOS((Q)row), QTOS((Q)col), (Obj)b);
                                 break;          break;
                         case O_LIST:        case O_LIST:
                                 if ( NEXT(ind) ) {          if ( NEXT(ind) ) {
                                         n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));            n0 = BDY((LIST)a); i = QTOS((Q)BDY(ind));
                                         if ( i < 0 )            if ( i < 0 )
                                                 error("putarray : Out of range");              error("putarray : Out of range");
                                         for ( n = n0; i > 0 && n; n = NEXT(n), i-- );            for ( n = n0; i > 0 && n; n = NEXT(n), i-- );
                                         if ( i || !n )            if ( i || !n )
                                                 error("puarray : Out of range");              error("puarray : Out of range");
                                         else            else
                                                 a = (pointer)BDY(n);              a = (pointer)BDY(n);
                                 } else          } else
                                         error("putarray : invalid assignment");            error("putarray : invalid assignment");
                                 break;          break;
                         default:        default:
                                 error("putarray : array expected");          error("putarray : array expected");
                                 break;          break;
                 }      }
         }    }
 }  }
   
 int rangecheck(Obj a,int n)  int rangecheck(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 p)  int zp(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(__GNUC__) || defined(VISUAL) || defined(__MINGW32__) || (defined(__MACH__) && defined(__ppc__)) || defined(__FreeBSD__)  #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
   
 V searchvar(char *str)  V searchvar(char *str)
 {  {
         VL vl;    VL vl;
   
         for ( vl = CO; vl ;vl = NEXT(vl) )    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) )
                         return VR(vl);        return VR(vl);
         return 0;    return 0;
 }  }
   
 void update_LASTCO()  void update_LASTCO()
Line 409  void update_LASTCO()
Line 409  void update_LASTCO()
   
 void makevar(char *str,P *p)  void makevar(char *str,P *p)
 {  {
         VL vl;    VL vl;
         V v;    V v;
         P t;    P t;
   
         for ( vl = CO; ; )    for ( vl = CO; ; )
                 if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {      if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
                         MKV(VR(vl),t); *p = t;        MKV(VR(vl),t); *p = t;
                         return;        return;
                 } else if ( !NEXT(vl) ) {      } else if ( !NEXT(vl) ) {
                         NEWV(v); v->attr = (pointer)V_IND;        NEWV(v); v->attr = (pointer)V_IND;
                         NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));        NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
                         strcpy(NAME(v),str);        strcpy(NAME(v),str);
                         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;        NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
                         MKV(v,t); *p = t;        MKV(v,t); *p = t;
                         LASTCO = NEXT(vl);        LASTCO = NEXT(vl);
                         return;        return;
                 } else      } else
                         vl = NEXT(vl);        vl = NEXT(vl);
 }  }
   
 void makesrvar(FUNC f,P *p)  void makesrvar(FUNC f,P *p)
 {  {
         VL vl;    VL vl;
         V v;    V v;
         P t;    P t;
         char *str;    char *str;
   
         for ( vl = CO, str = f->fullname; ; )    for ( vl = CO, str = f->fullname; ; )
                 if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {      if ( NAME(VR(vl)) && !strcmp(NAME(VR(vl)),str) ) {
                         VR(vl)->attr = (pointer)V_SR; VR(vl)->priv = (pointer)f;        VR(vl)->attr = (pointer)V_SR; VR(vl)->priv = (pointer)f;
                         MKV(VR(vl),t); *p = t;        MKV(VR(vl),t); *p = t;
                         return;        return;
                 } else if ( !NEXT(vl) ) {      } else if ( !NEXT(vl) ) {
                         NEWV(v); v->attr = (pointer)V_SR; v->priv = (pointer)f;        NEWV(v); v->attr = (pointer)V_SR; v->priv = (pointer)f;
                         NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));        NAME(v) = (char *)CALLOC(strlen(str)+1,sizeof(char));
                         strcpy(NAME(v),str);        strcpy(NAME(v),str);
                         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;        NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
                         LASTCO = NEXT(vl);        LASTCO = NEXT(vl);
                         MKV(v,t); *p = t;        MKV(v,t); *p = t;
                         return;        return;
                 } else      } else
                         vl = NEXT(vl);        vl = NEXT(vl);
 }  }
   
 void appendtonode(NODE n,pointer a,NODE *nrp)  void appendtonode(NODE n,pointer a,NODE *nrp)
 {  {
         NODE tn;    NODE tn;
   
         if ( !n )    if ( !n )
                 MKNODE(*nrp,a,0);      MKNODE(*nrp,a,0);
         else {    else {
                 for ( tn = n; NEXT(tn); tn = NEXT(tn) );      for ( tn = n; NEXT(tn); tn = NEXT(tn) );
                 MKNODE(NEXT(tn),a,0); *nrp = n;      MKNODE(NEXT(tn),a,0); *nrp = n;
         }    }
 }  }
   
 void appendtonode2(NODE2 n,pointer a,pointer b,NODE2 *nrp)  void appendtonode2(NODE2 n,pointer a,pointer b,NODE2 *nrp)
 {  {
         NODE2 tn;    NODE2 tn;
   
         if ( !n )    if ( !n )
                 MKNODE2(*nrp,a,b,0);      MKNODE2(*nrp,a,b,0);
         else {    else {
                 for ( tn = n; NEXT(tn); tn = NEXT(tn) );      for ( tn = n; NEXT(tn); tn = NEXT(tn) );
                 MKNODE2(NEXT(tn),a,b,0); *nrp = n;      MKNODE2(NEXT(tn),a,b,0); *nrp = n;
         }    }
 }  }
   
 void appendvar(VL vl,V v)  void appendvar(VL vl,V v)
 {  {
         while (1)    while (1)
                 if ( vl->v == v )      if ( vl->v == v )
                         return;        return;
                 else if ( !NEXT(vl) ) {      else if ( !NEXT(vl) ) {
                         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;        NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
                         LASTCO = NEXT(vl);        LASTCO = NEXT(vl);
                         return;        return;
                 } else      } else
                         vl = NEXT(vl);        vl = NEXT(vl);
 }  }
   
 void asir_reallocarray(char **arrayp,int *sizep,int *indexp,int esize)  void asir_reallocarray(char **arrayp,int *sizep,int *indexp,int esize)
 {  {
         char *new;    char *new;
   
         if ( *arrayp ) {    if ( *arrayp ) {
                 *sizep *= 2;      *sizep *= 2;
                 new = (char *)MALLOC((*sizep)*esize);      new = (char *)MALLOC((*sizep)*esize);
                 bcopy(*arrayp,new,*indexp*esize);      bcopy(*arrayp,new,*indexp*esize);
                 *arrayp = new;      *arrayp = new;
         } else {    } else {
                 *sizep = DEFSIZE; *indexp = 0;      *sizep = DEFSIZE; *indexp = 0;
                 new = (char *)MALLOC((*sizep)*esize);      new = (char *)MALLOC((*sizep)*esize);
                 bzero(new,DEFSIZE*esize);      bzero(new,DEFSIZE*esize);
                 *arrayp = new;      *arrayp = new;
         }    }
 }  }

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

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