tar: support -T - and -X -
[oweals/busybox.git] / libbb / strrstr.c
index b314264f56335eb8502afb3689261291dd9ff04b..d8823fc5117631b5cda95690158d32f4f272b4c9 100644 (file)
@@ -2,19 +2,70 @@
 /*
  * Utility routines.
  *
- * Copyright (C) 2008 Bernhard Fischer
+ * Copyright (C) 2008 Bernhard Reutner-Fischer
  *
- * Licensed under GPLv2 or later, see file License in this tarball for details.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
 
+#ifdef __DO_STRRSTR_TEST
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#else
 #include "libbb.h"
+#endif
 
-/* reverse strstr() */
-char* strrstr(const char *haystack, const char *needle)
+/*
+ * The strrstr() function finds the last occurrence of the substring needle
+ * in the string haystack. The terminating nul characters are not compared.
+ */
+char* FAST_FUNC strrstr(const char *haystack, const char *needle)
 {
-       char *tmp = strrchr(haystack, *needle);
-       if (tmp == NULL || strcmp(tmp, needle) != 0)
-               return NULL;
-       return tmp;
+       char *r = NULL;
+
+       if (!needle[0])
+               return (char*)haystack + strlen(haystack);
+       while (1) {
+               char *p = strstr(haystack, needle);
+               if (!p)
+                       return r;
+               r = p;
+               haystack = p + 1;
+       }
 }
 
+#ifdef __DO_STRRSTR_TEST
+int main(int argc, char **argv)
+{
+       static const struct {
+               const char *h, *n;
+               int pos;
+       } test_array[] = {
+               /* 0123456789 */
+               { "baaabaaab",  "aaa", 5  },
+               { "baaabaaaab", "aaa", 6  },
+               { "baaabaab",   "aaa", 1  },
+               { "aaa",        "aaa", 0  },
+               { "aaa",        "a",   2  },
+               { "aaa",        "bbb", -1 },
+               { "a",          "aaa", -1 },
+               { "aaa",        "",    3  },
+               { "",           "aaa", -1 },
+               { "",           "",    0  },
+       };
+
+       int i;
+
+       i = 0;
+       while (i < sizeof(test_array) / sizeof(test_array[0])) {
+               const char *r = strrstr(test_array[i].h, test_array[i].n);
+               printf("'%s' vs. '%s': '%s' - ", test_array[i].h, test_array[i].n, r);
+               if (r == NULL)
+                       r = test_array[i].h - 1;
+               printf("%s\n", r == test_array[i].h + test_array[i].pos ? "PASSED" : "FAILED");
+               i++;
+       }
+
+       return 0;
+}
+#endif