busybox/libbb/strrstr.c
<<
>>
Prefs
   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 source tree.
   8 */
   9
  10#include "libbb.h"
  11
  12/*
  13 * The strrstr() function finds the last occurrence of the substring needle
  14 * in the string haystack. The terminating nul characters are not compared.
  15 */
  16char* FAST_FUNC strrstr(const char *haystack, const char *needle)
  17{
  18        char *r = NULL;
  19
  20        if (!needle[0])
  21                return (char*)haystack + strlen(haystack);
  22        while (1) {
  23                char *p = strstr(haystack, needle);
  24                if (!p)
  25                        return r;
  26                r = p;
  27                haystack = p + 1;
  28        }
  29}
  30
  31#if ENABLE_UNIT_TEST
  32
  33BBUNIT_DEFINE_TEST(strrstr)
  34{
  35        static const struct {
  36                const char *h, *n;
  37                int pos;
  38        } test_array[] = {
  39                /* 0123456789 */
  40                { "baaabaaab",  "aaa", 5  },
  41                { "baaabaaaab", "aaa", 6  },
  42                { "baaabaab",   "aaa", 1  },
  43                { "aaa",        "aaa", 0  },
  44                { "aaa",        "a",   2  },
  45                { "aaa",        "bbb", -1 },
  46                { "a",          "aaa", -1 },
  47                { "aaa",        "",    3  },
  48                { "",           "aaa", -1 },
  49                { "",           "",    0  },
  50        };
  51
  52        int i;
  53
  54        i = 0;
  55        while (i < sizeof(test_array) / sizeof(test_array[0])) {
  56                const char *r = strrstr(test_array[i].h, test_array[i].n);
  57                if (r == NULL)
  58                        r = test_array[i].h - 1;
  59                BBUNIT_ASSERT_EQ(r, test_array[i].h + test_array[i].pos);
  60                i++;
  61        }
  62
  63        BBUNIT_ENDTEST;
  64}
  65
  66#endif /* ENABLE_UNIT_TEST */
  67