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