/* * inc/compat.h * Include file with declarations for tranportability * Microsoft C 5.0 - Turbo C 2.0 - Vax C 3.0 - GNU C 3.2 * Grupo de Tecnologia em Computacao Grafica - PUC/RIO * 26 Mar 92 */ /* * Ultimas modificacoes: * * 15/04/91 - definida variavel __GNUC386__ - Andre & Levy * 17/04/91 - retirada define __GNUC386__ - deve ser definida na * linha de comando com -D__GNUC386__ - Sedrez * 29/05/91 - agora os defines de includes tem sempre a primeira * letra em maiuscula - Sedrez * 16/09/91 - normalizado por sistema operacional * 17/10/91 - completada remodelagem - aceita ate AIX * 18/03/92 - definida variavel __NDPC__ - Andre & Sedrez * 23/03/92 - colocacao de min e max para NDPC e as funcoes FP_OFF, * FP_SEG e MK_FP. Mudanca do nome do include Values para * , eh igual ao MSC. declaracao da funcao * ecvt - Andre * 26/03/92 - Mudanca do nome do include Malloc para - Andre * 08/05/92 - definida variavel __WATCOMC__ - Andre & Levy * 13/08/92 - definido Memory para VAXC como sendo: string * */ /* * Define-se aqui uma macro com o nome do compilador. A definicao deve * seguir o padrao ANSI para nomes definidos internamente : __NOME__, * ou seja, dois "underscores" ( '_' ) a frente do nome e dois atras. */ /* * Sao os seguintes os compiladores ja' cadastrados : * __TURBOC__ Turbo C e Turbo C++, versao 1.0 ou posterior * __TURBOCPP__ Turbo C++, versao 1.0 ou posterior * __MSC__ Microsoft C versao 5.0 ou posterior * __VAXC__ Vax C versao 3.0 ou posterior * __GNUC__ GNU C versao 3.2 ou posterior * __GNUC386__ GNU C versao 3.2 para UNIX System V/386 * __CCPP__ C++ version 2 * __ULTRIXC__ ULTRIX C ( C da DECstation 5000 ) * __NDPC__ NDP C-386 Micro Way versao 3.1 * __WATCOMC__ WATCOM C/386 versao 9.0 * __ACCSUN__ Sun ANSI C (Q-ANSI C compiler) versao 1.1 */ /* * Sao os seguintes os sistemas operacionais ja cadastrados : * __MSDOS__ Microsoft ou PC DOS * __VMS__ VAX VMS * __UNIX__ UNIX * __ULTRIX__ unix da DECstation 5000 * __SunOS__ unix da Sun * __AIX__ unix da RISC 6000 * __CLIX__ unix da InterPro 32 * __DGR8000__ unix da Digirede * __IRIX__ unix da Silicon Graphics * __scosysv__ unix do SCO */ /* * Sao os seguintes os pre-processadores ja cadastrados : * __CPPA ANSI ( assumido por default ) * __CPPKR Kernighan & Ritchie * __CPPI Intermediate * __CPPSTR String pre-processor */ /* * Sao as seguintes as "strange reactions" ja cadastradas : * __NOUNIN no union initialization * __UNASST union as structure ( opposite: as first element ) * __NOSBF no signed bit field */ /* * Sao os seguintes os tipos de linker ja cadastrados : * __IGCASE ignore case * __DYNSTR dynamic stream pointer */ /* * Sao as seguintes as rotinas ou declaracoes ausentes : * __MINMAX min(a,b) e max(a,b) * __SEEK SEEK_SET, SEEK_CUR e SEEK_END * __FLT FLT_MIN, FLT_MAX, FLT_DIG * __DIV div(struct div_t) e ldiv(struct ldiv_t) * __C_LU tolower & toupper * __S_LU strlwr & strupr * __SDUP strdup(s) * __SICMP stricmp * __MMOV memmove(d,s,o) * __ULNK unlink * __RMV remove */ #ifndef __COMPAT_H__ #define __COMPAT_H__ /****************************************************/ /* */ /* */ /* Microsoft C 5.x identificado - __MSC__ */ /* */ /* */ /****************************************************/ #if defined(MSDOS) && defined(M_I86) #ifdef __TIMESTAP__ #define __MSC__ 0x0510 #else #define __MSC__ 0x0500 #endif /* __TIMESTAP */ #define __MSDOS__ #define __NOSBF /* intrinsic functions */ #pragma intrinsic(_enable,_disable,inp,outp,inpw,outpw) #if 0 #pragma intrinsic(memset,memcpy,memcmp) #pragma intrinsic(abs,sqrt,fabs) #pragma intrinsic(sin,cos,tan,atan,atan2) #endif #else /****************************************************/ /* */ /* */ /* Turbo C 2.x identificado - __TURBOC__ */ /* */ /* */ /****************************************************/ #if defined(__TURBOC__) /* ja' existente em Turbo C */ /****************************************************/ /* */ /* */ /* Turbo C++ 1.x identificado - __TURBOCPP__ */ /* */ /* */ /****************************************************/ #ifdef __cplusplus #define __TURBOCPP__ __TURBOC__ #endif /* __cplusplus */ /* __MSDOS__ ja esta identificado */ #else /****************************************************/ /* */ /* */ /* VAX C 3.x identificado - __VAXC__ */ /* */ /* */ /****************************************************/ #ifdef __CLIX__ /* CLIX - acc nao gosta de defined() */ #define __IsVax 0 #else #define __IsVax defined(vax) || defined(vms) || defined(vaxc) || defined(vax11c) || \ defined(VAX) || defined(VMS) || defined(VAXC) || defined(VAX11C) #endif #if __IsVax #define __VAXC__ 0x0300 #define __VMS__ #define __CPPKR #define __NOUNIN #define __NOSBF #define __IGCASE #define __DYNSTR #define __MINMAX #define __S_LU #define __SICMP #define __SDUP #define __ULNK #else /****************************************************/ /* */ /* */ /* GNU C 3.x identificado - __GNUC__ */ /* */ /* */ /****************************************************/ #if defined(__GNUC__) /* identificador __GNU__ ja' definido */ #ifdef __386ix__ #define __GNUC386__ #endif /* __386ix__ */ #define __UNIX__ #define __UNASST #ifndef __GNUC386__ #define __SICMP #define __S_LU #ifndef __ULTRIX__ #define __MMOV #define __DIV #else #define __SDUP #endif /* __ULTRIX__ */ #endif #ifdef __SunOS__ #define __RMV #endif /* __SunOS__ */ #ifdef __DGR8000__ #define __IGCASE #define __SICMP #define __S_LU #define __DIV #define __SYSV__ #define __SEEK #endif /* __DGR8000__ */ #define __MINMAX #else /****************************************************/ /* */ /* */ /* NDP C 386 3.1 identificado - __NDPC__ */ /* */ /* */ /****************************************************/ #if defined(__NDPC__) /* identificador __NDPC__ ja' definido */ #define far #define __DYNSTR #define __MSDOS__ #define __MINMAX #else /****************************************************/ /* */ /* */ /* WATCOM C 386 9.0 identificado - __WATCOMC__ */ /* */ /* */ /****************************************************/ #if defined(__WATCOMC__) /* identificador __WATCOMC__ ja' definido */ #define __DYNSTR #define __MSDOS__ #else /****************************************************/ /* */ /* */ /* AT&T C++ identificado - __CCPP__ */ /* */ /* */ /****************************************************/ #ifdef __cplusplus #define __CCPP__ 0x0200 #if defined(__AIX__) || defined(__ULTRIX__) || defined(__SunOS__) #define __UNIX__ #define __SICMP #endif /* __AIX__ || __ULTRIX__ || __SunOS__ */ #ifdef __SunOS__ #define __CPPKR #define __NOSBF #define __NOUNIN #define __MINMAX #define __S_LU #define __DIV #define __MMOV #define __SICMP #define __RMV #endif /* __SunOS__ */ /* reserved words used - class, delete, new & virtual */ /* as maiusculas nao estao definidas */ #define class CLASS #define delete DELETE #define new NEW #define virtual VIRTUAL #else /****************************************************/ /* */ /* */ /* Nenhum compilador identificado */ /* */ /* */ /****************************************************/ #ifdef __AIX__ #define __UNIX__ #define __IGCASE #define __MINMAX #define __SICMP #define __S_LU #endif /* __AIX__ */ #if defined(ultrix) || defined(__ULTRIX__) #define __UNIX__ #ifndef __ULTRIX__ #define __ULTRIX__ #endif /* __ULTRIX__ */ #endif /* ultrix || __ULTRIX__ */ #ifdef __SunOS__ /* Provavelmente Sun ANSI C */ #ifdef __STDC__ #define __ACCSUN__ #endif #define __UNIX__ #endif /* __SunOS__ */ #ifdef __IRIX__ #define __UNIX__ #define __SYSV__ #define __S_LU #define __SICMP #define __MINMAX #endif /*__IRIX__*/ #ifdef __scosysv__ #define __UNIX__ #define __MINMAX #define __SICMP #define __S_LU #define __NOSBF #endif /* __scosysv__*/ #ifdef __CLIX__ #ifndef __UNIX__ /* acc ja' tem isso definido */ #define __UNIX__ #endif #define __MINMAX #define __DYNSTR #define __SDUP #define __S_LU #define __C_LU #define __SICMP /* #define __CPPKR */ #endif /* __CLIX__ */ #ifdef __DGR8000__ #define __SICMP #define __S_LU #define __DIV #define __SYSV__ #define __SEEK #endif /* __DGR8000__ */ #endif /* __CCPP__ */ #endif /* __WATCOMC__ */ #endif /* __NDPC__ */ #endif /* __GNUC__ */ #endif /* __VAXC__ */ #undef __IsVax #endif /* __TURBOC__ || __TURBOCPP__ */ #endif /* __MSC__ */ /* PharLap 286|DOS Extender carregado */ #ifdef DOSX286 #define __DOSX286__ #endif /* DOSX286 */ /* define includes - para ser mais rapido */ /* ** Deste modo, usa-se : ** ** #include Name ** ** ao inves de : ** ** #include ou ** #include "name.h" ** */ /*********************************************************** ************************************************************ ** ** ** * * * * A T E N C A O * * * * ** ** ** ** As definicoes de include comecam com ** ** letras maiusculas para evitar problemas com outras ** ** definicoes do mesmo nome (p. e., numa estrutura), ** ** e com recursao na expansao da macro (com #define). ** ** ** ************************************************************ ***********************************************************/ #ifdef __VAXC__ /* VAX C nao tem io.h - tem unixio.h */ #define Io unixio #define Fcntl unixio #define Dos unixlib #define Conio unixio #define Memory string #define signed /* VAXC nao tem signed */ #else #define Ctype #ifdef __MSDOS__ #ifdef __TURBOC__ #define Direct #else #define Direct #endif /* __TURBOC__ */ #else #ifdef __UNIX__ #define Direct #endif /* __UNIX__ */ #endif /* __MSDOS__ */ #define Fcntl #define Graphics #if defined(__SunOS__) && !defined(__GNUC__) && !defined(__ACCSUN__) #define Float #else #define Float #endif /* __SunOS__ && !__GNUC__ && !__ACCSUN__ */ #if defined(__SunOS__) #define Floatingpoint #else #define Floatingpoint #endif /* __SunOS__ */ /* Gnu C e C++ (SUN) nao tem io.h */ #ifdef __UNIX__ #define Conio Stdio #if defined(__CCPP__) && defined(__SunOS__) #define Dos #else #define Dos #endif /* __CCPP__ || _SunOS__ */ #define Io #else #define Dos #ifdef __NDPC__ #define Conio #define Io #else #define Conio #define Io #endif /* __NDPC__ */ #endif /* __UNIX__ */ #if defined(__CCPP__) && defined(__SunOS__) #define Limits #define LONG_MAX MAXLONG #else #define Limits #endif #ifdef __TURBOC__ #define Malloc #else #ifdef __NDPC__ #define Malloc #else #define Malloc #endif /* __NDPC__ */ #endif /* __TURBOC__ */ #define Math #ifdef __TURBOC__ #define Memory #else #ifdef __CLIX__ #define Memory #else #if defined(__NDPC__) || defined(__WATCOMC__) #define Memory #else #define Memory #endif /* __NDPC__ || __WATCOMC__*/ #endif /* __CLIX__ */ #endif /* __TURBOC__ */ #define Stddef #define Stdio #define Stdlib #define Stdarg #define String #define Time #if defined(__MSC__) || defined(__NDPC__) || defined(__WATCOMC__) #define Values #else #define Values #endif /* __MSC__ || __NDPC__ || __WATCOMC__*/ #define Bind #define Chrfont #define Drvfunc #define Ems #define Gks #define Gks_data #define Gks_defs #define Gks_func #define Gks_ifun #define Gks_svga #define Gks_tab #define Gks_type #define Gksi #define Parametr #define Pckeys #define Seg #define Simula #if 0 /* desta eu nao gostei */ #define Tela "tela.h" #endif #define Vax_io #define Term_io #define Xms #endif /* __VAXC__ */ /* Storage Classes para importar e exportar variaveis */ /* Algumas podem ser compartilhadas, outras nao */ #if defined(__VAXC__) #define IMPORT globalref #define EXPORTSH globaldef{"GKS_DATA_SHARE"} #define EXPORTNS globaldef{"GKS_DATA_NOSHARE"} noshare #define EXPORTRO globaldef{"$CODE"} const #define STATICSH static #define STATICNS static noshare #define STATICRO static const #else #define IMPORT extern #define EXPORTSH #define EXPORTNS #define EXPORTRO const #define STATICSH static #define STATICNS static #define STATICRO static const #endif /* __VAXC__ */ /* Define particularidades dos compiladores */ /* referencias tipo far - so' tem sentido em MSDOS */ #ifndef __MSDOS__ #define far #endif /* __MSDOS__ */ #ifdef __SEEK #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif /* __SEEK */ #ifdef __FLT #define FLT_DIG FMAXEXP #define FLT_MIN MINFLOAT #define FLT_MAX MAXFLOAT #define DBL_DIG DMAXEXP #define DBL_MIN MINDOUBLE #define DBL_MAX MAXDOUBLE #endif /* __FLT */ #ifdef __MINMAX int max(int,int); int min(int,int); #endif /* __MINMAX */ #ifdef __S_LU char *strlwr(char *); char *strupr(char *); #endif /* __S_LU */ #ifdef __SDUP char *strdup(const char *); #endif /* __SDUP */ #ifdef __C_LU #define tolower(c) ((c)+(isupper(c)?('a'-'A'):0)) #define toupper(c) ((c)-(islower(c)?('a'-'A'):0)) #endif /* __C_LU */ #ifdef __MMOV void *memmove(void *, void *, unsigned); #endif /* __MMOV */ #ifdef __SICMP int stricmp ( const char *, const char * ); #endif /* __SICMP */ #ifdef __RMV #ifdef __ULNK /* nao posso redirecionar remove para unlink */ int remove ( const char *); #else #define remove unlink #endif /* __ULNK */ #endif /* __RMV */ #ifdef __DIV typedef struct { int quot; int rem; } div_t; typedef struct { long int quot; long int rem; } ldiv_t; div_t div ( int, int); ldiv_t ldiv (long int, long int); #endif /* __DIV */ /* VAX C - bug na implementacao de div e ldiv */ #ifdef __VAXC__ #define div _gks_puc_div #define ldiv _gks_puc_ldiv #define __DIV #endif /* __VAXC__ */ #if defined(__MSC__) || !defined(__MSDOS__) || defined(__NDPC__) /* funcoes FP_OFF e FP_SEG - nao existem fora de __MSDOS__ */ #if !defined(__MSDOS__) || defined(__NDPC__) #define FP_OFF(a) ((unsigned)( (long)(a) &0xffff)) #define FP_SEG(a) ((unsigned)(((long)(a)>>16)&0xffff)) #endif /* __MSC__ || __MSDOS__ */ /* funcao MK_FP - MaKe Far Pointer - nao existe em __MSC__ */ #define MK_FP(seg,ofs) ((void far *)(((unsigned long)(seg)<<16)|(unsigned)(ofs))) #endif /* __MSDOS__ */ #if defined(__GNUC__) || defined(__NDPC__) || defined(__IRIX__) /* tem a funcao, mas nao a declaracao */ char *ecvt( double, int, int *, int *); /* isto e' absolutamente necessario */ #if defined __sparc__ && !defined sparc #define sparc #endif /* __sparc__ || sparc */ #if defined __mc68000__ && !defined mc68000 #define mc68000 #endif /* __mc68000 || mc68000 */ #if defined __i386__ && !defined i386 #define i386 #endif /* __i386__ || i386 */ #endif /* __GNUC__ */ /* min e max na forma de macro - alguns compiladores nao tem */ /* necessario para long, float, double ou unsigned como um dos parametros */ #define _mmin(a,b) ((a)<(b)?(a):(b)) #define _mmax(a,b) ((a)>(b)?(a):(b)) #endif /* __COMPAT_H__ */