home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / mint / mntlib16.lzh / MNTLIB16 / BCMP.C < prev    next >
C/C++ Source or Header  |  1993-08-03  |  1KB  |  55 lines

  1. #include <stddef.h>
  2. #include <string.h>
  3. #include <assert.h>
  4.  
  5. #undef ODD
  6. #define ODD(x) (((short)(x)) & 1)    /* word ops are faster */
  7.  
  8. /*
  9.  * compare n bytes efficientlty
  10.  *
  11.  * odd/even handled correctly
  12.  *
  13.  *   ++jrb  bammi@dsrgsun.ces.cwru.edu
  14.  */
  15.  
  16. int bcmp(src, dst, n)
  17. const register void * src;
  18. const register void * dst;
  19. register size_t n;
  20. {
  21.     assert ((src != NULL) && (dst != NULL));
  22.  
  23.     if((src != dst) && (n > 0))
  24.     {
  25.     register size_t l, w;
  26.     
  27.     switch(ODD(src) + ODD(dst))
  28.     {
  29.       case 2: /* ODD ODD */
  30.         if(*(char *)dst++ != *(char *)src++)
  31.         return 1;
  32.         n--;
  33.         /* fall thru */
  34.         
  35.       case 0: /* EVEN EVEN */
  36.         l = (n >> 2); /* # of longs */
  37.         n -= (l << 2);
  38.         w = (n >> 1); /* # of words */
  39.         n -= (w << 1); /* n == # of residual bytes */
  40.         while(l--)
  41.         if( *((long *)dst)++ != *((long *)src)++ )
  42.             return 1;
  43.         while(w--)
  44.         if( *((short *)dst)++ != *((short *)src)++ )
  45.             return 1;
  46.         /* fall thru */
  47.       case 1: /* ODD/EVEN or EVEN/ODD */
  48.         while(n--)
  49.         if( *(char *)dst++ != *(char *)src++ )
  50.             return 1;
  51.     }
  52.     }
  53.      return 0;
  54. }
  55.