source: trunk/src/kmk/make.h@ 1838

Last change on this file since 1838 was 1835, checked in by bird, 17 years ago

kmk: fixed assertion + made them useful.

  • Property svn:eol-style set to native
File size: 20.6 KB
Line 
1/* Miscellaneous global declarations and portability cruft for GNU Make.
2Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
31998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
4Foundation, Inc.
5This file is part of GNU Make.
6
7GNU Make is free software; you can redistribute it and/or modify it under the
8terms of the GNU General Public License as published by the Free Software
9Foundation; either version 2, or (at your option) any later version.
10
11GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License along with
16GNU Make; see the file COPYING. If not, write to the Free Software
17Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */
18
19/* We use <config.h> instead of "config.h" so that a compilation
20 using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
21 (which it would do because make.h was found in $srcdir). */
22#include <config.h>
23#undef HAVE_CONFIG_H
24#define HAVE_CONFIG_H 1
25
26/* AIX requires this to be the first thing in the file. */
27#ifndef __GNUC__
28# if HAVE_ALLOCA_H
29# include <alloca.h>
30# else
31# ifdef _AIX
32 #pragma alloca
33# else
34# ifndef alloca /* predefined by HP cc +Olibcalls */
35char *alloca ();
36# endif
37# endif
38# endif
39#endif
40
41
42/* Specify we want GNU source code. This must be defined before any
43 system headers are included. */
44
45#define _GNU_SOURCE 1
46
47
48#ifdef CRAY
49/* This must happen before #include <signal.h> so
50 that the declaration therein is changed. */
51# define signal bsdsignal
52#endif
53
54/* If we're compiling for the dmalloc debugger, turn off string inlining. */
55#if defined(HAVE_DMALLOC_H) && defined(__GNUC__)
56# define __NO_STRING_INLINES
57#endif
58
59#include <sys/types.h>
60#include <sys/stat.h>
61#include <signal.h>
62#include <stdio.h>
63#include <ctype.h>
64#ifdef HAVE_SYS_TIMEB_H
65/* SCO 3.2 "devsys 4.2" has a prototype for `ftime' in <time.h> that bombs
66 unless <sys/timeb.h> has been included first. Does every system have a
67 <sys/timeb.h>? If any does not, configure should check for it. */
68# include <sys/timeb.h>
69#endif
70
71#if TIME_WITH_SYS_TIME
72# include <sys/time.h>
73# include <time.h>
74#else
75# if HAVE_SYS_TIME_H
76# include <sys/time.h>
77# else
78# include <time.h>
79# endif
80#endif
81
82#include <errno.h>
83
84#ifndef errno
85extern int errno;
86#endif
87
88#ifndef isblank
89# define isblank(c) ((c) == ' ' || (c) == '\t')
90#endif
91
92#ifdef HAVE_UNISTD_H
93# include <unistd.h>
94/* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get
95 POSIX.1 behavior with `cc -YPOSIX', which predefines POSIX itself! */
96# if defined (_POSIX_VERSION) && !defined (ultrix) && !defined (VMS)
97# define POSIX 1
98# endif
99#endif
100
101/* Some systems define _POSIX_VERSION but are not really POSIX.1. */
102#if (defined (butterfly) || defined (__arm) || (defined (__mips) && defined (_SYSTYPE_SVR3)) || (defined (sequent) && defined (i386)))
103# undef POSIX
104#endif
105
106#if !defined (POSIX) && defined (_AIX) && defined (_POSIX_SOURCE)
107# define POSIX 1
108#endif
109
110#ifndef RETSIGTYPE
111# define RETSIGTYPE void
112#endif
113
114#ifndef sigmask
115# define sigmask(sig) (1 << ((sig) - 1))
116#endif
117
118#ifndef HAVE_SA_RESTART
119# define SA_RESTART 0
120#endif
121
122#ifdef HAVE_LIMITS_H
123# include <limits.h>
124#endif
125#ifdef HAVE_SYS_PARAM_H
126# include <sys/param.h>
127#endif
128
129#ifndef PATH_MAX
130# ifndef POSIX
131# define PATH_MAX MAXPATHLEN
132# endif
133#endif
134#ifndef MAXPATHLEN
135# define MAXPATHLEN 1024
136#endif
137
138#ifdef PATH_MAX
139# define GET_PATH_MAX PATH_MAX
140# define PATH_VAR(var) char var[PATH_MAX]
141#else
142# define NEED_GET_PATH_MAX 1
143# define GET_PATH_MAX (get_path_max ())
144# define PATH_VAR(var) char *var = alloca (GET_PATH_MAX)
145unsigned int get_path_max (void);
146#endif
147
148#ifndef CHAR_BIT
149# define CHAR_BIT 8
150#endif
151
152#if defined(KMK) || defined(CONFIG_WITH_VALUE_LENGTH)
153# ifdef _MSC_VER
154# define MY_INLINE _inline static
155# define MY_DBGBREAK __debugbreak()
156# elif defined(__GNUC__)
157# define MY_INLINE static __inline__
158# if defined(__i386__) || defined(__x86_64__)
159# define MY_DBGBREAK __asm__ __volatile__ ("int3")
160#else
161# define MY_DBGBREAK assert(0)
162# endif
163# else
164# define MY_INLINE static
165# define MY_DBGBREAK assert(0)
166# endif
167# ifndef NDEBUG
168# define MY_ASSERT_MSG(expr, printfargs) \
169 do { if (!(expr)) { printf printfargs; MY_DBGBREAK; } } while (0)
170# else
171# define MY_ASSERT_MSG(expr, printfargs) do { } while (0)
172# endif
173#endif
174
175/* Nonzero if the integer type T is signed. */
176#define INTEGER_TYPE_SIGNED(t) ((t) -1 < 0)
177
178/* The minimum and maximum values for the integer type T.
179 Use ~ (t) 0, not -1, for portability to 1's complement hosts. */
180#define INTEGER_TYPE_MINIMUM(t) \
181 (! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))
182#define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t))
183
184#ifndef CHAR_MAX
185# define CHAR_MAX INTEGER_TYPE_MAXIMUM (char)
186#endif
187
188#ifdef STAT_MACROS_BROKEN
189# ifdef S_ISREG
190# undef S_ISREG
191# endif
192# ifdef S_ISDIR
193# undef S_ISDIR
194# endif
195#endif /* STAT_MACROS_BROKEN. */
196
197#ifndef S_ISREG
198# define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
199#endif
200#ifndef S_ISDIR
201# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
202#endif
203
204#ifdef VMS
205# include <types.h>
206# include <unixlib.h>
207# include <unixio.h>
208# include <perror.h>
209/* Needed to use alloca on VMS. */
210# include <builtins.h>
211#endif
212
213#ifndef __attribute__
214/* This feature is available in gcc versions 2.5 and later. */
215# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
216# define __attribute__(x)
217# endif
218/* The __-protected variants of `format' and `printf' attributes
219 are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
220# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
221# define __format__ format
222# define __printf__ printf
223# endif
224#endif
225#define UNUSED __attribute__ ((unused))
226
227#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)
228# include <stdlib.h>
229# include <string.h>
230# define ANSI_STRING 1
231#else /* No standard headers. */
232# ifdef HAVE_STRING_H
233# include <string.h>
234# define ANSI_STRING 1
235# else
236# include <strings.h>
237# endif
238# ifdef HAVE_MEMORY_H
239# include <memory.h>
240# endif
241# ifdef HAVE_STDLIB_H
242# include <stdlib.h>
243# else
244void *malloc (int);
245void *realloc (void *, int);
246void free (void *);
247
248void abort (void) __attribute__ ((noreturn));
249void exit (int) __attribute__ ((noreturn));
250# endif /* HAVE_STDLIB_H. */
251
252#endif /* Standard headers. */
253
254/* These should be in stdlib.h. Make sure we have them. */
255#ifndef EXIT_SUCCESS
256# define EXIT_SUCCESS 0
257#endif
258#ifndef EXIT_FAILURE
259# define EXIT_FAILURE 1
260#endif
261
262#ifndef ANSI_STRING
263
264/* SCO Xenix has a buggy macro definition in <string.h>. */
265#undef strerror
266#if !defined(__DECC)
267char *strerror (int errnum);
268#endif
269
270#endif /* !ANSI_STRING. */
271#undef ANSI_STRING
272
273#if HAVE_INTTYPES_H
274# include <inttypes.h>
275#endif
276#define FILE_TIMESTAMP uintmax_t
277
278#if !defined(HAVE_STRSIGNAL)
279char *strsignal (int signum);
280#endif
281
282/* ISDIGIT offers the following features:
283 - Its arg may be any int or unsigned int; it need not be an unsigned char.
284 - It's guaranteed to evaluate its argument exactly once.
285 NOTE! Make relies on this behavior, don't change it!
286 - It's typically faster.
287 POSIX 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
288 only '0' through '9' are digits. Prefer ISDIGIT to isdigit() unless
289 it's important to use the locale's definition of `digit' even when the
290 host does not conform to POSIX. */
291#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
292
293#ifndef iAPX286
294# define streq(a, b) \
295 ((a) == (b) || \
296 (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
297# ifdef HAVE_CASE_INSENSITIVE_FS
298# define strieq(a, b) \
299 ((a) == (b) \
300 || (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \
301 && (*(a) == '\0' || !strcasecmp ((a) + 1, (b) + 1))))
302# else
303# define strieq(a, b) streq(a, b)
304# endif
305#else
306/* Buggy compiler can't handle this. */
307# define streq(a, b) (strcmp ((a), (b)) == 0)
308# define strieq(a, b) (strcmp ((a), (b)) == 0)
309#endif
310#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0)
311
312#if (defined(__GNUC__) || defined(ENUM_BITFIELDS)) && !defined(NO_ENUM_BITFIELDS)
313# define ENUM_BITFIELD(bits) :bits
314#else
315# define ENUM_BITFIELD(bits)
316#endif
317
318/* Handle gettext and locales. */
319
320#if HAVE_LOCALE_H
321# include <locale.h>
322#else
323# define setlocale(category, locale)
324#endif
325
326#include <gettext.h>
327
328#define _(msgid) gettext (msgid)
329#define N_(msgid) gettext_noop (msgid)
330#define S_(msg1,msg2,num) ngettext (msg1,msg2,num)
331
332/* Handle other OSs. */
333#ifndef PATH_SEPARATOR_CHAR
334# if defined(HAVE_DOS_PATHS)
335# define PATH_SEPARATOR_CHAR ';'
336# elif defined(VMS)
337# define PATH_SEPARATOR_CHAR ','
338# else
339# define PATH_SEPARATOR_CHAR ':'
340# endif
341#endif
342
343/* This is needed for getcwd() and chdir(), on some W32 systems. */
344#if defined(HAVE_DIRECT_H)
345# include <direct.h>
346#endif
347
348#ifdef WINDOWS32
349# include <fcntl.h>
350# include <malloc.h>
351# define pipe(_p) _pipe((_p), 512, O_BINARY)
352# define kill(_pid,_sig) w32_kill((_pid),(_sig))
353
354void sync_Path_environment (void);
355int w32_kill (int pid, int sig); /* bird kill -> w32_kill - macro acquired () on the args. */
356char *end_of_token_w32 (const char *s, char stopchar);
357int find_and_set_default_shell (const char *token);
358
359/* indicates whether or not we have Bourne shell */
360extern int no_default_sh_exe;
361
362/* is default_shell unixy? */
363extern int unixy_shell;
364#endif /* WINDOWS32 */
365
366struct floc
367 {
368 const char *filenm;
369 unsigned long lineno;
370 };
371#define NILF ((struct floc *)0)
372
373#define STRING_SIZE_TUPLE(_s) (_s), (sizeof (_s)-1)
374
375
376
377/* We have to have stdarg.h or varargs.h AND v*printf or doprnt to use
378 variadic versions of these functions. */
379
380#if HAVE_STDARG_H || HAVE_VARARGS_H
381# if HAVE_VPRINTF || HAVE_DOPRNT
382# define USE_VARIADIC 1
383# endif
384#endif
385
386#if HAVE_ANSI_COMPILER && USE_VARIADIC && HAVE_STDARG_H
387void message (int prefix, const char *fmt, ...)
388 __attribute__ ((__format__ (__printf__, 2, 3)));
389void error (const struct floc *flocp, const char *fmt, ...)
390 __attribute__ ((__format__ (__printf__, 2, 3)));
391void fatal (const struct floc *flocp, const char *fmt, ...)
392 __attribute__ ((noreturn, __format__ (__printf__, 2, 3)));
393#else
394void message ();
395void error ();
396void fatal ();
397#endif
398
399void die (int) __attribute__ ((noreturn));
400void log_working_directory (int);
401void pfatal_with_name (const char *) __attribute__ ((noreturn));
402void perror_with_name (const char *, const char *);
403char *savestring (const char *, unsigned int);
404char *concat (const char *, const char *, const char *);
405void *xmalloc (unsigned int);
406void *xrealloc (void *, unsigned int);
407char *xstrdup (const char *);
408char *find_next_token (const char **, unsigned int *);
409char *next_token (const char *);
410char *end_of_token (const char *);
411#ifndef CONFIG_WITH_VALUE_LENGTH
412void collapse_continuations (char *);
413#else
414char *collapse_continuations (char *, unsigned int);
415#endif
416#ifdef CONFIG_WITH_OPTIMIZATION_HACKS /* memchr is usually compiler intrinsic, thus faster. */
417# define lindex(s, limit, c) ((char *)memchr((s), (c), (limit) - (s)))
418#else
419char *lindex (const char *, const char *, int);
420#endif
421int alpha_compare (const void *, const void *);
422void print_spaces (unsigned int);
423char *find_percent (char *);
424const char *find_percent_cached (const char **);
425FILE *open_tmpfile (char **, const char *);
426
427#ifndef NO_ARCHIVES
428int ar_name (const char *);
429void ar_parse_name (const char *, char **, char **);
430int ar_touch (const char *);
431time_t ar_member_date (const char *);
432
433typedef long int (*ar_member_func_t) (int desc, const char *mem, int truncated,
434 long int hdrpos, long int datapos,
435 long int size, long int date, int uid,
436 int gid, int mode, const void *arg);
437
438long int ar_scan (const char *archive, ar_member_func_t function, const void *arg);
439int ar_name_equal (const char *name, const char *mem, int truncated);
440#ifndef VMS
441int ar_member_touch (const char *arname, const char *memname);
442#endif
443#endif
444
445int dir_file_exists_p (const char *, const char *);
446int file_exists_p (const char *);
447int file_impossible_p (const char *);
448void file_impossible (const char *);
449const char *dir_name (const char *);
450void hash_init_directories (void);
451
452void define_default_variables (void);
453void set_default_suffixes (void);
454void install_default_suffix_rules (void);
455void install_default_implicit_rules (void);
456
457void build_vpath_lists (void);
458void construct_vpath_list (char *pattern, char *dirpath);
459const char *vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr);
460int gpath_search (const char *file, unsigned int len);
461
462void construct_include_path (const char **arg_dirs);
463
464void user_access (void);
465void make_access (void);
466void child_access (void);
467
468void close_stdout (void);
469
470char *strip_whitespace (const char **begpp, const char **endpp);
471
472/* String caching */
473void strcache_init (void);
474void strcache_print_stats (const char *prefix);
475int strcache_iscached (const char *str);
476const char *strcache_add (const char *str);
477const char *strcache_add_len (const char *str, int len);
478int strcache_setbufsize (int size);
479
480#ifdef HAVE_VFORK_H
481# include <vfork.h>
482#endif
483
484/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION,
485 because such systems often declare them in header files anyway. */
486
487#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32)
488
489long int atol ();
490# ifndef VMS
491long int lseek ();
492# endif
493
494#endif /* Not GNU C library or POSIX. */
495
496#ifdef HAVE_GETCWD
497# if !defined(VMS) && !defined(__DECC) && !defined(_MSC_VER) /* bird: MSC */
498char *getcwd ();
499# endif
500#else
501char *getwd ();
502# define getcwd(buf, len) getwd (buf)
503#endif
504
505#if !HAVE_STRCASECMP
506# if HAVE_STRICMP
507# define strcasecmp stricmp
508# elif HAVE_STRCMPI
509# define strcasecmp strcmpi
510# else
511/* Create our own, in misc.c */
512int strcasecmp (const char *s1, const char *s2);
513# endif
514#endif
515
516extern const struct floc *reading_file;
517extern const struct floc **expanding_var;
518
519#if !defined(_MSC_VER) /* bird */
520extern char **environ;
521#endif
522
523extern int just_print_flag, silent_flag, ignore_errors_flag, keep_going_flag;
524extern int print_data_base_flag, question_flag, touch_flag, always_make_flag;
525extern int env_overrides, no_builtin_rules_flag, no_builtin_variables_flag;
526extern int print_version_flag, print_directory_flag, check_symlink_flag;
527extern int warn_undefined_variables_flag, posix_pedantic, not_parallel;
528extern int second_expansion, clock_skew_detected, rebuilding_makefiles;
529#ifdef CONFIG_WITH_2ND_TARGET_EXPANSION
530extern int second_target_expansion;
531#endif
532#ifdef CONFIG_PRETTY_COMMAND_PRINTING
533extern int pretty_command_printing;
534#endif
535#ifdef CONFIG_WITH_MAKE_STATS
536extern int make_expensive_statistics;
537#endif
538
539
540/* can we run commands via 'sh -c xxx' or must we use batch files? */
541extern int batch_mode_shell;
542
543extern char cmd_prefix;
544
545extern unsigned int job_slots;
546extern int job_fds[2];
547extern int job_rfd;
548#ifndef NO_FLOAT
549extern double max_load_average;
550#else
551extern int max_load_average;
552#endif
553
554extern char *program;
555extern char *starting_directory;
556extern unsigned int makelevel;
557extern char *version_string, *remote_description, *make_host;
558
559extern unsigned int commands_started;
560
561extern int handling_fatal_signal;
562
563
564#ifndef MIN
565#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
566#endif
567#ifndef MAX
568#define MAX(_a,_b) ((_a)>(_b)?(_a):(_b))
569#endif
570
571#ifdef VMS
572# define MAKE_SUCCESS 1
573# define MAKE_TROUBLE 2
574# define MAKE_FAILURE 3
575#else
576# define MAKE_SUCCESS 0
577# define MAKE_TROUBLE 1
578# define MAKE_FAILURE 2
579#endif
580
581/* Set up heap debugging library dmalloc. */
582
583#ifdef HAVE_DMALLOC_H
584#include <dmalloc.h>
585#endif
586
587#ifndef initialize_main
588# ifdef __EMX__
589# define initialize_main(pargc, pargv) \
590 { _wildcard(pargc, pargv); _response(pargc, pargv); }
591# else
592# define initialize_main(pargc, pargv)
593# endif
594#endif
595
596#ifdef __EMX__
597# if !defined chdir
598# define chdir _chdir2
599# endif
600# if !defined getcwd
601# define getcwd _getcwd2
602# endif
603
604/* NO_CHDIR2 causes make not to use _chdir2() and _getcwd2() instead of
605 chdir() and getcwd(). This avoids some error messages for the
606 make testsuite but restricts the drive letter support. */
607# ifdef NO_CHDIR2
608# warning NO_CHDIR2: usage of drive letters restricted
609# undef chdir
610# undef getcwd
611# endif
612#endif
613
614#ifndef initialize_main
615# define initialize_main(pargc, pargv)
616#endif
617
618
619/* Some systems (like Solaris, PTX, etc.) do not support the SA_RESTART flag
620 properly according to POSIX. So, we try to wrap common system calls with
621 checks for EINTR. Note that there are still plenty of system calls that
622 can fail with EINTR but this, reportedly, gets the vast majority of
623 failure cases. If you still experience failures you'll need to either get
624 a system where SA_RESTART works, or you need to avoid -j. */
625
626#define EINTRLOOP(_v,_c) while (((_v)=_c)==-1 && errno==EINTR)
627
628/* While system calls that return integers are pretty consistent about
629 returning -1 on failure and setting errno in that case, functions that
630 return pointers are not always so well behaved. Sometimes they return
631 NULL for expected behavior: one good example is readdir() which returns
632 NULL at the end of the directory--and _doesn't_ reset errno. So, we have
633 to do it ourselves here. */
634
635#define ENULLLOOP(_v,_c) do { errno = 0; (_v) = _c; } \
636 while((_v)==0 && errno==EINTR)
637
638
639#if defined(__EMX__) && defined(CONFIG_WITH_OPTIMIZATION_HACKS) /* bird: saves 40-100ms on libc. */
640static inline void *__my_rawmemchr (const void *__s, int __c);
641#undef strchr
642#define strchr(s, c) \
643 (__extension__ (__builtin_constant_p (c) \
644 ? ((c) == '\0' \
645 ? (char *) __my_rawmemchr ((s), (c)) \
646 : __my_strchr_c ((s), ((c) & 0xff) << 8)) \
647 : __my_strchr_g ((s), (c))))
648static inline char *__my_strchr_c (const char *__s, int __c)
649{
650 register unsigned long int __d0;
651 register char *__res;
652 __asm__ __volatile__
653 ("1:\n\t"
654 "movb (%0),%%al\n\t"
655 "cmpb %%ah,%%al\n\t"
656 "je 2f\n\t"
657 "leal 1(%0),%0\n\t"
658 "testb %%al,%%al\n\t"
659 "jne 1b\n\t"
660 "xorl %0,%0\n"
661 "2:"
662 : "=r" (__res), "=&a" (__d0)
663 : "0" (__s), "1" (__c),
664 "m" ( *(struct { char __x[0xfffffff]; } *)__s)
665 : "cc");
666 return __res;
667}
668
669static inline char *__my_strchr_g (__const char *__s, int __c)
670{
671 register unsigned long int __d0;
672 register char *__res;
673 __asm__ __volatile__
674 ("movb %%al,%%ah\n"
675 "1:\n\t"
676 "movb (%0),%%al\n\t"
677 "cmpb %%ah,%%al\n\t"
678 "je 2f\n\t"
679 "leal 1(%0),%0\n\t"
680 "testb %%al,%%al\n\t"
681 "jne 1b\n\t"
682 "xorl %0,%0\n"
683 "2:"
684 : "=r" (__res), "=&a" (__d0)
685 : "0" (__s), "1" (__c),
686 "m" ( *(struct { char __x[0xfffffff]; } *)__s)
687 : "cc");
688 return __res;
689}
690
691static inline void *__my_rawmemchr (const void *__s, int __c)
692{
693 register unsigned long int __d0;
694 register unsigned char *__res;
695 __asm__ __volatile__
696 ("cld\n\t"
697 "repne; scasb\n\t"
698 : "=D" (__res), "=&c" (__d0)
699 : "a" (__c), "0" (__s), "1" (0xffffffff),
700 "m" ( *(struct { char __x[0xfffffff]; } *)__s)
701 : "cc");
702 return __res - 1;
703}
704
705#undef memchr
706#define memchr(a,b,c) __my_memchr((a),(b),(c))
707static inline void *__my_memchr (__const void *__s, int __c, size_t __n)
708{
709 register unsigned long int __d0;
710 register unsigned char *__res;
711 if (__n == 0)
712 return NULL;
713 __asm__ __volatile__
714 ("repne; scasb\n\t"
715 "je 1f\n\t"
716 "movl $1,%0\n"
717 "1:"
718 : "=D" (__res), "=&c" (__d0)
719 : "a" (__c), "0" (__s), "1" (__n),
720 "m" ( *(struct { __extension__ char __x[__n]; } *)__s)
721 : "cc");
722 return __res - 1;
723}
724
725#endif /* __EMX__ (bird) */
726
727#ifdef CONFIG_WITH_MAKE_STATS
728extern long make_stats_allocations;
729extern unsigned long make_stats_allocated;
730extern unsigned long make_stats_allocated_sum;
731extern unsigned long make_stats_ht_lookups;
732extern unsigned long make_stats_ht_collisions;
733
734# ifdef __APPLE__
735# include <malloc/malloc.h>
736# define SIZE_OF_HEAP_BLOCK(ptr) malloc_size(ptr)
737
738# elif defined(__linux__) /* glibc */
739# include <malloc.h>
740# define SIZE_OF_HEAP_BLOCK(ptr) malloc_usable_size(ptr)
741
742# elif defined(_MSC_VER) || defined(__OS2__)
743# define SIZE_OF_HEAP_BLOCK(ptr) _msize(ptr)
744
745# else
746# include <stdlib.h>
747# define SIZE_OF_HEAP_BLOCK(ptr) 0
748#endif
749
750# if defined(CONFIG_WITH_MAKE_STATS) && !defined(ELECTRIC_HEAP)
751# define free xfree
752extern void xfree (void *);
753# endif
754
755#endif
756
757#ifdef CONFIG_WITH_IF_CONDITIONALS
758extern int expr_eval_if_conditionals(char *line, const struct floc *flocp);
759extern char *expr_eval_to_string(char *o, char *expr);
760#endif
761
762#ifdef KMK
763extern char *abspath(const char *name, char *apath);
764extern char *func_breakpoint(char *o, char **argv, const char *funcname);
765#endif
Note: See TracBrowser for help on using the repository browser.