This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
missed a few files
[perl5.git] / ext / POSIX / POSIX.xs
CommitLineData
6dead956
GS
1#ifdef WIN32
2#define _POSIX_
3#endif
463ee0b2 4#include "EXTERN.h"
760ac839 5#define PERLIO_NOT_STDIO 1
463ee0b2
LW
6#include "perl.h"
7#include "XSUB.h"
35ff7856 8#ifdef PERL_OBJECT /* XXX _very_ temporary hacks */
873ef191
GS
9# undef signal
10# undef open
cd661bb6 11# undef setmode
35ff7856 12# define open PerlLIO_open3
873ef191 13#endif
2304df62 14#include <ctype.h>
a0d0e21e 15#ifdef I_DIRENT /* XXX maybe better to just rely on perl.h? */
2304df62 16#include <dirent.h>
a0d0e21e 17#endif
2304df62 18#include <errno.h>
2304df62
AD
19#ifdef I_FLOAT
20#include <float.h>
21#endif
a0d0e21e 22#ifdef I_LIMITS
2304df62 23#include <limits.h>
a0d0e21e 24#endif
2304df62
AD
25#include <locale.h>
26#include <math.h>
85e6fe83 27#ifdef I_PWD
2304df62 28#include <pwd.h>
85e6fe83 29#endif
2304df62
AD
30#include <setjmp.h>
31#include <signal.h>
2304df62 32#include <stdarg.h>
17c3b450 33
2304df62
AD
34#ifdef I_STDDEF
35#include <stddef.h>
36#endif
6990d991 37
a0d0e21e
LW
38/* XXX This comment is just to make I_TERMIO and I_SGTTY visible to
39 metaconfig for future extension writers. We don't use them in POSIX.
40 (This is really sneaky :-) --AD
41*/
42#if defined(I_TERMIOS)
43#include <termios.h>
44#endif
a0d0e21e 45#ifdef I_STDLIB
2304df62 46#include <stdlib.h>
a0d0e21e 47#endif
2304df62
AD
48#include <string.h>
49#include <sys/stat.h>
2304df62 50#include <sys/types.h>
2304df62 51#include <time.h>
6dead956 52#ifdef I_UNISTD
1d2dff63 53#include <unistd.h>
6dead956 54#endif
71be2cbc 55#include <fcntl.h>
56
6c418a22 57#if defined(__VMS) && !defined(__POSIX_SOURCE)
6c418a22 58# include <libdef.h> /* LIB$_INVARG constant */
59# include <lib$routines.h> /* prototype for lib$ediv() */
60# include <starlet.h> /* prototype for sys$gettim() */
774d564b 61# if DECC_VERSION < 50000000
62# define pid_t int /* old versions of DECC miss this in types.h */
63# endif
6c418a22 64
6990d991 65# undef mkfifo
6c418a22 66# define mkfifo(a,b) (not_here("mkfifo"),-1)
67# define tzset() not_here("tzset")
68
5f6761f9
DS
69#if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
70# define HAS_TZNAME /* shows up in VMS 7.0 or Dec C 5.6 */
71# include <utsname.h>
5f6761f9 72# endif /* __VMS_VER >= 70000000 or Dec C 5.6 */
6c418a22 73
74 /* The POSIX notion of ttyname() is better served by getname() under VMS */
75 static char ttnambuf[64];
76# define ttyname(fd) (isatty(fd) > 0 ? getname(fd,ttnambuf,0) : NULL)
77
78 /* The non-POSIX CRTL times() has void return type, so we just get the
79 current time directly */
6b88bc9c 80 clock_t vms_times(struct tms *PL_bufptr) {
6c418a22 81 clock_t retval;
82 /* Get wall time and convert to 10 ms intervals to
83 * produce the return value that the POSIX standard expects */
84# if defined(__DECC) && defined (__ALPHA)
85# include <ints.h>
86 uint64 vmstime;
87 _ckvmssts(sys$gettim(&vmstime));
88 vmstime /= 100000;
89 retval = vmstime & 0x7fffffff;
90# else
91 /* (Older hw or ccs don't have an atomic 64-bit type, so we
92 * juggle 32-bit ints (and a float) to produce a time_t result
93 * with minimal loss of information.) */
94 long int vmstime[2],remainder,divisor = 100000;
95 _ckvmssts(sys$gettim((unsigned long int *)vmstime));
96 vmstime[1] &= 0x7fff; /* prevent overflow in EDIV */
97 _ckvmssts(lib$ediv(&divisor,vmstime,(long int *)&retval,&remainder));
98# endif
99 /* Fill in the struct tms using the CRTL routine . . .*/
6b88bc9c 100 times((tbuffer_t *)PL_bufptr);
6c418a22 101 return (clock_t) retval;
102 }
103# define times(t) vms_times(t)
104#else
f89d6eaa
EF
105#if defined (CYGWIN32)
106# define tzname _tzname
107#endif
6dead956 108#if defined (WIN32)
6990d991 109# undef mkfifo
6dead956 110# define mkfifo(a,b) not_here("mkfifo")
873ef191 111# define ttyname(a) (char*)not_here("ttyname")
6dead956
GS
112# define sigset_t long
113# define pid_t long
114# ifdef __BORLANDC__
115# define tzname _tzname
116# endif
117# ifdef _MSC_VER
118# define mode_t short
119# endif
62520c91
GS
120# ifdef __MINGW32__
121# define mode_t short
f6c6487a
GS
122# ifndef tzset
123# define tzset() not_here("tzset")
124# endif
125# ifndef _POSIX_OPEN_MAX
126# define _POSIX_OPEN_MAX FOPEN_MAX /* XXX bogus ? */
127# endif
62520c91 128# endif
6dead956
GS
129# define sigaction(a,b,c) not_here("sigaction")
130# define sigpending(a) not_here("sigpending")
131# define sigprocmask(a,b,c) not_here("sigprocmask")
132# define sigsuspend(a) not_here("sigsuspend")
133# define sigemptyset(a) not_here("sigemptyset")
134# define sigaddset(a,b) not_here("sigaddset")
135# define sigdelset(a,b) not_here("sigdelset")
136# define sigfillset(a) not_here("sigfillset")
137# define sigismember(a,b) not_here("sigismember")
138#else
6990d991
JH
139
140# ifndef HAS_MKFIFO
d6a255e6
IZ
141# ifdef OS2
142# define mkfifo(a,b) not_here("mkfifo")
143# else /* !( defined OS2 ) */
144# ifndef mkfifo
145# define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
146# endif
6990d991
JH
147# endif
148# endif /* !HAS_MKFIFO */
149
6c418a22 150# include <grp.h>
151# include <sys/times.h>
152# ifdef HAS_UNAME
153# include <sys/utsname.h>
154# endif
155# include <sys/wait.h>
156# ifdef I_UTIME
157# include <utime.h>
158# endif
6dead956
GS
159#endif /* WIN32 */
160#endif /* __VMS */
2304df62
AD
161
162typedef int SysRet;
a0d0e21e 163typedef long SysRetLong;
2304df62
AD
164typedef sigset_t* POSIX__SigSet;
165typedef HV* POSIX__SigAction;
a0d0e21e
LW
166#ifdef I_TERMIOS
167typedef struct termios* POSIX__Termios;
168#else /* Define termios types to int, and call not_here for the functions.*/
169#define POSIX__Termios int
170#define speed_t int
171#define tcflag_t int
172#define cc_t int
173#define cfgetispeed(x) not_here("cfgetispeed")
174#define cfgetospeed(x) not_here("cfgetospeed")
175#define tcdrain(x) not_here("tcdrain")
176#define tcflush(x,y) not_here("tcflush")
177#define tcsendbreak(x,y) not_here("tcsendbreak")
178#define cfsetispeed(x,y) not_here("cfsetispeed")
179#define cfsetospeed(x,y) not_here("cfsetospeed")
180#define ctermid(x) (char *) not_here("ctermid")
181#define tcflow(x,y) not_here("tcflow")
182#define tcgetattr(x,y) not_here("tcgetattr")
183#define tcsetattr(x,y,z) not_here("tcsetattr")
184#endif
185
186/* Possibly needed prototypes */
187char *cuserid _((char *));
a89d8a78
DH
188double strtod _((const char *, char **));
189long strtol _((const char *, char **, int));
190unsigned long strtoul _((const char *, char **, int));
a0d0e21e
LW
191
192#ifndef HAS_CUSERID
193#define cuserid(a) (char *) not_here("cuserid")
194#endif
195#ifndef HAS_DIFFTIME
196#ifndef difftime
197#define difftime(a,b) not_here("difftime")
198#endif
199#endif
200#ifndef HAS_FPATHCONF
201#define fpathconf(f,n) (SysRetLong) not_here("fpathconf")
202#endif
203#ifndef HAS_MKTIME
204#define mktime(a) not_here("mktime")
8990e307
LW
205#endif
206#ifndef HAS_NICE
207#define nice(a) not_here("nice")
208#endif
a0d0e21e
LW
209#ifndef HAS_PATHCONF
210#define pathconf(f,n) (SysRetLong) not_here("pathconf")
211#endif
212#ifndef HAS_SYSCONF
213#define sysconf(n) (SysRetLong) not_here("sysconf")
214#endif
8990e307
LW
215#ifndef HAS_READLINK
216#define readlink(a,b,c) not_here("readlink")
217#endif
218#ifndef HAS_SETPGID
219#define setpgid(a,b) not_here("setpgid")
220#endif
8990e307
LW
221#ifndef HAS_SETSID
222#define setsid() not_here("setsid")
223#endif
a0d0e21e
LW
224#ifndef HAS_STRCOLL
225#define strcoll(s1,s2) not_here("strcoll")
226#endif
a89d8a78
DH
227#ifndef HAS_STRTOD
228#define strtod(s1,s2) not_here("strtod")
229#endif
230#ifndef HAS_STRTOL
231#define strtol(s1,s2,b) not_here("strtol")
232#endif
233#ifndef HAS_STRTOUL
234#define strtoul(s1,s2,b) not_here("strtoul")
235#endif
a0d0e21e
LW
236#ifndef HAS_STRXFRM
237#define strxfrm(s1,s2,n) not_here("strxfrm")
8990e307
LW
238#endif
239#ifndef HAS_TCGETPGRP
240#define tcgetpgrp(a) not_here("tcgetpgrp")
241#endif
242#ifndef HAS_TCSETPGRP
243#define tcsetpgrp(a,b) not_here("tcsetpgrp")
244#endif
245#ifndef HAS_TIMES
246#define times(a) not_here("times")
247#endif
248#ifndef HAS_UNAME
249#define uname(a) not_here("uname")
250#endif
251#ifndef HAS_WAITPID
252#define waitpid(a,b,c) not_here("waitpid")
253#endif
254
a0d0e21e
LW
255#ifndef HAS_MBLEN
256#ifndef mblen
257#define mblen(a,b) not_here("mblen")
258#endif
259#endif
260#ifndef HAS_MBSTOWCS
261#define mbstowcs(s, pwcs, n) not_here("mbstowcs")
262#endif
263#ifndef HAS_MBTOWC
264#define mbtowc(pwc, s, n) not_here("mbtowc")
265#endif
266#ifndef HAS_WCSTOMBS
267#define wcstombs(s, pwcs, n) not_here("wcstombs")
268#endif
269#ifndef HAS_WCTOMB
270#define wctomb(s, wchar) not_here("wcstombs")
271#endif
272#if !defined(HAS_MBLEN) && !defined(HAS_MBSTOWCS) && !defined(HAS_MBTOWC) && !defined(HAS_WCSTOMBS) && !defined(HAS_WCTOMB)
273/* If we don't have these functions, then we wouldn't have gotten a typedef
274 for wchar_t, the wide character type. Defining wchar_t allows the
275 functions referencing it to compile. Its actual type is then meaningless,
276 since without the above functions, all sections using it end up calling
277 not_here() and croak. --Kaveh Ghazi (ghazi@noc.rutgers.edu) 9/18/94. */
278#ifndef wchar_t
279#define wchar_t char
280#endif
281#endif
282
283#ifndef HAS_LOCALECONV
284#define localeconv() not_here("localeconv")
285#endif
286
287#ifdef HAS_TZNAME
62520c91 288# ifndef WIN32
a0d0e21e 289extern char *tzname[];
62520c91 290# endif
a0d0e21e 291#else
fa4efe8e 292#if !defined(WIN32) || (defined(__MINGW32__) && !defined(tzname))
a0d0e21e
LW
293char *tzname[] = { "" , "" };
294#endif
eda5ff31 295#endif
a0d0e21e 296
7747499c
TB
297/* XXX struct tm on some systems (SunOS4/BSD) contains extra (non POSIX)
298 * fields for which we don't have Configure support yet:
299 * char *tm_zone; -- abbreviation of timezone name
300 * long tm_gmtoff; -- offset from GMT in seconds
301 * To workaround core dumps from the uninitialised tm_zone we get the
302 * system to give us a reasonable struct to copy. This fix means that
303 * strftime uses the tm_zone and tm_gmtoff values returned by
304 * localtime(time()). That should give the desired result most of the
305 * time. But probably not always!
306 *
307 * This is a temporary workaround to be removed once Configure
308 * support is added and NETaa14816 is considered in full.
309 * It does not address tzname aspects of NETaa14816.
310 */
dfe9444c
AD
311#ifdef HAS_GNULIBC
312# ifndef STRUCT_TM_HASZONE
75cb7811 313# define STRUCT_TM_HASZONE
dfe9444c
AD
314# endif
315#endif
316
7747499c
TB
317#ifdef STRUCT_TM_HASZONE
318static void
0221c164 319init_tm(struct tm *ptm) /* see mktime, strftime and asctime */
7747499c
TB
320{
321 Time_t now;
322 (void)time(&now);
323 Copy(localtime(&now), ptm, 1, struct tm);
324}
325
326#else
327# define init_tm(ptm)
328#endif
329
330
dc45a647
MB
331#ifdef HAS_LONG_DOUBLE
332# if LONG_DOUBLESIZE > DOUBLESIZE
333# undef HAS_LONG_DOUBLE /* XXX until we figure out how to use them */
334# endif
335#endif
336
337#ifndef HAS_LONG_DOUBLE
a0d0e21e
LW
338#ifdef LDBL_MAX
339#undef LDBL_MAX
340#endif
341#ifdef LDBL_MIN
342#undef LDBL_MIN
343#endif
344#ifdef LDBL_EPSILON
345#undef LDBL_EPSILON
346#endif
347#endif
348
8990e307 349static int
f0f333f4 350not_here(char *s)
8990e307
LW
351{
352 croak("POSIX::%s not implemented on this architecture", s);
353 return -1;
354}
463ee0b2 355
640cc986
HM
356static
357#ifdef HAS_LONG_DOUBLE
358long double
359#else
360double
361#endif
f0f333f4 362constant(char *name, int arg)
2304df62
AD
363{
364 errno = 0;
365 switch (*name) {
366 case 'A':
367 if (strEQ(name, "ARG_MAX"))
368#ifdef ARG_MAX
369 return ARG_MAX;
370#else
371 goto not_there;
372#endif
373 break;
374 case 'B':
375 if (strEQ(name, "BUFSIZ"))
376#ifdef BUFSIZ
377 return BUFSIZ;
378#else
379 goto not_there;
380#endif
381 if (strEQ(name, "BRKINT"))
382#ifdef BRKINT
383 return BRKINT;
384#else
385 goto not_there;
386#endif
387 if (strEQ(name, "B9600"))
388#ifdef B9600
389 return B9600;
390#else
391 goto not_there;
392#endif
393 if (strEQ(name, "B19200"))
394#ifdef B19200
395 return B19200;
396#else
397 goto not_there;
398#endif
399 if (strEQ(name, "B38400"))
400#ifdef B38400
401 return B38400;
402#else
403 goto not_there;
404#endif
405 if (strEQ(name, "B0"))
406#ifdef B0
407 return B0;
408#else
409 goto not_there;
410#endif
411 if (strEQ(name, "B110"))
412#ifdef B110
413 return B110;
414#else
415 goto not_there;
416#endif
417 if (strEQ(name, "B1200"))
418#ifdef B1200
419 return B1200;
420#else
421 goto not_there;
422#endif
423 if (strEQ(name, "B134"))
424#ifdef B134
425 return B134;
426#else
427 goto not_there;
428#endif
429 if (strEQ(name, "B150"))
430#ifdef B150
431 return B150;
432#else
433 goto not_there;
434#endif
435 if (strEQ(name, "B1800"))
436#ifdef B1800
437 return B1800;
438#else
439 goto not_there;
440#endif
441 if (strEQ(name, "B200"))
442#ifdef B200
443 return B200;
444#else
445 goto not_there;
446#endif
447 if (strEQ(name, "B2400"))
448#ifdef B2400
449 return B2400;
450#else
451 goto not_there;
452#endif
453 if (strEQ(name, "B300"))
454#ifdef B300
455 return B300;
456#else
457 goto not_there;
458#endif
459 if (strEQ(name, "B4800"))
460#ifdef B4800
461 return B4800;
462#else
463 goto not_there;
464#endif
465 if (strEQ(name, "B50"))
466#ifdef B50
467 return B50;
468#else
469 goto not_there;
470#endif
471 if (strEQ(name, "B600"))
472#ifdef B600
473 return B600;
474#else
475 goto not_there;
476#endif
477 if (strEQ(name, "B75"))
478#ifdef B75
479 return B75;
480#else
481 goto not_there;
482#endif
483 break;
484 case 'C':
485 if (strEQ(name, "CHAR_BIT"))
486#ifdef CHAR_BIT
487 return CHAR_BIT;
488#else
489 goto not_there;
490#endif
491 if (strEQ(name, "CHAR_MAX"))
492#ifdef CHAR_MAX
493 return CHAR_MAX;
494#else
495 goto not_there;
496#endif
497 if (strEQ(name, "CHAR_MIN"))
498#ifdef CHAR_MIN
499 return CHAR_MIN;
500#else
501 goto not_there;
502#endif
503 if (strEQ(name, "CHILD_MAX"))
504#ifdef CHILD_MAX
505 return CHILD_MAX;
506#else
507 goto not_there;
508#endif
509 if (strEQ(name, "CLK_TCK"))
510#ifdef CLK_TCK
511 return CLK_TCK;
512#else
513 goto not_there;
514#endif
515 if (strEQ(name, "CLOCAL"))
516#ifdef CLOCAL
517 return CLOCAL;
518#else
519 goto not_there;
520#endif
521 if (strEQ(name, "CLOCKS_PER_SEC"))
522#ifdef CLOCKS_PER_SEC
523 return CLOCKS_PER_SEC;
524#else
525 goto not_there;
526#endif
527 if (strEQ(name, "CREAD"))
528#ifdef CREAD
529 return CREAD;
530#else
531 goto not_there;
532#endif
533 if (strEQ(name, "CS5"))
534#ifdef CS5
535 return CS5;
536#else
537 goto not_there;
538#endif
539 if (strEQ(name, "CS6"))
540#ifdef CS6
541 return CS6;
542#else
543 goto not_there;
544#endif
545 if (strEQ(name, "CS7"))
546#ifdef CS7
547 return CS7;
548#else
549 goto not_there;
550#endif
551 if (strEQ(name, "CS8"))
552#ifdef CS8
553 return CS8;
554#else
555 goto not_there;
556#endif
557 if (strEQ(name, "CSIZE"))
558#ifdef CSIZE
559 return CSIZE;
560#else
561 goto not_there;
562#endif
563 if (strEQ(name, "CSTOPB"))
564#ifdef CSTOPB
565 return CSTOPB;
566#else
567 goto not_there;
568#endif
569 break;
570 case 'D':
571 if (strEQ(name, "DBL_MAX"))
572#ifdef DBL_MAX
573 return DBL_MAX;
574#else
575 goto not_there;
576#endif
577 if (strEQ(name, "DBL_MIN"))
578#ifdef DBL_MIN
579 return DBL_MIN;
580#else
581 goto not_there;
582#endif
583 if (strEQ(name, "DBL_DIG"))
584#ifdef DBL_DIG
585 return DBL_DIG;
586#else
587 goto not_there;
588#endif
589 if (strEQ(name, "DBL_EPSILON"))
590#ifdef DBL_EPSILON
591 return DBL_EPSILON;
592#else
593 goto not_there;
594#endif
595 if (strEQ(name, "DBL_MANT_DIG"))
596#ifdef DBL_MANT_DIG
597 return DBL_MANT_DIG;
598#else
599 goto not_there;
600#endif
601 if (strEQ(name, "DBL_MAX_10_EXP"))
602#ifdef DBL_MAX_10_EXP
603 return DBL_MAX_10_EXP;
604#else
605 goto not_there;
606#endif
607 if (strEQ(name, "DBL_MAX_EXP"))
608#ifdef DBL_MAX_EXP
609 return DBL_MAX_EXP;
610#else
611 goto not_there;
612#endif
613 if (strEQ(name, "DBL_MIN_10_EXP"))
614#ifdef DBL_MIN_10_EXP
615 return DBL_MIN_10_EXP;
616#else
617 goto not_there;
618#endif
619 if (strEQ(name, "DBL_MIN_EXP"))
620#ifdef DBL_MIN_EXP
621 return DBL_MIN_EXP;
622#else
623 goto not_there;
624#endif
625 break;
626 case 'E':
627 switch (name[1]) {
628 case 'A':
629 if (strEQ(name, "EACCES"))
630#ifdef EACCES
631 return EACCES;
632#else
633 goto not_there;
634#endif
774d564b 635 if (strEQ(name, "EADDRINUSE"))
636#ifdef EADDRINUSE
637 return EADDRINUSE;
638#else
639 goto not_there;
640#endif
641 if (strEQ(name, "EADDRNOTAVAIL"))
642#ifdef EADDRNOTAVAIL
643 return EADDRNOTAVAIL;
644#else
645 goto not_there;
646#endif
647 if (strEQ(name, "EAFNOSUPPORT"))
648#ifdef EAFNOSUPPORT
649 return EAFNOSUPPORT;
650#else
651 goto not_there;
652#endif
2304df62
AD
653 if (strEQ(name, "EAGAIN"))
654#ifdef EAGAIN
655 return EAGAIN;
656#else
657 goto not_there;
658#endif
774d564b 659 if (strEQ(name, "EALREADY"))
660#ifdef EALREADY
661 return EALREADY;
662#else
663 goto not_there;
664#endif
2304df62
AD
665 break;
666 case 'B':
667 if (strEQ(name, "EBADF"))
668#ifdef EBADF
669 return EBADF;
670#else
671 goto not_there;
672#endif
673 if (strEQ(name, "EBUSY"))
674#ifdef EBUSY
675 return EBUSY;
676#else
677 goto not_there;
678#endif
679 break;
680 case 'C':
681 if (strEQ(name, "ECHILD"))
682#ifdef ECHILD
683 return ECHILD;
684#else
685 goto not_there;
686#endif
687 if (strEQ(name, "ECHO"))
688#ifdef ECHO
689 return ECHO;
690#else
691 goto not_there;
692#endif
693 if (strEQ(name, "ECHOE"))
694#ifdef ECHOE
695 return ECHOE;
696#else
697 goto not_there;
698#endif
699 if (strEQ(name, "ECHOK"))
700#ifdef ECHOK
701 return ECHOK;
702#else
703 goto not_there;
704#endif
705 if (strEQ(name, "ECHONL"))
706#ifdef ECHONL
707 return ECHONL;
708#else
709 goto not_there;
710#endif
774d564b 711 if (strEQ(name, "ECONNABORTED"))
712#ifdef ECONNABORTED
713 return ECONNABORTED;
714#else
715 goto not_there;
716#endif
717 if (strEQ(name, "ECONNREFUSED"))
718#ifdef ECONNREFUSED
719 return ECONNREFUSED;
720#else
721 goto not_there;
722#endif
723 if (strEQ(name, "ECONNRESET"))
724#ifdef ECONNRESET
725 return ECONNRESET;
726#else
727 goto not_there;
728#endif
2304df62
AD
729 break;
730 case 'D':
731 if (strEQ(name, "EDEADLK"))
732#ifdef EDEADLK
733 return EDEADLK;
734#else
735 goto not_there;
736#endif
774d564b 737 if (strEQ(name, "EDESTADDRREQ"))
738#ifdef EDESTADDRREQ
739 return EDESTADDRREQ;
740#else
741 goto not_there;
742#endif
2304df62
AD
743 if (strEQ(name, "EDOM"))
744#ifdef EDOM
745 return EDOM;
746#else
747 goto not_there;
748#endif
774d564b 749 if (strEQ(name, "EDQUOT"))
750#ifdef EDQUOT
751 return EDQUOT;
752#else
753 goto not_there;
754#endif
2304df62
AD
755 break;
756 case 'E':
757 if (strEQ(name, "EEXIST"))
758#ifdef EEXIST
759 return EEXIST;
760#else
761 goto not_there;
762#endif
763 break;
764 case 'F':
765 if (strEQ(name, "EFAULT"))
766#ifdef EFAULT
767 return EFAULT;
768#else
769 goto not_there;
770#endif
771 if (strEQ(name, "EFBIG"))
772#ifdef EFBIG
773 return EFBIG;
774#else
775 goto not_there;
776#endif
777 break;
774d564b 778 case 'H':
779 if (strEQ(name, "EHOSTDOWN"))
780#ifdef EHOSTDOWN
781 return EHOSTDOWN;
782#else
783 goto not_there;
784#endif
785 if (strEQ(name, "EHOSTUNREACH"))
786#ifdef EHOSTUNREACH
787 return EHOSTUNREACH;
788#else
789 goto not_there;
790#endif
791 break;
2304df62 792 case 'I':
774d564b 793 if (strEQ(name, "EINPROGRESS"))
794#ifdef EINPROGRESS
795 return EINPROGRESS;
796#else
797 goto not_there;
798#endif
2304df62
AD
799 if (strEQ(name, "EINTR"))
800#ifdef EINTR
801 return EINTR;
802#else
803 goto not_there;
804#endif
805 if (strEQ(name, "EINVAL"))
806#ifdef EINVAL
807 return EINVAL;
808#else
809 goto not_there;
810#endif
811 if (strEQ(name, "EIO"))
812#ifdef EIO
813 return EIO;
814#else
815 goto not_there;
816#endif
774d564b 817 if (strEQ(name, "EISCONN"))
818#ifdef EISCONN
819 return EISCONN;
820#else
821 goto not_there;
822#endif
2304df62
AD
823 if (strEQ(name, "EISDIR"))
824#ifdef EISDIR
825 return EISDIR;
826#else
827 goto not_there;
828#endif
4670cb3e
NC
829 break;
830 case 'L':
774d564b 831 if (strEQ(name, "ELOOP"))
832#ifdef ELOOP
833 return ELOOP;
834#else
835 goto not_there;
836#endif
2304df62
AD
837 break;
838 case 'M':
839 if (strEQ(name, "EMFILE"))
840#ifdef EMFILE
841 return EMFILE;
842#else
843 goto not_there;
844#endif
845 if (strEQ(name, "EMLINK"))
846#ifdef EMLINK
847 return EMLINK;
848#else
849 goto not_there;
850#endif
774d564b 851 if (strEQ(name, "EMSGSIZE"))
852#ifdef EMSGSIZE
853 return EMSGSIZE;
854#else
855 goto not_there;
856#endif
2304df62
AD
857 break;
858 case 'N':
774d564b 859 if (strEQ(name, "ENETDOWN"))
860#ifdef ENETDOWN
861 return ENETDOWN;
862#else
863 goto not_there;
864#endif
865 if (strEQ(name, "ENETRESET"))
866#ifdef ENETRESET
867 return ENETRESET;
868#else
869 goto not_there;
870#endif
871 if (strEQ(name, "ENETUNREACH"))
872#ifdef ENETUNREACH
873 return ENETUNREACH;
874#else
875 goto not_there;
876#endif
877 if (strEQ(name, "ENOBUFS"))
878#ifdef ENOBUFS
879 return ENOBUFS;
880#else
881 goto not_there;
882#endif
883 if (strEQ(name, "ENOEXEC"))
884#ifdef ENOEXEC
885 return ENOEXEC;
886#else
887 goto not_there;
888#endif
2304df62
AD
889 if (strEQ(name, "ENOMEM"))
890#ifdef ENOMEM
891 return ENOMEM;
892#else
893 goto not_there;
894#endif
774d564b 895 if (strEQ(name, "ENOPROTOOPT"))
896#ifdef ENOPROTOOPT
897 return ENOPROTOOPT;
898#else
899 goto not_there;
900#endif
2304df62
AD
901 if (strEQ(name, "ENOSPC"))
902#ifdef ENOSPC
903 return ENOSPC;
904#else
905 goto not_there;
906#endif
774d564b 907 if (strEQ(name, "ENOTBLK"))
908#ifdef ENOTBLK
909 return ENOTBLK;
2304df62
AD
910#else
911 goto not_there;
912#endif
774d564b 913 if (strEQ(name, "ENOTCONN"))
914#ifdef ENOTCONN
915 return ENOTCONN;
2304df62
AD
916#else
917 goto not_there;
918#endif
919 if (strEQ(name, "ENOTDIR"))
920#ifdef ENOTDIR
921 return ENOTDIR;
922#else
923 goto not_there;
924#endif
925 if (strEQ(name, "ENOTEMPTY"))
926#ifdef ENOTEMPTY
927 return ENOTEMPTY;
928#else
929 goto not_there;
930#endif
774d564b 931 if (strEQ(name, "ENOTSOCK"))
932#ifdef ENOTSOCK
933 return ENOTSOCK;
934#else
935 goto not_there;
936#endif
937 if (strEQ(name, "ENOTTY"))
938#ifdef ENOTTY
939 return ENOTTY;
940#else
941 goto not_there;
942#endif
2304df62
AD
943 if (strEQ(name, "ENFILE"))
944#ifdef ENFILE
945 return ENFILE;
946#else
947 goto not_there;
948#endif
949 if (strEQ(name, "ENODEV"))
950#ifdef ENODEV
951 return ENODEV;
952#else
953 goto not_there;
954#endif
955 if (strEQ(name, "ENOENT"))
956#ifdef ENOENT
957 return ENOENT;
958#else
959 goto not_there;
960#endif
961 if (strEQ(name, "ENOLCK"))
962#ifdef ENOLCK
963 return ENOLCK;
964#else
965 goto not_there;
966#endif
967 if (strEQ(name, "ENOSYS"))
968#ifdef ENOSYS
969 return ENOSYS;
970#else
971 goto not_there;
972#endif
973 if (strEQ(name, "ENXIO"))
974#ifdef ENXIO
975 return ENXIO;
976#else
977 goto not_there;
978#endif
979 if (strEQ(name, "ENAMETOOLONG"))
980#ifdef ENAMETOOLONG
981 return ENAMETOOLONG;
982#else
983 goto not_there;
984#endif
985 break;
986 case 'O':
987 if (strEQ(name, "EOF"))
988#ifdef EOF
989 return EOF;
990#else
991 goto not_there;
992#endif
774d564b 993 if (strEQ(name, "EOPNOTSUPP"))
994#ifdef EOPNOTSUPP
995 return EOPNOTSUPP;
996#else
997 goto not_there;
998#endif
2304df62
AD
999 break;
1000 case 'P':
1001 if (strEQ(name, "EPERM"))
1002#ifdef EPERM
1003 return EPERM;
1004#else
1005 goto not_there;
1006#endif
774d564b 1007 if (strEQ(name, "EPFNOSUPPORT"))
1008#ifdef EPFNOSUPPORT
1009 return EPFNOSUPPORT;
1010#else
1011 goto not_there;
1012#endif
2304df62
AD
1013 if (strEQ(name, "EPIPE"))
1014#ifdef EPIPE
1015 return EPIPE;
1016#else
1017 goto not_there;
1018#endif
774d564b 1019 if (strEQ(name, "EPROCLIM"))
1020#ifdef EPROCLIM
1021 return EPROCLIM;
1022#else
1023 goto not_there;
1024#endif
1025 if (strEQ(name, "EPROTONOSUPPORT"))
1026#ifdef EPROTONOSUPPORT
1027 return EPROTONOSUPPORT;
1028#else
1029 goto not_there;
1030#endif
1031 if (strEQ(name, "EPROTOTYPE"))
1032#ifdef EPROTOTYPE
1033 return EPROTOTYPE;
1034#else
1035 goto not_there;
1036#endif
2304df62
AD
1037 break;
1038 case 'R':
1039 if (strEQ(name, "ERANGE"))
1040#ifdef ERANGE
1041 return ERANGE;
1042#else
1043 goto not_there;
1044#endif
774d564b 1045 if (strEQ(name, "EREMOTE"))
1046#ifdef EREMOTE
1047 return EREMOTE;
1048#else
1049 goto not_there;
1050#endif
1051 if (strEQ(name, "ERESTART"))
1052#ifdef ERESTART
1053 return ERESTART;
1054#else
1055 goto not_there;
1056#endif
2304df62
AD
1057 if (strEQ(name, "EROFS"))
1058#ifdef EROFS
1059 return EROFS;
1060#else
1061 goto not_there;
1062#endif
1063 break;
1064 case 'S':
774d564b 1065 if (strEQ(name, "ESHUTDOWN"))
1066#ifdef ESHUTDOWN
1067 return ESHUTDOWN;
1068#else
1069 goto not_there;
1070#endif
1071 if (strEQ(name, "ESOCKTNOSUPPORT"))
1072#ifdef ESOCKTNOSUPPORT
1073 return ESOCKTNOSUPPORT;
1074#else
1075 goto not_there;
1076#endif
2304df62
AD
1077 if (strEQ(name, "ESPIPE"))
1078#ifdef ESPIPE
1079 return ESPIPE;
1080#else
1081 goto not_there;
1082#endif
1083 if (strEQ(name, "ESRCH"))
1084#ifdef ESRCH
1085 return ESRCH;
1086#else
1087 goto not_there;
1088#endif
774d564b 1089 if (strEQ(name, "ESTALE"))
1090#ifdef ESTALE
1091 return ESTALE;
1092#else
1093 goto not_there;
1094#endif
2304df62 1095 break;
774d564b 1096 case 'T':
1097 if (strEQ(name, "ETIMEDOUT"))
1098#ifdef ETIMEDOUT
1099 return ETIMEDOUT;
1100#else
1101 goto not_there;
1102#endif
1103 if (strEQ(name, "ETOOMANYREFS"))
1104#ifdef ETOOMANYREFS
1105 return ETOOMANYREFS;
1106#else
1107 goto not_there;
1108#endif
1109 if (strEQ(name, "ETXTBSY"))
1110#ifdef ETXTBSY
1111 return ETXTBSY;
1112#else
1113 goto not_there;
1114#endif
1115 break;
1116 case 'U':
1117 if (strEQ(name, "EUSERS"))
1118#ifdef EUSERS
1119 return EUSERS;
1120#else
1121 goto not_there;
1122#endif
1123 break;
1124 case 'W':
1125 if (strEQ(name, "EWOULDBLOCK"))
1126#ifdef EWOULDBLOCK
1127 return EWOULDBLOCK;
1128#else
1129 goto not_there;
1130#endif
1131 break;
2304df62
AD
1132 case 'X':
1133 if (strEQ(name, "EXIT_FAILURE"))
1134#ifdef EXIT_FAILURE
1135 return EXIT_FAILURE;
1136#else
1137 return 1;
1138#endif
1139 if (strEQ(name, "EXIT_SUCCESS"))
1140#ifdef EXIT_SUCCESS
1141 return EXIT_SUCCESS;
1142#else
1143 return 0;
1144#endif
1145 if (strEQ(name, "EXDEV"))
1146#ifdef EXDEV
1147 return EXDEV;
1148#else
1149 goto not_there;
1150#endif
1151 break;
1152 }
1153 if (strEQ(name, "E2BIG"))
1154#ifdef E2BIG
1155 return E2BIG;
1156#else
1157 goto not_there;
1158#endif
1159 break;
1160 case 'F':
1161 if (strnEQ(name, "FLT_", 4)) {
1162 if (strEQ(name, "FLT_MAX"))
1163#ifdef FLT_MAX
1164 return FLT_MAX;
1165#else
1166 goto not_there;
1167#endif
1168 if (strEQ(name, "FLT_MIN"))
1169#ifdef FLT_MIN
1170 return FLT_MIN;
1171#else
1172 goto not_there;
1173#endif
1174 if (strEQ(name, "FLT_ROUNDS"))
1175#ifdef FLT_ROUNDS
1176 return FLT_ROUNDS;
1177#else
1178 goto not_there;
1179#endif
1180 if (strEQ(name, "FLT_DIG"))
1181#ifdef FLT_DIG
1182 return FLT_DIG;
1183#else
1184 goto not_there;
1185#endif
1186 if (strEQ(name, "FLT_EPSILON"))
1187#ifdef FLT_EPSILON
1188 return FLT_EPSILON;
1189#else
1190 goto not_there;
1191#endif
1192 if (strEQ(name, "FLT_MANT_DIG"))
1193#ifdef FLT_MANT_DIG
1194 return FLT_MANT_DIG;
1195#else
1196 goto not_there;
1197#endif
1198 if (strEQ(name, "FLT_MAX_10_EXP"))
1199#ifdef FLT_MAX_10_EXP
1200 return FLT_MAX_10_EXP;
1201#else
1202 goto not_there;
1203#endif
1204 if (strEQ(name, "FLT_MAX_EXP"))
1205#ifdef FLT_MAX_EXP
1206 return FLT_MAX_EXP;
1207#else
1208 goto not_there;
1209#endif
1210 if (strEQ(name, "FLT_MIN_10_EXP"))
1211#ifdef FLT_MIN_10_EXP
1212 return FLT_MIN_10_EXP;
1213#else
1214 goto not_there;
1215#endif
1216 if (strEQ(name, "FLT_MIN_EXP"))
1217#ifdef FLT_MIN_EXP
1218 return FLT_MIN_EXP;
1219#else
1220 goto not_there;
1221#endif
1222 if (strEQ(name, "FLT_RADIX"))
1223#ifdef FLT_RADIX
1224 return FLT_RADIX;
1225#else
1226 goto not_there;
1227#endif
1228 break;
1229 }
1230 if (strnEQ(name, "F_", 2)) {
1231 if (strEQ(name, "F_DUPFD"))
1232#ifdef F_DUPFD
1233 return F_DUPFD;
1234#else
1235 goto not_there;
1236#endif
1237 if (strEQ(name, "F_GETFD"))
1238#ifdef F_GETFD
1239 return F_GETFD;
1240#else
1241 goto not_there;
1242#endif
1243 if (strEQ(name, "F_GETFL"))
1244#ifdef F_GETFL
1245 return F_GETFL;
1246#else
1247 goto not_there;
1248#endif
1249 if (strEQ(name, "F_GETLK"))
1250#ifdef F_GETLK
1251 return F_GETLK;
1252#else
1253 goto not_there;
1254#endif
1255 if (strEQ(name, "F_OK"))
1256#ifdef F_OK
1257 return F_OK;
1258#else
1259 goto not_there;
1260#endif
1261 if (strEQ(name, "F_RDLCK"))
1262#ifdef F_RDLCK
1263 return F_RDLCK;
1264#else
1265 goto not_there;
1266#endif
1267 if (strEQ(name, "F_SETFD"))
1268#ifdef F_SETFD
1269 return F_SETFD;
1270#else
1271 goto not_there;
1272#endif
1273 if (strEQ(name, "F_SETFL"))
1274#ifdef F_SETFL
1275 return F_SETFL;
1276#else
1277 goto not_there;
1278#endif
1279 if (strEQ(name, "F_SETLK"))
1280#ifdef F_SETLK
1281 return F_SETLK;
1282#else
1283 goto not_there;
1284#endif
1285 if (strEQ(name, "F_SETLKW"))
1286#ifdef F_SETLKW
1287 return F_SETLKW;
1288#else
1289 goto not_there;
1290#endif
1291 if (strEQ(name, "F_UNLCK"))
1292#ifdef F_UNLCK
1293 return F_UNLCK;
1294#else
1295 goto not_there;
1296#endif
1297 if (strEQ(name, "F_WRLCK"))
1298#ifdef F_WRLCK
1299 return F_WRLCK;
1300#else
1301 goto not_there;
1302#endif
1303 break;
1304 }
40000a8c
AD
1305 if (strEQ(name, "FD_CLOEXEC"))
1306#ifdef FD_CLOEXEC
1307 return FD_CLOEXEC;
1308#else
1309 goto not_there;
1310#endif
2304df62
AD
1311 if (strEQ(name, "FILENAME_MAX"))
1312#ifdef FILENAME_MAX
1313 return FILENAME_MAX;
1314#else
1315 goto not_there;
1316#endif
1317 break;
1318 case 'H':
1319 if (strEQ(name, "HUGE_VAL"))
1320#ifdef HUGE_VAL
1321 return HUGE_VAL;
1322#else
1323 goto not_there;
1324#endif
1325 if (strEQ(name, "HUPCL"))
1326#ifdef HUPCL
1327 return HUPCL;
1328#else
1329 goto not_there;
1330#endif
1331 break;
1332 case 'I':
1333 if (strEQ(name, "INT_MAX"))
1334#ifdef INT_MAX
1335 return INT_MAX;
1336#else
1337 goto not_there;
1338#endif
1339 if (strEQ(name, "INT_MIN"))
1340#ifdef INT_MIN
1341 return INT_MIN;
1342#else
1343 goto not_there;
1344#endif
1345 if (strEQ(name, "ICANON"))
1346#ifdef ICANON
1347 return ICANON;
1348#else
1349 goto not_there;
1350#endif
1351 if (strEQ(name, "ICRNL"))
1352#ifdef ICRNL
1353 return ICRNL;
1354#else
1355 goto not_there;
1356#endif
1357 if (strEQ(name, "IEXTEN"))
1358#ifdef IEXTEN
1359 return IEXTEN;
1360#else
1361 goto not_there;
1362#endif
1363 if (strEQ(name, "IGNBRK"))
1364#ifdef IGNBRK
1365 return IGNBRK;
1366#else
1367 goto not_there;
1368#endif
1369 if (strEQ(name, "IGNCR"))
1370#ifdef IGNCR
1371 return IGNCR;
1372#else
1373 goto not_there;
1374#endif
1375 if (strEQ(name, "IGNPAR"))
1376#ifdef IGNPAR
1377 return IGNPAR;
1378#else
1379 goto not_there;
1380#endif
1381 if (strEQ(name, "INLCR"))
1382#ifdef INLCR
1383 return INLCR;
1384#else
1385 goto not_there;
1386#endif
1387 if (strEQ(name, "INPCK"))
1388#ifdef INPCK
1389 return INPCK;
1390#else
1391 goto not_there;
1392#endif
1393 if (strEQ(name, "ISIG"))
1394#ifdef ISIG
1395 return ISIG;
1396#else
1397 goto not_there;
1398#endif
1399 if (strEQ(name, "ISTRIP"))
1400#ifdef ISTRIP
1401 return ISTRIP;
1402#else
1403 goto not_there;
1404#endif
1405 if (strEQ(name, "IXOFF"))
1406#ifdef IXOFF
1407 return IXOFF;
1408#else
1409 goto not_there;
1410#endif
1411 if (strEQ(name, "IXON"))
1412#ifdef IXON
1413 return IXON;
1414#else
1415 goto not_there;
1416#endif
1417 break;
1418 case 'L':
1419 if (strnEQ(name, "LC_", 3)) {
1420 if (strEQ(name, "LC_ALL"))
1421#ifdef LC_ALL
1422 return LC_ALL;
1423#else
1424 goto not_there;
1425#endif
1426 if (strEQ(name, "LC_COLLATE"))
1427#ifdef LC_COLLATE
1428 return LC_COLLATE;
1429#else
1430 goto not_there;
1431#endif
1432 if (strEQ(name, "LC_CTYPE"))
1433#ifdef LC_CTYPE
1434 return LC_CTYPE;
1435#else
1436 goto not_there;
1437#endif
1438 if (strEQ(name, "LC_MONETARY"))
1439#ifdef LC_MONETARY
1440 return LC_MONETARY;
1441#else
1442 goto not_there;
1443#endif
1444 if (strEQ(name, "LC_NUMERIC"))
1445#ifdef LC_NUMERIC
1446 return LC_NUMERIC;
1447#else
1448 goto not_there;
1449#endif
1450 if (strEQ(name, "LC_TIME"))
1451#ifdef LC_TIME
1452 return LC_TIME;
1453#else
1454 goto not_there;
1455#endif
1456 break;
1457 }
1458 if (strnEQ(name, "LDBL_", 5)) {
1459 if (strEQ(name, "LDBL_MAX"))
1460#ifdef LDBL_MAX
1461 return LDBL_MAX;
1462#else
1463 goto not_there;
1464#endif
1465 if (strEQ(name, "LDBL_MIN"))
1466#ifdef LDBL_MIN
1467 return LDBL_MIN;
1468#else
1469 goto not_there;
1470#endif
1471 if (strEQ(name, "LDBL_DIG"))
1472#ifdef LDBL_DIG
1473 return LDBL_DIG;
1474#else
1475 goto not_there;
1476#endif
1477 if (strEQ(name, "LDBL_EPSILON"))
1478#ifdef LDBL_EPSILON
1479 return LDBL_EPSILON;
1480#else
1481 goto not_there;
1482#endif
1483 if (strEQ(name, "LDBL_MANT_DIG"))
1484#ifdef LDBL_MANT_DIG
1485 return LDBL_MANT_DIG;
1486#else
1487 goto not_there;
1488#endif
1489 if (strEQ(name, "LDBL_MAX_10_EXP"))
1490#ifdef LDBL_MAX_10_EXP
1491 return LDBL_MAX_10_EXP;
1492#else
1493 goto not_there;
1494#endif
1495 if (strEQ(name, "LDBL_MAX_EXP"))
1496#ifdef LDBL_MAX_EXP
1497 return LDBL_MAX_EXP;
1498#else
1499 goto not_there;
1500#endif
1501 if (strEQ(name, "LDBL_MIN_10_EXP"))
1502#ifdef LDBL_MIN_10_EXP
1503 return LDBL_MIN_10_EXP;
1504#else
1505 goto not_there;
1506#endif
1507 if (strEQ(name, "LDBL_MIN_EXP"))
1508#ifdef LDBL_MIN_EXP
1509 return LDBL_MIN_EXP;
1510#else
1511 goto not_there;
1512#endif
1513 break;
1514 }
1515 if (strnEQ(name, "L_", 2)) {
1516 if (strEQ(name, "L_ctermid"))
1517#ifdef L_ctermid
1518 return L_ctermid;
1519#else
1520 goto not_there;
1521#endif
1522 if (strEQ(name, "L_cuserid"))
1523#ifdef L_cuserid
1524 return L_cuserid;
1525#else
1526 goto not_there;
1527#endif
1528 if (strEQ(name, "L_tmpname"))
1529#ifdef L_tmpname
1530 return L_tmpname;
1531#else
1532 goto not_there;
1533#endif
1534 break;
1535 }
1536 if (strEQ(name, "LONG_MAX"))
1537#ifdef LONG_MAX
1538 return LONG_MAX;
1539#else
1540 goto not_there;
1541#endif
1542 if (strEQ(name, "LONG_MIN"))
1543#ifdef LONG_MIN
1544 return LONG_MIN;
1545#else
1546 goto not_there;
1547#endif
1548 if (strEQ(name, "LINK_MAX"))
1549#ifdef LINK_MAX
1550 return LINK_MAX;
1551#else
1552 goto not_there;
1553#endif
1554 break;
1555 case 'M':
1556 if (strEQ(name, "MAX_CANON"))
1557#ifdef MAX_CANON
1558 return MAX_CANON;
1559#else
1560 goto not_there;
1561#endif
1562 if (strEQ(name, "MAX_INPUT"))
1563#ifdef MAX_INPUT
1564 return MAX_INPUT;
1565#else
1566 goto not_there;
1567#endif
1568 if (strEQ(name, "MB_CUR_MAX"))
1569#ifdef MB_CUR_MAX
1570 return MB_CUR_MAX;
1571#else
1572 goto not_there;
1573#endif
1574 if (strEQ(name, "MB_LEN_MAX"))
1575#ifdef MB_LEN_MAX
1576 return MB_LEN_MAX;
1577#else
1578 goto not_there;
1579#endif
1580 break;
1581 case 'N':
a0d0e21e 1582 if (strEQ(name, "NULL")) return 0;
2304df62
AD
1583 if (strEQ(name, "NAME_MAX"))
1584#ifdef NAME_MAX
1585 return NAME_MAX;
1586#else
1587 goto not_there;
1588#endif
1589 if (strEQ(name, "NCCS"))
1590#ifdef NCCS
1591 return NCCS;
1592#else
1593 goto not_there;
1594#endif
1595 if (strEQ(name, "NGROUPS_MAX"))
1596#ifdef NGROUPS_MAX
1597 return NGROUPS_MAX;
1598#else
1599 goto not_there;
1600#endif
1601 if (strEQ(name, "NOFLSH"))
1602#ifdef NOFLSH
1603 return NOFLSH;
1604#else
1605 goto not_there;
1606#endif
1607 break;
1608 case 'O':
1609 if (strnEQ(name, "O_", 2)) {
1610 if (strEQ(name, "O_APPEND"))
1611#ifdef O_APPEND
1612 return O_APPEND;
1613#else
1614 goto not_there;
1615#endif
1616 if (strEQ(name, "O_CREAT"))
1617#ifdef O_CREAT
1618 return O_CREAT;
1619#else
1620 goto not_there;
1621#endif
1622 if (strEQ(name, "O_TRUNC"))
1623#ifdef O_TRUNC
1624 return O_TRUNC;
1625#else
1626 goto not_there;
1627#endif
1628 if (strEQ(name, "O_RDONLY"))
1629#ifdef O_RDONLY
1630 return O_RDONLY;
1631#else
1632 goto not_there;
1633#endif
1634 if (strEQ(name, "O_RDWR"))
1635#ifdef O_RDWR
1636 return O_RDWR;
1637#else
1638 goto not_there;
1639#endif
1640 if (strEQ(name, "O_WRONLY"))
1641#ifdef O_WRONLY
1642 return O_WRONLY;
1643#else
1644 goto not_there;
1645#endif
1646 if (strEQ(name, "O_EXCL"))
1647#ifdef O_EXCL
1648 return O_EXCL;
1649#else
1650 goto not_there;
1651#endif
1652 if (strEQ(name, "O_NOCTTY"))
1653#ifdef O_NOCTTY
1654 return O_NOCTTY;
1655#else
1656 goto not_there;
1657#endif
1658 if (strEQ(name, "O_NONBLOCK"))
1659#ifdef O_NONBLOCK
1660 return O_NONBLOCK;
1661#else
1662 goto not_there;
1663#endif
1664 if (strEQ(name, "O_ACCMODE"))
1665#ifdef O_ACCMODE
1666 return O_ACCMODE;
1667#else
1668 goto not_there;
1669#endif
1670 break;
1671 }
1672 if (strEQ(name, "OPEN_MAX"))
1673#ifdef OPEN_MAX
1674 return OPEN_MAX;
1675#else
1676 goto not_there;
1677#endif
1678 if (strEQ(name, "OPOST"))
1679#ifdef OPOST
1680 return OPOST;
1681#else
1682 goto not_there;
1683#endif
1684 break;
1685 case 'P':
1686 if (strEQ(name, "PATH_MAX"))
1687#ifdef PATH_MAX
1688 return PATH_MAX;
1689#else
1690 goto not_there;
1691#endif
1692 if (strEQ(name, "PARENB"))
1693#ifdef PARENB
1694 return PARENB;
1695#else
1696 goto not_there;
1697#endif
1698 if (strEQ(name, "PARMRK"))
1699#ifdef PARMRK
1700 return PARMRK;
1701#else
1702 goto not_there;
1703#endif
1704 if (strEQ(name, "PARODD"))
1705#ifdef PARODD
1706 return PARODD;
1707#else
1708 goto not_there;
1709#endif
1710 if (strEQ(name, "PIPE_BUF"))
1711#ifdef PIPE_BUF
1712 return PIPE_BUF;
1713#else
1714 goto not_there;
1715#endif
1716 break;
1717 case 'R':
1718 if (strEQ(name, "RAND_MAX"))
1719#ifdef RAND_MAX
1720 return RAND_MAX;
1721#else
1722 goto not_there;
1723#endif
1724 if (strEQ(name, "R_OK"))
1725#ifdef R_OK
1726 return R_OK;
1727#else
1728 goto not_there;
1729#endif
1730 break;
1731 case 'S':
1732 if (strnEQ(name, "SIG", 3)) {
1733 if (name[3] == '_') {
1734 if (strEQ(name, "SIG_BLOCK"))
1735#ifdef SIG_BLOCK
1736 return SIG_BLOCK;
1737#else
1738 goto not_there;
1739#endif
1740#ifdef SIG_DFL
68dc0745 1741 if (strEQ(name, "SIG_DFL")) return (IV)SIG_DFL;
2304df62
AD
1742#endif
1743#ifdef SIG_ERR
68dc0745 1744 if (strEQ(name, "SIG_ERR")) return (IV)SIG_ERR;
2304df62
AD
1745#endif
1746#ifdef SIG_IGN
68dc0745 1747 if (strEQ(name, "SIG_IGN")) return (IV)SIG_IGN;
2304df62
AD
1748#endif
1749 if (strEQ(name, "SIG_SETMASK"))
1750#ifdef SIG_SETMASK
1751 return SIG_SETMASK;
1752#else
1753 goto not_there;
1754#endif
1755 if (strEQ(name, "SIG_UNBLOCK"))
1756#ifdef SIG_UNBLOCK
1757 return SIG_UNBLOCK;
1758#else
1759 goto not_there;
1760#endif
1761 break;
1762 }
1763 if (strEQ(name, "SIGABRT"))
1764#ifdef SIGABRT
1765 return SIGABRT;
1766#else
1767 goto not_there;
1768#endif
1769 if (strEQ(name, "SIGALRM"))
1770#ifdef SIGALRM
1771 return SIGALRM;
1772#else
1773 goto not_there;
1774#endif
1775 if (strEQ(name, "SIGCHLD"))
1776#ifdef SIGCHLD
1777 return SIGCHLD;
1778#else
1779 goto not_there;
1780#endif
1781 if (strEQ(name, "SIGCONT"))
1782#ifdef SIGCONT
1783 return SIGCONT;
1784#else
1785 goto not_there;
1786#endif
1787 if (strEQ(name, "SIGFPE"))
1788#ifdef SIGFPE
1789 return SIGFPE;
1790#else
1791 goto not_there;
1792#endif
1793 if (strEQ(name, "SIGHUP"))
1794#ifdef SIGHUP
1795 return SIGHUP;
1796#else
1797 goto not_there;
1798#endif
1799 if (strEQ(name, "SIGILL"))
1800#ifdef SIGILL
1801 return SIGILL;
1802#else
1803 goto not_there;
1804#endif
1805 if (strEQ(name, "SIGINT"))
1806#ifdef SIGINT
1807 return SIGINT;
1808#else
1809 goto not_there;
1810#endif
1811 if (strEQ(name, "SIGKILL"))
1812#ifdef SIGKILL
1813 return SIGKILL;
1814#else
1815 goto not_there;
1816#endif
1817 if (strEQ(name, "SIGPIPE"))
1818#ifdef SIGPIPE
1819 return SIGPIPE;
1820#else
1821 goto not_there;
1822#endif
1823 if (strEQ(name, "SIGQUIT"))
1824#ifdef SIGQUIT
1825 return SIGQUIT;
1826#else
1827 goto not_there;
1828#endif
1829 if (strEQ(name, "SIGSEGV"))
1830#ifdef SIGSEGV
1831 return SIGSEGV;
1832#else
1833 goto not_there;
1834#endif
1835 if (strEQ(name, "SIGSTOP"))
1836#ifdef SIGSTOP
1837 return SIGSTOP;
1838#else
1839 goto not_there;
1840#endif
1841 if (strEQ(name, "SIGTERM"))
1842#ifdef SIGTERM
1843 return SIGTERM;
1844#else
1845 goto not_there;
1846#endif
1847 if (strEQ(name, "SIGTSTP"))
1848#ifdef SIGTSTP
1849 return SIGTSTP;
1850#else
1851 goto not_there;
1852#endif
1853 if (strEQ(name, "SIGTTIN"))
1854#ifdef SIGTTIN
1855 return SIGTTIN;
1856#else
1857 goto not_there;
1858#endif
1859 if (strEQ(name, "SIGTTOU"))
1860#ifdef SIGTTOU
1861 return SIGTTOU;
1862#else
1863 goto not_there;
1864#endif
1865 if (strEQ(name, "SIGUSR1"))
1866#ifdef SIGUSR1
1867 return SIGUSR1;
1868#else
1869 goto not_there;
1870#endif
1871 if (strEQ(name, "SIGUSR2"))
1872#ifdef SIGUSR2
1873 return SIGUSR2;
1874#else
1875 goto not_there;
1876#endif
1877 break;
1878 }
1879 if (name[1] == '_') {
2304df62
AD
1880 if (strEQ(name, "S_ISGID"))
1881#ifdef S_ISGID
1882 return S_ISGID;
1883#else
1884 goto not_there;
1885#endif
1886 if (strEQ(name, "S_ISUID"))
1887#ifdef S_ISUID
1888 return S_ISUID;
1889#else
1890 goto not_there;
1891#endif
1892 if (strEQ(name, "S_IRGRP"))
1893#ifdef S_IRGRP
1894 return S_IRGRP;
1895#else
1896 goto not_there;
1897#endif
1898 if (strEQ(name, "S_IROTH"))
1899#ifdef S_IROTH
1900 return S_IROTH;
1901#else
1902 goto not_there;
1903#endif
1904 if (strEQ(name, "S_IRUSR"))
1905#ifdef S_IRUSR
1906 return S_IRUSR;
1907#else
1908 goto not_there;
1909#endif
1910 if (strEQ(name, "S_IRWXG"))
1911#ifdef S_IRWXG
1912 return S_IRWXG;
1913#else
1914 goto not_there;
1915#endif
1916 if (strEQ(name, "S_IRWXO"))
1917#ifdef S_IRWXO
1918 return S_IRWXO;
1919#else
1920 goto not_there;
1921#endif
1922 if (strEQ(name, "S_IRWXU"))
1923#ifdef S_IRWXU
1924 return S_IRWXU;
1925#else
1926 goto not_there;
1927#endif
1928 if (strEQ(name, "S_IWGRP"))
1929#ifdef S_IWGRP
1930 return S_IWGRP;
1931#else
1932 goto not_there;
1933#endif
1934 if (strEQ(name, "S_IWOTH"))
1935#ifdef S_IWOTH
1936 return S_IWOTH;
1937#else
1938 goto not_there;
1939#endif
1940 if (strEQ(name, "S_IWUSR"))
1941#ifdef S_IWUSR
1942 return S_IWUSR;
1943#else
1944 goto not_there;
1945#endif
1946 if (strEQ(name, "S_IXGRP"))
1947#ifdef S_IXGRP
1948 return S_IXGRP;
1949#else
1950 goto not_there;
1951#endif
1952 if (strEQ(name, "S_IXOTH"))
1953#ifdef S_IXOTH
1954 return S_IXOTH;
1955#else
1956 goto not_there;
1957#endif
1958 if (strEQ(name, "S_IXUSR"))
1959#ifdef S_IXUSR
1960 return S_IXUSR;
1961#else
1962 goto not_there;
1963#endif
4633a7c4
LW
1964 errno = EAGAIN; /* the following aren't constants */
1965#ifdef S_ISBLK
1966 if (strEQ(name, "S_ISBLK")) return S_ISBLK(arg);
1967#endif
1968#ifdef S_ISCHR
1969 if (strEQ(name, "S_ISCHR")) return S_ISCHR(arg);
1970#endif
1971#ifdef S_ISDIR
1972 if (strEQ(name, "S_ISDIR")) return S_ISDIR(arg);
1973#endif
1974#ifdef S_ISFIFO
1975 if (strEQ(name, "S_ISFIFO")) return S_ISFIFO(arg);
1976#endif
1977#ifdef S_ISREG
1978 if (strEQ(name, "S_ISREG")) return S_ISREG(arg);
1979#endif
2304df62
AD
1980 break;
1981 }
1982 if (strEQ(name, "SEEK_CUR"))
1983#ifdef SEEK_CUR
1984 return SEEK_CUR;
1985#else
1986 goto not_there;
1987#endif
1988 if (strEQ(name, "SEEK_END"))
1989#ifdef SEEK_END
1990 return SEEK_END;
1991#else
1992 goto not_there;
1993#endif
1994 if (strEQ(name, "SEEK_SET"))
1995#ifdef SEEK_SET
1996 return SEEK_SET;
1997#else
1998 goto not_there;
1999#endif
2000 if (strEQ(name, "STREAM_MAX"))
2001#ifdef STREAM_MAX
2002 return STREAM_MAX;
2003#else
2004 goto not_there;
2005#endif
2006 if (strEQ(name, "SHRT_MAX"))
2007#ifdef SHRT_MAX
2008 return SHRT_MAX;
2009#else
2010 goto not_there;
2011#endif
2012 if (strEQ(name, "SHRT_MIN"))
2013#ifdef SHRT_MIN
2014 return SHRT_MIN;
2015#else
2016 goto not_there;
2017#endif
774d564b 2018 if (strnEQ(name, "SA_", 3)) {
2019 if (strEQ(name, "SA_NOCLDSTOP"))
2304df62 2020#ifdef SA_NOCLDSTOP
774d564b 2021 return SA_NOCLDSTOP;
2304df62 2022#else
774d564b 2023 goto not_there;
2304df62 2024#endif
774d564b 2025 if (strEQ(name, "SA_NOCLDWAIT"))
2026#ifdef SA_NOCLDWAIT
2027 return SA_NOCLDWAIT;
2028#else
2029 goto not_there;
2030#endif
2031 if (strEQ(name, "SA_NODEFER"))
2032#ifdef SA_NODEFER
2033 return SA_NODEFER;
2034#else
2035 goto not_there;
2036#endif
2037 if (strEQ(name, "SA_ONSTACK"))
2038#ifdef SA_ONSTACK
2039 return SA_ONSTACK;
2040#else
2041 goto not_there;
2042#endif
2043 if (strEQ(name, "SA_RESETHAND"))
2044#ifdef SA_RESETHAND
2045 return SA_RESETHAND;
2046#else
2047 goto not_there;
2048#endif
2049 if (strEQ(name, "SA_RESTART"))
2050#ifdef SA_RESTART
2051 return SA_RESTART;
2052#else
2053 goto not_there;
2054#endif
2055 if (strEQ(name, "SA_SIGINFO"))
2056#ifdef SA_SIGINFO
2057 return SA_SIGINFO;
2058#else
2059 goto not_there;
2060#endif
2061 break;
2062 }
2304df62
AD
2063 if (strEQ(name, "SCHAR_MAX"))
2064#ifdef SCHAR_MAX
2065 return SCHAR_MAX;
2066#else
2067 goto not_there;
2068#endif
2069 if (strEQ(name, "SCHAR_MIN"))
2070#ifdef SCHAR_MIN
2071 return SCHAR_MIN;
2072#else
2073 goto not_there;
2074#endif
2075 if (strEQ(name, "SSIZE_MAX"))
2076#ifdef SSIZE_MAX
2077 return SSIZE_MAX;
2078#else
2079 goto not_there;
2080#endif
2081 if (strEQ(name, "STDIN_FILENO"))
2082#ifdef STDIN_FILENO
2083 return STDIN_FILENO;
2084#else
2085 goto not_there;
2086#endif
2087 if (strEQ(name, "STDOUT_FILENO"))
2088#ifdef STDOUT_FILENO
2089 return STDOUT_FILENO;
2090#else
2091 goto not_there;
2092#endif
2093 if (strEQ(name, "STRERR_FILENO"))
2094#ifdef STRERR_FILENO
2095 return STRERR_FILENO;
2096#else
2097 goto not_there;
2098#endif
2099 break;
2100 case 'T':
2101 if (strEQ(name, "TCIFLUSH"))
2102#ifdef TCIFLUSH
2103 return TCIFLUSH;
2104#else
2105 goto not_there;
2106#endif
2107 if (strEQ(name, "TCIOFF"))
2108#ifdef TCIOFF
2109 return TCIOFF;
2110#else
2111 goto not_there;
2112#endif
2113 if (strEQ(name, "TCIOFLUSH"))
2114#ifdef TCIOFLUSH
2115 return TCIOFLUSH;
2116#else
2117 goto not_there;
2118#endif
2119 if (strEQ(name, "TCION"))
2120#ifdef TCION
2121 return TCION;
2122#else
2123 goto not_there;
2124#endif
2125 if (strEQ(name, "TCOFLUSH"))
2126#ifdef TCOFLUSH
2127 return TCOFLUSH;
2128#else
2129 goto not_there;
2130#endif
2131 if (strEQ(name, "TCOOFF"))
2132#ifdef TCOOFF
2133 return TCOOFF;
2134#else
2135 goto not_there;
2136#endif
2137 if (strEQ(name, "TCOON"))
2138#ifdef TCOON
2139 return TCOON;
2140#else
2141 goto not_there;
2142#endif
2143 if (strEQ(name, "TCSADRAIN"))
2144#ifdef TCSADRAIN
2145 return TCSADRAIN;
2146#else
2147 goto not_there;
2148#endif
2149 if (strEQ(name, "TCSAFLUSH"))
2150#ifdef TCSAFLUSH
2151 return TCSAFLUSH;
2152#else
2153 goto not_there;
2154#endif
2155 if (strEQ(name, "TCSANOW"))
2156#ifdef TCSANOW
2157 return TCSANOW;
2158#else
2159 goto not_there;
2160#endif
2161 if (strEQ(name, "TMP_MAX"))
2162#ifdef TMP_MAX
2163 return TMP_MAX;
2164#else
2165 goto not_there;
2166#endif
2167 if (strEQ(name, "TOSTOP"))
2168#ifdef TOSTOP
2169 return TOSTOP;
2170#else
2171 goto not_there;
2172#endif
2173 if (strEQ(name, "TZNAME_MAX"))
2174#ifdef TZNAME_MAX
2175 return TZNAME_MAX;
2176#else
2177 goto not_there;
2178#endif
2179 break;
2180 case 'U':
2181 if (strEQ(name, "UCHAR_MAX"))
2182#ifdef UCHAR_MAX
2183 return UCHAR_MAX;
2184#else
2185 goto not_there;
2186#endif
2187 if (strEQ(name, "UINT_MAX"))
2188#ifdef UINT_MAX
2189 return UINT_MAX;
2190#else
2191 goto not_there;
2192#endif
2193 if (strEQ(name, "ULONG_MAX"))
2194#ifdef ULONG_MAX
2195 return ULONG_MAX;
2196#else
2197 goto not_there;
2198#endif
2199 if (strEQ(name, "USHRT_MAX"))
2200#ifdef USHRT_MAX
2201 return USHRT_MAX;
2202#else
2203 goto not_there;
2204#endif
2205 break;
2206 case 'V':
2207 if (strEQ(name, "VEOF"))
2208#ifdef VEOF
2209 return VEOF;
2210#else
2211 goto not_there;
2212#endif
2213 if (strEQ(name, "VEOL"))
2214#ifdef VEOL
2215 return VEOL;
2216#else
2217 goto not_there;
2218#endif
2219 if (strEQ(name, "VERASE"))
2220#ifdef VERASE
2221 return VERASE;
2222#else
2223 goto not_there;
2224#endif
2225 if (strEQ(name, "VINTR"))
2226#ifdef VINTR
2227 return VINTR;
2228#else
2229 goto not_there;
2230#endif
2231 if (strEQ(name, "VKILL"))
2232#ifdef VKILL
2233 return VKILL;
2234#else
2235 goto not_there;
2236#endif
2237 if (strEQ(name, "VMIN"))
2238#ifdef VMIN
2239 return VMIN;
2240#else
2241 goto not_there;
2242#endif
2243 if (strEQ(name, "VQUIT"))
2244#ifdef VQUIT
2245 return VQUIT;
2246#else
2247 goto not_there;
2248#endif
2249 if (strEQ(name, "VSTART"))
2250#ifdef VSTART
2251 return VSTART;
2252#else
2253 goto not_there;
2254#endif
2255 if (strEQ(name, "VSTOP"))
2256#ifdef VSTOP
2257 return VSTOP;
2258#else
2259 goto not_there;
2260#endif
2261 if (strEQ(name, "VSUSP"))
2262#ifdef VSUSP
2263 return VSUSP;
2264#else
2265 goto not_there;
2266#endif
2267 if (strEQ(name, "VTIME"))
2268#ifdef VTIME
2269 return VTIME;
2270#else
2271 goto not_there;
2272#endif
2273 break;
2274 case 'W':
2275 if (strEQ(name, "W_OK"))
2276#ifdef W_OK
2277 return W_OK;
2278#else
2279 goto not_there;
2280#endif
4633a7c4
LW
2281 if (strEQ(name, "WNOHANG"))
2282#ifdef WNOHANG
2283 return WNOHANG;
2284#else
2285 goto not_there;
2286#endif
2287 if (strEQ(name, "WUNTRACED"))
2288#ifdef WUNTRACED
2289 return WUNTRACED;
2290#else
2291 goto not_there;
2292#endif
2293 errno = EAGAIN; /* the following aren't constants */
2304df62
AD
2294#ifdef WEXITSTATUS
2295 if (strEQ(name, "WEXITSTATUS")) return WEXITSTATUS(arg);
2296#endif
2297#ifdef WIFEXITED
2298 if (strEQ(name, "WIFEXITED")) return WIFEXITED(arg);
2299#endif
2300#ifdef WIFSIGNALED
2301 if (strEQ(name, "WIFSIGNALED")) return WIFSIGNALED(arg);
2302#endif
2303#ifdef WIFSTOPPED
2304 if (strEQ(name, "WIFSTOPPED")) return WIFSTOPPED(arg);
2305#endif
2304df62
AD
2306#ifdef WSTOPSIG
2307 if (strEQ(name, "WSTOPSIG")) return WSTOPSIG(arg);
2308#endif
2309#ifdef WTERMSIG
2310 if (strEQ(name, "WTERMSIG")) return WTERMSIG(arg);
2311#endif
2304df62
AD
2312 break;
2313 case 'X':
2314 if (strEQ(name, "X_OK"))
2315#ifdef X_OK
2316 return X_OK;
2317#else
2318 goto not_there;
2319#endif
2320 break;
2321 case '_':
2322 if (strnEQ(name, "_PC_", 4)) {
2323 if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
491527d0 2324#if defined(_PC_CHOWN_RESTRICTED) || HINT_SC_EXIST
2304df62
AD
2325 return _PC_CHOWN_RESTRICTED;
2326#else
2327 goto not_there;
2328#endif
2329 if (strEQ(name, "_PC_LINK_MAX"))
491527d0 2330#if defined(_PC_LINK_MAX) || HINT_SC_EXIST
2304df62
AD
2331 return _PC_LINK_MAX;
2332#else
2333 goto not_there;
2334#endif
2335 if (strEQ(name, "_PC_MAX_CANON"))
491527d0 2336#if defined(_PC_MAX_CANON) || HINT_SC_EXIST
2304df62
AD
2337 return _PC_MAX_CANON;
2338#else
2339 goto not_there;
2340#endif
2341 if (strEQ(name, "_PC_MAX_INPUT"))
491527d0 2342#if defined(_PC_MAX_INPUT) || HINT_SC_EXIST
2304df62
AD
2343 return _PC_MAX_INPUT;
2344#else
2345 goto not_there;
2346#endif
2347 if (strEQ(name, "_PC_NAME_MAX"))
491527d0 2348#if defined(_PC_NAME_MAX) || HINT_SC_EXIST
2304df62
AD
2349 return _PC_NAME_MAX;
2350#else
2351 goto not_there;
2352#endif
2353 if (strEQ(name, "_PC_NO_TRUNC"))
491527d0 2354#if defined(_PC_NO_TRUNC) || HINT_SC_EXIST
2304df62
AD
2355 return _PC_NO_TRUNC;
2356#else
2357 goto not_there;
2358#endif
2359 if (strEQ(name, "_PC_PATH_MAX"))
491527d0 2360#if defined(_PC_PATH_MAX) || HINT_SC_EXIST
2304df62
AD
2361 return _PC_PATH_MAX;
2362#else
2363 goto not_there;
2364#endif
2365 if (strEQ(name, "_PC_PIPE_BUF"))
491527d0 2366#if defined(_PC_PIPE_BUF) || HINT_SC_EXIST
2304df62
AD
2367 return _PC_PIPE_BUF;
2368#else
2369 goto not_there;
2370#endif
2371 if (strEQ(name, "_PC_VDISABLE"))
491527d0 2372#if defined(_PC_VDISABLE) || HINT_SC_EXIST
2304df62
AD
2373 return _PC_VDISABLE;
2374#else
2375 goto not_there;
2376#endif
2377 break;
2378 }
2379 if (strnEQ(name, "_POSIX_", 7)) {
2380 if (strEQ(name, "_POSIX_ARG_MAX"))
2381#ifdef _POSIX_ARG_MAX
2382 return _POSIX_ARG_MAX;
2383#else
2384 return 0;
2385#endif
2386 if (strEQ(name, "_POSIX_CHILD_MAX"))
2387#ifdef _POSIX_CHILD_MAX
2388 return _POSIX_CHILD_MAX;
2389#else
2390 return 0;
2391#endif
2392 if (strEQ(name, "_POSIX_CHOWN_RESTRICTED"))
2393#ifdef _POSIX_CHOWN_RESTRICTED
2394 return _POSIX_CHOWN_RESTRICTED;
2395#else
2396 return 0;
2397#endif
2398 if (strEQ(name, "_POSIX_JOB_CONTROL"))
2399#ifdef _POSIX_JOB_CONTROL
2400 return _POSIX_JOB_CONTROL;
2401#else
2402 return 0;
2403#endif
2404 if (strEQ(name, "_POSIX_LINK_MAX"))
2405#ifdef _POSIX_LINK_MAX
2406 return _POSIX_LINK_MAX;
2407#else
2408 return 0;
2409#endif
2410 if (strEQ(name, "_POSIX_MAX_CANON"))
2411#ifdef _POSIX_MAX_CANON
2412 return _POSIX_MAX_CANON;
2413#else
2414 return 0;
2415#endif
2416 if (strEQ(name, "_POSIX_MAX_INPUT"))
2417#ifdef _POSIX_MAX_INPUT
2418 return _POSIX_MAX_INPUT;
2419#else
2420 return 0;
2421#endif
2422 if (strEQ(name, "_POSIX_NAME_MAX"))
2423#ifdef _POSIX_NAME_MAX
2424 return _POSIX_NAME_MAX;
2425#else
2426 return 0;
2427#endif
2428 if (strEQ(name, "_POSIX_NGROUPS_MAX"))
2429#ifdef _POSIX_NGROUPS_MAX
2430 return _POSIX_NGROUPS_MAX;
2431#else
2432 return 0;
2433#endif
2434 if (strEQ(name, "_POSIX_NO_TRUNC"))
2435#ifdef _POSIX_NO_TRUNC
2436 return _POSIX_NO_TRUNC;
2437#else
2438 return 0;
2439#endif
2440 if (strEQ(name, "_POSIX_OPEN_MAX"))
2441#ifdef _POSIX_OPEN_MAX
2442 return _POSIX_OPEN_MAX;
2443#else
2444 return 0;
2445#endif
2446 if (strEQ(name, "_POSIX_PATH_MAX"))
2447#ifdef _POSIX_PATH_MAX
2448 return _POSIX_PATH_MAX;
2449#else
2450 return 0;
2451#endif
2452 if (strEQ(name, "_POSIX_PIPE_BUF"))
2453#ifdef _POSIX_PIPE_BUF
2454 return _POSIX_PIPE_BUF;
2455#else
2456 return 0;
2457#endif
2458 if (strEQ(name, "_POSIX_SAVED_IDS"))
2459#ifdef _POSIX_SAVED_IDS
2460 return _POSIX_SAVED_IDS;
2461#else
2462 return 0;
2463#endif
2464 if (strEQ(name, "_POSIX_SSIZE_MAX"))
2465#ifdef _POSIX_SSIZE_MAX
2466 return _POSIX_SSIZE_MAX;
2467#else
2468 return 0;
2469#endif
2470 if (strEQ(name, "_POSIX_STREAM_MAX"))
2471#ifdef _POSIX_STREAM_MAX
2472 return _POSIX_STREAM_MAX;
2473#else
2474 return 0;
2475#endif
2476 if (strEQ(name, "_POSIX_TZNAME_MAX"))
2477#ifdef _POSIX_TZNAME_MAX
2478 return _POSIX_TZNAME_MAX;
2479#else
2480 return 0;
2481#endif
2482 if (strEQ(name, "_POSIX_VDISABLE"))
2483#ifdef _POSIX_VDISABLE
2484 return _POSIX_VDISABLE;
2485#else
2486 return 0;
2487#endif
2488 if (strEQ(name, "_POSIX_VERSION"))
2489#ifdef _POSIX_VERSION
2490 return _POSIX_VERSION;
2491#else
2492 return 0;
2493#endif
2494 break;
2495 }
2496 if (strnEQ(name, "_SC_", 4)) {
2497 if (strEQ(name, "_SC_ARG_MAX"))
491527d0 2498#if defined(_SC_ARG_MAX) || HINT_SC_EXIST
2304df62
AD
2499 return _SC_ARG_MAX;
2500#else
2501 goto not_there;
2502#endif
2503 if (strEQ(name, "_SC_CHILD_MAX"))
491527d0 2504#if defined(_SC_CHILD_MAX) || HINT_SC_EXIST
2304df62
AD
2505 return _SC_CHILD_MAX;
2506#else
2507 goto not_there;
2508#endif
2509 if (strEQ(name, "_SC_CLK_TCK"))
491527d0 2510#if defined(_SC_CLK_TCK) || HINT_SC_EXIST
2304df62
AD
2511 return _SC_CLK_TCK;
2512#else
2513 goto not_there;
2514#endif
2515 if (strEQ(name, "_SC_JOB_CONTROL"))
491527d0 2516#if defined(_SC_JOB_CONTROL) || HINT_SC_EXIST
2304df62
AD
2517 return _SC_JOB_CONTROL;
2518#else
2519 goto not_there;
2520#endif
2521 if (strEQ(name, "_SC_NGROUPS_MAX"))
491527d0 2522#if defined(_SC_NGROUPS_MAX) || HINT_SC_EXIST
2304df62
AD
2523 return _SC_NGROUPS_MAX;
2524#else
2525 goto not_there;
2526#endif
2527 if (strEQ(name, "_SC_OPEN_MAX"))
491527d0 2528#if defined(_SC_OPEN_MAX) || HINT_SC_EXIST
2304df62
AD
2529 return _SC_OPEN_MAX;
2530#else
2531 goto not_there;
2532#endif
2533 if (strEQ(name, "_SC_SAVED_IDS"))
491527d0 2534#if defined(_SC_SAVED_IDS) || HINT_SC_EXIST
2304df62
AD
2535 return _SC_SAVED_IDS;
2536#else
2537 goto not_there;
2538#endif
2539 if (strEQ(name, "_SC_STREAM_MAX"))
491527d0 2540#if defined(_SC_STREAM_MAX) || HINT_SC_EXIST
2304df62
AD
2541 return _SC_STREAM_MAX;
2542#else
2543 goto not_there;
2544#endif
2545 if (strEQ(name, "_SC_TZNAME_MAX"))
491527d0 2546#if defined(_SC_TZNAME_MAX) || HINT_SC_EXIST
2304df62
AD
2547 return _SC_TZNAME_MAX;
2548#else
2549 goto not_there;
2550#endif
2551 if (strEQ(name, "_SC_VERSION"))
491527d0 2552#if defined(_SC_VERSION) || HINT_SC_EXIST
2304df62
AD
2553 return _SC_VERSION;
2554#else
2555 goto not_there;
2556#endif
2557 break;
2558 }
2304df62
AD
2559 }
2560 errno = EINVAL;
2561 return 0;
2562
2563not_there:
2564 errno = ENOENT;
2565 return 0;
2566}
2567
2568MODULE = SigSet PACKAGE = POSIX::SigSet PREFIX = sig
2569
2570POSIX::SigSet
2571new(packname = "POSIX::SigSet", ...)
2572 char * packname
2573 CODE:
2574 {
2575 int i;
01667c76 2576 New(0, RETVAL, 1, sigset_t);
2304df62 2577 sigemptyset(RETVAL);
a0d0e21e 2578 for (i = 1; i < items; i++)
2304df62
AD
2579 sigaddset(RETVAL, SvIV(ST(i)));
2580 }
2581 OUTPUT:
2582 RETVAL
463ee0b2 2583
8990e307 2584void
2304df62
AD
2585DESTROY(sigset)
2586 POSIX::SigSet sigset
2587 CODE:
01667c76 2588 Safefree(sigset);
2304df62
AD
2589
2590SysRet
2591sigaddset(sigset, sig)
2592 POSIX::SigSet sigset
2593 int sig
2594
2595SysRet
2596sigdelset(sigset, sig)
2597 POSIX::SigSet sigset
2598 int sig
2599
2600SysRet
2601sigemptyset(sigset)
2602 POSIX::SigSet sigset
2603
2604SysRet
2605sigfillset(sigset)
2606 POSIX::SigSet sigset
2607
2608int
2609sigismember(sigset, sig)
2610 POSIX::SigSet sigset
2611 int sig
2612
2613
a0d0e21e
LW
2614MODULE = Termios PACKAGE = POSIX::Termios PREFIX = cf
2615
2616POSIX::Termios
2617new(packname = "POSIX::Termios", ...)
2618 char * packname
2619 CODE:
2620 {
2621#ifdef I_TERMIOS
01667c76 2622 New(0, RETVAL, 1, struct termios);
a0d0e21e
LW
2623#else
2624 not_here("termios");
640cc986 2625 RETVAL = 0;
a0d0e21e
LW
2626#endif
2627 }
2628 OUTPUT:
2629 RETVAL
2630
2631void
2632DESTROY(termios_ref)
2633 POSIX::Termios termios_ref
2634 CODE:
2635#ifdef I_TERMIOS
01667c76 2636 Safefree(termios_ref);
a0d0e21e
LW
2637#else
2638 not_here("termios");
2639#endif
2640
2641SysRet
2642getattr(termios_ref, fd = 0)
2643 POSIX::Termios termios_ref
2644 int fd
2645 CODE:
2646 RETVAL = tcgetattr(fd, termios_ref);
2647 OUTPUT:
2648 RETVAL
2649
2650SysRet
2651setattr(termios_ref, fd = 0, optional_actions = 0)
2652 POSIX::Termios termios_ref
2653 int fd
2654 int optional_actions
2655 CODE:
2656 RETVAL = tcsetattr(fd, optional_actions, termios_ref);
2657 OUTPUT:
2658 RETVAL
2659
2660speed_t
2661cfgetispeed(termios_ref)
2662 POSIX::Termios termios_ref
2663
2664speed_t
2665cfgetospeed(termios_ref)
2666 POSIX::Termios termios_ref
2667
2668tcflag_t
2669getiflag(termios_ref)
2670 POSIX::Termios termios_ref
2671 CODE:
2672#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2673 RETVAL = termios_ref->c_iflag;
2674#else
640cc986
HM
2675 not_here("getiflag");
2676 RETVAL = 0;
a0d0e21e
LW
2677#endif
2678 OUTPUT:
2679 RETVAL
2680
2681tcflag_t
2682getoflag(termios_ref)
2683 POSIX::Termios termios_ref
2684 CODE:
2685#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2686 RETVAL = termios_ref->c_oflag;
2687#else
640cc986
HM
2688 not_here("getoflag");
2689 RETVAL = 0;
a0d0e21e
LW
2690#endif
2691 OUTPUT:
2692 RETVAL
2693
2694tcflag_t
2695getcflag(termios_ref)
2696 POSIX::Termios termios_ref
2697 CODE:
2698#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2699 RETVAL = termios_ref->c_cflag;
2700#else
640cc986
HM
2701 not_here("getcflag");
2702 RETVAL = 0;
a0d0e21e
LW
2703#endif
2704 OUTPUT:
2705 RETVAL
2706
2707tcflag_t
2708getlflag(termios_ref)
2709 POSIX::Termios termios_ref
2710 CODE:
2711#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2712 RETVAL = termios_ref->c_lflag;
2713#else
640cc986
HM
2714 not_here("getlflag");
2715 RETVAL = 0;
a0d0e21e
LW
2716#endif
2717 OUTPUT:
2718 RETVAL
2719
2720cc_t
2721getcc(termios_ref, ccix)
2722 POSIX::Termios termios_ref
2723 int ccix
2724 CODE:
2725#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2726 if (ccix >= NCCS)
2727 croak("Bad getcc subscript");
2728 RETVAL = termios_ref->c_cc[ccix];
2729#else
640cc986
HM
2730 not_here("getcc");
2731 RETVAL = 0;
a0d0e21e
LW
2732#endif
2733 OUTPUT:
2734 RETVAL
2735
2736SysRet
2737cfsetispeed(termios_ref, speed)
2738 POSIX::Termios termios_ref
2739 speed_t speed
2740
2741SysRet
2742cfsetospeed(termios_ref, speed)
2743 POSIX::Termios termios_ref
2744 speed_t speed
2745
2746void
2747setiflag(termios_ref, iflag)
2748 POSIX::Termios termios_ref
2749 tcflag_t iflag
2750 CODE:
2751#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2752 termios_ref->c_iflag = iflag;
2753#else
2754 not_here("setiflag");
2755#endif
2756
2757void
2758setoflag(termios_ref, oflag)
2759 POSIX::Termios termios_ref
2760 tcflag_t oflag
2761 CODE:
2762#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2763 termios_ref->c_oflag = oflag;
2764#else
2765 not_here("setoflag");
2766#endif
2767
2768void
2769setcflag(termios_ref, cflag)
2770 POSIX::Termios termios_ref
2771 tcflag_t cflag
2772 CODE:
2773#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2774 termios_ref->c_cflag = cflag;
2775#else
2776 not_here("setcflag");
2777#endif
2778
2779void
2780setlflag(termios_ref, lflag)
2781 POSIX::Termios termios_ref
2782 tcflag_t lflag
2783 CODE:
2784#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2785 termios_ref->c_lflag = lflag;
2786#else
2787 not_here("setlflag");
2788#endif
2789
2790void
2791setcc(termios_ref, ccix, cc)
2792 POSIX::Termios termios_ref
2793 int ccix
2794 cc_t cc
2795 CODE:
2796#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2797 if (ccix >= NCCS)
2798 croak("Bad setcc subscript");
2799 termios_ref->c_cc[ccix] = cc;
2800#else
2801 not_here("setcc");
2802#endif
2803
2804
a0d0e21e
LW
2805MODULE = POSIX PACKAGE = POSIX
2806
2807double
2304df62
AD
2808constant(name,arg)
2809 char * name
2810 int arg
2811
2812int
2813isalnum(charstring)
5344da4e 2814 unsigned char * charstring
2304df62 2815 CODE:
5344da4e 2816 unsigned char *s = charstring;
6b88bc9c 2817 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2818 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2819 if (!isalnum(*s))
2820 RETVAL = 0;
2821 OUTPUT:
2822 RETVAL
2823
2824int
2825isalpha(charstring)
5344da4e 2826 unsigned char * charstring
2304df62 2827 CODE:
5344da4e 2828 unsigned char *s = charstring;
6b88bc9c 2829 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2830 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2831 if (!isalpha(*s))
2832 RETVAL = 0;
2833 OUTPUT:
2834 RETVAL
2835
2836int
2837iscntrl(charstring)
5344da4e 2838 unsigned char * charstring
2304df62 2839 CODE:
5344da4e 2840 unsigned char *s = charstring;
6b88bc9c 2841 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2842 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2843 if (!iscntrl(*s))
2844 RETVAL = 0;
2845 OUTPUT:
2846 RETVAL
2847
2848int
2849isdigit(charstring)
5344da4e 2850 unsigned char * charstring
2304df62 2851 CODE:
5344da4e 2852 unsigned char *s = charstring;
6b88bc9c 2853 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2854 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2855 if (!isdigit(*s))
2856 RETVAL = 0;
2857 OUTPUT:
2858 RETVAL
2859
2860int
2861isgraph(charstring)
5344da4e 2862 unsigned char * charstring
2304df62 2863 CODE:
5344da4e 2864 unsigned char *s = charstring;
6b88bc9c 2865 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2866 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2867 if (!isgraph(*s))
2868 RETVAL = 0;
2869 OUTPUT:
2870 RETVAL
2871
2872int
2873islower(charstring)
5344da4e 2874 unsigned char * charstring
2304df62 2875 CODE:
5344da4e 2876 unsigned char *s = charstring;
6b88bc9c 2877 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2878 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2879 if (!islower(*s))
2880 RETVAL = 0;
2881 OUTPUT:
2882 RETVAL
2883
2884int
2885isprint(charstring)
5344da4e 2886 unsigned char * charstring
2304df62 2887 CODE:
5344da4e 2888 unsigned char *s = charstring;
6b88bc9c 2889 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2890 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2891 if (!isprint(*s))
2892 RETVAL = 0;
2893 OUTPUT:
2894 RETVAL
2895
2896int
2897ispunct(charstring)
5344da4e 2898 unsigned char * charstring
2304df62 2899 CODE:
5344da4e 2900 unsigned char *s = charstring;
6b88bc9c 2901 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2902 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2903 if (!ispunct(*s))
2904 RETVAL = 0;
2905 OUTPUT:
2906 RETVAL
2907
2908int
2909isspace(charstring)
5344da4e 2910 unsigned char * charstring
2304df62 2911 CODE:
5344da4e 2912 unsigned char *s = charstring;
6b88bc9c 2913 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2914 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2915 if (!isspace(*s))
2916 RETVAL = 0;
2917 OUTPUT:
2918 RETVAL
8990e307
LW
2919
2920int
2304df62 2921isupper(charstring)
5344da4e 2922 unsigned char * charstring
2304df62 2923 CODE:
5344da4e 2924 unsigned char *s = charstring;
6b88bc9c 2925 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2926 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2927 if (!isupper(*s))
2928 RETVAL = 0;
2929 OUTPUT:
2930 RETVAL
8990e307
LW
2931
2932int
2304df62 2933isxdigit(charstring)
5344da4e 2934 unsigned char * charstring
2304df62 2935 CODE:
5344da4e 2936 unsigned char *s = charstring;
6b88bc9c 2937 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
5344da4e 2938 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
2939 if (!isxdigit(*s))
2940 RETVAL = 0;
2941 OUTPUT:
2942 RETVAL
2943
2944SysRet
2945open(filename, flags = O_RDONLY, mode = 0666)
2946 char * filename
2947 int flags
a0d0e21e 2948 Mode_t mode
748a9306
LW
2949 CODE:
2950 if (flags & (O_APPEND|O_CREAT|O_TRUNC|O_RDWR|O_WRONLY|O_EXCL))
2951 TAINT_PROPER("open");
2952 RETVAL = open(filename, flags, mode);
2953 OUTPUT:
2954 RETVAL
2955
2304df62
AD
2956
2957HV *
2958localeconv()
2959 CODE:
a0d0e21e 2960#ifdef HAS_LOCALECONV
2304df62
AD
2961 struct lconv *lcbuf;
2962 RETVAL = newHV();
2963 if (lcbuf = localeconv()) {
2964 /* the strings */
2965 if (lcbuf->decimal_point && *lcbuf->decimal_point)
2966 hv_store(RETVAL, "decimal_point", 13,
2967 newSVpv(lcbuf->decimal_point, 0), 0);
2968 if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
2969 hv_store(RETVAL, "thousands_sep", 13,
2970 newSVpv(lcbuf->thousands_sep, 0), 0);
28e8609d 2971#ifndef NO_LOCALECONV_GROUPING
2304df62
AD
2972 if (lcbuf->grouping && *lcbuf->grouping)
2973 hv_store(RETVAL, "grouping", 8,
2974 newSVpv(lcbuf->grouping, 0), 0);
28e8609d 2975#endif
2304df62
AD
2976 if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
2977 hv_store(RETVAL, "int_curr_symbol", 15,
2978 newSVpv(lcbuf->int_curr_symbol, 0), 0);
2979 if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
2980 hv_store(RETVAL, "currency_symbol", 15,
2981 newSVpv(lcbuf->currency_symbol, 0), 0);
2982 if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
2983 hv_store(RETVAL, "mon_decimal_point", 17,
2984 newSVpv(lcbuf->mon_decimal_point, 0), 0);
39e571d4 2985#ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
2304df62
AD
2986 if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
2987 hv_store(RETVAL, "mon_thousands_sep", 17,
2988 newSVpv(lcbuf->mon_thousands_sep, 0), 0);
39e571d4 2989#endif
28e8609d 2990#ifndef NO_LOCALECONV_MON_GROUPING
2304df62
AD
2991 if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
2992 hv_store(RETVAL, "mon_grouping", 12,
2993 newSVpv(lcbuf->mon_grouping, 0), 0);
28e8609d 2994#endif
2304df62
AD
2995 if (lcbuf->positive_sign && *lcbuf->positive_sign)
2996 hv_store(RETVAL, "positive_sign", 13,
2997 newSVpv(lcbuf->positive_sign, 0), 0);
2998 if (lcbuf->negative_sign && *lcbuf->negative_sign)
2999 hv_store(RETVAL, "negative_sign", 13,
3000 newSVpv(lcbuf->negative_sign, 0), 0);
3001 /* the integers */
3002 if (lcbuf->int_frac_digits != CHAR_MAX)
3003 hv_store(RETVAL, "int_frac_digits", 15,
3004 newSViv(lcbuf->int_frac_digits), 0);
3005 if (lcbuf->frac_digits != CHAR_MAX)
3006 hv_store(RETVAL, "frac_digits", 11,
3007 newSViv(lcbuf->frac_digits), 0);
3008 if (lcbuf->p_cs_precedes != CHAR_MAX)
3009 hv_store(RETVAL, "p_cs_precedes", 13,
3010 newSViv(lcbuf->p_cs_precedes), 0);
3011 if (lcbuf->p_sep_by_space != CHAR_MAX)
3012 hv_store(RETVAL, "p_sep_by_space", 14,
3013 newSViv(lcbuf->p_sep_by_space), 0);
3014 if (lcbuf->n_cs_precedes != CHAR_MAX)
3015 hv_store(RETVAL, "n_cs_precedes", 13,
3016 newSViv(lcbuf->n_cs_precedes), 0);
3017 if (lcbuf->n_sep_by_space != CHAR_MAX)
3018 hv_store(RETVAL, "n_sep_by_space", 14,
3019 newSViv(lcbuf->n_sep_by_space), 0);
3020 if (lcbuf->p_sign_posn != CHAR_MAX)
3021 hv_store(RETVAL, "p_sign_posn", 11,
3022 newSViv(lcbuf->p_sign_posn), 0);
3023 if (lcbuf->n_sign_posn != CHAR_MAX)
3024 hv_store(RETVAL, "n_sign_posn", 11,
3025 newSViv(lcbuf->n_sign_posn), 0);
3026 }
a0d0e21e
LW
3027#else
3028 localeconv(); /* A stub to call not_here(). */
3029#endif
2304df62
AD
3030 OUTPUT:
3031 RETVAL
3032
3033char *
c28ee57b 3034setlocale(category, locale = 0)
2304df62
AD
3035 int category
3036 char * locale
c28ee57b
JH
3037 CODE:
3038 RETVAL = setlocale(category, locale);
bbce6d69 3039 if (RETVAL) {
36477c24 3040#ifdef USE_LOCALE_CTYPE
bbce6d69 3041 if (category == LC_CTYPE
3042#ifdef LC_ALL
3043 || category == LC_ALL
3044#endif
3045 )
3046 {
3047 char *newctype;
3048#ifdef LC_ALL
3049 if (category == LC_ALL)
3050 newctype = setlocale(LC_CTYPE, NULL);
3051 else
3052#endif
3053 newctype = RETVAL;
3054 perl_new_ctype(newctype);
3055 }
36477c24 3056#endif /* USE_LOCALE_CTYPE */
3057#ifdef USE_LOCALE_COLLATE
bbce6d69 3058 if (category == LC_COLLATE
3059#ifdef LC_ALL
3060 || category == LC_ALL
3061#endif
3062 )
3063 {
3064 char *newcoll;
3065#ifdef LC_ALL
3066 if (category == LC_ALL)
3067 newcoll = setlocale(LC_COLLATE, NULL);
3068 else
3069#endif
3070 newcoll = RETVAL;
3071 perl_new_collate(newcoll);
3072 }
36477c24 3073#endif /* USE_LOCALE_COLLATE */
3074#ifdef USE_LOCALE_NUMERIC
bbce6d69 3075 if (category == LC_NUMERIC
3076#ifdef LC_ALL
3077 || category == LC_ALL
3078#endif
3079 )
3080 {
3081 char *newnum;
3082#ifdef LC_ALL
3083 if (category == LC_ALL)
3084 newnum = setlocale(LC_NUMERIC, NULL);
3085 else
3086#endif
3087 newnum = RETVAL;
3088 perl_new_numeric(newnum);
3089 }
36477c24 3090#endif /* USE_LOCALE_NUMERIC */
bbce6d69 3091 }
c28ee57b
JH
3092 OUTPUT:
3093 RETVAL
3094
2304df62
AD
3095
3096double
3097acos(x)
3098 double x
3099
3100double
3101asin(x)
3102 double x
3103
3104double
3105atan(x)
3106 double x
3107
3108double
3109ceil(x)
3110 double x
3111
3112double
3113cosh(x)
3114 double x
3115
3116double
3117floor(x)
3118 double x
3119
3120double
3121fmod(x,y)
3122 double x
3123 double y
3124
3125void
3126frexp(x)
3127 double x
3128 PPCODE:
3129 int expvar;
2304df62
AD
3130 /* (We already know stack is long enough.) */
3131 PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
3132 PUSHs(sv_2mortal(newSViv(expvar)));
3133
3134double
3135ldexp(x,exp)
3136 double x
3137 int exp
3138
3139double
3140log10(x)
3141 double x
3142
3143void
3144modf(x)
3145 double x
3146 PPCODE:
3147 double intvar;
2304df62
AD
3148 /* (We already know stack is long enough.) */
3149 PUSHs(sv_2mortal(newSVnv(modf(x,&intvar))));
3150 PUSHs(sv_2mortal(newSVnv(intvar)));
3151
3152double
3153sinh(x)
3154 double x
3155
3156double
3b35bae3
AD
3157tan(x)
3158 double x
3159
3160double
2304df62
AD
3161tanh(x)
3162 double x
3163
3164SysRet
3165sigaction(sig, action, oldaction = 0)
3166 int sig
3167 POSIX::SigAction action
3168 POSIX::SigAction oldaction
3169 CODE:
6dead956
GS
3170#ifdef WIN32
3171 RETVAL = not_here("sigaction");
3172#else
2304df62
AD
3173# This code is really grody because we're trying to make the signal
3174# interface look beautiful, which is hard.
3175
3280af22 3176 if (!PL_siggv)
85e6fe83 3177 gv_fetchpv("SIG", TRUE, SVt_PVHV);
2304df62
AD
3178
3179 {
3180 struct sigaction act;
3181 struct sigaction oact;
3182 POSIX__SigSet sigset;
3183 SV** svp;
3280af22 3184 SV** sigsvp = hv_fetch(GvHVn(PL_siggv),
4ec43091
JH
3185 PL_sig_name[sig],
3186 strlen(PL_sig_name[sig]),
2304df62 3187 TRUE);
2d8e6c8d 3188 STRLEN n_a;
2304df62
AD
3189
3190 /* Remember old handler name if desired. */
3191 if (oldaction) {
2d8e6c8d 3192 char *hand = SvPVx(*sigsvp, n_a);
2304df62
AD
3193 svp = hv_fetch(oldaction, "HANDLER", 7, TRUE);
3194 sv_setpv(*svp, *hand ? hand : "DEFAULT");
3195 }
3196
3197 if (action) {
3198 /* Vector new handler through %SIG. (We always use sighandler
3199 for the C signal handler, which reads %SIG to dispatch.) */
3200 svp = hv_fetch(action, "HANDLER", 7, FALSE);
3201 if (!svp)
3202 croak("Can't supply an action without a HANDLER");
2d8e6c8d 3203 sv_setpv(*sigsvp, SvPV(*svp, n_a));
2304df62
AD
3204 mg_set(*sigsvp); /* handles DEFAULT and IGNORE */
3205 act.sa_handler = sighandler;
3206
3207 /* Set up any desired mask. */
3208 svp = hv_fetch(action, "MASK", 4, FALSE);
3209 if (svp && sv_isa(*svp, "POSIX::SigSet")) {
a0d0e21e
LW
3210 unsigned long tmp;
3211 tmp = (unsigned long)SvNV((SV*)SvRV(*svp));
3212 sigset = (sigset_t*) tmp;
2304df62
AD
3213 act.sa_mask = *sigset;
3214 }
3215 else
85e6fe83 3216 sigemptyset(& act.sa_mask);
2304df62
AD
3217
3218 /* Set up any desired flags. */
3219 svp = hv_fetch(action, "FLAGS", 5, FALSE);
3220 act.sa_flags = svp ? SvIV(*svp) : 0;
3221 }
3222
3223 /* Now work around sigaction oddities */
3224 if (action && oldaction)
85e6fe83 3225 RETVAL = sigaction(sig, & act, & oact);
2304df62 3226 else if (action)
6c418a22 3227 RETVAL = sigaction(sig, & act, (struct sigaction *)0);
2304df62 3228 else if (oldaction)
6c418a22 3229 RETVAL = sigaction(sig, (struct sigaction *)0, & oact);
a0d0e21e
LW
3230 else
3231 RETVAL = -1;
2304df62
AD
3232
3233 if (oldaction) {
3234 /* Get back the mask. */
3235 svp = hv_fetch(oldaction, "MASK", 4, TRUE);
a0d0e21e
LW
3236 if (sv_isa(*svp, "POSIX::SigSet")) {
3237 unsigned long tmp;
3238 tmp = (unsigned long)SvNV((SV*)SvRV(*svp));
3239 sigset = (sigset_t*) tmp;
3240 }
2304df62 3241 else {
01667c76 3242 New(0, sigset, 1, sigset_t);
2304df62
AD
3243 sv_setptrobj(*svp, sigset, "POSIX::SigSet");
3244 }
3245 *sigset = oact.sa_mask;
3246
3247 /* Get back the flags. */
3248 svp = hv_fetch(oldaction, "FLAGS", 5, TRUE);
3249 sv_setiv(*svp, oact.sa_flags);
3250 }
3251 }
6dead956 3252#endif
2304df62
AD
3253 OUTPUT:
3254 RETVAL
3255
3256SysRet
3257sigpending(sigset)
3258 POSIX::SigSet sigset
3259
3260SysRet
3261sigprocmask(how, sigset, oldsigset = 0)
3262 int how
3263 POSIX::SigSet sigset
33c27489
GS
3264 POSIX::SigSet oldsigset = NO_INIT
3265INIT:
3266 if ( items < 3 ) {
3267 oldsigset = 0;
3268 }
3269 else if (sv_derived_from(ST(2), "POSIX::SigSet")) {
3270 IV tmp = SvIV((SV*)SvRV(ST(2)));
3271 oldsigset = (POSIX__SigSet) tmp;
3272 }
3273 else {
01667c76 3274 New(0, oldsigset, 1, sigset_t);
33c27489
GS
3275 sigemptyset(oldsigset);
3276 sv_setref_pv(ST(2), "POSIX::SigSet", (void*)oldsigset);
3277 }
2304df62
AD
3278
3279SysRet
3280sigsuspend(signal_mask)
3281 POSIX::SigSet signal_mask
3282
2304df62
AD
3283void
3284_exit(status)
3285 int status
8990e307 3286
85e6fe83 3287SysRet
8990e307
LW
3288close(fd)
3289 int fd
3290
85e6fe83 3291SysRet
8990e307
LW
3292dup(fd)
3293 int fd
3294
85e6fe83 3295SysRet
8990e307
LW
3296dup2(fd1, fd2)
3297 int fd1
3298 int fd2
3299
94b6baf5 3300SysRetLong
a0d0e21e 3301lseek(fd, offset, whence)
85e6fe83
LW
3302 int fd
3303 Off_t offset
3304 int whence
8990e307 3305
85e6fe83 3306SysRet
8990e307
LW
3307nice(incr)
3308 int incr
3309
3310int
8990e307 3311pipe()
85e6fe83
LW
3312 PPCODE:
3313 int fds[2];
85e6fe83 3314 if (pipe(fds) != -1) {
924508f0 3315 EXTEND(SP,2);
85e6fe83
LW
3316 PUSHs(sv_2mortal(newSViv(fds[0])));
3317 PUSHs(sv_2mortal(newSViv(fds[1])));
3318 }
8990e307 3319
85e6fe83 3320SysRet
a0d0e21e 3321read(fd, buffer, nbytes)
7747499c
TB
3322 PREINIT:
3323 SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
3324 INPUT:
3325 int fd
3326 size_t nbytes
3327 char * buffer = sv_grow( sv_buffer, nbytes+1 );
a0d0e21e 3328 CLEANUP:
7747499c
TB
3329 if (RETVAL >= 0) {
3330 SvCUR(sv_buffer) = RETVAL;
3331 SvPOK_only(sv_buffer);
3332 *SvEND(sv_buffer) = '\0';
bbce6d69 3333 SvTAINTED_on(sv_buffer);
7747499c 3334 }
8990e307 3335
85e6fe83 3336SysRet
8990e307
LW
3337setpgid(pid, pgid)
3338 pid_t pid
3339 pid_t pgid
3340
8990e307
LW
3341pid_t
3342setsid()
3343
8990e307
LW
3344pid_t
3345tcgetpgrp(fd)
3346 int fd
3347
85e6fe83 3348SysRet
8990e307
LW
3349tcsetpgrp(fd, pgrp_id)
3350 int fd
3351 pid_t pgrp_id
3352
3353int
8990e307 3354uname()
2304df62 3355 PPCODE:
a0d0e21e 3356#ifdef HAS_UNAME
85e6fe83 3357 struct utsname buf;
85e6fe83 3358 if (uname(&buf) >= 0) {
924508f0 3359 EXTEND(SP, 5);
85e6fe83
LW
3360 PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
3361 PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
3362 PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
3363 PUSHs(sv_2mortal(newSVpv(buf.version, 0)));
3364 PUSHs(sv_2mortal(newSVpv(buf.machine, 0)));
8990e307 3365 }
a0d0e21e
LW
3366#else
3367 uname((char *) 0); /* A stub to call not_here(). */
3368#endif
8990e307 3369
85e6fe83 3370SysRet
a0d0e21e
LW
3371write(fd, buffer, nbytes)
3372 int fd
3373 char * buffer
3374 size_t nbytes
3375
3376char *
3377tmpnam(s = 0)
3378 char * s = 0;
3379
3380void
3381abort()
3382
3383int
3384mblen(s, n)
3385 char * s
3386 size_t n
3387
3388size_t
3389mbstowcs(s, pwcs, n)
3390 wchar_t * s
3391 char * pwcs
3392 size_t n
3393
3394int
3395mbtowc(pwc, s, n)
3396 wchar_t * pwc
3397 char * s
3398 size_t n
3399
3400int
3401wcstombs(s, pwcs, n)
3402 char * s
3403 wchar_t * pwcs
3404 size_t n
3405
3406int
3407wctomb(s, wchar)
3408 char * s
3409 wchar_t wchar
3410
3411int
3412strcoll(s1, s2)
3413 char * s1
3414 char * s2
3415
a89d8a78
DH
3416void
3417strtod(str)
3418 char * str
3419 PREINIT:
3420 double num;
3421 char *unparsed;
3422 PPCODE:
36477c24 3423 SET_NUMERIC_LOCAL();
a89d8a78
DH
3424 num = strtod(str, &unparsed);
3425 PUSHs(sv_2mortal(newSVnv(num)));
3426 if (GIMME == G_ARRAY) {
924508f0 3427 EXTEND(SP, 1);
a89d8a78
DH
3428 if (unparsed)
3429 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3430 else
6b88bc9c 3431 PUSHs(&PL_sv_undef);
a89d8a78
DH
3432 }
3433
3434void
3435strtol(str, base = 0)
3436 char * str
3437 int base
3438 PREINIT:
3439 long num;
3440 char *unparsed;
3441 PPCODE:
3442 num = strtol(str, &unparsed, base);
3443 if (num >= IV_MIN && num <= IV_MAX)
3444 PUSHs(sv_2mortal(newSViv((IV)num)));
3445 else
3446 PUSHs(sv_2mortal(newSVnv((double)num)));
3447 if (GIMME == G_ARRAY) {
924508f0 3448 EXTEND(SP, 1);
a89d8a78
DH
3449 if (unparsed)
3450 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3451 else
6b88bc9c 3452 PUSHs(&PL_sv_undef);
a89d8a78
DH
3453 }
3454
3455void
3456strtoul(str, base = 0)
3457 char * str
3458 int base
3459 PREINIT:
3460 unsigned long num;
3461 char *unparsed;
3462 PPCODE:
3463 num = strtoul(str, &unparsed, base);
3464 if (num <= IV_MAX)
3465 PUSHs(sv_2mortal(newSViv((IV)num)));
3466 else
3467 PUSHs(sv_2mortal(newSVnv((double)num)));
3468 if (GIMME == G_ARRAY) {
924508f0 3469 EXTEND(SP, 1);
a89d8a78
DH
3470 if (unparsed)
3471 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3472 else
6b88bc9c 3473 PUSHs(&PL_sv_undef);
a89d8a78
DH
3474 }
3475
a0d0e21e
LW
3476SV *
3477strxfrm(src)
3478 SV * src
85e6fe83 3479 CODE:
a0d0e21e
LW
3480 {
3481 STRLEN srclen;
3482 STRLEN dstlen;
3483 char *p = SvPV(src,srclen);
3484 srclen++;
748a9306 3485 ST(0) = sv_2mortal(NEWSV(800,srclen));
a0d0e21e
LW
3486 dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)srclen);
3487 if (dstlen > srclen) {
3488 dstlen++;
3489 SvGROW(ST(0), dstlen);
3490 strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
3491 dstlen--;
3492 }
3493 SvCUR(ST(0)) = dstlen;
3494 SvPOK_only(ST(0));
3495 }
3496
3497SysRet
3498mkfifo(filename, mode)
3499 char * filename
3500 Mode_t mode
748a9306
LW
3501 CODE:
3502 TAINT_PROPER("mkfifo");
3503 RETVAL = mkfifo(filename, mode);
3504 OUTPUT:
3505 RETVAL
a0d0e21e
LW
3506
3507SysRet
3508tcdrain(fd)
3509 int fd
3510
3511
3512SysRet
3513tcflow(fd, action)
3514 int fd
3515 int action
3516
3517
3518SysRet
3519tcflush(fd, queue_selector)
3520 int fd
3521 int queue_selector
3522
3523SysRet
3524tcsendbreak(fd, duration)
3525 int fd
3526 int duration
3527
3528char *
3529asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3530 int sec
3531 int min
3532 int hour
3533 int mday
3534 int mon
3535 int year
3536 int wday
3537 int yday
3538 int isdst
3539 CODE:
3540 {
3541 struct tm mytm;
7747499c 3542 init_tm(&mytm); /* XXX workaround - see init_tm() above */
a0d0e21e
LW
3543 mytm.tm_sec = sec;
3544 mytm.tm_min = min;
3545 mytm.tm_hour = hour;
3546 mytm.tm_mday = mday;
3547 mytm.tm_mon = mon;
3548 mytm.tm_year = year;
3549 mytm.tm_wday = wday;
3550 mytm.tm_yday = yday;
3551 mytm.tm_isdst = isdst;
3552 RETVAL = asctime(&mytm);
3553 }
3554 OUTPUT:
3555 RETVAL
3556
3557long
3558clock()
3559
3560char *
3561ctime(time)
748a9306 3562 Time_t &time
8990e307 3563
37120919
AD
3564void
3565times()
3566 PPCODE:
3567 struct tms tms;
3568 clock_t realtime;
3569 realtime = times( &tms );
924508f0 3570 EXTEND(SP,5);
9607fc9c 3571 PUSHs( sv_2mortal( newSViv( (IV) realtime ) ) );
3572 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_utime ) ) );
3573 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_stime ) ) );
3574 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cutime ) ) );
3575 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cstime ) ) );
37120919 3576
a0d0e21e
LW
3577double
3578difftime(time1, time2)
3579 Time_t time1
3580 Time_t time2
3581
3582SysRetLong
3583mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3584 int sec
3585 int min
3586 int hour
3587 int mday
3588 int mon
3589 int year
3590 int wday
3591 int yday
3592 int isdst
3593 CODE:
3594 {
3595 struct tm mytm;
7747499c 3596 init_tm(&mytm); /* XXX workaround - see init_tm() above */
a0d0e21e
LW
3597 mytm.tm_sec = sec;
3598 mytm.tm_min = min;
3599 mytm.tm_hour = hour;
3600 mytm.tm_mday = mday;
3601 mytm.tm_mon = mon;
3602 mytm.tm_year = year;
3603 mytm.tm_wday = wday;
3604 mytm.tm_yday = yday;
3605 mytm.tm_isdst = isdst;
3606 RETVAL = mktime(&mytm);
3607 }
85e6fe83
LW
3608 OUTPUT:
3609 RETVAL
a0d0e21e
LW
3610
3611char *
e44f695e 3612strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
a0d0e21e
LW
3613 char * fmt
3614 int sec
3615 int min
3616 int hour
3617 int mday
3618 int mon
3619 int year
3620 int wday
3621 int yday
3622 int isdst
3623 CODE:
3624 {
3625 char tmpbuf[128];
3626 struct tm mytm;
3627 int len;
7747499c 3628 init_tm(&mytm); /* XXX workaround - see init_tm() above */
a0d0e21e
LW
3629 mytm.tm_sec = sec;
3630 mytm.tm_min = min;
3631 mytm.tm_hour = hour;
3632 mytm.tm_mday = mday;
3633 mytm.tm_mon = mon;
3634 mytm.tm_year = year;
3635 mytm.tm_wday = wday;
3636 mytm.tm_yday = yday;
3637 mytm.tm_isdst = isdst;
e44f695e 3638 (void) mktime(&mytm);
a0d0e21e 3639 len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm);
e8227f62
TL
3640 /*
3641 ** The following is needed to handle to the situation where
3642 ** tmpbuf overflows. Basically we want to allocate a buffer
3643 ** and try repeatedly. The reason why it is so complicated
3644 ** is that getting a return value of 0 from strftime can indicate
3645 ** one of the following:
3646 ** 1. buffer overflowed,
3647 ** 2. illegal conversion specifier, or
3648 ** 3. the format string specifies nothing to be returned(not
3649 ** an error). This could be because format is an empty string
3650 ** or it specifies %p that yields an empty string in some locale.
3651 ** If there is a better way to make it portable, go ahead by
3652 ** all means.
3653 */
3654 if ( ( len > 0 && len < sizeof(tmpbuf) )
3655 || ( len == 0 && strlen(fmt) == 0 ) ) {
3656 ST(0) = sv_2mortal(newSVpv(tmpbuf, len));
3657 } else {
3658 /* Possibly buf overflowed - try again with a bigger buf */
3659 int bufsize = strlen(fmt) + sizeof(tmpbuf);
01667c76 3660 char* buf;
e8227f62 3661 int buflen;
01667c76
JD
3662
3663 New(0, buf, bufsize, char);
e8227f62
TL
3664 while( buf ) {
3665 buflen = strftime(buf, bufsize, fmt, &mytm);
3666 if ( buflen > 0 && buflen < bufsize ) break;
3667 bufsize *= 2;
01667c76 3668 Renew(buf, bufsize, char);
e8227f62
TL
3669 }
3670 if ( buf ) {
79cb57f6 3671 ST(0) = sv_2mortal(newSVpvn(buf, buflen));
01667c76 3672 Safefree(buf);
e8227f62 3673 } else {
79cb57f6 3674 ST(0) = sv_2mortal(newSVpvn(tmpbuf, len));
e8227f62
TL
3675 }
3676 }
a0d0e21e
LW
3677 }
3678
3679void
3680tzset()
3681
3682void
3683tzname()
3684 PPCODE:
924508f0 3685 EXTEND(SP,2);
79cb57f6
GS
3686 PUSHs(sv_2mortal(newSVpvn(tzname[0],strlen(tzname[0]))));
3687 PUSHs(sv_2mortal(newSVpvn(tzname[1],strlen(tzname[1]))));
a0d0e21e
LW
3688
3689SysRet
3690access(filename, mode)
3691 char * filename
3692 Mode_t mode
3693
3694char *
3695ctermid(s = 0)
3696 char * s = 0;
3697
3698char *
3699cuserid(s = 0)
3700 char * s = 0;
3701
3702SysRetLong
3703fpathconf(fd, name)
3704 int fd
3705 int name
3706
3707SysRetLong
3708pathconf(filename, name)
3709 char * filename
3710 int name
3711
3712SysRet
3713pause()
3714
3715SysRetLong
3716sysconf(name)
3717 int name
3718
3719char *
3720ttyname(fd)
3721 int fd