#include "stringops.hpp"

#include <cctype>
#include <algorithm>
#include <iterator>

#include <string.h>
#include <libs/platform/strings.h>



namespace Misc
{

bool begins(const char* str1, const char* str2)
{
  while(*str2)
    {
      if(*str1 == 0 || *str1 != *str2) return false;

      str1++;
      str2++;
    }
  return true;
}

bool ends(const char* str1, const char* str2)
{
  int len1 = strlen(str1);
  int len2 = strlen(str2);

  if(len1 < len2) return false;

  return strcmp(str2, str1+len1-len2) == 0;
}

// True if the given chars match, case insensitive
static bool icmp(char a, char b)
{
  if(a >= 'A' && a <= 'Z')
    a += 'a' - 'A';
  if(b >= 'A' && b <= 'Z')
    b += 'a' - 'A';

  return a == b;
}

bool ibegins(const char* str1, const char* str2)
{
  while(*str2)
    {
      if(*str1 == 0 || !icmp(*str1,*str2)) return false;

      str1++;
      str2++;
    }
  return true;
}

bool iends(const char* str1, const char* str2)
{
  int len1 = strlen(str1);
  int len2 = strlen(str2);

  if(len1 < len2) return false;

  return strcasecmp(str2, str1+len1-len2) == 0;
}

std::string toLower (const std::string& name)
{
        std::string lowerCase;

        std::transform (name.begin(), name.end(), std::back_inserter (lowerCase),
            (int(*)(int)) std::tolower);

        return lowerCase;
}

bool stringCompareNoCase (std::string first, std::string second)
{
        unsigned int i=0;
        while ( (i<first.length()) && (i<second.length()) )
        {
            if (tolower(first[i])<tolower(second[i])) return true;
            else if (tolower(first[i])>tolower(second[i])) return false;
            ++i;
        }
        if (first.length()<second.length())
            return true;
        else
            return false;
}


}