view xcrc.c @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500
parents
children
line wrap: on
line source

/* Copyright 1990-2011, Jsoftware Inc.  All rights reserved. */
/* License in license.txt.                                   */
/*                                                                         */
/* Xenos: CRC calculation                                                  */

#include "j.h"
#include "x.h"


typedef unsigned int II;

static II crctab[256];

static II jtcrcvalidate(J jt,A w){A*wv;B*v;I m,wd;II p,x,z=-1;
 RZ(w);
 ASSERT(1>=AR(w),EVRANK);
 m=AN(w);
 if(m&&BOX&AT(w)){ASSERT(2>=m,EVLENGTH); wv=AAV(w); wd=(I)w*ARELATIVE(w); w=WVR(0); if(2==m)RE(z=(II)i0(WVR(1)));}
 if(B01&AT(w)){ASSERT(32==AN(w),EVLENGTH); v=BAV(w); p=0; DO(32, p<<=1; if(*v++)p|=1;);}
 else RE(p=(II)i0(w));
 DO(256, x=(II)i; DO(8, if(1&x)x=p^x>>1; else x>>=1;); crctab[i]=x;); 
 R z;
}

F1(jtcrc1){R crc2(sc(-306674912),w);}

F2(jtcrc2){I n;II z;UC*v;
 RZ(a&&w);
 ASSERT(1>=AR(a)&&1>=AR(w),EVRANK);
 n=AN(w); v=UAV(w);
 ASSERT(!n||LIT&AT(w),EVDOMAIN);
 RE(z=crcvalidate(a));
 DO(n, z=z>>8^crctab[255&(z^*v++)];);
 R sc((I)z^(I)-1);
}

F1(jtcrccompile){A h,*hv;II z;
 RZ(w);
 GA(h,BOX,2,1,0); hv=AAV(h);
 RE(z=crcvalidate(w));
 RZ(hv[0]=vec(INT,256L,crctab));
 RZ(hv[1]=sc((I)z));
 R h;
}

DF1(jtcrcfixedleft){A h,*hv;I n;II*t,z;UC*v;
 RZ(w);
 h=VAV(self)->h; hv=AAV(h); t=(II*)AV(hv[0]); z=(II)*AV(hv[1]);
 n=AN(w); v=UAV(w);
 ASSERT(!n||LIT&AT(w),EVDOMAIN); 
 DO(n, z=z>>8^t[255&(z^*v++)];);
 R sc((I)z^(I)-1);
}