/* vi: set sw=4 ts=4: */
/*
 * Utility routines.
 *
 * Copyright (C) 2008 Bernhard Fischer
 * Copyright (C) 2008 Tito Ragusa
 *
 * Licensed under GPLv2 or later, see file License in this tarball for details.
 */

#include "libbb.h"

/*
 * The strrstr() function finds the last occurrence of the nul terminated
 * substring needle in the nul terminated string haystack. The terminating
 * nul characters  or NULL pointers are  not compared.
 */

char* strrstr(const char *haystack, const char *needle)
{
	char *p = (char *)haystack;
	char *s1;
	char *s2;

	if (!haystack || !needle)
		return NULL;

	while (*p++)
		/* VOID */;

	p--;
	
	while (p-- != haystack) {
		s1 = p;
		s2 = (char *)needle;
		while (*s1 && *s1++ == *s2++) {
			if (!*s2)
				return p;
		}
	}
	return NULL;
}

#ifdef STRRSTR_TEST
int main(int argc, char **argv)
{
	int ret = 0;
	int n;
	char *tmp;

	
	ret |= !(n = ((tmp = strrstr("baaabaaab", "aaa")) != NULL && strcmp(tmp, "aaab") == 0));
	printf("'baaabaaab'  vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = ((tmp = strrstr("baaabaaaab", "aaa")) != NULL && strcmp(tmp, "aaab") == 0));
	printf("'baaabaaaab' vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = ((tmp = strrstr("baaabaab", "aaa")) != NULL && strcmp(tmp, "aaabaab") == 0));
	printf("'baaabaab'   vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("aaa", "aaa") != NULL));
	printf("'aaa'        vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("aaa", "a") != NULL));
	printf("'aaa'        vs. 'a'         : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("aaa", "bbb") == NULL));
	printf("'aaa'        vs. 'bbb'       : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("a", "aaa") == NULL));
	printf("'a'          vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("aaa", "") == NULL));
	printf("'aaa'        vs. ''          : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("", "aaa") == NULL));
	printf("''           vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("", "") == NULL));
	printf("''           vs. ''          : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr(NULL, NULL) == NULL));
	printf("'NULL'       vs. 'NULL'      : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("", NULL) == NULL));
	printf("''           vs. 'NULL'      : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr(NULL, "") == NULL));
	printf("'NULL'       vs. ''          : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr("aaa", NULL) == NULL));
	printf("'aaa'        vs. 'NULL'      : %s\n", n ? "PASSED" : "FAILED");
	ret |= !(n = (strrstr(NULL, "aaa") == NULL));
	printf("'NULL'       vs. 'aaa'       : %s\n", n ? "PASSED" : "FAILED");

	return ret;
}
#endif

