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