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 126 typedef unsigned char u_char; 127 typedef unsigned short u_short; 128 typedef unsigned int u_int; 129 typedef 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) 143 typedef extended dblparam_t; 144 #else 145 typedef 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 203 typedef long off_t; 204 extern int open(const char *name, int flags, int mode); 205 extern int close(int fd); 206 extern int write(int fd, const char *buf, int nbytes); 207 extern int read(int fd, char *buf, int nbytes); 208 extern off_t lseek(int fd, off_t offset, int whence); 209 extern 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