Looking further, I guess the segfault is related to c4range.
c4range itself is ok, but casting *I to *C4 when calling
c4range does not work in big-endian. Please see if this patch
can fix the issue. Note that the code base has gone through
some changes, so that you can ignore lines that are not present
in your copy.
diff --git a/jsrc/ao.c b/jsrc/ao.c
index 360175e..c54dd44 100644
--- a/jsrc/ao.c
+++ b/jsrc/ao.c
@@ -208,7 +208,7 @@ static I jtkeyrs(J jt,A a,I*zr,I*zs){I ac,at,r=0,s=0;
at=AT(a); ac=aii(a);
if(2>=ac)switch(CTTZ(at)){
case C2TX: if(1==ac)s=65536; break;
- case C4TX: if(1==ac)c4range(AN(a),C4AV(a),(C4 *)&r,&s); break;
+ case C4TX: if(1==ac){C4 cr=r; c4range(AN(a),C4AV(a),&cr,&s); r=cr;} break;
case B01X: if(1==ac)s=2; else{s=258; at=C2T;} break;
case LITX: if(1==ac)s=256; else{s=65536; at=C2T;} break;
case INTX: if(1==ac)irange(AN(a),AV(a),&r,&s); break;
@@ -375,7 +375,7 @@ F1(jtgroup){PROLOG(0014);A c,d,x,z,*zv;B
b;I**cu,*cv,*dv,j,k,m,n,p,q,t,*u,*v,*wv
n=IC(w); t=AT(w); p=q=0; b=0; k=n?aii(w)*bp(t):0;
if(!AN(w)){GATV(z,BOX,n?1:0,1,0); if(n)RZ(*AAV(z)=IX(n)); R z;}
if(2>=k)q=t&B01?(1==k?2:258):t&LIT?(1==k?256:65536):t&C2T?65536:0;
- if(k==sizeof(C4)&&t&C4T){c4range(n,C4AV(w),(C4*)&p,&q);}
+ if(k==sizeof(C4)&&t&C4T){C4 cp=p; c4range(n,C4AV(w),&cp,&q); p=cp;}
if(k==SZI&&t&INT+SBT)irange(n,AV(w),&p,&q);
if(b=q&&(2>=k||q<=2*n)){
GATV(c,INT,q,1,0); cv=AV(c)-p; /* counts */
diff --git a/jsrc/vb.c b/jsrc/vb.c
index de283a8..129a899 100644
--- a/jsrc/vb.c
+++ b/jsrc/vb.c
@@ -59,7 +59,7 @@ static F2(jtebarvec){A y,z;B*zv;C*av,*wv,*yv;I an,k,n,s,t,wn;
/* -3: rank > 2 */
/* -4: not discrete type or range too large */
-static I jtebarprep(J jt,A a,A w,A*za,A*zw,I*zc){I
ar,at,c=0,ca,cw,d=IMAX,da,dw,m,n,t,wr,wt,memlimit;
+static I jtebarprep(J jt,A a,A w,A*za,A*zw,I*zc){I
ar,at,c=0,ca,cw,d=IMAX,da,dw,m,n,t,wr,wt,memlimit;C4 ccaw;
ar=AR(a); at=AT(a); m=AN(a);
wr=AR(w); wt=AT(w); n=AN(w);
ASSERT(ar==wr||!ar&&1==wr,EVRANK);
@@ -88,7 +88,7 @@ static I jtebarprep(J jt,A a,A w,A*za,A*zw,I*zc){I
ar,at,c=0,ca,cw,d=IMAX,da,dw,
if(da&&dw){c=MIN(ca,cw); d=MAX(ca+da,cw+dw)-c;} // This may make d
overflow (if c<0), but we catch that at exit
if(0<c&&c+d<=memlimit){d+=c;} break; // Extend lower bound to 0
if that doesn't make d too big
case C2TX: d=65536; break;
- case C4TX: c4range(m,C4AV(a),(C4*)&ca,&da);
if(da)c4range(n,C4AV(w),(C4*)&cw,&dw);
+ case C4TX: ccaw=ca; c4range(m,C4AV(a),&ccaw,&da); ca=ccaw; if(da){ccaw=cw;
c4range(n,C4AV(w),&ccaw,&dw); cw=ccaw; }
if(da&&dw){c=MIN((C4)ca,(C4)cw);
d=MAX(((C4)ca)+da,((C4)cw)+dw)-(C4)c;} // This may make d overflow (if c<0),
but we catch that at exit
if(0<c&&c+d<=memlimit){d+=c;} break; // Extend lower bound to 0
if that doesn't make d too big
case LITX: d=256; break;
diff --git a/jsrc/vgranking.c b/jsrc/vgranking.c
index 1c6e358..897a22e 100644
--- a/jsrc/vgranking.c
+++ b/jsrc/vgranking.c
@@ -90,7 +90,7 @@ F1(jtranking){A y,z;C*wv;I
i,k,m,n,p=0,q=0,t,wcr,wf,wk,wr,*ws,wt,*yu,*yv,*zv;
case 2: p=65536; break;
case sizeof(int):
if(wt&INT){irange(AN(w)/(k/wk),(I*)wv,&q,&p);
if(!(65536>p||0.69*(p+2*n)<n*log((D)n)))p=0;}
- else if(wt&C4T){c4range(AN(w)/(k/wk),(C4*)wv,(C4*)&q,&p);
if(!(65536>p||0.69*(p+2*n)<n*log((D)n)))p=0;}
+ else if(wt&C4T){C4 cq=q; c4range(AN(w)/(k/wk),(C4*)wv,&cq,&p); q=cq;
if(!(65536>p||0.69*(p+2*n)<n*log((D)n)))p=0;}
}
if(!p){
RZ(y=irs1(w,0L,wcr,jtgrade1)); yv=AV(y);
--
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm