chkbuf.c

00001 /* #pragma ident "@(#)chkbuf.c  1.21 02/05/08 EDT" */
00002 
00003 #include "edtinc.h"
00004 
00005 #include "chkbuf.h"
00006 
00007 /*
00008  * dump 64 longs
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         /* test index for limits */
00020         if (index < 0) index = 0;
00021         if (index + 256 > maxindex) index = maxindex - 256;
00022         index = index & 0xfffffffc ; /* make an even word boundary */
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  * check buffersize -1 that each byte increments over the next
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  * find the bit alignment in a byte for incrementing bytes
00145  * (look for the bit that flips each time, it is the lsb)
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                  * look at the first 9 bytes 
00168                  * if bufsize is less than 8 to bad
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                  * look at the first 9 bytes 
00213                  * if bufsize is less than 8 to bad
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                  * look at the first 9 bytes 
00258                  * if bufsize is less than 8 to bad
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  * copy a buffer andshift a by n bits to the left
00288  * result buffer is one byte less
00289  * n is assumed to be less than 8
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         printf("cp_shift from %08x to %08x shift %d length %d\n",
00302                 from, to, shift, blen);
00303         */
00304         mask = 0xff << shift;
00305         reg = ( *from << 8); from++;
00306         /*
00307         printf("mask = %04x, start reg = %04x\n", mask, reg);
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         /* printf("mask = %016llx, start reg = %016llx\n", mask, reg);*/
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 }

Generated on Mon May 12 16:38:51 2008 by  doxygen 1.5.1