2 # creates a C API file from proto.h
3 # takes one argument, the path to lib/CORE directory.
4 # creates 2 files: "PerlCAPI.cpp" and "PerlCAPI.h".
6 my $hdrfile = "$ARGV[0]\\PerlCAPI.h";
7 my $infile = '..\\proto.h';
8 my $embedfile = '..\\embed.h';
15 my ($syms, $file) = @_;
20 or die "$0: Can't open $file: $!\n";
21 while ($line = <FILE>) {
23 if ($line =~ /^#define\s+\w+/) {
24 $line =~ s/^#define\s+//;
25 @words = split ' ', $line;
26 # print "$words[0]\t$words[1]\n";
27 $$syms{$words[0]} = $words[1];
33 readembed %embed, $embedfile;
37 foreach my $symbol (@$list) {
38 $skip_list{$symbol} = 1;
74 if (!open(INFILE, "<$infile")) {
75 print "open of $infile failed: $!\n";
79 if (!open(OUTFILE, ">PerlCAPI.cpp")) {
80 print "open of PerlCAPI.cpp failed: $!\n";
84 print OUTFILE <<ENDCODE;
89 #define DESTRUCTORFUNC (void (*)(void*))
93 print OUTFILE "#ifdef SetCPerlObj_defined\n" unless ($separateObj == 0);
95 print OUTFILE <<ENDCODE;
96 extern "C" void SetCPerlObj(CPerlObj* pP)
103 print OUTFILE "#endif\n" unless ($separateObj == 0);
106 last unless defined ($_ = <INFILE>);
112 $_ =~ s/^VIRTUAL\s*//;
113 $_ =~ s/\s*__attribute__.*$/;/;
114 if ( /(.*)\s([A-z_]*[0-9A-z_]+\s)_\(\((.*)\)\);/ ||
115 /(.*)\*([A-z_]*[0-9A-z_]+\s)_\(\((.*)\)\);/ ) {
122 next if (defined $skip_list{$name});
124 if($args eq "ARGSproto") {
128 $return = ($type eq "void" or $type eq "Free_t") ? "\t" : "\treturn";
130 if(defined $embed{$name}) {
131 $funcName = $embed{$name};
136 @args = split(',', $args);
137 if ($args[$#args] =~ /\s*\.\.\.\s*/) {
138 if(($name eq "croak") or ($name eq "deb") or ($name eq "die")
139 or ($name eq "form") or ($name eq "warn")) {
140 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
141 $args[0] =~ /(\w+)\W*$/;
143 print OUTFILE <<ENDCODE;
146 extern "C" $type $funcName ($args)
151 va_start(args, $arg);
152 pmsg = pPerl->Perl_mess($arg, &args);
153 New(0, pstr, strlen(pmsg)+1, char);
155 $return pPerl->Perl_$name(pstr);
159 print OUTFILE "#endif\n" unless ($separateObj == 0);
161 elsif($name eq "newSVpvf") {
162 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
163 $args[0] =~ /(\w+)\W*$/;
165 print OUTFILE <<ENDCODE;
168 extern "C" $type $funcName ($args)
172 va_start(args, $arg);
173 sv = pPerl->Perl_newSV(0);
174 pPerl->Perl_sv_vcatpvfn(sv, $arg, strlen($arg), &args, NULL, 0, NULL);
179 print OUTFILE "#endif\n" unless ($separateObj == 0);
181 elsif($name eq "sv_catpvf") {
182 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
183 $args[0] =~ /(\w+)\W*$/;
185 $args[1] =~ /(\w+)\W*$/;
187 print OUTFILE <<ENDCODE;
190 extern "C" $type $funcName ($args)
193 va_start(args, $arg1);
194 pPerl->Perl_sv_vcatpvfn($arg0, $arg1, strlen($arg1), &args, NULL, 0, NULL);
198 print OUTFILE "#endif\n" unless ($separateObj == 0);
200 elsif($name eq "sv_setpvf") {
201 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
202 $args[0] =~ /(\w+)\W*$/;
204 $args[1] =~ /(\w+)\W*$/;
206 print OUTFILE <<ENDCODE;
209 extern "C" $type $funcName ($args)
212 va_start(args, $arg1);
213 pPerl->Perl_sv_vsetpvfn($arg0, $arg1, strlen($arg1), &args, NULL, 0, NULL);
217 print OUTFILE "#endif\n" unless ($separateObj == 0);
219 elsif($name eq "fprintf") {
220 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
221 $args[0] =~ /(\w+)\W*$/;
223 $args[1] =~ /(\w+)\W*$/;
225 print OUTFILE <<ENDCODE;
228 extern "C" $type $name ($args)
232 va_start(args, $arg1);
233 nRet = PerlIO_vprintf($arg0, $arg1, args);
238 print OUTFILE "#endif\n" unless ($separateObj == 0);
240 print "Warning: can't handle varargs function '$name'\n";
246 if ($name eq "newXS") {
250 print OUTFILE "\n#ifdef $name" . "defined" unless ($separateObj == 0);
252 # handle specical case for save_destructor
253 if ($name eq "save_destructor") {
256 # handle specical case for sighandler
257 if ($name eq "sighandler") {
260 # handle special case for sv_grow
261 if ($name eq "sv_grow" and $args eq "SV* sv, unsigned long newlen") {
264 # handle special case for newSV
265 if ($name eq "newSV" and $args eq "I32 x, STRLEN len") {
268 # handle special case for perl_parse
269 if ($name eq "perl_parse") {
270 print OUTFILE <<ENDCODE;
273 extern "C" $type $name ($args)
275 return pPerl->perl_parse(xsinit, argc, argv, env);
278 print OUTFILE "#endif\n" unless ($separateObj == 0);
283 if ($args eq "void") {
284 print OUTFILE <<ENDCODE;
287 extern "C" $type $funcName ()
289 $return pPerl->$funcName();
293 print OUTFILE "#endif\n" unless ($separateObj == 0);
297 # foo(char *s, const int bar);
298 print OUTFILE <<ENDCODE;
301 extern "C" $type $funcName ($args)
303 $return pPerl->$funcName
307 foreach $arg (@args) {
308 if ($arg =~ /(\w+)\W*$/) {
310 print OUTFILE ", $1";
318 print OUTFILE ");\n}\n";
319 print OUTFILE "#endif\n" unless ($separateObj == 0);
322 print "failed to match $_";
431 my ($syms, $file, $pre) = @_;
434 open(FILE, "< $file")
435 or die "$0: Can't open $file: $!\n";
437 s/[ \t]*#.*//; # Delete comments.
438 if (/PERLVARI?C?\($pre(\w+),\s*([^,)]+)/) {
449 readvars %intrp, '..\intrpvar.h','I';
450 readvars %thread, '..\thrdvar.h','T';
451 readvars %globvar, '..\perlvars.h','G';
453 open(HDRFILE, ">$hdrfile") or die "$0: Can't open $hdrfile: $!\n";
454 print HDRFILE <<ENDCODE;
455 void SetCPerlObj(void* pP);
456 CV* Perl_newXS(char* name, void (*subaddr)(CV* cv), char* filename);
464 return if (defined $skip_list{$name});
465 return if ($type eq 'struct perl_thread *');
467 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
468 print OUTFILE <<ENDCODE;
469 extern "C" $type * _Perl_$name ()
471 return (($type *)&pPerl->Perl_$name);
476 print OUTFILE "#endif\n" unless ($separateObj == 0);
478 print HDRFILE <<ENDCODE;
481 $type * _Perl_$name ();
482 #define Perl_$name (*_Perl_$name())
488 foreach $key (keys %intrp) {
489 DoVariable ($key, $intrp{$key});
492 foreach $key (keys %thread) {
493 DoVariable ($key, $thread{$key});
496 foreach $key (keys %globvar) {
497 DoVariable ($key, $globvar{$key});
500 print OUTFILE <<EOCODE;
504 void xs_handler(CV* cv, CPerlObj* p)
508 MAGIC* m = pPerl->Perl_mg_find((SV*)cv, '~');
514 func = (void(*)(CV*))SvIVX(sv);
518 func = (void(*)(CV*))pPerl->Perl_sv_2iv(sv);
524 CV* Perl_newXS(char* name, void (*subaddr)(CV* cv), char* filename)
526 CV* cv = pPerl->Perl_newXS(name, xs_handler, filename);
527 pPerl->Perl_sv_magic((SV*)cv, pPerl->Perl_sv_2mortal(pPerl->Perl_newSViv((IV)subaddr)), '~', "CAPI", 4);
532 void Perl_deb(const char pat, ...)
544 int * _win32_errno(void)
546 return &pPerl->ErrorNo();
549 FILE* _win32_stdin(void)
551 return (FILE*)pPerl->piStdIO->Stdin();
554 FILE* _win32_stdout(void)
556 return (FILE*)pPerl->piStdIO->Stdout();
559 FILE* _win32_stderr(void)
561 return (FILE*)pPerl->piStdIO->Stderr();
564 int _win32_ferror(FILE *fp)
566 return pPerl->piStdIO->Error((PerlIO*)fp, ErrorNo());
569 int _win32_feof(FILE *fp)
571 return pPerl->piStdIO->Eof((PerlIO*)fp, ErrorNo());
574 char* _win32_strerror(int e)
579 void _win32_perror(const char *str)
584 int _win32_vfprintf(FILE *pf, const char *format, va_list arg)
586 return pPerl->piStdIO->Vprintf((PerlIO*)pf, ErrorNo(), format, arg);
589 int _win32_vprintf(const char *format, va_list arg)
591 return pPerl->piStdIO->Vprintf(pPerl->piStdIO->Stdout(), ErrorNo(), format, arg);
594 int _win32_fprintf(FILE *pf, const char *format, ...)
598 va_start(args, format);
599 ret = _win32_vfprintf(pf, format, args);
604 int _win32_printf(const char *format, ...)
608 va_start(args, format);
609 ret = _win32_vprintf(format, args);
614 size_t _win32_fread(void *buf, size_t size, size_t count, FILE *pf)
616 return pPerl->piStdIO->Read((PerlIO*)pf, buf, (size*count), ErrorNo());
619 size_t _win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf)
621 return pPerl->piStdIO->Write((PerlIO*)pf, buf, (size*count), ErrorNo());
624 FILE* _win32_fopen(const char *path, const char *mode)
626 return (FILE*)pPerl->piStdIO->Open(path, mode, ErrorNo());
629 FILE* _win32_fdopen(int fh, const char *mode)
631 return (FILE*)pPerl->piStdIO->Fdopen(fh, mode, ErrorNo());
634 FILE* _win32_freopen(const char *path, const char *mode, FILE *pf)
636 return (FILE*)pPerl->piStdIO->Reopen(path, mode, (PerlIO*)pf, ErrorNo());
639 int _win32_fclose(FILE *pf)
641 return pPerl->piStdIO->Close((PerlIO*)pf, ErrorNo());
644 int _win32_fputs(const char *s,FILE *pf)
646 return pPerl->piStdIO->Puts((PerlIO*)pf, s, ErrorNo());
649 int _win32_fputc(int c,FILE *pf)
651 return pPerl->piStdIO->Putc((PerlIO*)pf, c, ErrorNo());
654 int _win32_ungetc(int c,FILE *pf)
656 return pPerl->piStdIO->Ungetc((PerlIO*)pf, c, ErrorNo());
659 int _win32_getc(FILE *pf)
661 return pPerl->piStdIO->Getc((PerlIO*)pf, ErrorNo());
664 int _win32_fileno(FILE *pf)
666 return pPerl->piStdIO->Fileno((PerlIO*)pf, ErrorNo());
669 void _win32_clearerr(FILE *pf)
671 pPerl->piStdIO->Clearerr((PerlIO*)pf, ErrorNo());
674 int _win32_fflush(FILE *pf)
676 return pPerl->piStdIO->Flush((PerlIO*)pf, ErrorNo());
679 long _win32_ftell(FILE *pf)
681 return pPerl->piStdIO->Tell((PerlIO*)pf, ErrorNo());
684 int _win32_fseek(FILE *pf,long offset,int origin)
686 return pPerl->piStdIO->Seek((PerlIO*)pf, offset, origin, ErrorNo());
689 int _win32_fgetpos(FILE *pf,fpos_t *p)
691 return pPerl->piStdIO->Getpos((PerlIO*)pf, p, ErrorNo());
694 int _win32_fsetpos(FILE *pf,const fpos_t *p)
696 return pPerl->piStdIO->Setpos((PerlIO*)pf, p, ErrorNo());
699 void _win32_rewind(FILE *pf)
701 pPerl->piStdIO->Rewind((PerlIO*)pf, ErrorNo());
704 FILE* _win32_tmpfile(void)
706 return (FILE*)pPerl->piStdIO->Tmpfile(ErrorNo());
709 void _win32_setbuf(FILE *pf, char *buf)
711 pPerl->piStdIO->SetBuf((PerlIO*)pf, buf, ErrorNo());
714 int _win32_setvbuf(FILE *pf, char *buf, int type, size_t size)
716 return pPerl->piStdIO->SetVBuf((PerlIO*)pf, buf, type, size, ErrorNo());
719 int _win32_fgetc(FILE *pf)
721 return pPerl->piStdIO->Getc((PerlIO*)pf, ErrorNo());
724 int _win32_putc(int c, FILE *pf)
726 return pPerl->piStdIO->Putc((PerlIO*)pf, c, ErrorNo());
729 int _win32_puts(const char *s)
731 return pPerl->piStdIO->Puts(pPerl->piStdIO->Stdout(), s, ErrorNo());
734 int _win32_getchar(void)
736 return pPerl->piStdIO->Getc(pPerl->piStdIO->Stdin(), ErrorNo());
739 int _win32_putchar(int c)
741 return pPerl->piStdIO->Putc(pPerl->piStdIO->Stdout(), c, ErrorNo());
744 void* _win32_malloc(size_t size)
746 return pPerl->piMem->Malloc(size);
749 void* _win32_calloc(size_t numitems, size_t size)
751 return pPerl->piMem->Malloc(numitems*size);
754 void* _win32_realloc(void *block, size_t size)
756 return pPerl->piMem->Realloc(block, size);
759 void _win32_free(void *block)
761 pPerl->piMem->Free(block);
764 void _win32_abort(void)
766 pPerl->piProc->Abort();
769 int _win32_pipe(int *phandles, unsigned int psize, int textmode)
771 return pPerl->piProc->Pipe(phandles);
774 FILE* _win32_popen(const char *command, const char *mode)
776 return (FILE*)pPerl->piProc->Popen(command, mode);
779 int _win32_pclose(FILE *pf)
781 return pPerl->piProc->Pclose((PerlIO*)pf);
784 unsigned _win32_sleep(unsigned int t)
786 return pPerl->piProc->Sleep(t);
789 int _win32_spawnvp(int mode, const char *cmdname, const char *const *argv)
791 return pPerl->piProc->Spawnvp(mode, cmdname, argv);
794 int _win32_mkdir(const char *dir, int mode)
796 return pPerl->piDir->Makedir(dir, mode, ErrorNo());
799 int _win32_rmdir(const char *dir)
801 return pPerl->piDir->Rmdir(dir, ErrorNo());
804 int _win32_chdir(const char *dir)
806 return pPerl->piDir->Chdir(dir, ErrorNo());
810 int _win32_fstat(int fd,struct stat *sbufptr)
812 return pPerl->piLIO->FileStat(fd, sbufptr, ErrorNo());
815 int _win32_stat(const char *name,struct stat *sbufptr)
817 return pPerl->piLIO->NameStat(name, sbufptr, ErrorNo());
820 int _win32_setmode(int fd, int mode)
822 return pPerl->piLIO->Setmode(fd, mode, ErrorNo());
825 long _win32_lseek(int fd, long offset, int origin)
827 return pPerl->piLIO->Lseek(fd, offset, origin, ErrorNo());
830 long _win32_tell(int fd)
832 return pPerl->piStdIO->Tell((PerlIO*)fd, ErrorNo());
835 int _win32_dup(int fd)
837 return pPerl->piLIO->Dup(fd, ErrorNo());
840 int _win32_dup2(int h1, int h2)
842 return pPerl->piLIO->Dup2(h1, h2, ErrorNo());
845 int _win32_open(const char *path, int oflag,...)
847 return pPerl->piLIO->Open(path, oflag, ErrorNo());
850 int _win32_close(int fd)
852 return pPerl->piLIO->Close(fd, ErrorNo());
855 int _win32_read(int fd, void *buf, unsigned int cnt)
857 return pPerl->piLIO->Read(fd, buf, cnt, ErrorNo());
860 int _win32_write(int fd, const void *buf, unsigned int cnt)
862 return pPerl->piLIO->Write(fd, buf, cnt, ErrorNo());
865 int _win32_times(struct tms *timebuf)
867 return pPerl->piProc->Times(timebuf);
870 int _win32_ioctl(int i, unsigned int u, char *data)
872 return pPerl->piLIO->IOCtl(i, u, data, ErrorNo());
875 int _win32_utime(const char *f, struct utimbuf *t)
877 return pPerl->piLIO->Utime((char*)f, t, ErrorNo());
880 char* _win32_getenv(const char *name)
882 return pPerl->piENV->Getenv(name, ErrorNo());
885 int _win32_open_osfhandle(long handle, int flags)
887 return pPerl->piStdIO->OpenOSfhandle(handle, flags);
890 long _win32_get_osfhandle(int fd)
892 return pPerl->piStdIO->GetOSfhandle(fd);
898 print HDRFILE <<EOCODE;
907 #undef win32_vfprintf
920 #undef win32_clearerr
965 #define win32_errno _win32_errno
966 #define win32_stdin _win32_stdin
967 #define win32_stdout _win32_stdout
968 #define win32_stderr _win32_stderr
969 #define win32_ferror _win32_ferror
970 #define win32_feof _win32_feof
971 #define win32_strerror _win32_strerror
972 #define win32_perror _win32_perror
973 #define win32_fprintf _win32_fprintf
974 #define win32_printf _win32_printf
975 #define win32_vfprintf _win32_vfprintf
976 #define win32_vprintf _win32_vprintf
977 #define win32_fread _win32_fread
978 #define win32_fwrite _win32_fwrite
979 #define win32_fopen _win32_fopen
980 #define win32_fdopen _win32_fdopen
981 #define win32_freopen _win32_freopen
982 #define win32_fclose _win32_fclose
983 #define win32_fputs _win32_fputs
984 #define win32_fputc _win32_fputc
985 #define win32_ungetc _win32_ungetc
986 #define win32_getc _win32_getc
987 #define win32_fileno _win32_fileno
988 #define win32_clearerr _win32_clearerr
989 #define win32_fflush _win32_fflush
990 #define win32_ftell _win32_ftell
991 #define win32_fseek _win32_fseek
992 #define win32_fgetpos _win32_fgetpos
993 #define win32_fsetpos _win32_fsetpos
994 #define win32_rewind _win32_rewind
995 #define win32_tmpfile _win32_tmpfile
996 #define win32_abort _win32_abort
997 #define win32_fstat _win32_fstat
998 #define win32_stat _win32_stat
999 #define win32_pipe _win32_pipe
1000 #define win32_popen _win32_popen
1001 #define win32_pclose _win32_pclose
1002 #define win32_setmode _win32_setmode
1003 #define win32_lseek _win32_lseek
1004 #define win32_tell _win32_tell
1005 #define win32_dup _win32_dup
1006 #define win32_dup2 _win32_dup2
1007 #define win32_open _win32_open
1008 #define win32_close _win32_close
1009 #define win32_eof _win32_eof
1010 #define win32_read _win32_read
1011 #define win32_write _win32_write
1012 #define win32_mkdir _win32_mkdir
1013 #define win32_rmdir _win32_rmdir
1014 #define win32_chdir _win32_chdir
1015 #define win32_setbuf _win32_setbuf
1016 #define win32_setvbuf _win32_setvbuf
1017 #define win32_fgetc _win32_fgetc
1018 #define win32_putc _win32_putc
1019 #define win32_puts _win32_puts
1020 #define win32_getchar _win32_getchar
1021 #define win32_putchar _win32_putchar
1022 #define win32_malloc _win32_malloc
1023 #define win32_calloc _win32_calloc
1024 #define win32_realloc _win32_realloc
1025 #define win32_free _win32_free
1026 #define win32_sleep _win32_sleep
1027 #define win32_spawnvp _win32_spawnvp
1028 #define win32_times _win32_times
1029 #define win32_stat _win32_stat
1030 #define win32_ioctl _win32_ioctl
1031 #define win32_utime _win32_utime
1032 #define win32_getenv _win32_getenv
1033 #define win32_open_osfhandle _win32_open_osfhandle
1034 #define win32_get_osfhandle _win32_get_osfhandle
1036 int * _win32_errno(void);
1037 FILE* _win32_stdin(void);
1038 FILE* _win32_stdout(void);
1039 FILE* _win32_stderr(void);
1040 int _win32_ferror(FILE *fp);
1041 int _win32_feof(FILE *fp);
1042 char* _win32_strerror(int e);
1043 void _win32_perror(const char *str);
1044 int _win32_fprintf(FILE *pf, const char *format, ...);
1045 int _win32_printf(const char *format, ...);
1046 int _win32_vfprintf(FILE *pf, const char *format, va_list arg);
1047 int _win32_vprintf(const char *format, va_list arg);
1048 size_t _win32_fread(void *buf, size_t size, size_t count, FILE *pf);
1049 size_t _win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf);
1050 FILE* _win32_fopen(const char *path, const char *mode);
1051 FILE* _win32_fdopen(int fh, const char *mode);
1052 FILE* _win32_freopen(const char *path, const char *mode, FILE *pf);
1053 int _win32_fclose(FILE *pf);
1054 int _win32_fputs(const char *s,FILE *pf);
1055 int _win32_fputc(int c,FILE *pf);
1056 int _win32_ungetc(int c,FILE *pf);
1057 int _win32_getc(FILE *pf);
1058 int _win32_fileno(FILE *pf);
1059 void _win32_clearerr(FILE *pf);
1060 int _win32_fflush(FILE *pf);
1061 long _win32_ftell(FILE *pf);
1062 int _win32_fseek(FILE *pf,long offset,int origin);
1063 int _win32_fgetpos(FILE *pf,fpos_t *p);
1064 int _win32_fsetpos(FILE *pf,const fpos_t *p);
1065 void _win32_rewind(FILE *pf);
1066 FILE* _win32_tmpfile(void);
1067 void _win32_abort(void);
1068 int _win32_fstat(int fd,struct stat *sbufptr);
1069 int _win32_stat(const char *name,struct stat *sbufptr);
1070 int _win32_pipe( int *phandles, unsigned int psize, int textmode );
1071 FILE* _win32_popen( const char *command, const char *mode );
1072 int _win32_pclose( FILE *pf);
1073 int _win32_setmode( int fd, int mode);
1074 long _win32_lseek( int fd, long offset, int origin);
1075 long _win32_tell( int fd);
1076 int _win32_dup( int fd);
1077 int _win32_dup2(int h1, int h2);
1078 int _win32_open(const char *path, int oflag,...);
1079 int _win32_close(int fd);
1080 int _win32_eof(int fd);
1081 int _win32_read(int fd, void *buf, unsigned int cnt);
1082 int _win32_write(int fd, const void *buf, unsigned int cnt);
1083 int _win32_mkdir(const char *dir, int mode);
1084 int _win32_rmdir(const char *dir);
1085 int _win32_chdir(const char *dir);
1086 void _win32_setbuf(FILE *pf, char *buf);
1087 int _win32_setvbuf(FILE *pf, char *buf, int type, size_t size);
1088 char* _win32_fgets(char *s, int n, FILE *pf);
1089 char* _win32_gets(char *s);
1090 int _win32_fgetc(FILE *pf);
1091 int _win32_putc(int c, FILE *pf);
1092 int _win32_puts(const char *s);
1093 int _win32_getchar(void);
1094 int _win32_putchar(int c);
1095 void* _win32_malloc(size_t size);
1096 void* _win32_calloc(size_t numitems, size_t size);
1097 void* _win32_realloc(void *block, size_t size);
1098 void _win32_free(void *block);
1099 unsigned _win32_sleep(unsigned int);
1100 int _win32_spawnvp(int mode, const char *cmdname, const char *const *argv);
1101 int _win32_times(struct tms *timebuf);
1102 int _win32_stat(const char *path, struct stat *buf);
1103 int _win32_ioctl(int i, unsigned int u, char *data);
1104 int _win32_utime(const char *f, struct utimbuf *t);
1105 char* _win32_getenv(const char *name);
1106 int _win32_open_osfhandle(long handle, int flags);
1107 long _win32_get_osfhandle(int fd);
1109 #pragma warning(once : 4113)