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 */
527