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