/*
 * string.c - string helper function implementation.
 *
 * Authors      Ghassan Almaless (2007,2009,2010,2011,2012)
 *              Alain Greiner (2017)
 *
 * Copyright (c) UPMC Sorbonne Universites
 *
 * This file is part of ALMOS-MKH.
 *
 * ALMOS-MKH is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2.0 of the License.
 *
 * ALMOS-MKH is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <hal_types.h>
#include <ctype.h>
#include <string.h>

///////////////////////////////////
uint32_t strlen( const char * str )
{
	register const char *ptr = str;

	if (str == NULL)
		return 0;

	while (*ptr) ptr++;

	return (ptr - str);
}

///////////////////////////////////
uint32_t strnlen( const char * str,
                  uint32_t     maxlen )
{
	register const char *ptr = str;

	if (str == NULL)
		return 0;

	while (*ptr && (maxlen-- > 0)) ptr++;

	return (ptr - str);
}

////////////////////////////
int strcmp( const char * s1,
            const char * s2 )
{
	if((s1 == NULL) || (s2 == NULL))
		return s1 - s2;
  
	while (*s1 && *s1 == *s2)
	{
		s1 ++;
		s2 ++;
	}
  
	return (*s1 - *s2);
}

/////////////////////////////
int strncmp( const char * s1,
             const char * s2,
             uint32_t     n )
{ 
	if((s1 == NULL) || (s2 == NULL) || (n == 0))
		return s1 - s2;
  
	while (*s1 && (*s1 == *s2) && (n > 1))
	{
		s1 ++;
		s2 ++;
		n--;
	}
  
	return (*s1 - *s2);
}

//////////////////////////////////
int strcasecmp( const char * str1,
                const char * str2 )
{
	char c1;
	char c2;

	if((str1 == NULL) || (str2 == NULL))
		return str1 - str2;
  
	do{
		c1 = toupper(*++str1);
		c2 = toupper(*++str2);
	}while(c1 && c1 == c2);
  
	return (c1 - c2);
}

///////////////////////////
char * strcpy (char * dest,
               char * src )
{
	char *src_ptr = src;
	char *dst_ptr = dest;

	if(!dest || !src)
		return dest;

	while(*src_ptr)
		*(dst_ptr++) = *(src_ptr++);
  
	*dst_ptr = 0;
	return dest;
}

///////////////////////////////
char * strncpy( char    * dest,
                char    * src,
                uint32_t  n )
{
	uint32_t i;

	for (i = 0; (i < n) && (src[i] != '\0') ; i++)
		dest[i] = src[i];

	for (; i < n; i++)
		dest[i] = '\0';
  
	return dest;
}

//////////////////////////////
char * strchr( const char * s,
               int          c )
{
	if(s == NULL)
		return (char*)s;

	while(*s && *s != (char) c)
		s++;

	if(*s == (char) c)
		return (char*)s;
  
	return NULL;
}

///////////////////////////////
char * strrchr( const char * t,
                int          c )
{
  register char         ch;
  register const char * l =0;

  ch = c;
  for (;;) {
    if (*t == ch) l=t; if (!*t) return (char*)l; ++t;
  }
  return (char*)l;
}

