/*************************************************************************
* TinyFugue - programmable mud client
* Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2006-2007 Ken Keys
*
* TinyFugue (aka "tf") is protected under the terms of the GNU
* General Public License. See the file "COPYING" for details.
************************************************************************/
/* $Id: port.h,v 35004.38 2007/01/13 23:12:39 kkeys Exp $ */
#ifndef PORT_H
#define PORT_H
#ifdef __hpux__
# ifndef _HPUX_SOURCE
# define _HPUX_SOURCE /* Enables some "extensions" on HPUX. */
# endif
#endif
#if _AIX - 0
# ifndef _ALL_SOURCE
# define _ALL_SOURCE /* Enables some "extensions" on AIX. */
# endif
/* # define _BSD 44 */ /* Needed for nonblocking connect on AIX. */
#endif
#if 0 /* These cause a few problems, but little benefit, so forget it. */
/* These aren't neccessary, but may improve optimization, etc. */
# ifdef __GNUC__
# define INLINE __inline__
# if (__GNUC__ == 2 && __GNUC_MINOR__ >= 5) || (__GNUC__ > 2)
# define GNUC_2_5_OR_LATER
# define PURE __attribute__ ((const))
# define NORET __attribute__ ((noreturn))
# endif
# endif
#endif
#ifndef INLINE
# define INLINE
#endif
#ifndef PURE
# define PURE
#endif
#ifndef NORET
# define NORET
#endif
#if 0
# ifdef __GNUC__
# define format_printf(fmt, var) __attribute__((format(printf, fmt, var)))
# else
# define format_printf(fmt, var) /* empty */
# endif
#else
# define format_printf(fmt, var) /* empty */
#endif
/* standard stuff */
#include <errno.h>
#ifndef errno
extern int errno; /* Some systems don't declare errno in errno.h. Duh. */
#endif
#include <stdio.h>
#ifndef SEEK_SET
# define SEEK_SET 0
#endif
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifndef STDIN_FILENO
# define STDIN_FILENO 0
# define STDOUT_FILENO 1
# define STDERR_FILENO 2
#endif
#if STDC_HEADERS
# include <stdlib.h>
# include <string.h>
#else
extern void free();
# if HAVE_MEMORY_H
# include <memory.h>
# endif
# if !HAVE_STRCHR
# if HAVE_INDEX
# define strchr index
# define strrchr rindex /* assumed */
# endif
# endif
# if !HAVE_MEMCPY
# if HAVE_BCOPY
# define memcpy(dst, src, len) bcopy((src), (dst), (len))
# endif
# endif
#endif
#if !HAVE_BZERO
/* We don't use the nonstandard bzero(), but some stupid sys/select.h do */
# define bzero(ptr, size) memset((ptr), '\0', (size))
#endif
/* Try the common case insensitive strcmp's before falling back to our own */
#if HAVE_STRCASECMP
# define cstrcmp strcasecmp
#else
# if HAVE_STRICMP
# define cstrcmp stricmp
# else
# if HAVE_STRCMPI
# define cstrcmp strcmpi
# endif
# endif
#endif
#ifndef cstrcmp
extern int cstrcmp(const char *s, const char *t);
#endif
#if !HAVE_STRERROR
extern int sys_nerr;
extern char *sys_errlist[];
# define strerror(n) (((n) > 0 && (n) < sys_nerr) ? sys_errlist[(n)] : \
"unknown error")
#endif
#if !HAVE_FILENO /* occurs on at least one pre-POSIX SVr3-like platform */
# ifdef PLATFORM_UNIX
# define fileno(p) ((p)->_file)
# else
/* Who knows what it should be elsewhere; it should already exist. */
# endif
#endif
#ifdef PLATFORM_OS2
# define HAVE_GETCWD
# define getcwd _getcwd2 /* handles drive names */
# define chdir _chdir2 /* handles drive names */
#endif
#if !HAVE_LOCALE_H
# undef HAVE_SETLOCALE
#endif
#if !HAVE_SETLOCALE
# undef HAVE_LOCALE_H
#endif
#include <ctype.h>
#if STDC_HEADERS /* are tolower and toupper safe on non-letters, per ANSI? */
/* more efficient */
# define lcase(x) tolower((unsigned char)(x))
# define ucase(x) toupper((unsigned char)(x))
#else
/* will work even in nonstandard C */
extern int lcase(int x);
extern int ucase(int x);
/* This expression evaluates its argument more than once:
* (is_upper(x) ? tolower(x) : (x))
* This expression has no sequence points:
* (dummy=(x), (is_upper(dummy) ? tolower(dummy) : (dummy)))
*/
#endif
/* The standard ctype functions expect an int argument, containing either EOF
* or an unsigned char representation of a character. The functions below do
* not allow EOF, but do work on plain char values. (The signedness becomes
* important when using character sets other than 7-bit ASCII.)
*/
#define is_alnum(c) isalnum((unsigned char)(c))
#define is_alpha(c) isalpha((unsigned char)(c))
#define is_cntrl(c) iscntrl((unsigned char)(c))
#define is_digit(c) isdigit((unsigned char)(c))
#define is_graph(c) isgraph((unsigned char)(c))
#define is_lower(c) islower((unsigned char)(c))
#define is_print(c) isprint((unsigned char)(c))
#define is_punct(c) ispunct((unsigned char)(c))
#define is_space(c) isspace((unsigned char)(c))
#define is_upper(c) isupper((unsigned char)(c))
#define is_xdigit(c) isxdigit((unsigned char)(c))
/* RRAND(lo,hi) returns a random integer in the range [lo,hi].
* RAND() returns a random integer in the range [0,TF_RAND_MAX].
* SRAND() seeds the generator.
* If random() exists, use it, because it is better than rand().
* If not, we'll have to use rand(); if RAND_MAX isn't defined,
* we'll have to use the modulus method instead of the division method.
* Warning: RRAND() is undefined if hi < lo.
* Warning: on Solaris 2.x, libucb contains a nonstandard rand() that does
* not agree with RAND_MAX. We must not link with -lucb.
*/
#if HAVE_SRANDOM
# include <math.h>
# define RAND() (int)random()
# define SRAND(seed) srandom(seed)
# define RRAND(lo,hi) (RAND() % ((hi)-(lo)+1) + (lo))
#else
# if HAVE_SRAND
# define RAND() rand()
# define SRAND(seed) srand(seed)
# if RAND_MAX
# define RRAND(lo,hi) ((hi)==(lo)) ? (hi) : \
((RAND() / (RAND_MAX / ((hi)-(lo)+1) + 1)) + (lo))
# else
# define RRAND(lo,hi) (RAND() % ((hi)-(lo)+1) + (lo))
# endif
# else
error "Don't have srand() or srandom()."
# endif
#endif
#if !HAVE_STRTOD
# define NO_FLOAT
#endif
#ifndef PATH_MAX
# ifdef MAXPATHLEN
# define PATH_MAX MAXPATHLEN
# else
# define PATH_MAX 1024
# endif
#endif
/* These just prevent warnings during development. They should not be
* used in production, since they might conflict with system headers.
*/
#ifdef TF_IRIX_DECLS
extern int kill(pid_t, int);
extern int ioctl(int, int, ...);
extern long random(void);
extern int srandom(unsigned);
#endif
#ifdef TF_AIX_DECLS
extern int strcasecmp(const char *, const char *);
extern time_t time(time_t *);
/* extern pid_t wait(int *); */
extern int socket(int, int, int);
extern int getsockopt(int, int, int, char *, int *);
extern int send(int, const char *, int, int);
extern int recv(int, char *, int, int);
extern int ioctl(int, int, ...);
extern long random(void);
extern int srandom(unsigned);
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#endif /* PORT_H */
syntax highlighted by Code2HTML, v. 0.9.1