/* Sys.h */

#include "Config.h"

#ifdef HAVE_UNISTD_H
#	include <unistd.h>
#endif
#include <sys/types.h>

#include <stdio.h>
#include <sys/time.h>

#ifdef STDC_HEADERS
#	include <stdlib.h>
#endif


#ifdef HAVE_STRING_H
#	include <string.h>		/* They have string.h... */
#	if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
/*
	#		include <memory.h>
*/
#	endif
#	define PTRZERO(p,siz)  memset(p, 0, (size_t) (siz))
#else
#	include <strings.h>		/* Then hope they have strings.h. */
#	define strchr index
#	define strrchr rindex
#	ifdef HAVE_MEMORY_H
#		include <memory.h>
#	endif
#	define memcpy(d,s,n) bcopy((s), (d), (int)(n) )
#	define PTRZERO bzero
#endif

/* Autoconf's AC_TIME_WITH_SYS_TIME defines TIME_WITH_SYS_TIME. */
#ifdef TIME_WITH_SYS_TIME
#	include <sys/time.h>
#	include <time.h>
#else
#	ifdef HAVE_SYS_TIME_H
#		include <sys/time.h>
#	else
#		include <time.h>
#	endif
#endif

#ifdef HAVE_STDARG_H
#	include <stdarg.h>
#else
#	include <varargs.h>
#endif



#ifdef HAVE_FCNTL_H
#	include <fcntl.h>
#endif

/* All of this crap because NeXT doesn't define these symbols. */
#include <sys/stat.h>
#ifndef O_RDONLY
#	define	O_RDONLY	0
#	define	O_WRONLY	1
#	define	O_RDWR		2
#endif

/* These aren't guaranteed to work, as they are defined differently on
 * differenet systems!
 */
#ifndef O_CREAT
#	define	O_CREAT		0x100
#	define	O_TRUNC		0x200
#	define	O_EXCL		0x400
#endif
#ifndef O_APPEND
#	define O_APPEND		0x08
#endif

/* This group is somewhat standard, though. */
#ifndef S_IRUSR
#	define	S_IRUSR	00400		/* read permission: owner */
#	define	S_IWUSR	00200		/* write permission: owner */
#	define	S_IXUSR	00100		/* execute permission: owner */
#	define	S_IRWXU	00700		/* read, write, execute: owner */
#	define	S_IRWXG	00070		/* read, write, execute: group */
#	define	S_IRGRP	00040		/* read permission: group */
#	define	S_IWGRP	00020		/* write permission: group */
#	define	S_IXGRP	00010		/* execute permission: group */
#	define	S_IRWXO	00007		/* read, write, execute: other */
#	define	S_IROTH	00004		/* read permission: other */
#	define	S_IWOTH	00002		/* write permission: other */
#	define	S_IXOTH	00001		/* execute permission: other */
#endif
#ifndef S_ISDIR
#	define S_ISDIR(mode)	((mode&S_IFMT) == S_IFDIR)
#	define S_ISREG(mode)	((mode&S_IFMT) == S_IFREG) 
#	define S_ISLNK(m)      (((m) & S_IFMT) == S_IFLNK)
#endif



#ifdef F_SETLK		/* Def'd if <fcntl.h> has it and fcntl() can lock. */
#	define LOCK_METHOD 1
#else
#	ifdef HAVE_FLOCK
#		define LOCK_METHOD 2
#	else
#		define LOCK_METHOD 3
#	endif
#endif




#ifdef _POSIX_VERSION
#	define POSIX_SIGNALS 1
#endif

#ifndef MYPOPEN
#	define POpen popen
#	define PClose pclose
#endif

#ifdef SVR4
#	ifndef Gettimeofday
#		define Gettimeofday gettimeofday
#	endif
#endif  /* SVR4 */

#ifndef Gettimeofday
#	define Gettimeofday(a) gettimeofday(a, (struct timezone *)0)
#endif /* Gettimeofday */

/* This malloc stuff is mostly for our own use. */
#define LIBC_MALLOC 0
#define FAST_MALLOC 1
#define DEBUG_MALLOC 2

#ifdef LIBMALLOC
	/* Make sure you use -I to use the malloc.h of choice. */
#	if LIBMALLOC == FAST_MALLOC
#		include "/usr/include/malloc.h"
#	endif
#	if LIBMALLOC == DEBUG_MALLOC
#		include <dbmalloc.h>
#		define MCHK malloc_chain_check(0)
#	endif
#else
#	define LIBMALLOC LIBC_MALLOC
#endif

#if LIBMALLOC != DEBUG_MALLOC
#	define malloc_enter(func)
#	define malloc_leave(func)
#	define malloc_chain_check(a)
#	define malloc_dump(fd)
#	define malloc_list(a,b,c)
#	define malloc_inuse(hist)    (*(hist) = 0, 0)
#	define MCHK
#endif

/* eof */
