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