/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "plstr.h"
#include <string.h>

PR_IMPLEMENT(char*)
PL_strstr(const char* big, const char* little) {
  if (((const char*)0 == big) || ((const char*)0 == little)) {
    return (char*)0;
  }
  if (((char)0 == *big) || ((char)0 == *little)) {
    return (char*)0;
  }

  return strstr(big, little);
}

PR_IMPLEMENT(char*)
PL_strrstr(const char* big, const char* little) {
  const char* p;
  size_t ll;
  size_t bl;

  if (((const char*)0 == big) || ((const char*)0 == little)) {
    return (char*)0;
  }
  if (((char)0 == *big) || ((char)0 == *little)) {
    return (char*)0;
  }

  ll = strlen(little);
  bl = strlen(big);
  if (bl < ll) {
    return (char*)0;
  }
  p = &big[bl - ll];

  for (; p >= big; p--)
    if (*little == *p)
      if (0 == strncmp(p, little, ll)) {
        return (char*)p;
      }

  return (char*)0;
}

PR_IMPLEMENT(char*)
PL_strnstr(const char* big, const char* little, PRUint32 max) {
  size_t ll;

  if (((const char*)0 == big) || ((const char*)0 == little)) {
    return (char*)0;
  }
  if (((char)0 == *big) || ((char)0 == *little)) {
    return (char*)0;
  }

  ll = strlen(little);
  if (ll > (size_t)max) {
    return (char*)0;
  }
  max -= (PRUint32)ll;
  max++;

  for (; max && *big; big++, max--)
    if (*little == *big)
      if (0 == strncmp(big, little, ll)) {
        return (char*)big;
      }

  return (char*)0;
}

PR_IMPLEMENT(char*)
PL_strnrstr(const char* big, const char* little, PRUint32 max) {
  const char* p;
  size_t ll;

  if (((const char*)0 == big) || ((const char*)0 == little)) {
    return (char*)0;
  }
  if (((char)0 == *big) || ((char)0 == *little)) {
    return (char*)0;
  }

  ll = strlen(little);

  for (p = big; max && *p; p++, max--);

  p -= ll;
  if (p < big) {
    return (char*)0;
  }

  for (; p >= big; p--)
    if (*little == *p)
      if (0 == strncmp(p, little, ll)) {
        return (char*)p;
      }

  return (char*)0;
}
