#ifndef  STRING_STORMAMIGA_H
#define  STRING_STORMAMIGA_H

/*
**    $VER: string_stormamiga.h 1.2 (18.09.98)
**             Includes Release 45.00
**
**     Copyright © 1996/99 by CyberdyneSystems
**
**            written by Matthias Henze
**               All Rights Reserved
*/

#ifndef  STORMAMIGA_H
  #include <stormamiga.h>
#endif
#ifndef  _INCLUDE_STRING_H
  #include <string.h>
#endif

#ifdef __cplusplus
  extern "C" {
#endif

/*----- ANSI C-functions -----*/

int     strcoll     (cchar *, cchar *);
size_t  strxfrm     (char *, cchar *, size_t);

/*----- UNIX-functions -----*/

int     bcmp        (cvoid *, cvoid *, size_t);
void    bcopy       (cvoid *, void *, size_t);
void    bzero       (void *, size_t);
int     ffs         (int);
int     strnicmp    (cchar *, cchar *, size_t);
int     strcasecmp  (cchar *, cchar *);
int     strncasecmp (cchar *, cchar *, size_t);
char    *index      (cchar *, int);
char    *rindex     (cchar *, int);
char    *strdup     (cchar *);
char    *strsep     (char **, cchar *);
char    *strlower   (char *);
char    *strupper   (char *);
char    *stpchr     (cchar *, int);
char    *stpcpy     (char *, cchar *);
void    *memccpy    (void *, cvoid *, int, size_t);
void    swab        (cvoid *, void *, size_t);

/*----- DICE-functions -----*/

void    strins      (char *, cchar *);
int     strbpl      (char **, int, cchar *);

/*----- stormamiga-functions -----*/

#ifdef STORMAMIGA_DEUTSCH
  #define stricmp     stricmp_d
  #define strnicmp    strnicmp_d
  #define strcasecmp  strcasecmp_d
  #define strncasecmp strncasecmp_d
  #define strlwr      strlwr_d
  #define strupr      strupr_d
  #define strlower    strlower_d
  #define strupper    strupper_d
#endif

int   stricmp_d       (cchar *, cchar *);
int   strnicmp_d      (cchar *, cchar *, size_t);
int   strcasecmp_d    (cchar *, cchar *);
int   strncasecmp_d   (cchar *, cchar *, size_t);
char  *strlwr_d       (char *);
char  *strlower_d     (char *);
char  *strupr_d       (char *);
char  *strupper_d     (char *);
char  *strncpyn       (char *, cchar *, size_t);

#ifdef __cplusplus
  }
#endif

#ifdef STORMAMIGA_INLINE

/*----- ANSI C-functions -----*/

__inline void *memcpy   (void *d, cvoid *s, size_t n)
{
  void *r = d;
  while (n)
  {
    *(((uchar*) d)++) = *(((uchar*) s)++);
    n--;
  }
  return r;
}

__inline void *memmove  (void *d, cvoid *s, size_t n)
{
 void *r = d;
 if (n)
 {
  if ((uchar *) d < (uchar *) s)
  {
    do
    {
      *(((uchar *) d)++) = *(((uchar *) s)++);
    }
    while (--n);
  };
  else
  {
    (uchar *) d += n;
    (uchar *) s += n;
    do
    {
      *(--((uchar *) d)) = *(--((uchar *) s));
    }
    while (--n);
  };
 }
 return r;
}

__inline void *memset   (void *d, int c, size_t n)
{
  void *r = d;
  while (n)
  {
    *(((uchar *) d)++) = c;
    n--;
  }
  return r;
}

__inline void *memchr    (cvoid *s, int c, size_t n)
{
  while (n)
  {
   if (*(((uchar *) s)++) == (uchar) c)
     return (uchar *) s - 1;
   n--;
  };
  return NULL;
}

__inline int memcmp      (cvoid *m1, cvoid *m2, size_t n)
{
 int r = 0;
 char a, b;
 if (n)
 {
   while ((a = *(((uchar *) m1)++)) == (b = *(((uchar *) m2)++)) && --n)
    ;
   r = a - b;
 }
 return r;
}

/*----- UNIX-functions -----*/

#define bcmp  memcmp

__inline void bzero      (void *d,  size_t n)
{
  while (n)
  {
    *(((uchar *) d)++) = 0;
    n--;
  }
}
#endif  /* STORMAMIGA_INLINE */

#endif  /* STRING_STORMAMIGA_H */
