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