1 #ifndef __PASLIB_H__
2 #define __PASLIB_H__
3 
4 #define maxint ((int)(1 << (sizeof(integer)*8-1)) - 1)
5 
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 double sin(double);
11 double cos(double);
12 double tan(double);
13 double atan(double);
14 
15 double exp(double);
16 double log(double);
17 
18 double sqrt(double);
19 
20 #ifdef __cplusplus
21 }
22 #endif
23 
24 /*
25  * Macros for some Pascal standard functions
26  */
27 
28 
29 #define trunc(x)  ((integer)(x))
30 
31 #define pred(type,x) ((type)((x) - 1))
32 
33 #define succ(type,x) ((type)((x) + 1))
34 
35 #define pack(a_l,a_h,a,i,z) memcpy(z, &(a)[(i)-(a_l)], sizeof(z))
36 
37 #define unpack(z,a_l,a_h,a,i) memcpy(&(a)[(i)-(a_l)], (z), sizeof(z))
38 
39 #define bitsize(x) (sizeof(x)*8)
40 
41 #define odd(x) ((x) & 1)
42 
43 #define chr(n) ((char)(n))
44 
45 #define ord(c) ((int)(unsigned char)(c))
46 
47 #ifdef __cplusplus
48 
49 #ifndef abs
50 #if 0 // abs for integers is defined in stdlib
51 inline signed char   abs(signed char x) { return x < 0 ? -x : x; }
52 inline short         abs(short x)       { return x < 0 ? -x : x; }
53 inline int           abs(int x)         { return x < 0 ? -x : x; }
54 inline long          abs(long x)        { return x < 0 ? -x : x; }
55 #endif
abs(float x)56 inline float         abs(float x)       { return  x < 0 ? -x : x; }
abs(double x)57 inline double        abs(double x)      { return  x < 0 ? -x : x; }
58 #endif
59 
sqr(signed char x)60 inline int           sqr(signed char x)    { return x*x; }
sqr(unsigned char x)61 inline unsigned      sqr(unsigned char x)  { return x*x; }
sqr(short x)62 inline int           sqr(short x)          { return x*x; }
sqr(unsigned short x)63 inline unsigned      sqr(unsigned short x) { return x*x; }
sqr(int x)64 inline int           sqr(int x)            { return x*x; }
sqr(unsigned x)65 inline unsigned      sqr(unsigned x)       { return x*x; }
sqr(long x)66 inline long          sqr(long x)           { return x*x; }
sqr(unsigned long x)67 inline unsigned long sqr(unsigned long x)  { return x*x; }
sqr(float x)68 inline float         sqr(float x)          { return x*x; }
sqr(double x)69 inline double        sqr(double x)         { return x*x; }
70 
71 extern "C" void timestamp(integer* day,  integer* month, integer* year,
72 			  integer* hour, integer* min,   integer* sec);
73 
74 extern "C" real get_realtime();
75 
76 extern "C" integer round(real);
77 
timestamp(integer & day,integer & month,integer & year,integer & hour,integer & min,integer & sec)78 inline void timestamp(integer& day,  integer& month, integer& year,
79 		      integer& hour, integer& min,   integer& sec)
80 {
81     timestamp(&day, &month, &year, &hour, &min, &sec);
82 }
83 
84 #else
85 
86 #ifndef abs
87 #define abs(x) ((x) < 0 ? -(x) : (x))
88 #endif
89 #define sqr(x) ((x)*(x))
90 
91 void timestamp(integer* day,  integer* month, integer* year,
92 	       integer* hour, integer* min,   integer* sec);
93 
94 real get_realtime();
95 
96 integer round(real);
97 
98 #endif
99 
100 #ifdef TURBO_PASCAL
101 
102 #ifdef USE_CONIO
103 #include <conio.h>
104 #define readkey()    _getche()
105 #define keypressed() _kbhit()
106 #endif
107 
108 #define lo(x) ((x) & 0xFF)
109 #define hi(x) (((x) >> 8) & 0xFF)
110 #define ptr(seg, ofs) (void*)(((seg) << 16) | (ofs))
111 
112 char* get_date();
113 char* get_time();
114 
115 #define EXTERN extern
116 
117 const double pi = 3.14159265359;
118 
119 #include <ctype.h>
120 
121 #define ParamCount       paramcount
122 #define ExitProc         exitproc
123 #define RandSeed         randseed
124 #define DirectVideo      directvideo
125 #define ParamStr(i)      paramstr(i)
126 #define GetMem(p, size)  getmem(p, size)
127 #define FreeMem(p, size) freemem(p, size)
128 
129 #define upcase(c)        ((char)toupper(c))
130 #define lowcase(c)       ((char)tolower(c))
131 
132 extern "C" int paramcount;
133 extern "C" char const* const* param_array;
134 extern "C" boolean directvideo;
135 extern "C" pointer exitproc;
136 extern "C" unsigned randseed;
137 
paramstr(int index)138 inline string paramstr(int index) {
139     assert(index <= paramcount);
140     return string(param_array[index]);
141 }
142 
143 inline void halt(int code = EXIT_FAILURE) { exit(code); }
144 
145 #define getmem(ptr,size)  ptr = malloc(size)
146 #define freemem(ptr,size) free(ptr)
147 
148 extern "C" void     Randomize();
149 extern "C" unsigned randint(unsigned range);
150 extern "C" double   randreal();
151 
Random(unsigned range)152 inline unsigned Random(unsigned range) { return randint(range); }
Random()153 inline double   Random() { return randreal(); }
154 
155 #endif
156 
157 #endif
158 
159 
160