home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / MEMMEM.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  3KB  |  106 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4. **  MEMMEM.C - A strstr() work-alike for non-text buffers
  5. **
  6. **  public domain by Bob Stout
  7. **
  8. **  Warning: The memchr() in Borland C/C++ versions *prior* to 4.x is broken!
  9. */
  10.  
  11. #include <string.h>
  12. #include "snip_str.h"
  13.  
  14. #if defined(__cplusplus) && __cplusplus
  15.  extern "C" {
  16. #endif
  17.  
  18. void *memmem(const void *buf, const void *pattern, size_t buflen, size_t len)
  19. {
  20. #if defined(__TURBOC__) && (__TURBOC__ >= 0x500)
  21.  
  22.       char *bf = (char *)buf, *pt = (char *)pattern, *p = bf;
  23.  
  24.       while (len <= (buflen - (p - bf)))
  25.       {
  26.             if (NULL != (p = memchr(p, (int)(*pt), buflen - (p - bf))))
  27.             {
  28.                   if (Success_ == memcmp(p, pattern, len))
  29.                         return p;
  30.                   else  ++p;
  31.             }
  32.             else  break;
  33.       }
  34.       return NULL;
  35.  
  36. #else /* Borland/Turbo C/C++ version prior to 4.x */
  37.  
  38.       size_t i, j;
  39.       char *bf = (char *)buf, *pt = (char *)pattern;
  40.  
  41.       if (len > buflen)
  42.             return (void *)NULL;
  43.  
  44.       for (i = 0; i <= (buflen - len); ++i)
  45.       {
  46.             for (j = 0; j < len; ++j)
  47.             {
  48.                   if (pt[j] != bf[i + j])
  49.                         break;
  50.             }
  51.             if (j == len)
  52.                   return (bf + i);
  53.       }
  54.       return NULL;
  55.  
  56. #endif
  57. }
  58.  
  59. #if defined(__cplusplus) && __cplusplus
  60.  }
  61. #endif
  62.  
  63. #ifdef TEST
  64.  
  65. #include <stdio.h>
  66.  
  67. main()
  68. {
  69.       char buf[13] = "\0""12344567890\x1b";
  70.       char a[3] = "456";
  71.       char b[3] = "\0""12";
  72.       char c[3] = "90\x1b";
  73.       char d[3] = "ABC";
  74.       char e[3] = "0\x1b""\0";
  75.       char f[1] = "\x1b";
  76.       char *ptr;
  77.  
  78.       if (NULL == (ptr = memmem(buf, a, 13, 3)))
  79.             puts("a not found in buf");
  80.       else  printf("a found in buf at posn %d\n", ptr - buf);
  81.  
  82.       if (NULL == (ptr = memmem(buf, b, 13, 3)))
  83.             puts("b not found in buf");
  84.       else  printf("b found in buf at posn %d\n", ptr - buf);
  85.  
  86.       if (NULL == (ptr = memmem(buf, c, 13, 3)))
  87.             puts("c not found in buf");
  88.       else  printf("c found in buf at posn %d\n", ptr - buf);
  89.  
  90.       if (NULL == (ptr = memmem(buf, d, 13, 3)))
  91.             puts("d not found in buf");
  92.       else  printf("d found in buf at posn %d\n", ptr - buf);
  93.  
  94.       if (NULL == (ptr = memmem(buf, e, 13, 3)))
  95.             puts("e not found in buf");
  96.       else  printf("e found in buf at posn %d\n", ptr - buf);
  97.  
  98.       if (NULL == (ptr = memmem(buf, f, 13, 1)))
  99.             puts("f not found in buf");
  100.       else  printf("f found in buf at posn %d\n", ptr - buf);
  101.       
  102.       return 0;
  103. }
  104.  
  105. #endif /* TEST */
  106.