source: trunk/src/gmake/make.h@ 469

Last change on this file since 469 was 430, checked in by bird, 19 years ago

better hashing, more inline string stuff. (still optimizing libc)

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