chiark / gitweb /
volume_id: provide libvolume_id.a file
[elogind.git] / klibc / klibc / memmem.c
index 0f59938ffb1f6bba5d2a774f65577f20976ace19..8b5faa0014e8ad1323dd79bba2b3c45226ffe59f 100644 (file)
 
 void *memmem(const void *haystack, size_t n, const void *needle, size_t m)
 {
-  const unsigned char *y = (const unsigned char *)haystack;
-  const unsigned char *x = (const unsigned char *)needle;
+       const unsigned char *y = (const unsigned char *)haystack;
+       const unsigned char *x = (const unsigned char *)needle;
 
-  size_t j, k, l;
+       size_t j, k, l;
 
-  if ( m > n )
-    return NULL;
+       if (m > n || !m || !n)
+               return NULL;
 
-  if ( x[0] == x[1] ) {
-    k = 2;
-    l = 1;
-  } else {
-    k = 1;
-    l = 2;
-  }
+       if (1 != m) {
+               if (x[0] == x[1]) {
+                       k = 2;
+                       l = 1;
+               } else {
+                       k = 1;
+                       l = 2;
+               }
 
-  j = 0;
-  while ( j <= n-m ) {
-    if (x[1] != y[j+1]) {
-      j += k;
-    } else {
-      if ( !memcmp(x+2, y+j+2, m-2) && x[0] == y[j] )
-       return (void *)&y[j];
-      j += l;
-    }
-  }
+               j = 0;
+               while (j <= n - m) {
+                       if (x[1] != y[j + 1]) {
+                               j += k;
+                       } else {
+                               if (!memcmp(x + 2, y + j + 2, m - 2)
+                                   && x[0] == y[j])
+                                       return (void *)&y[j];
+                               j += l;
+                       }
+               }
+       } else
+               do {
+                       if (*y == *x)
+                               return (void *)y;
+                       y++;
+               } while (--n);
 
-  return NULL;
+       return NULL;
 }