/* This configuration file is for all non-Unix OS */
/*
Copyright (C) 2004-2021,2022 John E. Davis

This file is part of the S-Lang Library.

The S-Lang Library 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; either version 2 of the
License, or (at your option) any later version.

The S-Lang Library 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 this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
*/

#ifndef SL_CONFIG_H
#define SL_CONFIG_H

#ifdef VMS
# ifdef __DECC
#  define HAVE_STDLIB_H
# endif
/* Borland's compiler complains about long constants, so I will work
 * around it as follows:
 */
# define VMS_VERSION_602 60200000
# define VMS_VERSION_700 70000000
# if __VMS_VER >= VMS_VERSION_602
#  define HAVE_UNISTD_H
# endif
#endif

/* [JMS:BC5] The Borland v5.x compiler defines some things that other versions,
 * and MSC don't, so we can check for those using ifdef __BORLAND_V5__
 */

#if defined(__BORLANDC__) && ((__BORLANDC__>>8) == 0x5)
# define __BORLAND_V5__
#endif

#if defined(__WATCOMC__) && defined(__DOS__)
# define  DOS386
#endif

/* Set of the various defines for pc systems.  This includes OS/2 */

/* DJGPP has a split personality.  It tries implement a unix like environment
 * under MSDOS.  Unfortunately, the personalities clash.
 */
#ifdef __GO32__
# ifndef __DJGPP__
#  define __DJGPP__ 1
# endif
#endif

#if defined(__DJGPP__) || defined(__CYGWIN32__) || defined(__MINGW32__)
# ifdef REAL_UNIX_SYSTEM
#  undef REAL_UNIX_SYSTEM
# endif
#endif

#if defined(__MSDOS__) || defined(__DOS__)
# ifndef __MSDOS__
#  define __MSDOS__
# endif
# ifndef IBMPC_SYSTEM
#  define IBMPC_SYSTEM
# endif
#endif

#if defined(OS2) || defined(__OS2__)
# ifndef IBMPC_SYSTEM
#   define IBMPC_SYSTEM
# endif
# ifndef __os2__
#  define __os2__
# endif
#endif

#if defined(__CYGWIN32__) || defined(__MINGW32__)
# ifndef __WIN32__
#  define __WIN32__
# endif
#endif

#if defined(WIN32) || defined(__WIN32__)
# ifndef IBMPC_SYSTEM
#  define IBMPC_SYSTEM
# endif
# ifndef __WIN32__
#  define __WIN32__
# endif
#endif

#if defined(__MSDOS__) && !defined(__GO32__) && !defined(DOS386) && !defined(__WIN32__)
# ifndef __MSDOS_16BIT__
#  define __MSDOS_16BIT__	1
# endif
#endif

#if defined(MSWINDOWS)
# ifndef IBMPC_SYSTEM
#  define IBMPC_SYSTEM
# endif
# ifndef __WIN16__
#  define __WIN16__
# endif
#endif

#if defined(__WIN16__) || defined(__MSDOS_16BIT__)
# define __16_BIT_SYSTEM__	1
#endif

#if defined(__WATCOMC__) && !defined(__QNX__)
# undef unix
# undef __unix__
#endif /* __WATCOMC__ */

#ifdef IBMPC_SYSTEM
# define HAVE_STDLIB_H
# define HAVE_PUTENV
# if defined(__GO32__) || defined(__MINGW32__) || defined(__CYGWIN32__)
#  define HAVE_UNISTD_H
# endif
#endif

#ifdef VMS
# if __VMS_VER >= VMS_VERSION_700
#  define HAVE_MEMORY_H
# endif
#else
# if !defined(__WATCOMC__)
#  define HAVE_MEMORY_H
# endif
#endif

#define HAVE_MEMCPY
#define HAVE_MEMSET

#if !defined(VMS) || (__VMS_VER >= VMS_VERSION_700)
# define HAVE_MEMCMP
# define HAVE_MEMCHR
# define HAVE_FCNTL_H
#endif

#if defined(__WIN32__)
# define HAVE_ENVIRON 1
#endif

#define HAVE_GETCWD 1

#ifndef VMS
# define HAVE_VFSCANF	1
# define HAVE_STRTOD	1
#endif

/* Does VMS have this??? */
#if !defined(VMS) && !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__))
# define HAVE_DIRENT_H	1
#endif

#if defined(VMS) || (defined(__WATCOMC__) && !defined(__QNX__))
# define HAVE_DIRECT_H 1
#endif

#if defined(__unix__) || (defined(VMS) && (__VMS_VER >= VMS_VERSION_700))
# define HAVE_KILL 1
# define HAVE_CHOWN 1
# define HAVE_FLOCK 1
#endif

#undef HAVE_LSTAT
#undef HAVE_LCHOWN

#define HAVE_ATEXIT	1

/* Do these systems have these functions?  For now, assume the worst */
#undef HAVE_GETPPID
#undef HAVE_GETGID
#undef HAVE_GETEGID
#undef HAVE_GETEUID
#undef HAVE_SETGID
#undef HAVE_SETPGID
#undef HAVE_SETUID
#undef HAVE_ISSETUGID

/* Needed for tic/toc */
#undef HAVE_TIMES
#undef HAVE_SYS_TIMES_H

#undef HAVE_ALARM
#undef HAVE_PAUSE

#undef HAVE_GETITIMER
#undef HAVE_SETITIMER

#undef HAVE_SYS_TIME_H
#undef HAVE_GETTIMEOFDAY

#undef HAVE_GMTIME
#undef HAVE_GMTIME_R
#undef HAVE_LOCALTIME_R
#undef HAVE_CTIME_R

#ifdef __unix__
# define HAVE_GMTIME	1
#endif
#define HAVE_MKTIME	1

#undef HAVE_SYMLINK
#undef HAVE_LINK
#undef HAVE_READLINK
#undef HAVE_UNAME

#if defined(__MINGW32__)
# define HAVE_UTIME
# define HAVE_UTIME_H
#endif
#undef HAVE_UTIMES

#undef HAVE_POPEN
#if defined(__MINGW32__)
# define HAVE_POPEN 1
#endif

/* #define HAVE_ROUND	1 */
#if !defined(__os2__) && !defined(__WATCOMC__)
# ifndef VMS			       /* FIXME */
#  define HAVE_FINITE	1
#  define HAVE_ISNAN	1
#  define HAVE_ISINF	1
# endif
#endif

#define HAVE_HYPOT	1
#define HAVE_ATAN2	1
#define HAVE_FREXP	1
#undef HAVE_FREXPF
#define HAVE_LDEXP	1
#undef HAVE_LDEXPF
#undef HAVE_SINCOS
#undef HAVE_SINCOSF

#if defined(__WIN32__)
# define isnan _isnan
# define finite _finite
#endif

/* FPU control unit headers and functions */
#undef HAVE_FLOATINGPOINT_H
#undef HAVE_NAN_H
#undef HAVE_IEEEFP_H
#undef HAVE_FENV_H

#undef HAVE_FECLEAREXCEPT
#undef HAVE_FPSETSTICKY

/* Define if you have the vsnprintf, snprintf functions and they return
 * EOF upon failure.
 */
#undef HAVE_VSNPRINTF
#undef HAVE_SNPRINTF

#ifdef _MSC_VER
# define HAVE_VSNPRINTF 1
# define HAVE_SNPRINTF 1
# if _MSC_VER < 1400
/* Grrr, older versions of Visual Studio have vnsprintf, but with an '_'. */
#  define vsnprintf _vsnprintf
# endif
#endif

/* Some compilers may not have definitions for these. */
/* #define mode_t int */
/* #define pid_t int */
/* #define uid_t int */
/* #define gid_t int */
/* #define off_t int */
/* #define size_t unsigned int */

#if defined(__MINGW64__)
# define _FILE_OFFSET_BITS 64 /* Makes sizeof(off_t) == 8 */
# define SIZEOF_SIZE_T 8
# define SIZEOF_OFF_T 8
#else
# if defined(__LP64__)   /* gcc only??? 64-bit */
#  define SIZEOF_OFF_T	8
#  define SIZEOF_SIZE_T	8
# else
#  if defined(__WIN64__)
#   define SIZEOF_OFF_T	4	       /* yes, 4 */
#   define SIZEOF_SIZE_T 8
#  else
#   define SIZEOF_OFF_T	4
#   define SIZEOF_SIZE_T 4
#  endif
# endif
#endif

#define HAVE_LONG_LONG 1
#define SIZEOF_LONG_LONG 8

#define HAVE_SETVBUF

#if defined (__EMX__) || defined(__BORLANDC__) || defined(__IBMC__) || defined(_MSC_VER) || defined(__WATCOMC__)
# define HAVE_IO_H
#endif

#if defined(_MSC_VER) || defined(__IBMC__) || defined(__BORLANDC__) || defined(__MINGW32__) || defined(__WATCOMC__)
# define HAVE_PROCESS_H
#endif

#ifdef _MSC_VER
# define HAVE_POPEN	1
# define popen _popen
# define pclose _pclose
#endif

#ifdef VMS
# define SIZEOF_SHORT	2
# define SIZEOF_INT	4
# if defined(__alpha__) || defined(__ALPHA__) || defined(__alpha)
/* Apparantly, when compaq bought digital, the size of the long was reduced
 * to 4 bytes for the alpha on VMS.  On unix it is still 8 bytes.
 */
#  define SIZEOF_LONG	4
# else
#  define SIZEOF_LONG	4
# endif
# define SIZEOF_FLOAT	4
# define SIZEOF_DOUBLE	8

#else				       /* NOT VMS */

# define SIZEOF_SHORT	2
# if defined(__WIN16__) || defined(__MSDOS_16BIT__)
# define SIZEOF_INT	2
#else
# define SIZEOF_INT	4
#endif
#define SIZEOF_LONG	4
#define SIZEOF_FLOAT	4
#define SIZEOF_DOUBLE	8

#endif				       /* ifdef VMS */

#ifndef HAVE_LONG_LONG
# undef SIZEOF_LONG_LONG
# define SIZEOF_LONG_LONG 0
#endif

#ifdef HAVE_LONG_LONG
# define HAVE_ATOLL	1
# define HAVE_STRTOLL	1
#endif

#undef HAVE_FORK
#undef HAVE_WAITPID
#undef HAVE_TTYNAME
#undef HAVE_TTYNAME_R
#undef HAVE_GETRUSAGE

/* Files used by the slang-readline interface.  The interface first tries
 * to read SLRLINE_USER_INIT_FILE from $HOME, and if that does not exist, it
 * will read SLRLINE_SYS_INIT_FILE from the load path.
 */
#define SLRLINE_USER_INIT_FILE	"slrline.rc"
#define SLRLINE_SYS_INIT_FILE	"rline/slrline.rc"

#endif				       /* ifndef SL_CONFIG_H */
