00001
00002
00003 #include "edtinc.h"
00004
00005 #include "chkbuf.h"
00006
00007
00008
00009
00010 void
00011 dumpblk(ptr, index, maxindex)
00012 u_char *ptr;
00013 int index;
00014 int maxindex;
00015 {
00016 int *p;
00017 int i;
00018
00019
00020 if (index < 0) index = 0;
00021 if (index + 256 > maxindex) index = maxindex - 256;
00022 index = index & 0xfffffffc ;
00023
00024 p = (int *)(&ptr[index]);
00025 for(i=0; i<64; i++)
00026 {
00027 if ( i % 8 == 0) printf("\n%d -\t", index + (i*4));
00028 printf("%08x ", *p);
00029 p++;
00030 }
00031 printf("\n");
00032 }
00033
00034
00035
00036
00037 int
00038 chkbuf(unsigned char *align, int bufsize, int bufnum, int verbose)
00039
00040 {
00041 unsigned char shdbe, *p;
00042 int cnt;
00043 int err = 0;
00044 int firsterr = 1;
00045
00046 p = align;
00047 shdbe = (*p+1) & 0xff; p++;
00048 for(cnt=1; cnt<bufsize-1; cnt++)
00049 {
00050 if (*p != shdbe)
00051 {
00052 err++;
00053 if (verbose)
00054 {
00055 if (firsterr)
00056 {
00057 printf("offset %d in buffer %d was %02x, s/b %02x\n",
00058 cnt, bufnum, *p, shdbe);
00059 dumpblk(align, cnt-16, bufsize);
00060 printf("first error - hit cr to continue"); getchar();
00061 }
00062 firsterr = 0;
00063 }
00064 }
00065 shdbe = (*p+1) & 0xff; p++;
00066 }
00067
00068 return err;
00069 }
00070
00071 int
00072 chkbuf_short(unsigned short *align, int bufsize, int bufnum, int verbose)
00073
00074 {
00075 unsigned short shdbe;
00076 int cnt;
00077 int err = 0;
00078 int firsterr = 1;
00079
00080 shdbe = (align[0]+1) & 0xffff;
00081 for(cnt=1; cnt<bufsize-1; cnt++)
00082 {
00083 if (align[cnt] != shdbe)
00084 {
00085 err++;
00086 if (verbose)
00087 {
00088
00089 if (firsterr)
00090 {
00091 printf("offset %d in buffer %p was %04x, s/b %04x\n",
00092 cnt, align, align[cnt], shdbe);
00093 dumpblk((unsigned char *) align,
00094 (cnt-16) * 2, bufsize * 2);
00095 printf("first error - hit cr to continue"); getchar();
00096 }
00097 firsterr = 0;
00098 }
00099 }
00100
00101 shdbe = (align[cnt]+1) & 0xffff;
00102 }
00103
00104 return err;
00105 }
00106
00107 int
00108 chkbuf_long(unsigned long *align, int bufsize, int bufnum, int verbose)
00109
00110 {
00111 unsigned long shdbe;
00112 int cnt;
00113 int err = 0;
00114 int firsterr = 1;
00115
00116 shdbe = align[0]+1;
00117 for(cnt=1; cnt<bufsize-1; cnt++)
00118 {
00119 if (align[cnt] != shdbe)
00120 {
00121 err++;
00122 if (verbose)
00123 {
00124
00125 if (firsterr)
00126 {
00127 printf("offset %d in buffer %p was %08lx, s/b %08lx\n",
00128 cnt, align, align[cnt], shdbe);
00129 dumpblk((unsigned char *) align,
00130 (cnt-16) * 2, bufsize * 2);
00131 printf("first error - hit cr to continue"); getchar();
00132 }
00133 firsterr = 0;
00134 }
00135 }
00136
00137 shdbe = align[cnt]+1;
00138 }
00139
00140 return err;
00141 }
00142
00143
00144
00145
00146
00147 int
00148 bitoffset(bptr)
00149 unsigned char *bptr;
00150 {
00151 int i;
00152 int bit;
00153 unsigned char *p;
00154 unsigned char mask, last;
00155 int maxbit;
00156 int trans;
00157 int maxtrans;
00158
00159 mask = 0x1;
00160 maxbit = 0;
00161 maxtrans = 0;
00162 for(bit=0; bit< 8; bit++)
00163 {
00164 trans = 0;
00165 p = bptr;
00166
00167
00168
00169
00170 last = *p; p++;
00171 for(i=0; i< 256; i++)
00172 {
00173 if ( ((*p ^ last) & mask) != 0)
00174 {
00175 trans++;
00176 }
00177 last = *p; p++;
00178 }
00179 #if 0
00180 printf("bit %d has %d transitions of mask %02x\n", bit, trans, mask);
00181 #endif
00182 if (trans > maxtrans)
00183 {
00184 maxbit = bit;
00185 maxtrans = trans;
00186 }
00187 mask = (mask << 1);
00188 }
00189 return(maxbit);
00190 }
00191
00192 int
00193 bitoffset32(bptr)
00194 unsigned int *bptr;
00195 {
00196 int i;
00197 int bit;
00198 unsigned int *p;
00199 unsigned int mask, last;
00200 int maxbit;
00201 int trans;
00202 int maxtrans;
00203
00204 mask = 0x1;
00205 maxbit = 0;
00206 maxtrans = 0;
00207 for(bit=0; bit< 32; bit++)
00208 {
00209 trans = 0;
00210 p = bptr;
00211
00212
00213
00214
00215 last = *p; p++;
00216 for(i=0; i< 128*1024/4; i++)
00217 {
00218 if ( ((*p ^ last) & mask) != 0)
00219 {
00220 trans++;
00221 }
00222 last = *p; p++;
00223 }
00224 #if 0
00225 printf("bit %d has %d transitions of mask %08x\n", bit, trans, mask);
00226 #endif
00227 if (trans > maxtrans)
00228 {
00229 maxbit = bit;
00230 maxtrans = trans;
00231 }
00232 mask = (mask << 1);
00233 }
00234 return(maxbit);
00235 }
00236
00237 int
00238 bitoffset64(bptr)
00239 unsigned int *bptr;
00240 {
00241 int i;
00242 int bit;
00243 u_longlong_t *p;
00244 u_longlong_t mask, last;
00245 int maxbit;
00246 int trans;
00247 int maxtrans;
00248
00249 mask = 0x1;
00250 maxbit = 0;
00251 maxtrans = 0;
00252 for(bit=0; bit< 64; bit++)
00253 {
00254 trans = 0;
00255 p = (u_longlong_t *) bptr;
00256
00257
00258
00259
00260 last = *p; p++;
00261 for(i=0; i< 128*1024/8; i++)
00262 {
00263 if ( ((*p ^ last) & mask) != 0)
00264 {
00265 trans++;
00266 }
00267 last = *p; p++;
00268 }
00269 #if 0
00270 #ifdef _MSC_VER
00271 printf("bit %d has %d transitions of mask %I64x\n", bit, trans, mask);
00272 #else
00273 printf("bit %d has %d transitions of mask %016llx\n", bit, trans, mask);
00274 #endif
00275 #endif
00276 if (trans > maxtrans)
00277 {
00278 maxbit = bit;
00279 maxtrans = trans;
00280 }
00281 mask = (mask << 1);
00282 }
00283 return(maxbit);
00284 }
00285
00286
00287
00288
00289
00290
00291 void
00292 cp_shift(from, to, shift, blen)
00293 unsigned char *from, *to;
00294 int shift, blen;
00295
00296 {
00297 unsigned short reg, tmp, mask;
00298 int i;
00299
00300
00301
00302
00303
00304 mask = 0xff << shift;
00305 reg = ( *from << 8); from++;
00306
00307
00308
00309 for(i=0; i< blen - 1; i++)
00310 {
00311 reg |= *from; from++;
00312 tmp = reg & mask;
00313 *to = (unsigned char)(tmp >> shift); to++;
00314 reg = reg<<8;
00315 }
00316 }
00317
00318 void
00319 cp_shift32(from, to, shift, blen)
00320 unsigned int *from, *to;
00321 int shift, blen;
00322 {
00323
00324
00325
00326 u_longlong_t reg, tmp, mask;
00327 int i;
00328 u_longlong_t tmp2 ;
00329
00330 #if 0
00331 printf("cp_shift32 from %08x to %08x shift %d length %d\n",
00332 from, to, shift, blen);
00333 #endif
00334 mask = (u_longlong_t)0xffffffff << shift;
00335 tmp2 = (u_longlong_t)*from ;
00336 reg = ( tmp2 << 32); from++;
00337
00338 for(i=0; i< blen - 1; i++)
00339 {
00340 reg |= (u_longlong_t)*from; from++;
00341 tmp = reg & mask;
00342 tmp2 = tmp >> shift ;
00343 *to = (unsigned int)(tmp >> shift);
00344 to++;
00345 reg = reg<<32;
00346 }
00347 }
00348
00349 void
00350 cp_shift64(u_longlong_t *from, u_longlong_t *to, int shift, int blen)
00351 {
00352 int i, maskshift ;
00353 u_longlong_t upper, lower, mask ;
00354
00355
00356 upper = 0 ;
00357 lower = 0 ;
00358 mask = ((u_longlong_t) 1 << (u_longlong_t) shift) - 1 ;
00359 maskshift = 64 - shift ;
00360
00361 for (i = 0; i < blen; i++, to++, from++)
00362 {
00363 *to = upper | (*from >> shift) ;
00364 upper = (*from & mask) << maskshift ;
00365
00366 if ((u_longlong_t)*to &
00367 #ifdef _MSC_VER
00368 (u_longlong_t)0xeeeeeeeeeeeeeeeei64)
00369 printf("Bad value: %016I64x %016I64x\n", *from, *to) ;
00370 #else
00371 (u_longlong_t)0xeeeeeeeeeeeeeeeeLL)
00372 printf("Bad value: %016llx %016llx\n", *from, *to) ;
00373 #endif
00374 }
00375 }
00376 void
00377 intswap(u_char *buf, int size)
00378 {
00379 u_longlong_t *tmpp ;
00380 u_longlong_t *endp ;
00381 tmpp = (u_longlong_t *)buf ;
00382 endp = tmpp + (size / 8) ;
00383 while (tmpp < endp)
00384 {
00385 *tmpp = iswap(*tmpp) ;
00386 tmpp++ ;
00387 }
00388 }
00389 u_longlong_t
00390 iswap(u_longlong_t val)
00391 {
00392 #ifdef _MSC_VER
00393 return (
00394 ((val & 0x00000000ffffffffi64) << 32)
00395 | ((val & 0xffffffff00000000i64) >> 32));
00396 #else
00397 return (
00398 ((val & 0x00000000ffffffffLL) << 32)
00399 | ((val & 0xffffffff00000000LL) >> 32));
00400
00401 #endif
00402 }