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