3cd76670ad33a439b24911f36d24c3ce998d4cca
[oweals/busybox.git] / libbb / strrstr.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 2008 Bernhard Fischer
6  *
7  * Licensed under GPLv2 or later, see file License in this tarball for details.
8  */
9
10 #include <string.h>
11 #include <stdio.h>
12
13 /*
14  * The strrstr() function finds the last occurrence of the substring needle
15  * in the string haystack. The terminating nul characters are not compared.
16  */
17 char* strrstr(const char *haystack, const char *needle)
18 {
19         char *r = NULL;
20
21         if (!needle[0])
22                         return r;
23         while (1) {
24                         char *p = strstr(haystack, needle);
25                         if (!p)
26                                         return r;
27                         r = p;
28                         haystack = p + 1;
29         }
30 }
31
32 #ifdef __DO_STRRSTR_TEST
33 /* Test */
34 int main(int argc, char **argv)
35 {
36         int ret = 0;
37         int n;
38         char *tmp;
39
40         ret |= !(n = ((tmp = strrstr("baaabaaab", "aaa")) != NULL && strcmp(tmp, "aaab") == 0));
41         printf("'baaabaaab'  vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
42
43         ret |= !(n = ((tmp = strrstr("baaabaaaab", "aaa")) != NULL && strcmp(tmp, "aaab") == 0));
44         printf("'baaabaaaab' vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
45
46         ret |= !(n = ((tmp = strrstr("baaabaab", "aaa")) != NULL && strcmp(tmp, "aaabaab") == 0));
47         printf("'baaabaab'   vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
48
49         ret |= !(n = (strrstr("aaa", "aaa") != NULL));
50         printf("'aaa'        vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
51
52         ret |= !(n = (strrstr("aaa", "a") != NULL));
53         printf("'aaa'        vs. 'a'         : %s\n", n ? "PASSED" : "FAILED");
54
55         ret |= !(n = (strrstr("aaa", "bbb") == NULL));
56         printf("'aaa'        vs. 'bbb'       : %s\n", n ? "PASSED" : "FAILED");
57
58         ret |= !(n = (strrstr("a", "aaa") == NULL));
59         printf("'a'          vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
60
61         ret |= !(n = ((tmp = strrstr("aaa", "")) != NULL && strcmp(tmp, "aaa") == 0));
62         printf("'aaa'        vs. ''          : %s\n", n ? "FAILED" : "PASSED");
63
64         ret |= !(n = (strrstr("", "aaa") == NULL));
65         printf("''           vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
66
67         ret |= !(n = ((tmp = strrstr("", "")) != NULL && strcmp(tmp, "") == 0));
68         printf("''           vs. ''          : %s\n", n ? "PASSED" : "FAILED");
69
70         /*ret |= !(n = (strrstr(NULL, NULL) == NULL));
71         printf("'NULL'       vs. 'NULL'      : %s\n", n ? "PASSED" : "FAILED");
72         ret |= !(n = (strrstr("", NULL) == NULL));
73         printf("''           vs. 'NULL'      : %s\n", n ? "PASSED" : "FAILED");
74         ret |= !(n = (strrstr(NULL, "") == NULL));
75         printf("'NULL'       vs. ''          : %s\n", n ? "PASSED" : "FAILED");
76         ret |= !(n = (strrstr("aaa", NULL) == NULL));
77         printf("'aaa'        vs. 'NULL'      : %s\n", n ? "PASSED" : "FAILED");
78         ret |= !(n = (strrstr(NULL, "aaa") == NULL));
79         printf("'NULL'       vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");*/
80
81         return ret;
82 }
83 #endif