1 /* @(#)mconfig.h	1.71 15/08/14 Copyright 1995-2015 J. Schilling */
2 /*
3  *	definitions for machine configuration
4  *
5  *	Copyright (c) 1995-2015 J. Schilling
6  *
7  *	This file must be included before any other file.
8  *	If this file is not included before stdio.h you will not be
9  *	able to get LARGEFILE support
10  *
11  *	Use only cpp instructions.
12  *
13  *	NOTE: SING: (Schily Is Not Gnu)
14  */
15 /*
16  * The contents of this file are subject to the terms of the
17  * Common Development and Distribution License, Version 1.0 only
18  * (the "License").  You may not use this file except in compliance
19  * with the License.
20  *
21  * See the file CDDL.Schily.txt in this distribution for details.
22  * A copy of the CDDL is also available via the Internet at
23  * http://www.opensource.org/licenses/cddl1.txt
24  *
25  * When distributing Covered Code, include this CDDL HEADER in each
26  * file and include the License file CDDL.Schily.txt from this distribution.
27  */
28 
29 #ifndef _SCHILY_MCONFIG_H
30 #define	_SCHILY_MCONFIG_H
31 
32 /*
33  * Tell our users that this is a Schily SING compile environment.
34  */
35 #define	IS_SCHILY
36 
37 /*
38  * We need to do this before we include xconfig.h
39  */
40 #ifdef	NO_LARGEFILES
41 #undef	USE_LARGEFILES
42 #endif
43 #ifdef	NO_ACL
44 #undef	USE_ACL
45 #endif
46 
47 /*
48  * Inside <schily/archdefs.h> we get architecture specific Processor defines
49  * fetched from compiler predefinitions only.
50  */
51 #include <schily/archdefs.h>
52 
53 /*
54  * Inside <schily/xconfig.h> we decide whether to use static or dynamic
55  * autoconf stuff.
56  */
57 #include <schily/xconfig.h>
58 
59 /*
60  * Make sure that neither HAVE_LARGEFILES nor USE_LARGEFILES is defined
61  * if the platform does not support large files.
62  */
63 #ifndef	HAVE_LARGEFILES
64 #undef	USE_LARGEFILES
65 #endif
66 
67 #ifdef __cplusplus
68 extern "C" {
69 #endif
70 
71 /*
72  * The NetBSD people want to bother us.
73  * They removed the definition for 'unix' and are bleating for every test
74  * for #if defined(unix). So we need to check for NetBSD early.
75  */
76 #ifndef	IS_UNIX
77 #	if defined(__NetBSD__)
78 #		define	IS_UNIX
79 #	endif
80 #endif
81 
82 #ifndef	IS_UNIX
83 #	if (defined(unix) || defined(__unix) || defined(__unix__)) && \
84 	!defined(__DJGPP__)
85 #		define	IS_UNIX
86 #	endif
87 #endif
88 
89 #ifdef	__MSDOS__
90 #	define	IS_MSDOS
91 #endif
92 
93 #if defined(tos) || defined(__tos)
94 #	define	IS_TOS
95 #endif
96 
97 #ifdef	THINK_C
98 #	define	IS_MAC
99 #endif
100 
101 #if defined(sun) || defined(__sun) || defined(__sun__)
102 #	define	IS_SUN
103 #endif
104 
105 #if defined(__CYGWIN32__) || defined(__CYGWIN__)
106 #	define	IS_GCC_WIN32
107 #	define	IS_CYGWIN
108 
109 #if	defined(unix) || defined(_X86)
110 #	define	IS_CYGWIN_1
111 #endif
112 #endif
113 
114 /* ------------------------------------------------------------------------- */
115 /*
116  * Some magic that cannot (yet) be figured out with autoconf.
117  */
118 
119 #if defined(sun3) || defined(mc68000) || defined(mc68020)
120 #	ifndef	HAVE_SCANSTACK
121 #	define	HAVE_SCANSTACK
122 #	endif
123 #endif
124 #ifdef sparc
125 #	ifndef	HAVE_LDSTUB
126 #	define	HAVE_LDSTUB
127 #	endif
128 #	ifndef	HAVE_SCANSTACK
129 #	define	HAVE_SCANSTACK
130 #	endif
131 #endif
132 #if	defined(__i386_) || defined(i386)
133 #	ifndef	HAVE_XCHG
134 #	define	HAVE_XCHG
135 #	endif
136 #	ifndef	HAVE_SCANSTACK
137 #	define	HAVE_SCANSTACK
138 #	endif
139 #endif
140 
141 /*
142  * Use of SCANSTACK is disabled by default
143  */
144 #ifndef	USE_SCANSTACK
145 #	undef	HAVE_SCANSTACK
146 #else
147 /*
148  * But ....
149  * The tests are much better now, so always give it a chance.
150  */
151 #ifndef	HAVE_SCANSTACK
152 #	define	HAVE_SCANSTACK
153 #endif
154 #endif
155 
156 /*
157  * Allow to overwrite the defines in the makefiles by calling
158  *
159  *	make COPTX=-DFORCE_SCANSTACK
160  */
161 #ifdef	FORCE_SCANSTACK
162 #	undef	NO_SCANSTACK
163 #ifndef	HAVE_SCANSTACK
164 #	define	HAVE_SCANSTACK
165 #endif
166 #ifndef	USE_SCANSTACK
167 #	define	USE_SCANSTACK
168 #endif
169 #endif
170 
171 /*
172  * This is the global switch to deactivate stack scanning
173  */
174 #ifdef	NO_SCANSTACK
175 #	ifdef	HAVE_SCANSTACK
176 #	undef	HAVE_SCANSTACK
177 #	endif
178 #endif
179 
180 /*
181  * This is the global switch to deactivate using #pragma weak
182  */
183 #ifdef	NO_PRAGMA_WEAK
184 #	ifdef	HAVE_PRAGMA_WEAK
185 #	undef	HAVE_PRAGMA_WEAK
186 #	endif
187 #endif
188 
189 #ifdef	NO_FORK
190 #	ifdef	HAVE_FORK
191 #	undef	HAVE_FORK
192 #	endif
193 #	ifdef	HAVE_VFORK
194 #	undef	HAVE_VFORK
195 #	endif
196 #endif
197 #ifdef	NO_VFORK
198 #	ifdef	HAVE_VFORK
199 #	undef	HAVE_VFORK
200 #	endif
201 #endif
202 
203 #if	defined(SOL2) || defined(SOL2) || \
204 	defined(S5R4) || defined(__S5R4) || defined(SVR4)
205 #	ifndef	__SVR4
206 #		define	__SVR4
207 #	endif
208 #endif
209 
210 #ifdef	__SVR4
211 #	ifndef	SVR4
212 #		define	SVR4
213 #	endif
214 #endif
215 
216 /*
217  * SunOS 4.x / SunOS 5.x
218  */
219 #if defined(IS_SUN)
220 #	define	HAVE_GETAV0
221 #endif
222 
223 /*
224  * AIX
225  */
226 #if	defined(_IBMR2) || defined(_AIX)
227 #	ifndef	IS_UNIX
228 #	define	IS_UNIX		/* ??? really ??? */
229 #	endif
230 #endif
231 
232 /*
233  * QNX
234  */
235 #if defined(__QNX__)
236 #	ifndef	IS_UNIX
237 #	define	IS_UNIX
238 #	endif
239 #endif
240 
241 /*
242  * Silicon Graphics	(must be before SVR4)
243  */
244 #if defined(sgi) || defined(__sgi)
245 #	define	__NOT_SVR4__	/* Not a real SVR4 implementation */
246 #endif
247 
248 /*
249  * Data General
250  */
251 #if defined(__DGUX__)
252 #ifdef	XXXXXXX
253 #	undef	HAVE_MTGET_DSREG
254 #	undef	HAVE_MTGET_RESID
255 #	undef	HAVE_MTGET_FILENO
256 #	undef	HAVE_MTGET_BLKNO
257 #endif
258 #	define	mt_type		mt_model
259 #	define	mt_dsreg	mt_status1
260 #	define	mt_erreg	mt_status2
261 	/*
262 	 * DGUX hides its flock as dg_flock.
263 	 */
264 #	define	HAVE_FLOCK
265 #	define	flock	dg_flock
266 	/*
267 	 * Use the BSD style wait on DGUX to get the resource usages of child
268 	 * processes.
269 	 */
270 #	define	_BSD_WAIT_FLAVOR
271 #endif
272 
273 /*
274  * Apple Rhapsody (This is the name for Mac OS X beta)
275  */
276 #if defined(__NeXT__) && defined(__TARGET_OSNAME) && __TARGET_OSNAME == rhapsody
277 #	define	HAVE_OSDEF /* prevent later definitions to overwrite current */
278 #	ifndef	IS_UNIX
279 #	define	IS_UNIX
280 #	endif
281 #endif
282 
283 /*
284  * NextStep
285  */
286 #if defined(__NeXT__) && !defined(HAVE_OSDEF)
287 #define	NO_PRINT_OVR
288 #undef	HAVE_USG_STDIO
289 				/*
290 				 * NeXT Step 3.x uses
291 				 * __flsbuf(unsigned char, FILE *)
292 				 * instead of __flsbuf(int, FILE *)
293 				 */
294 #	ifndef	IS_UNIX
295 #	define	IS_UNIX
296 #	endif
297 #endif
298 
299 /*
300  * Mac OS X
301  */
302 #if defined(__APPLE__) && defined(__MACH__)
303 #	ifndef	IS_UNIX
304 #	define	IS_UNIX
305 #	endif
306 #	define	IS_MACOS_X
307 #endif
308 
309 /*
310  * NextStep 3.x has a broken linker that does not allow us to override
311  * these functions.
312  */
313 #ifndef	__OPRINTF__
314 
315 #ifdef	NO_PRINT_OVR
316 #	define	printf	Xprintf
317 #	define	fprintf	Xfprintf
318 #	define	sprintf	Xsprintf
319 #endif
320 
321 #endif	/* __OPRINTF__ */
322 
323 /* ------------------------------------------------------------------------- */
324 
325 #ifndef	_SCHILY_PROTOTYP_H
326 #include <schily/prototyp.h>
327 #endif
328 
329 /*
330  * We use HAVE_LONGLONG as generalized test on whether "long long", "__in64" or
331  * something similar exist.
332  *
333  * In case that HAVE_LONGLONG is defined here, this is an indication that
334  * "long long" works. We define HAVE_LONG_LONG to keep this knowledge.
335  */
336 #ifdef	HAVE_LONGLONG
337 #	define	HAVE_LONG_LONG
338 #endif
339 
340 /*
341  * Microsoft C defines _MSC_VER
342  * use __int64 instead of long long and use 0i64 for a signed long long const
343  * and 0ui64 for an unsigned long long const.
344  *
345  * #if defined(HAVE___INT64)
346  *	use __int64
347  * #elif defined(HAVE_LONGLONG)
348  *	use long long
349  * #endif
350  *
351  * Be very careful here as older MSVC versions do not implement long long but
352  * rather __int64 and once someone makes 'long long' 128 bits on a 64 bit
353  * machine, we may need to check for a MSVC __int128 type.
354  */
355 #ifndef	HAVE_LONGLONG
356 #	if	defined(HAVE___INT64)
357 #		define	HAVE_LONGLONG
358 #	endif
359 #endif
360 
361 /*
362  * gcc 2.x generally implements the "long long" type.
363  */
364 #ifdef	__GNUC__
365 #	if	__GNUC__ > 1
366 #		ifndef	HAVE_LONGLONG
367 #			define	HAVE_LONGLONG
368 #		endif
369 #		ifndef	HAVE_LONG_LONG
370 #			define	HAVE_LONG_LONG
371 #		endif
372 #	endif
373 #endif
374 
375 #ifdef	__CHAR_UNSIGNED__	/* GNU GCC define (dynamic)	*/
376 #ifndef CHAR_IS_UNSIGNED
377 #define	CHAR_IS_UNSIGNED	/* Sing Schily define (static)	*/
378 #endif
379 #endif
380 
381 /*
382  * Convert to GNU name
383  */
384 #ifdef	HAVE_STDC_HEADERS
385 #	ifndef	STDC_HEADERS
386 #		define	STDC_HEADERS
387 #	endif
388 #endif
389 /*
390  * Convert to SCHILY name
391  */
392 #ifdef	STDC_HEADERS
393 #	ifndef	HAVE_STDC_HEADERS
394 #		define	HAVE_STDC_HEADERS
395 #	endif
396 #endif
397 
398 #ifdef	IS_UNIX
399 #	define	HAVE_PATH_DELIM
400 #	define	PATH_DELIM		'/'
401 #	define	PATH_DELIM_STR		"/"
402 #	define	PATH_ENV_DELIM		':'
403 #	define	PATH_ENV_DELIM_STR	":"
404 #	define	far
405 #	define	near
406 #endif
407 
408 /*
409  * Win32 with Gygwin
410  */
411 #ifdef	IS_GCC_WIN32
412 #	define	HAVE_PATH_DELIM
413 #	define	PATH_DELIM		'/'
414 #	define	PATH_DELIM_STR		"/"
415 #	define	PATH_ENV_DELIM		':'
416 #	define	PATH_ENV_DELIM_STR	":"
417 #	define	HAVE_DOS_DRIVELETTER
418 #	define	far
419 #	define	near
420 #	define	NEED_O_BINARY
421 #endif
422 
423 /*
424  * Win32 with Mingw32
425  */
426 #ifdef	__MINGW32__
427 #	define	HAVE_PATH_DELIM
428 #	define	PATH_DELIM		'/'
429 #	define	PATH_DELIM_STR		"/"
430 #	define	PATH_ENV_DELIM		';'
431 #	define	PATH_ENV_DELIM_STR	";"
432 #	define	HAVE_DOS_DRIVELETTER
433 #	define	far
434 #	define	near
435 #	define	NEED_O_BINARY
436 #endif
437 
438 /*
439  * OS/2 EMX
440  */
441 #ifdef	__EMX__				/* We don't want to call it UNIX */
442 #	define	HAVE_PATH_DELIM
443 #	define	PATH_DELIM		'/'
444 #	define	PATH_DELIM_STR		"/"
445 #	define	PATH_ENV_DELIM		';'
446 #	define	PATH_ENV_DELIM_STR	";"
447 #	define	HAVE_DOS_DRIVELETTER
448 #	define	far
449 #	define	near
450 #	define	NEED_O_BINARY
451 #endif
452 
453 #ifdef	__BEOS__			/* We don't want to call it UNIX */
454 #	define	HAVE_PATH_DELIM
455 #	define	PATH_DELIM		'/'
456 #	define	PATH_DELIM_STR		"/"
457 #	define	PATH_ENV_DELIM		':'
458 #	define	PATH_ENV_DELIM_STR	":"
459 #	define	far
460 #	define	near
461 #endif
462 
463 /*
464  * DOS with DJGPP
465  */
466 #ifdef	__DJGPP__			/* We don't want to call it UNIX */
467 #	define	HAVE_PATH_DELIM
468 #	define	PATH_DELIM		'/'
469 #	define	PATH_DELIM_STR		"/"
470 #	define	PATH_ENV_DELIM		';'
471 #	define	PATH_ENV_DELIM_STR	";"
472 #	define	HAVE_DOS_DRIVELETTER
473 
474 #	define	NEED_O_BINARY
475 #endif
476 
477 /*
478  * Vanilla DOS
479  */
480 #if	defined(IS_MSDOS) && !defined(__DJGPP__)
481 #	define	HAVE_PATH_DELIM
482 #	define	PATH_DELIM		'\\'
483 #	define	PATH_DELIM_STR		"\\"
484 #	define	PATH_ENV_DELIM		';'
485 #	define	PATH_ENV_DELIM_STR	";"
486 #	define	HAVE_DOS_DRIVELETTER
487 
488 #	define	NEED_O_BINARY
489 #endif
490 
491 /*
492  * ATARI TOS
493  */
494 #ifdef	IS_TOS
495 #	define	HAVE_PATH_DELIM
496 #	define	PATH_DELIM		'\\'
497 #	define	PATH_DELIM_STR		"\\"
498 #	define	PATH_ENV_DELIM		','
499 #	define	PATH_ENV_DELIM_STR	","
500 #	define	HAVE_DOS_DRIVELETTER
501 #	define	far
502 #	define	near
503 #endif
504 
505 /*
506  * Mac OS 9
507  */
508 #ifdef	IS_MAC
509 #	define	HAVE_PATH_DELIM
510 #	define	PATH_DELIM		':'
511 #	define	PATH_DELIM_STR		":"
512 #	define	PATH_ENV_DELIM		';'	/* ??? */
513 #	define	PATH_ENV_DELIM_STR	";"	/* ??? */
514 #	define	far
515 #	define	near
516 #endif
517 
518 /*
519  * I hope this will make compilation on unknown OS easier.
520  */
521 #ifndef	HAVE_PATH_DELIM			/* Default to POSIX rules */
522 #	define	HAVE_PATH_DELIM
523 #	define	PATH_DELIM		'/'
524 #	define	PATH_DELIM_STR		"/"
525 #	define	PATH_ENV_DELIM		':'
526 #	define	PATH_ENV_DELIM_STR	":"
527 #	define	far
528 #	define	near
529 #endif
530 
531 /*
532  * Is there a solution for /dev/tty and similar?
533  */
534 #ifdef	HAVE__DEV_NULL
535 #	define	DEV_NULL		"/dev/null"
536 #else
537 #if defined(_MSC_VER) || defined(__MINGW32__)
538 #	define	DEV_NULL		"NUL"
539 #else
540 /*
541  * What to do here?
542  */
543 #endif
544 #endif
545 
546 #ifdef	DBG_MALLOC
547 /*
548  * We need to include this here already in order to make sure that
549  * every program that is based on mconfig.h will include schily/dbgmalloc.h
550  * in case that we specify -DDBG_MALLOC
551  */
552 #include <schily/dbgmalloc.h>
553 #endif
554 
555 #ifdef __cplusplus
556 }
557 #endif
558 
559 #endif /* _SCHILY_MCONFIG_H */
560