1/* $Header$ */
2
3/*
4 * Copyright (c) 1990-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided
9 * that (i) the above copyright notices and this permission notice appear in
10 * all copies of the software and related documentation, and (ii) the names of
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics.
14 *
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18 *
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * OF THIS SOFTWARE.
25 */
26
27#ifndef _COMPAT_
28#define _COMPAT_
29/*
30 * This file contains a hodgepodge of definitions and
31 * declarations that are needed to provide compatibility
32 * between the native system and the base implementation
33 * that the library assumes.
34 *
35 * NB: This file is a mess.
36 */
37
38/*
39 * Setup basic type definitions and function declaratations.
40 */
41
42/*
43 * Simplify Acorn RISC OS identifier (to avoid confusion with Acorn RISC iX
44 * and with defunct Unix Risc OS)
45 * No need to specify __arm - hey, Acorn might port the OS, no problem here!
46 */
47#ifdef __acornriscos
48#undef __acornriscos
49#endif
50#if defined(__acorn) && defined(__riscos)
51#define __acornriscos
52#endif
53
54#if (defined(__MWERKS__) && !defined(__MACH__)) || defined(THINK_C)
55#include <unix.h>
56#include <math.h>
57#endif
58
59#include <stdio.h>
60
61#if defined(__PPCC__) || ( defined(__SC__) && !defined(__DMC__) ) || defined(__MRC__)
62#include <types.h>
63#elif !defined(__MWERKS__) && !defined(THINK_C) && !defined(__acornriscos) && !defined(applec)
64#include <sys/types.h>
65#endif
66
67#if defined(VMS)
68#include <file.h>
69#include <unixio.h>
70#elif !defined(__acornriscos)
71#include <fcntl.h>
72#endif
73
74/*
75 * This maze of checks controls defines or not the
76 * target system has BSD-style typdedefs declared in
77 * an include file and/or whether or not to include
78 * <unistd.h> to get the SEEK_* definitions.  Some
79 * additional includes are also done to pull in the
80 * appropriate definitions we're looking for.
81 */
82#if defined(__MWERKS__) || defined(THINK_C) || defined(__PPCC__) || ( defined(__SC__) && !defined(__DMC__) ) || defined(__MRC__)
83#include <stdlib.h>
84#define	BSDTYPES
85#define	HAVE_UNISTD_H	0
86#elif (defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) || defined(_WIN32)) && !defined(unix)
87#define	BSDTYPES
88#elif defined(OS2_16) || defined(OS2_32)
89#define	BSDTYPES
90#elif defined(__MSDOS__)
91#define	BSDTYPES
92#elif defined(__acornriscos)
93#include <stdlib.h>
94#define	BSDTYPES
95#define	HAVE_UNISTD_H	0
96#elif defined(VMS)
97#define	HAVE_UNISTD_H	0
98#else
99#define	HAVE_UNISTD_H	1
100#endif
101
102/*
103 * The library uses the ANSI C/POSIX SEEK_*
104 * definitions that should be defined in unistd.h
105 * (except on system where they are in stdio.h and
106 * there is no unistd.h).
107 */
108#if !defined(SEEK_SET) && HAVE_UNISTD_H
109#include <unistd.h>
110#endif
111
112/*
113 * The library uses memset, memcpy, and memcmp.
114 * ANSI C and System V define these in string.h.
115 */
116#include <string.h>
117
118/*
119 * The BSD typedefs are used throughout the library.
120 * If your system doesn't have them in <sys/types.h>,
121 * then define BSDTYPES in your Makefile.
122 */
123#if defined(BSDTYPES)
124# ifndef _BSDTYPES_DEFINED
125#  ifndef __u_char_defined
126typedef	unsigned char u_char;
127typedef	unsigned short u_short;
128typedef	unsigned int u_int;
129typedef	unsigned long u_long;
130#   define __u_char_defined
131#  endif /* __u_char_defined */
132#  define _BSDTYPES_DEFINED
133# endif /* _BSDTYPES_DEFINED */
134#endif /* BSDTYPES */
135
136/*
137 * dblparam_t is the type that a double precision
138 * floating point value will have on the parameter
139 * stack (when coerced by the compiler).
140 */
141/* Note: on MacPowerPC "extended" is undefined. So only use it for 68K-Macs */
142#if ( defined(__SC__) && !defined(__DMC__) ) || defined(THINK_C)
143typedef extended dblparam_t;
144#else
145typedef double dblparam_t;
146#endif
147
148/*
149 * If your compiler supports inline functions, then
150 * set INLINE appropriately to get the known hotspots
151 * in the library expanded inline.
152 */
153#if defined(__GNUC__)
154#if defined(__STRICT_ANSI__)
155#define	INLINE	__inline__
156#else
157#define	INLINE	inline
158#endif
159#else /* !__GNUC__ */
160#define	INLINE
161#endif
162
163/*
164 * GLOBALDATA is a macro that is used to define global variables
165 * private to the library.  We use this indirection to hide
166 * brain-damage in VAXC (and GCC) under VAX/VMS.  In these
167 * environments the macro places the variable in a non-shareable
168 * program section, which ought to be done by default (sigh!)
169 *
170 * Apparently DEC are aware of the problem as this behaviour is the
171 * default under VMS on AXP.
172 *
173 * The GNU C variant is untested.
174 */
175#if defined(VAX) && defined(VMS)
176#if defined(VAXC)
177#define GLOBALDATA(TYPE,NAME)	extern noshare TYPE NAME
178#endif
179#if defined(__GNUC__)
180#define GLOBALDATA(TYPE,NAME)	extern TYPE NAME \
181	asm("_$$PsectAttributes_NOSHR$$" #NAME)
182#endif
183#else	/* !VAX/VMS */
184#define GLOBALDATA(TYPE,NAME)	extern TYPE NAME
185#endif
186
187#if defined(__acornriscos)
188/*
189 * osfcn.h is part of C++Lib on Acorn C/C++, and as such can't be used
190 * on C alone. For that reason, the relevant functions are
191 * implemented in tif_acorn.c, and the elements from the header
192 * file are included here.
193 */
194#if defined(__cplusplus)
195#include <osfcn.h>
196#else
197#define	O_RDONLY	0
198#define	O_WRONLY	1
199#define	O_RDWR		2
200#define	O_APPEND	8
201#define	O_CREAT		0x200
202#define	O_TRUNC		0x400
203typedef long off_t;
204extern int open(const char *name, int flags, int mode);
205extern int close(int fd);
206extern int write(int fd, const char *buf, int nbytes);
207extern int read(int fd, char *buf, int nbytes);
208extern off_t lseek(int fd, off_t offset, int whence);
209extern int creat(const char *path, int mode);
210#endif /* __cplusplus */
211#endif /* __acornriscos */
212
213/* Bit and byte order, the default is MSB to LSB */
214#ifdef VMS
215#undef HOST_FILLORDER
216#undef HOST_BIGENDIAN
217#define HOST_FILLORDER FILLORDER_LSB2MSB
218#define HOST_BIGENDIAN	0
219#endif
220
221#ifndef LINKAGEMODE
222    #define LINKAGEMODE
223#endif
224
225#endif /* _COMPAT_ */
226