1 /* Miscellaneous global declarations and portability cruft for GNU Make.
2 Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
5 This file is part of GNU Make.
7 GNU Make is free software; you can redistribute it and/or modify it under the
8 terms of the GNU General Public License as published by the Free Software
9 Foundation; either version 3 of the License, or (at your option) any later
12 GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License along with
17 this program. If not, see <http://www.gnu.org/licenses/>. */
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). */
24 #define HAVE_CONFIG_H 1
26 /* AIX requires this to be the first thing in the file. */
34 # ifndef alloca /* predefined by HP cc +Olibcalls */
39 #elif defined(__sun__) && defined (HAVE_ALLOCA_H) /* bird: kill warnings. */
44 /* Specify we want GNU source code. This must be defined before any
45 system headers are included. */
51 /* This must happen before #include <signal.h> so
52 that the declaration therein is changed. */
53 # define signal bsdsignal
56 /* If we're compiling for the dmalloc debugger, turn off string inlining. */
57 #if defined(HAVE_DMALLOC_H) && defined(__GNUC__)
58 # define __NO_STRING_INLINES
61 #include <sys/types.h>
66 #ifdef HAVE_SYS_TIMEB_H
67 /* SCO 3.2 "devsys 4.2" has a prototype for `ftime' in <time.h> that bombs
68 unless <sys/timeb.h> has been included first. Does every system have a
69 <sys/timeb.h>? If any does not, configure should check for it. */
70 # include <sys/timeb.h>
73 #if TIME_WITH_SYS_TIME
74 # include <sys/time.h>
78 # include <sys/time.h>
91 # define isblank(c) ((c) == ' ' || (c) == '\t')
96 /* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get
97 POSIX.1 behavior with `cc -YPOSIX', which predefines POSIX itself! */
98 # if defined (_POSIX_VERSION) && !defined (ultrix) && !defined (VMS)
103 /* Some systems define _POSIX_VERSION but are not really POSIX.1. */
104 #if (defined (butterfly) || defined (__arm) || (defined (__mips) && defined (_SYSTYPE_SVR3)) || (defined (sequent) && defined (i386)))
108 #if !defined (POSIX) && defined (_AIX) && defined (_POSIX_SOURCE)
113 # define RETSIGTYPE void
117 # define sigmask(sig) (1 << ((sig) - 1))
120 #ifndef HAVE_SA_RESTART
121 # define SA_RESTART 0
127 #ifdef HAVE_SYS_PARAM_H
128 # include <sys/param.h>
133 # define PATH_MAX MAXPATHLEN
137 # define MAXPATHLEN 1024
141 # define GET_PATH_MAX PATH_MAX
142 # define PATH_VAR(var) char var[PATH_MAX]
144 # define NEED_GET_PATH_MAX 1
145 # define GET_PATH_MAX (get_path_max ())
146 # define PATH_VAR(var) char *var = alloca (GET_PATH_MAX)
147 unsigned int get_path_max (void);
150 #if defined (KMK) || defined (CONFIG_WITH_VALUE_LENGTH) \
151 || defined (CONFIG_WITH_ALLOC_CACHES) \
152 || defined (CONFIG_WITH_STRCACHE2)
154 # define MY_INLINE _inline static
155 # elif defined(__GNUC__)
156 # define MY_INLINE static __inline__
158 # define MY_INLINE static
162 # define MY_PREDICT_TRUE(expr) __builtin_expect(!!(expr), 1)
163 # define MY_PREDICT_FALSE(expr) __builtin_expect(!!(expr), 0)
165 # define MY_PREDICT_TRUE(expr) (expr)
166 # define MY_PREDICT_FALSE(expr) (expr)
170 #if defined (KMK) || defined (CONFIG_WITH_VALUE_LENGTH) \
171 || defined (CONFIG_WITH_STRCACHE2)
173 # define MY_DBGBREAK __debugbreak()
174 # elif defined(__GNUC__)
175 # if defined(__i386__) || defined(__x86_64__)
176 # define MY_DBGBREAK __asm__ __volatile__ ("int3")
178 # define MY_DBGBREAK assert(0)
181 # define MY_DBGBREAK assert(0)
184 # define MY_ASSERT_MSG(expr, printfargs) \
185 do { if (!(expr)) { printf printfargs; MY_DBGBREAK; } } while (0)
187 # define MY_ASSERT_MSG(expr, printfargs) do { } while (0)
193 # if 1 /* See if this speeds things up (Windows is doing this anyway, so,
194 we might as well try be consistent in speed + features). */
196 # define MY_IS_BLANK(ch) ((ch) == ' ' || (ch) == '\t')
197 # define MY_IS_BLANK_OR_EOS(ch) ((ch) == ' ' || (ch) == '\t' || (ch) == '\0')
199 # define MY_IS_BLANK(ch) (((ch) == ' ') | ((ch) == '\t'))
200 # define MY_IS_BLANK_OR_EOS(ch) (((ch) == ' ') | ((ch) == '\t') | ((ch) == '\0'))
203 # define isblank(ch) MY_IS_BLANK(ch)
205 # define MY_IS_BLANK(ch) isblank ((unsigned char)(ch))
206 # define MY_IS_BLANK_OR_EOS(ch) (isblank ((unsigned char)(ch)) || (ch) == '\0')
210 #ifdef CONFIG_WITH_MAKE_STATS
211 extern long make_stats_allocations
;
212 extern long make_stats_reallocations
;
213 extern unsigned long make_stats_allocated
;
214 extern unsigned long make_stats_ht_lookups
;
215 extern unsigned long make_stats_ht_collisions
;
218 # include <malloc/malloc.h>
219 # define SIZE_OF_HEAP_BLOCK(ptr) malloc_good_size(ptr)
221 # elif defined(__linux__) /* glibc */
223 # define SIZE_OF_HEAP_BLOCK(ptr) malloc_usable_size(ptr)
225 # elif defined(_MSC_VER) || defined(__OS2__)
226 # define SIZE_OF_HEAP_BLOCK(ptr) _msize(ptr)
230 # define SIZE_OF_HEAP_BLOCK(ptr) 0
233 # define MAKE_STATS_3(expr) do { expr; } while (0)
234 # define MAKE_STATS_2(expr) do { expr; } while (0)
235 # define MAKE_STATS(expr) do { expr; } while (0)
237 # define MAKE_STATS_3(expr) do { } while (0)
238 # define MAKE_STATS_2(expr) do { } while (0)
239 # define MAKE_STATS(expr) do { } while (0)
247 /* Nonzero if the integer type T is signed. */
248 #define INTEGER_TYPE_SIGNED(t) ((t) -1 < 0)
250 /* The minimum and maximum values for the integer type T.
251 Use ~ (t) 0, not -1, for portability to 1's complement hosts. */
252 #define INTEGER_TYPE_MINIMUM(t) \
253 (! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))
254 #define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t))
257 # define CHAR_MAX INTEGER_TYPE_MAXIMUM (char)
260 #ifdef STAT_MACROS_BROKEN
267 #endif /* STAT_MACROS_BROKEN. */
270 # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
273 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
278 # include <unixlib.h>
281 /* Needed to use alloca on VMS. */
282 # include <builtins.h>
285 #ifndef __attribute__
286 /* This feature is available in gcc versions 2.5 and later. */
287 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
288 # define __attribute__(x)
290 /* The __-protected variants of `format' and `printf' attributes
291 are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
292 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
293 # define __format__ format
294 # define __printf__ printf
297 #define UNUSED __attribute__ ((unused))
299 #if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)
302 # define ANSI_STRING 1
303 #else /* No standard headers. */
304 # ifdef HAVE_STRING_H
306 # define ANSI_STRING 1
308 # include <strings.h>
310 # ifdef HAVE_MEMORY_H
313 # ifdef HAVE_STDLIB_H
317 void *realloc (void *, int);
320 void abort (void) __attribute__ ((noreturn
));
321 void exit (int) __attribute__ ((noreturn
));
322 # endif /* HAVE_STDLIB_H. */
324 #endif /* Standard headers. */
326 /* These should be in stdlib.h. Make sure we have them. */
328 # define EXIT_SUCCESS 0
331 # define EXIT_FAILURE 1
336 /* SCO Xenix has a buggy macro definition in <string.h>. */
339 char *strerror (int errnum
);
342 #endif /* !ANSI_STRING. */
346 # include <inttypes.h>
348 #define FILE_TIMESTAMP uintmax_t
350 #if !defined(HAVE_STRSIGNAL)
351 char *strsignal (int signum
);
354 /* ISDIGIT offers the following features:
355 - Its arg may be any int or unsigned int; it need not be an unsigned char.
356 - It's guaranteed to evaluate its argument exactly once.
357 NOTE! Make relies on this behavior, don't change it!
358 - It's typically faster.
359 POSIX 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
360 only '0' through '9' are digits. Prefer ISDIGIT to isdigit() unless
361 it's important to use the locale's definition of `digit' even when the
362 host does not conform to POSIX. */
363 #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
366 # define streq(a, b) \
368 (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
369 # ifdef HAVE_CASE_INSENSITIVE_FS
370 # define strieq(a, b) \
372 || (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \
373 && (*(a) == '\0' || !strcasecmp ((a) + 1, (b) + 1))))
375 # define strieq(a, b) streq(a, b)
378 /* Buggy compiler can't handle this. */
379 # define streq(a, b) (strcmp ((a), (b)) == 0)
380 # define strieq(a, b) (strcmp ((a), (b)) == 0)
382 #define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0)
384 #if (defined(__GNUC__) || defined(ENUM_BITFIELDS)) && !defined(NO_ENUM_BITFIELDS)
385 # define ENUM_BITFIELD(bits) :bits
387 # define ENUM_BITFIELD(bits)
390 /* Handle gettext and locales. */
395 # define setlocale(category, locale)
400 #define _(msgid) gettext (msgid)
401 #define N_(msgid) gettext_noop (msgid)
402 #define S_(msg1,msg2,num) ngettext (msg1,msg2,num)
404 /* Handle other OSs. */
405 #ifndef PATH_SEPARATOR_CHAR
406 # if defined(HAVE_DOS_PATHS)
407 # define PATH_SEPARATOR_CHAR ';'
409 # define PATH_SEPARATOR_CHAR ','
411 # define PATH_SEPARATOR_CHAR ':'
415 /* This is needed for getcwd() and chdir(), on some W32 systems. */
416 #if defined(HAVE_DIRECT_H)
423 # define pipe(_p) _pipe((_p), 512, O_BINARY)
424 # define kill(_pid,_sig) w32_kill((_pid),(_sig))
426 void sync_Path_environment (void);
427 int w32_kill (int pid
, int sig
);
428 char *end_of_token_w32 (const char *s
, char stopchar
);
429 int find_and_set_default_shell (const char *token
);
431 /* indicates whether or not we have Bourne shell */
432 extern int no_default_sh_exe
;
434 /* is default_shell unixy? */
435 extern int unixy_shell
;
436 #endif /* WINDOWS32 */
441 unsigned long lineno
;
443 #define NILF ((struct floc *)0)
445 #define STRING_SIZE_TUPLE(_s) (_s), (sizeof (_s)-1)
447 #if defined (CONFIG_WITH_MATH) \
448 || defined (CONFIG_WITH_NANOTS) \
449 || defined (CONFIG_WITH_FILE_SIZE) \
450 || defined (CONFIG_WITH_PRINT_TIME_SWITCH) /* bird */
452 typedef __int64 big_int
;
453 # define BIG_INT_C(c) (c ## LL)
454 typedef unsigned __int64 big_uint
;
455 # define BIG_UINT_C(c) (c ## ULL)
458 typedef int64_t big_int
;
459 # define BIG_INT_C(c) INT64_C(c)
460 typedef uint64_t big_uint
;
461 # define BIG_UINT_C(c) UINT64_C(c)
466 /* We have to have stdarg.h or varargs.h AND v*printf or doprnt to use
467 variadic versions of these functions. */
469 #if HAVE_STDARG_H || HAVE_VARARGS_H
470 # if HAVE_VPRINTF || HAVE_DOPRNT
471 # define USE_VARIADIC 1
475 #if HAVE_ANSI_COMPILER && USE_VARIADIC && HAVE_STDARG_H
476 void message (int prefix
, const char *fmt
, ...)
477 __attribute__ ((__format__ (__printf__
, 2, 3)));
478 void error (const struct floc
*flocp
, const char *fmt
, ...)
479 __attribute__ ((__format__ (__printf__
, 2, 3)));
480 void fatal (const struct floc
*flocp
, const char *fmt
, ...)
481 __attribute__ ((noreturn
, __format__ (__printf__
, 2, 3)));
488 void die (int) __attribute__ ((noreturn
));
489 void log_working_directory (int);
490 void pfatal_with_name (const char *) __attribute__ ((noreturn
));
491 void perror_with_name (const char *, const char *);
492 char *savestring (const char *, unsigned int);
493 char *concat (const char *, const char *, const char *);
494 void *xmalloc (unsigned int);
495 void *xrealloc (void *, unsigned int);
496 char *xstrdup (const char *);
497 #ifdef CONFIG_WITH_PRINT_STATS_SWITCH
498 void print_heap_stats (void);
500 char *find_next_token (const char **, unsigned int *);
501 char *next_token (const char *);
502 char *end_of_token (const char *);
503 #ifndef CONFIG_WITH_VALUE_LENGTH
504 void collapse_continuations (char *);
506 char *collapse_continuations (char *, unsigned int);
508 #ifdef CONFIG_WITH_OPTIMIZATION_HACKS /* memchr is usually compiler intrinsic, thus faster. */
509 # define lindex(s, limit, c) ((char *)memchr((s), (c), (limit) - (s)))
511 char *lindex (const char *, const char *, int);
513 int alpha_compare (const void *, const void *);
514 void print_spaces (unsigned int);
515 char *find_percent (char *);
516 const char *find_percent_cached (const char **);
517 FILE *open_tmpfile (char **, const char *);
520 int ar_name (const char *);
521 void ar_parse_name (const char *, char **, char **);
522 int ar_touch (const char *);
523 time_t ar_member_date (const char *);
525 typedef long int (*ar_member_func_t
) (int desc
, const char *mem
, int truncated
,
526 long int hdrpos
, long int datapos
,
527 long int size
, long int date
, int uid
,
528 int gid
, int mode
, const void *arg
);
530 long int ar_scan (const char *archive
, ar_member_func_t function
, const void *arg
);
531 int ar_name_equal (const char *name
, const char *mem
, int truncated
);
533 int ar_member_touch (const char *arname
, const char *memname
);
537 int dir_file_exists_p (const char *, const char *);
538 int file_exists_p (const char *);
539 int file_impossible_p (const char *);
540 void file_impossible (const char *);
541 const char *dir_name (const char *);
542 void hash_init_directories (void);
544 void define_default_variables (void);
545 void set_default_suffixes (void);
546 void install_default_suffix_rules (void);
547 void install_default_implicit_rules (void);
549 void build_vpath_lists (void);
550 void construct_vpath_list (char *pattern
, char *dirpath
);
551 const char *vpath_search (const char *file
, FILE_TIMESTAMP
*mtime_ptr
);
552 int gpath_search (const char *file
, unsigned int len
);
554 void construct_include_path (const char **arg_dirs
);
556 void user_access (void);
557 void make_access (void);
558 void child_access (void);
560 void close_stdout (void);
562 char *strip_whitespace (const char **begpp
, const char **endpp
);
564 #ifdef CONFIG_WITH_ALLOC_CACHES
565 /* alloccache (misc.c) */
567 struct alloccache_free_ent
569 struct alloccache_free_ent
*next
;
576 struct alloccache_free_ent
*free_head
;
578 unsigned int total_count
;
579 unsigned long alloc_count
;
580 unsigned long free_count
;
582 struct alloccache
*next
;
584 void *(*grow_alloc
)(void *grow_arg
, unsigned int size
);
587 void alloccache_init (struct alloccache
*cache
, unsigned int size
, const char *name
,
588 void *(*grow_alloc
)(void *grow_arg
, unsigned int size
), void *grow_arg
);
589 void alloccache_term (struct alloccache
*cache
,
590 void (*term_free
)(void *term_arg
, void *ptr
, unsigned int size
), void *term_arg
);
591 void alloccache_join (struct alloccache
*cache
, struct alloccache
*eat
);
592 void alloccache_print (struct alloccache
*cache
);
593 void alloccache_print_all (void);
594 struct alloccache_free_ent
*alloccache_alloc_grow (struct alloccache
*cache
);
595 void alloccache_free (struct alloccache
*cache
, void *item
);
597 /* Allocate an item. */
599 alloccache_alloc (struct alloccache
*cache
)
601 struct alloccache_free_ent
*f
= cache
->free_head
;
603 cache
->free_head
= f
->next
;
604 else if (cache
->free_start
!= cache
->free_end
)
606 f
= (struct alloccache_free_ent
*)cache
->free_start
;
607 cache
->free_start
+= cache
->size
;
610 f
= alloccache_alloc_grow (cache
);
611 MAKE_STATS(cache
->alloc_count
++;);
615 /* Allocate a cleared item. */
617 alloccache_calloc (struct alloccache
*cache
)
619 void *item
= alloccache_alloc (cache
);
620 memset (item
, '\0', cache
->size
);
625 /* the alloc caches */
626 extern struct alloccache dep_cache
;
627 extern struct alloccache file_cache
;
628 extern struct alloccache commands_cache
;
629 extern struct alloccache nameseq_cache
;
630 extern struct alloccache variable_cache
;
631 extern struct alloccache variable_set_cache
;
632 extern struct alloccache variable_set_list_cache
;
634 #endif /* CONFIG_WITH_ALLOC_CACHES */
638 void strcache_init (void);
639 void strcache_print_stats (const char *prefix
);
640 #ifndef CONFIG_WITH_STRCACHE2
641 int strcache_iscached (const char *str
);
642 const char *strcache_add (const char *str
);
643 const char *strcache_add_len (const char *str
, int len
);
644 int strcache_setbufsize (int size
);
645 #else /* CONFIG_WITH_STRCACHE2 */
647 # include "strcache2.h"
648 extern struct strcache2 file_strcache
;
649 extern const char *suffixes_strcached
;
651 # define strcache_iscached(str) strcache2_is_cached(&file_strcache, str)
652 # define strcache_add(str) strcache2_add_file(&file_strcache, str, strlen (str))
653 # define strcache_add_len(str, len) strcache2_add_file(&file_strcache, str, len)
654 # define strcache_get_len(str) strcache2_get_len(&file_strcache, str) /* FIXME: replace this and related checks ... */
656 #endif /* CONFIG_WITH_STRCACHE2 */
662 /* We omit these declarations on non-POSIX systems which define _POSIX_VERSION,
663 because such systems often declare them in header files anyway. */
665 #if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32)
672 #endif /* Not GNU C library or POSIX. */
675 # if !defined(VMS) && !defined(__DECC) && !defined(_MSC_VER) /* bird: MSC */
680 # define getcwd(buf, len) getwd (buf)
685 # define strcasecmp stricmp
687 # define strcasecmp strcmpi
689 /* Create our own, in misc.c */
690 int strcasecmp (const char *s1
, const char *s2
);
694 extern const struct floc
*reading_file
;
695 extern const struct floc
**expanding_var
;
697 #if !defined(_MSC_VER) /* bird */
698 extern char **environ
;
701 extern int just_print_flag
, silent_flag
, ignore_errors_flag
, keep_going_flag
;
702 extern int print_data_base_flag
, question_flag
, touch_flag
, always_make_flag
;
703 extern int env_overrides
, no_builtin_rules_flag
, no_builtin_variables_flag
;
704 extern int print_version_flag
, print_directory_flag
, check_symlink_flag
;
705 extern int warn_undefined_variables_flag
, posix_pedantic
, not_parallel
;
706 extern int second_expansion
, clock_skew_detected
, rebuilding_makefiles
;
707 #ifdef CONFIG_WITH_2ND_TARGET_EXPANSION
708 extern int second_target_expansion
;
710 #ifdef CONFIG_PRETTY_COMMAND_PRINTING
711 extern int pretty_command_printing
;
713 #ifdef CONFIG_WITH_PRINT_TIME_SWITCH
714 extern int print_time_min
, print_time_width
;
716 #if defined (CONFIG_WITH_MAKE_STATS) || defined (CONFIG_WITH_MINIMAL_STATS)
717 extern int make_expensive_statistics
;
721 /* can we run commands via 'sh -c xxx' or must we use batch files? */
722 extern int batch_mode_shell
;
724 /* Resetting the command script introduction prefix character. */
725 #define RECIPEPREFIX_NAME ".RECIPEPREFIX"
726 #define RECIPEPREFIX_DEFAULT '\t'
727 extern char cmd_prefix
;
729 extern unsigned int job_slots
;
730 extern int job_fds
[2];
733 extern double max_load_average
;
735 extern int max_load_average
;
738 extern char *program
;
739 extern char *starting_directory
;
740 extern unsigned int makelevel
;
741 extern char *version_string
, *remote_description
, *make_host
;
743 extern unsigned int commands_started
;
745 extern int handling_fatal_signal
;
749 #define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
752 #define MAX(_a,_b) ((_a)>(_b)?(_a):(_b))
756 # define MAKE_SUCCESS 1
757 # define MAKE_TROUBLE 2
758 # define MAKE_FAILURE 3
760 # define MAKE_SUCCESS 0
761 # define MAKE_TROUBLE 1
762 # define MAKE_FAILURE 2
765 /* Set up heap debugging library dmalloc. */
767 #ifdef HAVE_DMALLOC_H
771 #ifndef initialize_main
773 # define initialize_main(pargc, pargv) \
774 { _wildcard(pargc, pargv); _response(pargc, pargv); }
776 # define initialize_main(pargc, pargv)
782 # define chdir _chdir2
785 # define getcwd _getcwd2
788 /* NO_CHDIR2 causes make not to use _chdir2() and _getcwd2() instead of
789 chdir() and getcwd(). This avoids some error messages for the
790 make testsuite but restricts the drive letter support. */
792 # warning NO_CHDIR2: usage of drive letters restricted
798 #ifndef initialize_main
799 # define initialize_main(pargc, pargv)
803 /* Some systems (like Solaris, PTX, etc.) do not support the SA_RESTART flag
804 properly according to POSIX. So, we try to wrap common system calls with
805 checks for EINTR. Note that there are still plenty of system calls that
806 can fail with EINTR but this, reportedly, gets the vast majority of
807 failure cases. If you still experience failures you'll need to either get
808 a system where SA_RESTART works, or you need to avoid -j. */
810 #define EINTRLOOP(_v,_c) while (((_v)=_c)==-1 && errno==EINTR)
812 /* While system calls that return integers are pretty consistent about
813 returning -1 on failure and setting errno in that case, functions that
814 return pointers are not always so well behaved. Sometimes they return
815 NULL for expected behavior: one good example is readdir() which returns
816 NULL at the end of the directory--and _doesn't_ reset errno. So, we have
817 to do it ourselves here. */
819 #define ENULLLOOP(_v,_c) do { errno = 0; (_v) = _c; } \
820 while((_v)==0 && errno==EINTR)
823 #if defined(__EMX__) && defined(CONFIG_WITH_OPTIMIZATION_HACKS) /* bird: saves 40-100ms on libc. */
824 static inline void *__my_rawmemchr (const void *__s
, int __c
);
826 #define strchr(s, c) \
827 (__extension__ (__builtin_constant_p (c) \
829 ? (char *) __my_rawmemchr ((s), (c)) \
830 : __my_strchr_c ((s), ((c) & 0xff) << 8)) \
831 : __my_strchr_g ((s), (c))))
832 static inline char *__my_strchr_c (const char *__s
, int __c
)
834 register unsigned long int __d0
;
835 register char *__res
;
842 "testb %%al,%%al\n\t"
846 : "=r" (__res
), "=&a" (__d0
)
847 : "0" (__s
), "1" (__c
),
848 "m" ( *(struct { char __x
[0xfffffff]; } *)__s
)
853 static inline char *__my_strchr_g (__const
char *__s
, int __c
)
855 register unsigned long int __d0
;
856 register char *__res
;
864 "testb %%al,%%al\n\t"
868 : "=r" (__res
), "=&a" (__d0
)
869 : "0" (__s
), "1" (__c
),
870 "m" ( *(struct { char __x
[0xfffffff]; } *)__s
)
875 static inline void *__my_rawmemchr (const void *__s
, int __c
)
877 register unsigned long int __d0
;
878 register unsigned char *__res
;
882 : "=D" (__res
), "=&c" (__d0
)
883 : "a" (__c
), "0" (__s
), "1" (0xffffffff),
884 "m" ( *(struct { char __x
[0xfffffff]; } *)__s
)
890 #define memchr(a,b,c) __my_memchr((a),(b),(c))
891 static inline void *__my_memchr (__const
void *__s
, int __c
, size_t __n
)
893 register unsigned long int __d0
;
894 register unsigned char *__res
;
902 : "=D" (__res
), "=&c" (__d0
)
903 : "a" (__c
), "0" (__s
), "1" (__n
),
904 "m" ( *(struct { __extension__
char __x
[__n
]; } *)__s
)
909 #endif /* __EMX__ (bird) */
911 #ifdef CONFIG_WITH_IF_CONDITIONALS
912 extern int expr_eval_if_conditionals(const char *line
, const struct floc
*flocp
);
913 extern char *expr_eval_to_string(char *o
, const char *expr
);
917 extern char *abspath(const char *name
, char *apath
);
918 extern char *func_breakpoint(char *o
, char **argv
, const char *funcname
);
921 #if defined (CONFIG_WITH_NANOTS) || defined (CONFIG_WITH_PRINT_TIME_SWITCH)
923 extern big_int
nano_timestamp (void);
924 extern int format_elapsed_nano (char *buf
, size_t size
, big_int ts
);