Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
26 | pmbaty | 1 | /* ACC -- Automatic Compiler Configuration |
2 | |||
3 | Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer |
||
4 | All Rights Reserved. |
||
5 | |||
6 | This software is a copyrighted work licensed under the terms of |
||
7 | the GNU General Public License. Please consult the file "ACC_LICENSE" |
||
8 | for details. |
||
9 | |||
10 | Markus F.X.J. Oberhumer |
||
11 | <markus@oberhumer.com> |
||
12 | http://www.oberhumer.com/ |
||
13 | */ |
||
14 | |||
15 | |||
16 | #ifndef __ACC_LIB_H_INCLUDED |
||
17 | #define __ACC_LIB_H_INCLUDED 1 |
||
18 | |||
19 | |||
20 | #if !defined(__ACCLIB_FUNCNAME) |
||
21 | # define __ACCLIB_FUNCNAME(f) f |
||
22 | #endif |
||
23 | #if !defined(ACCLIB_EXTERN) |
||
24 | # define ACCLIB_EXTERN(r,f) extern r __ACCLIB_FUNCNAME(f) |
||
25 | #endif |
||
26 | |||
27 | |||
28 | #if !defined(__ACCLIB_CONST_CAST_RETURN) |
||
29 | #if (ACC_CC_GNUC) |
||
30 | # define __ACCLIB_CONST_CAST_RETURN(type,var) \ |
||
31 | { union { type a; const type b; } u; u.b = (var); return u.a; } |
||
32 | #else |
||
33 | # define __ACCLIB_CONST_CAST_RETURN(type,var) return (type) (var); |
||
34 | #endif |
||
35 | #endif |
||
36 | |||
37 | |||
38 | #if (ACC_OS_WIN64) |
||
39 | # define acclib_handle_t acc_int64l_t |
||
40 | # define acclib_uhandle_t acc_uint64l_t |
||
41 | #elif (ACC_ARCH_IA32 && ACC_CC_MSC && (_MSC_VER >= 1300)) |
||
42 | typedef __w64 long acclib_handle_t; |
||
43 | typedef __w64 unsigned long acclib_uhandle_t; |
||
44 | # define acclib_handle_t acclib_handle_t |
||
45 | # define acclib_uhandle_t acclib_uhandle_t |
||
46 | #else |
||
47 | # define acclib_handle_t long |
||
48 | # define acclib_uhandle_t unsigned long |
||
49 | #endif |
||
50 | |||
51 | |||
52 | /************************************************************************* |
||
53 | // wrap <ctype.h> |
||
54 | **************************************************************************/ |
||
55 | |||
56 | #if 0 |
||
57 | ACCLIB_EXTERN(int, acc_ascii_digit) (int); |
||
58 | ACCLIB_EXTERN(int, acc_ascii_islower) (int); |
||
59 | ACCLIB_EXTERN(int, acc_ascii_isupper) (int); |
||
60 | ACCLIB_EXTERN(int, acc_ascii_tolower) (int); |
||
61 | ACCLIB_EXTERN(int, acc_ascii_toupper) (int); |
||
62 | ACCLIB_EXTERN(int, acc_ascii_utolower) (int); |
||
63 | ACCLIB_EXTERN(int, acc_ascii_utoupper) (int); |
||
64 | #endif |
||
65 | |||
66 | #define acc_ascii_isdigit(c) (((unsigned)(c) - 48) < 10) |
||
67 | #define acc_ascii_islower(c) (((unsigned)(c) - 97) < 26) |
||
68 | #define acc_ascii_isupper(c) (((unsigned)(c) - 65) < 26) |
||
69 | #define acc_ascii_tolower(c) ((int)(c) + (acc_ascii_isupper(c) << 5)) |
||
70 | #define acc_ascii_toupper(c) ((int)(c) - (acc_ascii_islower(c) << 5)) |
||
71 | |||
72 | #define acc_ascii_utolower(c) acc_ascii_tolower((unsigned char)(c)) |
||
73 | #define acc_ascii_utoupper(c) acc_ascii_toupper((unsigned char)(c)) |
||
74 | |||
75 | |||
76 | /************************************************************************* |
||
77 | // huge pointer layer |
||
78 | **************************************************************************/ |
||
79 | |||
80 | #ifndef acc_hsize_t |
||
81 | #if (ACC_HAVE_MM_HUGE_PTR) |
||
82 | # define acc_hsize_t unsigned long |
||
83 | # define acc_hvoid_p void __huge * |
||
84 | # define acc_hchar_p char __huge * |
||
85 | # define acc_hchar_pp char __huge * __huge * |
||
86 | # define acc_hbyte_p unsigned char __huge * |
||
87 | #else |
||
88 | # define acc_hsize_t size_t |
||
89 | # define acc_hvoid_p void * |
||
90 | # define acc_hchar_p char * |
||
91 | # define acc_hchar_pp char ** |
||
92 | # define acc_hbyte_p unsigned char * |
||
93 | #endif |
||
94 | #endif |
||
95 | #ifndef ACC_FILE_P |
||
96 | #define ACC_FILE_P FILE * |
||
97 | #endif |
||
98 | |||
99 | /* halloc */ |
||
100 | ACCLIB_EXTERN(acc_hvoid_p, acc_halloc) (acc_hsize_t); |
||
101 | ACCLIB_EXTERN(void, acc_hfree) (acc_hvoid_p); |
||
102 | |||
103 | /* dos_alloc */ |
||
104 | #if (ACC_OS_DOS16 || ACC_OS_OS216) |
||
105 | ACCLIB_EXTERN(void __far*, acc_dos_alloc) (unsigned long); |
||
106 | ACCLIB_EXTERN(int, acc_dos_free) (void __far*); |
||
107 | #endif |
||
108 | |||
109 | /* string */ |
||
110 | ACCLIB_EXTERN(int, acc_hmemcmp) (const acc_hvoid_p, const acc_hvoid_p, acc_hsize_t); |
||
111 | ACCLIB_EXTERN(acc_hvoid_p, acc_hmemcpy) (acc_hvoid_p, const acc_hvoid_p, acc_hsize_t); |
||
112 | ACCLIB_EXTERN(acc_hvoid_p, acc_hmemmove) (acc_hvoid_p, const acc_hvoid_p, acc_hsize_t); |
||
113 | ACCLIB_EXTERN(acc_hvoid_p, acc_hmemset) (acc_hvoid_p, int, acc_hsize_t); |
||
114 | |||
115 | /* string */ |
||
116 | ACCLIB_EXTERN(acc_hsize_t, acc_hstrlen) (const acc_hchar_p); |
||
117 | ACCLIB_EXTERN(int, acc_hstrcmp) (const acc_hchar_p, const acc_hchar_p); |
||
118 | ACCLIB_EXTERN(int, acc_hstrncmp)(const acc_hchar_p, const acc_hchar_p, acc_hsize_t); |
||
119 | ACCLIB_EXTERN(int, acc_ascii_hstricmp) (const acc_hchar_p, const acc_hchar_p); |
||
120 | ACCLIB_EXTERN(int, acc_ascii_hstrnicmp)(const acc_hchar_p, const acc_hchar_p, acc_hsize_t); |
||
121 | ACCLIB_EXTERN(int, acc_ascii_hmemicmp) (const acc_hvoid_p, const acc_hvoid_p, acc_hsize_t); |
||
122 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrstr) (const acc_hchar_p, const acc_hchar_p); |
||
123 | ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstristr) (const acc_hchar_p, const acc_hchar_p); |
||
124 | ACCLIB_EXTERN(acc_hvoid_p, acc_hmemmem) (const acc_hvoid_p, acc_hsize_t, const acc_hvoid_p, acc_hsize_t); |
||
125 | ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemimem) (const acc_hvoid_p, acc_hsize_t, const acc_hvoid_p, acc_hsize_t); |
||
126 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrcpy) (acc_hchar_p, const acc_hchar_p); |
||
127 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrcat) (acc_hchar_p, const acc_hchar_p); |
||
128 | ACCLIB_EXTERN(acc_hsize_t, acc_hstrlcpy) (acc_hchar_p, const acc_hchar_p, acc_hsize_t); |
||
129 | ACCLIB_EXTERN(acc_hsize_t, acc_hstrlcat) (acc_hchar_p, const acc_hchar_p, acc_hsize_t); |
||
130 | ACCLIB_EXTERN(int, acc_hstrscpy) (acc_hchar_p, const acc_hchar_p, acc_hsize_t); |
||
131 | ACCLIB_EXTERN(int, acc_hstrscat) (acc_hchar_p, const acc_hchar_p, acc_hsize_t); |
||
132 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrccpy) (acc_hchar_p, const acc_hchar_p, int); |
||
133 | ACCLIB_EXTERN(acc_hvoid_p, acc_hmemccpy) (acc_hvoid_p, const acc_hvoid_p, int, acc_hsize_t); |
||
134 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrchr) (const acc_hchar_p, int); |
||
135 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrrchr) (const acc_hchar_p, int); |
||
136 | ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrichr) (const acc_hchar_p, int); |
||
137 | ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrrichr) (const acc_hchar_p, int); |
||
138 | ACCLIB_EXTERN(acc_hvoid_p, acc_hmemchr) (const acc_hvoid_p, int, acc_hsize_t); |
||
139 | ACCLIB_EXTERN(acc_hvoid_p, acc_hmemrchr) (const acc_hvoid_p, int, acc_hsize_t); |
||
140 | ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemichr) (const acc_hvoid_p, int, acc_hsize_t); |
||
141 | ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemrichr) (const acc_hvoid_p, int, acc_hsize_t); |
||
142 | ACCLIB_EXTERN(acc_hsize_t, acc_hstrspn) (const acc_hchar_p, const acc_hchar_p); |
||
143 | ACCLIB_EXTERN(acc_hsize_t, acc_hstrrspn) (const acc_hchar_p, const acc_hchar_p); |
||
144 | ACCLIB_EXTERN(acc_hsize_t, acc_hstrcspn) (const acc_hchar_p, const acc_hchar_p); |
||
145 | ACCLIB_EXTERN(acc_hsize_t, acc_hstrrcspn) (const acc_hchar_p, const acc_hchar_p); |
||
146 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrpbrk) (const acc_hchar_p, const acc_hchar_p); |
||
147 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrrpbrk) (const acc_hchar_p, const acc_hchar_p); |
||
148 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrsep) (acc_hchar_pp, const acc_hchar_p); |
||
149 | ACCLIB_EXTERN(acc_hchar_p, acc_hstrrsep) (acc_hchar_pp, const acc_hchar_p); |
||
150 | ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrlwr) (acc_hchar_p); |
||
151 | ACCLIB_EXTERN(acc_hchar_p, acc_ascii_hstrupr) (acc_hchar_p); |
||
152 | ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemlwr) (acc_hvoid_p, acc_hsize_t); |
||
153 | ACCLIB_EXTERN(acc_hvoid_p, acc_ascii_hmemupr) (acc_hvoid_p, acc_hsize_t); |
||
154 | |||
155 | /* stdio */ |
||
156 | ACCLIB_EXTERN(acc_hsize_t, acc_hfread) (ACC_FILE_P, acc_hvoid_p, acc_hsize_t); |
||
157 | ACCLIB_EXTERN(acc_hsize_t, acc_hfwrite) (ACC_FILE_P, const acc_hvoid_p, acc_hsize_t); |
||
158 | |||
159 | /* io */ |
||
160 | #if (ACC_HAVE_MM_HUGE_PTR) |
||
161 | ACCLIB_EXTERN(long, acc_hread) (int, acc_hvoid_p, long); |
||
162 | ACCLIB_EXTERN(long, acc_hwrite) (int, const acc_hvoid_p, long); |
||
163 | #endif |
||
164 | ACCLIB_EXTERN(long, acc_safe_hread) (int, acc_hvoid_p, long); |
||
165 | ACCLIB_EXTERN(long, acc_safe_hwrite) (int, const acc_hvoid_p, long); |
||
166 | |||
167 | |||
168 | /************************************************************************* |
||
169 | // wrap filename limits |
||
170 | **************************************************************************/ |
||
171 | |||
172 | /* maximum length of full pathname (excl. '\0') */ |
||
173 | #if !defined(ACC_FN_PATH_MAX) |
||
174 | #if (ACC_OS_DOS16 || ACC_OS_WIN16) |
||
175 | # define ACC_FN_PATH_MAX 143 |
||
176 | #elif (ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_WIN32 || ACC_OS_WIN64) |
||
177 | # define ACC_FN_PATH_MAX 259 |
||
178 | #elif (ACC_OS_TOS) |
||
179 | # define ACC_FN_PATH_MAX 259 |
||
180 | #endif |
||
181 | #endif |
||
182 | #if !defined(ACC_FN_PATH_MAX) |
||
183 | /* arbitrary limit for acclib implementation */ |
||
184 | # define ACC_FN_PATH_MAX 1024 |
||
185 | #endif |
||
186 | |||
187 | /* maximum length of a filename (a single path component) (excl. '\0') */ |
||
188 | #if !defined(ACC_FN_NAME_MAX) |
||
189 | #if (ACC_OS_DOS16 || ACC_OS_WIN16) |
||
190 | # define ACC_FN_NAME_MAX 12 |
||
191 | #elif (ACC_OS_TOS && (ACC_CC_PUREC || ACC_CC_TURBOC)) |
||
192 | # define ACC_FN_NAME_MAX 12 |
||
193 | #elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__) |
||
194 | #elif (ACC_OS_DOS32) |
||
195 | # define ACC_FN_NAME_MAX 12 |
||
196 | #endif |
||
197 | #endif |
||
198 | #if !defined(ACC_FN_NAME_MAX) |
||
199 | # define ACC_FN_NAME_MAX ACC_FN_PATH_MAX |
||
200 | #endif |
||
201 | |||
202 | |||
203 | #define ACC_FNMATCH_NOESCAPE 1 |
||
204 | #define ACC_FNMATCH_PATHNAME 2 |
||
205 | #define ACC_FNMATCH_PATHSTAR 4 |
||
206 | #define ACC_FNMATCH_PERIOD 8 |
||
207 | #define ACC_FNMATCH_ASCII_CASEFOLD 16 |
||
208 | ACCLIB_EXTERN(int, acc_fnmatch) (const acc_hchar_p, const acc_hchar_p, int); |
||
209 | |||
210 | |||
211 | /************************************************************************* |
||
212 | // wrap <dirent.h> |
||
213 | **************************************************************************/ |
||
214 | |||
215 | #undef __ACCLIB_USE_OPENDIR |
||
216 | #if (HAVE_DIRENT_H || ACC_CC_WATCOMC) |
||
217 | # define __ACCLIB_USE_OPENDIR 1 |
||
218 | # if (ACC_OS_DOS32 && defined(__BORLANDC__)) |
||
219 | # elif (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__) |
||
220 | # elif (ACC_OS_OS2 || ACC_OS_OS216) |
||
221 | # elif (ACC_OS_TOS && ACC_CC_GNUC) |
||
222 | # elif (ACC_OS_WIN32 && !defined(ACC_HAVE_WINDOWS_H)) |
||
223 | # elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_OS2 || ACC_OS_OS216 || ACC_OS_TOS || ACC_OS_WIN16 || ACC_OS_WIN32 || ACC_OS_WIN64) |
||
224 | # undef __ACCLIB_USE_OPENDIR |
||
225 | # endif |
||
226 | #endif |
||
227 | |||
228 | |||
229 | typedef struct |
||
230 | { |
||
231 | #if defined(__ACCLIB_USE_OPENDIR) |
||
232 | void *u_dirp; /* private */ |
||
233 | # if (ACC_CC_WATCOMC) |
||
234 | unsigned short f_time; |
||
235 | unsigned short f_date; |
||
236 | unsigned long f_size; |
||
237 | # endif |
||
238 | char f_name[ACC_FN_NAME_MAX+1]; |
||
239 | #elif (ACC_OS_WIN32 || ACC_OS_WIN64) |
||
240 | acclib_handle_t u_handle; /* private */ |
||
241 | unsigned f_attr; |
||
242 | unsigned f_size_low; |
||
243 | unsigned f_size_high; |
||
244 | char f_name[ACC_FN_NAME_MAX+1]; |
||
245 | #elif (ACC_OS_DOS16 || ACC_OS_DOS32 || ACC_OS_TOS || ACC_OS_WIN16) |
||
246 | char u_dta[21]; /* private */ |
||
247 | unsigned char f_attr; |
||
248 | unsigned short f_time; |
||
249 | unsigned short f_date; |
||
250 | unsigned short f_size_low; |
||
251 | unsigned short f_size_high; |
||
252 | char f_name[ACC_FN_NAME_MAX+1]; |
||
253 | char u_dirp; /* private */ |
||
254 | #else |
||
255 | void *u_dirp; /* private */ |
||
256 | char f_name[ACC_FN_NAME_MAX+1]; |
||
257 | #endif |
||
258 | } acc_dir_t; |
||
259 | |||
260 | #ifndef acc_dir_p |
||
261 | #define acc_dir_p acc_dir_t * |
||
262 | #endif |
||
263 | |||
264 | ACCLIB_EXTERN(int, acc_opendir) (acc_dir_p, const char*); |
||
265 | ACCLIB_EXTERN(int, acc_readdir) (acc_dir_p); |
||
266 | ACCLIB_EXTERN(int, acc_closedir) (acc_dir_p); |
||
267 | |||
268 | |||
269 | /************************************************************************* |
||
270 | // wrap misc |
||
271 | **************************************************************************/ |
||
272 | |||
273 | #if (ACC_CC_GNUC) && (defined(__CYGWIN__) || defined(__MINGW32__)) |
||
274 | # define acc_alloca(x) __builtin_alloca((x)) |
||
275 | #elif (ACC_CC_BORLANDC) && defined(__linux__) |
||
276 | /* FIXME: alloca does not work */ |
||
277 | #elif (HAVE_ALLOCA) |
||
278 | # define acc_alloca(x) alloca((x)) |
||
279 | #endif |
||
280 | |||
281 | #if (ACC_OS_DOS32 && ACC_CC_GNUC) && defined(__DJGPP__) |
||
282 | # define acc_stackavail() stackavail() |
||
283 | #elif (ACC_ARCH_IA16 && ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0410)) |
||
284 | # define acc_stackavail() stackavail() |
||
285 | #elif (ACC_ARCH_IA16 && ACC_CC_BORLANDC && (__BORLANDC__ >= 0x0400)) |
||
286 | # if (ACC_OS_WIN16) && (ACC_MM_TINY || ACC_MM_SMALL || ACC_MM_MEDIUM) |
||
287 | # else |
||
288 | # define acc_stackavail() stackavail() |
||
289 | # endif |
||
290 | #elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && (ACC_CC_DMC || ACC_CC_SYMANTECC)) |
||
291 | # define acc_stackavail() stackavail() |
||
292 | #elif ((ACC_ARCH_IA16) && ACC_CC_MSC && (_MSC_VER >= 700)) |
||
293 | # define acc_stackavail() _stackavail() |
||
294 | #elif ((ACC_ARCH_IA16) && ACC_CC_MSC) |
||
295 | # define acc_stackavail() stackavail() |
||
296 | #elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && ACC_CC_TURBOC && (__TURBOC__ >= 0x0450)) |
||
297 | # define acc_stackavail() stackavail() |
||
298 | #elif (ACC_ARCH_IA16 && ACC_CC_TURBOC && (__TURBOC__ >= 0x0400)) |
||
299 | ACC_EXTERN_C size_t __cdecl stackavail(void); |
||
300 | # define acc_stackavail() stackavail() |
||
301 | #elif ((ACC_ARCH_IA16 || ACC_ARCH_IA32) && (ACC_CC_WATCOMC)) |
||
302 | # define acc_stackavail() stackavail() |
||
303 | #elif (ACC_ARCH_IA16 && ACC_CC_ZORTECHC) |
||
304 | # define acc_stackavail() _chkstack() |
||
305 | #endif |
||
306 | |||
307 | ACCLIB_EXTERN(acclib_handle_t, acc_get_osfhandle) (int); |
||
308 | ACCLIB_EXTERN(int, acc_isatty) (int); |
||
309 | ACCLIB_EXTERN(int, acc_mkdir) (const char*, unsigned); |
||
310 | ACCLIB_EXTERN(int, acc_response) (int*, char***); |
||
311 | ACCLIB_EXTERN(int, acc_set_binmode) (int, int); |
||
312 | |||
313 | ACCLIB_EXTERN(acc_int32l_t, acc_muldiv32) (acc_int32l_t, acc_int32l_t, acc_int32l_t); |
||
314 | ACCLIB_EXTERN(acc_uint32l_t, acc_umuldiv32) (acc_uint32l_t, acc_uint32l_t, acc_uint32l_t); |
||
315 | |||
316 | ACCLIB_EXTERN(void, acc_wildargv) (int*, char***); |
||
317 | |||
318 | |||
319 | /************************************************************************* |
||
320 | // uclock (real, i.e. "wall" clock) |
||
321 | **************************************************************************/ |
||
322 | |||
323 | #if defined(acc_int32e_t) |
||
324 | ACCLIB_EXTERN(int, acc_tsc_read) (acc_uint32e_t*); |
||
325 | ACCLIB_EXTERN(int, acc_tsc_read_add) (acc_uint32e_t*); |
||
326 | #endif |
||
327 | |||
328 | |||
329 | typedef struct { /* all private */ |
||
330 | acclib_handle_t h; |
||
331 | int mode; |
||
332 | #if (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t) |
||
333 | double qpf; |
||
334 | #endif |
||
335 | } acc_uclock_handle_t; |
||
336 | |||
337 | typedef struct { /* all private */ |
||
338 | union { |
||
339 | acc_uint32l_t t32; |
||
340 | #if !(ACC_OS_DOS16 || ACC_OS_WIN16) |
||
341 | double td; |
||
342 | # if defined(acc_int64l_t) |
||
343 | acc_int64l_t t64; |
||
344 | # endif |
||
345 | #endif |
||
346 | } ticks; |
||
347 | #if (ACC_HAVE_WINDOWS_H) && defined(acc_int64l_t) |
||
348 | acc_int64l_t qpc; |
||
349 | #endif |
||
350 | } acc_uclock_t; |
||
351 | |||
352 | #ifndef acc_uclock_handle_p |
||
353 | #define acc_uclock_handle_p acc_uclock_handle_t * |
||
354 | #endif |
||
355 | #ifndef acc_uclock_p |
||
356 | #define acc_uclock_p acc_uclock_t * |
||
357 | #endif |
||
358 | |||
359 | ACCLIB_EXTERN(int, acc_uclock_open) (acc_uclock_handle_p); |
||
360 | ACCLIB_EXTERN(int, acc_uclock_close) (acc_uclock_handle_p); |
||
361 | ACCLIB_EXTERN(void, acc_uclock_read) (acc_uclock_handle_p, acc_uclock_p); |
||
362 | ACCLIB_EXTERN(double, acc_uclock_get_elapsed) (acc_uclock_handle_p, const acc_uclock_p, const acc_uclock_p); |
||
363 | |||
364 | |||
365 | /************************************************************************* |
||
366 | // performance counters (virtual clock) |
||
367 | **************************************************************************/ |
||
368 | |||
369 | #if defined(acc_int64l_t) |
||
370 | |||
371 | typedef struct { /* all private */ |
||
372 | void* h; |
||
373 | unsigned cpu_type, cpu_features, cpu_khz, cpu_nrctrs; |
||
374 | const char* cpu_name; |
||
375 | } acc_perfctr_handle_t; |
||
376 | |||
377 | typedef struct { |
||
378 | acc_uint64l_t tsc; |
||
379 | #if (ACC_OS_POSIX_LINUX) |
||
380 | acc_uint64l_t pmc[18]; |
||
381 | #else |
||
382 | acc_uint64l_t pmc[1]; |
||
383 | #endif |
||
384 | } acc_perfctr_clock_t; |
||
385 | |||
386 | #ifndef acc_perfctr_handle_p |
||
387 | #define acc_perfctr_handle_p acc_perfctr_handle_t * |
||
388 | #endif |
||
389 | #ifndef acc_perfctr_clock_p |
||
390 | #define acc_perfctr_clock_p acc_perfctr_clock_t * |
||
391 | #endif |
||
392 | |||
393 | ACCLIB_EXTERN(int, acc_perfctr_open) (acc_perfctr_handle_p); |
||
394 | ACCLIB_EXTERN(int, acc_perfctr_close) (acc_perfctr_handle_p); |
||
395 | ACCLIB_EXTERN(void, acc_perfctr_read) (acc_perfctr_handle_p, acc_perfctr_clock_p); |
||
396 | ACCLIB_EXTERN(double, acc_perfctr_get_elapsed) (acc_perfctr_handle_p, const acc_perfctr_clock_p, const acc_perfctr_clock_p); |
||
397 | ACCLIB_EXTERN(double, acc_perfctr_get_elapsed_tsc) (acc_perfctr_handle_p, acc_uint64l_t); |
||
398 | |||
399 | #endif |
||
400 | |||
401 | |||
402 | /************************************************************************* |
||
403 | // Big Endian / Little Endian |
||
404 | **************************************************************************/ |
||
405 | |||
406 | ACCLIB_EXTERN(unsigned, acc_get_be16) (const acc_hvoid_p); |
||
407 | ACCLIB_EXTERN(acc_uint32l_t, acc_get_be24) (const acc_hvoid_p); |
||
408 | ACCLIB_EXTERN(acc_uint32l_t, acc_get_be32) (const acc_hvoid_p); |
||
409 | ACCLIB_EXTERN(void, acc_set_be16) (acc_hvoid_p, unsigned); |
||
410 | ACCLIB_EXTERN(void, acc_set_be24) (acc_hvoid_p, acc_uint32l_t); |
||
411 | ACCLIB_EXTERN(void, acc_set_be32) (acc_hvoid_p, acc_uint32l_t); |
||
412 | ACCLIB_EXTERN(unsigned, acc_get_le16) (const acc_hvoid_p); |
||
413 | ACCLIB_EXTERN(acc_uint32l_t, acc_get_le24) (const acc_hvoid_p); |
||
414 | ACCLIB_EXTERN(acc_uint32l_t, acc_get_le32) (const acc_hvoid_p); |
||
415 | ACCLIB_EXTERN(void, acc_set_le16) (acc_hvoid_p, unsigned); |
||
416 | ACCLIB_EXTERN(void, acc_set_le24) (acc_hvoid_p, acc_uint32l_t); |
||
417 | ACCLIB_EXTERN(void, acc_set_le32) (acc_hvoid_p, acc_uint32l_t); |
||
418 | #if defined(acc_uint64l_t) |
||
419 | ACCLIB_EXTERN(acc_uint64l_t, acc_get_be64) (const acc_hvoid_p); |
||
420 | ACCLIB_EXTERN(void, acc_set_be64) (acc_hvoid_p, acc_uint64l_t); |
||
421 | ACCLIB_EXTERN(acc_uint64l_t, acc_get_le64) (const acc_hvoid_p); |
||
422 | ACCLIB_EXTERN(void, acc_set_le64) (acc_hvoid_p, acc_uint64l_t); |
||
423 | #endif |
||
424 | |||
425 | /* inline versions */ |
||
426 | #if (ACC_ARCH_AMD64 || ACC_ARCH_IA32) |
||
427 | # define ACC_GET_LE16(p) (* (const unsigned short *) (p)) |
||
428 | # define ACC_GET_LE32(p) (* (const acc_uint32e_t *) (p)) |
||
429 | # define ACC_SET_LE16(p,v) (* (unsigned short *) (p) = (unsigned short) (v)) |
||
430 | # define ACC_SET_LE32(p,v) (* (acc_uint32e_t *) (p) = (acc_uint32e_t) (v)) |
||
431 | #endif |
||
432 | #if (ACC_ARCH_AMD64) |
||
433 | # define ACC_GET_LE64(p) (* (const acc_uint64l_t *) (p)) |
||
434 | # define ACC_SET_LE64(p,v) (* (acc_uint64l_t *) (p) = (acc_uint64l_t) (v)) |
||
435 | #endif |
||
436 | |||
437 | |||
438 | /************************************************************************* |
||
439 | // getopt |
||
440 | **************************************************************************/ |
||
441 | |||
442 | typedef struct { |
||
443 | const char* name; |
||
444 | int has_arg; |
||
445 | int* flag; |
||
446 | int val; |
||
447 | } acc_getopt_longopt_t; |
||
448 | #ifndef acc_getopt_longopt_p |
||
449 | #define acc_getopt_longopt_p acc_getopt_longopt_t * |
||
450 | #endif |
||
451 | |||
452 | typedef struct { |
||
453 | int go_argc; |
||
454 | char** go_argv; |
||
455 | const char* go_shortopts; |
||
456 | const acc_getopt_longopt_p longopts; |
||
457 | #if (ACC_BROKEN_CDECL_ALT_SYNTAX) |
||
458 | int __acc_cdecl_va (*go_error)(const char *, ...); |
||
459 | #else |
||
460 | int (__acc_cdecl_va *go_error)(const char *, ...); |
||
461 | #endif |
||
462 | } acc_getopt_t; |
||
463 | #ifndef acc_getopt_p |
||
464 | #define acc_getopt_p acc_getopt_t * |
||
465 | #endif |
||
466 | |||
467 | ACCLIB_EXTERN(void, acc_getopt_init) (acc_getopt_p); |
||
468 | ACCLIB_EXTERN(int, acc_getopt) (acc_getopt_p); |
||
469 | ACCLIB_EXTERN(void, acc_getopt_close)(acc_getopt_p); |
||
470 | |||
471 | |||
472 | /************************************************************************* |
||
473 | // rand |
||
474 | **************************************************************************/ |
||
475 | |||
476 | typedef struct { /* all private */ |
||
477 | acc_uint32l_t seed; |
||
478 | } acc_rand31_t; |
||
479 | #ifndef acc_rand31_p |
||
480 | #define acc_rand31_p acc_rand31_t * |
||
481 | #endif |
||
482 | ACCLIB_EXTERN(void, acc_srand31) (acc_rand31_p, acc_uint32l_t); |
||
483 | ACCLIB_EXTERN(acc_uint32l_t, acc_rand31) (acc_rand31_p); |
||
484 | |||
485 | #if defined(acc_uint64l_t) |
||
486 | typedef struct { /* all private */ |
||
487 | acc_uint64l_t seed; |
||
488 | } acc_rand48_t; |
||
489 | #ifndef acc_rand48_p |
||
490 | #define acc_rand48_p acc_rand48_t * |
||
491 | #endif |
||
492 | ACCLIB_EXTERN(void, acc_srand48) (acc_rand48_p, acc_uint32l_t); |
||
493 | ACCLIB_EXTERN(acc_uint32l_t, acc_rand48) (acc_rand48_p); |
||
494 | ACCLIB_EXTERN(acc_uint32l_t, acc_rand48_r32) (acc_rand48_p); |
||
495 | #endif |
||
496 | |||
497 | #if defined(acc_uint64l_t) |
||
498 | typedef struct { /* all private */ |
||
499 | acc_uint64l_t seed; |
||
500 | } acc_rand64_t; |
||
501 | #ifndef acc_rand64_p |
||
502 | #define acc_rand64_p acc_rand64_t * |
||
503 | #endif |
||
504 | ACCLIB_EXTERN(void, acc_srand64) (acc_rand64_p, acc_uint64l_t); |
||
505 | ACCLIB_EXTERN(acc_uint32l_t, acc_rand64) (acc_rand64_p); |
||
506 | ACCLIB_EXTERN(acc_uint32l_t, acc_rand64_r32) (acc_rand64_p); |
||
507 | #endif |
||
508 | |||
509 | typedef struct { /* all private */ |
||
510 | unsigned n; |
||
511 | acc_uint32l_t s[624]; |
||
512 | } acc_randmt_t; |
||
513 | #ifndef acc_randmt_p |
||
514 | #define acc_randmt_p acc_randmt_t * |
||
515 | #endif |
||
516 | ACCLIB_EXTERN(void, acc_srandmt) (acc_randmt_p, acc_uint32l_t); |
||
517 | ACCLIB_EXTERN(acc_uint32l_t, acc_randmt) (acc_randmt_p); |
||
518 | ACCLIB_EXTERN(acc_uint32l_t, acc_randmt_r32) (acc_randmt_p); |
||
519 | |||
520 | |||
521 | #endif /* already included */ |
||
522 | |||
523 | |||
524 | /* |
||
525 | vi:ts=4:et |
||
526 | */ |