#ifndef  STORMAMIGA_H
#define  STORMAMIGA_H

/*
**     $VER: stormamiga.h 43.00 (07.11.97)
**
**      Copyright © 1996/97 by COMPIUTECK
**          written by Matthias Henze
**             All Rights Reserved
*/

#ifndef  _INCLUDE_STDIO_H
  #include <stdio.h>
#endif
#ifndef _INCLUDE_TIME_H
  #include <time.h>
#endif
#ifndef INTUITION_INTUITION_H
  #include <intuition/intuition.h>
#endif
#ifndef GRAPHICS_RASTPORT_H
  #include <graphics/rastport.h>
#endif

#ifdef STORMAMIGA_NOWB
  void wbmain_(void) {};
#endif

#ifdef __cplusplus
  extern "C" {
#endif


#define cvoid         const void
#define cchar         const char
#define cschar        const signed char
#define cuchar        const unsigned char
#define schar         signed char
#define uchar         unsigned char
#define ushort        unsigned short
#define lint          long int
#define llint         long long int
#define uint          unsigned int
#define ulint         unsigned long int
#define ullint        unsigned long long int
#define llong         long long
#define ulong         unsigned long
#define ullong        unsigned long long

#ifdef STORMAMIGA_NO_IO_WB
  void ioinit_(void) {};
#endif

#ifdef STORMAMIGA_STACK
  long stack = STORMAMIGA_STACK;
  void INIT_9_Stack(void);
  static void _initstack(void)
  { INIT_9_Stack(); }
#endif

#ifdef STORMAMIGA_OS3
  void *malloc_3(size_t);
  void free_3(void *);

  void free(void *p)
  { free_3((void *)p); }

  void *malloc(size_t n)
  { return malloc_3(n); }

  #define malloc  malloc_3
  #define free  free_3
#endif


/*----- Nonstandard-AmigaLib-functions -----*/

long    SPRINTF       (char *, cchar *, ...);
long    VSPRINTF      (char *, cchar *, va_list);


/*----- Nonstandard-stdio-functions -----*/

#ifdef STORMAMIGA_64BIT
  #define printf      printf64
  #define printf_     printf64_
  #define fprintf     fprintf64
  #define fprintf_    fprintf64_
  #define sprintf     sprintf64
  #define sprintf_    sprintf64_
  #define snprintf    snprintf64
  #define snprintf_   snprintf64_
  #define vprintf     vprintf64
  #define vprintf_    vprintf64_
  #define vfprintf    vfprintf64
  #define vfprintf_   vfprintf64_
  #define vsprintf    vsprintf64
  #define vsprintf_   vsprintf64_
  #define vsnprintf   vsnprintf64
  #define vsnprintf_  vsnprintf64_
  #define scanf       scanf64
  #define scanf_      scanf64_
  #define fscanf      fscanf64
  #define fscanf_     fscanf64_
  #define sscanf      sscanf64
  #define sscanf_     sscanf64_
  #define vscanf      vscanf64
  #define vscanf_     vscanf64_
  #define vfscanf     vfscanf64
  #define vfscanf_    vfscanf64_
  #define vsscanf     vsscanf64
  #define vsscanf_    vsscanf64_
#endif

int     printf64      (cchar *, ...);
int     printf_       (cchar *, ...);
int     printf64_     (cchar *, ...);
int     fprintf64     (FILE *, cchar *, ...);
int     fprintf_      (FILE *, cchar *, ...);
int     fprintf64_    (FILE *, cchar *, ...);
int     sprintf64     (char *, cchar *, ...);
int     sprintf_      (char *, cchar *, ...);
int     sprintf64_    (char *, cchar *, ...);
int     snprintf      (char *, size_t, cchar *, ...);
int     snprintf64    (char *, size_t, cchar *, ...);
int     snprintf_     (char *, size_t, cchar *, ...);
int     snprintf64_   (char *, size_t, cchar *, ...);
int     vprintf64     (cchar *, va_list);
int     vprintf_      (cchar *, va_list);
int     vprintf64_    (cchar *, va_list);
int     vfprintf64    (FILE *, cchar *, va_list);
int     vfprintf_     (FILE *, cchar *, va_list);
int     vfprintf64_   (FILE *, cchar *, va_list);
int     vsprintf64    (char *, cchar *, va_list);
int     vsprintf_     (char *, cchar *, va_list);
int     vsprintf64_   (char *, cchar *, va_list);
int     vsnprintf     (char *, size_t, cchar *, va_list);
int     vsnprintf64   (char *, size_t, cchar *, va_list);
int     vsnprintf_    (char *, size_t, cchar *, va_list);
int     vsnprintf64_  (char *, size_t, cchar *, va_list);
int     scanf64       (cchar *, ...);
int     scanf_        (cchar *, ...);
int     scanf64_      (cchar *, ...);
int     fscanf64      (FILE *, cchar *, ...);
int     fscanf_       (FILE *, cchar *, ...);
int     fscanf64_     (FILE *, cchar *, ...);
int     sscanf64      (cchar *, cchar *, ...);
int     sscanf_       (cchar *, cchar *, ...);
int     sscanf64_     (cchar *, cchar *, ...);
int     vscanf        (cchar *, va_list);
int     vscanf64      (cchar *, va_list);
int     vscanf_       (cchar *, va_list);
int     vscanf64_     (cchar *, va_list);
int     vfscanf       (FILE *, cchar *, va_list);
int     vfscanf64     (FILE *, cchar *, va_list);
int     vfscanf_      (FILE *, cchar *, va_list);
int     vfscanf64_    (FILE *, cchar *, va_list);
int     vsscanf       (cchar *, cchar *, va_list);
int     vsscanf64     (cchar *, cchar *, va_list);
int     vsscanf_      (cchar *, cchar *, va_list);
int     vsscanf64_    (cchar *, cchar *, va_list);
void    setbuffer     (FILE *, char *, int);
int     setlinebuf    (FILE *);


/*----- string-functions -----*/

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


/*----- Nonstandard-string-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

#ifdef bzero
  #undef bzero
#endif

int     bcmp          (cvoid *, cvoid *, size_t);
void    bcopy         (cvoid *, void *, size_t);
void    bzero         (void *, size_t);
int     ffs           (int);
char    *index        (cchar *, int);
char    *rindex       (cchar *, int);
void    *memccpy      (void *, cvoid *, int, size_t);
char    *strncpyn     (char *, cchar *, size_t);
char    *strdup       (cchar *);
char    *strsep       (char **, cchar *);
void    swab          (cvoid *, void *, size_t);
int     stricmp_d     (cchar *, cchar *);
int     strnicmp      (cchar *, cchar *, size_t);
int     strnicmp_d    (cchar *, cchar *, size_t);
int     strcasecmp    (cchar *, cchar *);
int     strcasecmp_d  (cchar *, cchar *);
int     strncasecmp   (cchar *, cchar *, size_t);
int     strncasecmp_d (cchar *, cchar *, size_t);
char    *strlwr_d     (char *);
char    *strlower     (char *);
char    *strlower_d   (char *);
char    *strupr_d     (char *);
char    *strupper     (char *);
char    *strupper_d   (char *);


/*----- Nonstandard-assert-functions -----*/

#ifdef  NDEBUG
  #define assert_(C)
#else
  void    do_assert_  (char *, char *, char *, uint);
  #define assert_(C)  { if(!(C)) do_assert_(#C, __FILE__, __FUNC__, __LINE__); }
#endif


/*----- Nonstandard-ctype-functions -----*/

#ifdef STORMAMIGA_DEUTSCH
  #define isalnum     isalnum_d
  #define isalpha     isalpha_d
  #define islower     islower_d
  #define isupper     isupper_d
  #define isprint     isprint_d
  #define ispunct     ispunct_d
  #define tolower     tolower_d
  #define toupper     toupper_d
#endif

int     isalnum_d     (int);
int     isalpha_d     (int);
int     islower_d     (int);
int     isprint_d     (int);
int     ispunct_d     (int);
int     isupper_d     (int);
int     tolower_d     (int);
int     toupper_d     (int);


/*----- Nonstandard-time-functions -----*/

#ifdef STORMAMIGA_DEUTSCH
  #define strftime    strftime_d
  #define asctime     asctime_d
  #define ctime       ctime_d
#endif

int     strftime_d    (char *, uint, cchar *, const struct tm *);
char    *asctime_d    (const struct tm *);
char    *ctime_d      (const time_t *);


/*----- Nonstandard-math-functions -----*/

int     isinf         (double);
int     isnan         (double);


/*----- Special-functions -----*/

  long    muls        (long, long);
  ulong   mulu        (ulong, ulong);
  long    divsl       (long, long);
  ulong   divul       (ulong, ulong);
  long    muls64      (long, long);
  ulong   mulu64      (ulong, ulong);
  long    divs64      (long, long);
  ulong   divu64      (ulong, ulong);
  int     button      (int, int);
  void    waitbutton  (int, int);
  int     max_Width   (struct Window *);
  int     max_Height  (struct Window *);

int     button_al     ();
int     button_ar     ();
int     button_bl     ();
int     button_br     ();
void    waitbutton_al ();
void    waitbutton_ar ();
void    waitbutton_bl ();
void    waitbutton_br ();


/*----- Inline-functions -----*/

#ifdef STORMAMIGA_INLINE
  #ifndef  STORMAMIGAINLINE_H
    #include <stormamigainline.h>
  #endif
#endif

#ifdef __cplusplus
  }
#endif

#endif   /* STORMAMIGA_H */
