[asperl] add AS patch#17
[p5sagit/p5-mst-13.2.git] / win32 / GenCAPI.pl
CommitLineData
e3b8966e 1
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".
5
6my $hdrfile = "$ARGV[0]\\PerlCAPI.h";
7my $infile = '..\\proto.h';
8my $embedfile = '..\\embed.h';
9my $separateObj = 0;
10
11my %skip_list;
12my %embed;
13
14sub readembed(\%$) {
15 my ($syms, $file) = @_;
16 my ($line, @words);
17 %$syms = ();
18 local (*FILE, $_);
19 open(FILE, "< $file")
20 or die "$0: Can't open $file: $!\n";
21 while ($line = <FILE>) {
22 chop($line);
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];
28 }
29 }
30 close(FILE);
31}
32
33readembed %embed, $embedfile;
34
35sub skip_these {
36 my $list = shift;
37 foreach my $symbol (@$list) {
38 $skip_list{$symbol} = 1;
39 }
40}
41
42skip_these [qw(
43cando
44cast_ulong
45my_chsize
46condpair_magic
47deb
48deb_growlevel
49debprofdump
50debop
51debstack
52debstackptrs
53fprintf
54find_threadsv
55magic_mutexfree
56my_pclose
57my_popen
58my_swap
59my_htonl
60my_ntohl
61new_struct_thread
62same_dirent
63unlnk
64unlock_condpair
65safexmalloc
66safexcalloc
67safexrealloc
68safexfree
69Perl_GetVars
70)];
71
72
73
74if (!open(INFILE, "<$infile")) {
75 print "open of $infile failed: $!\n";
76 return 1;
77}
78
79if (!open(OUTFILE, ">PerlCAPI.cpp")) {
80 print "open of PerlCAPI.cpp failed: $!\n";
81 return 1;
82}
83
84print OUTFILE "#include \"EXTERN.h\"\n#include \"perl.h\"\n#include \"XSUB.h\"\n\n";
85print OUTFILE "#define DESTRUCTORFUNC (void (*)(void*))\n\n";
86print OUTFILE "#ifdef SetCPerlObj_defined\n" unless ($separateObj == 0);
87print OUTFILE "extern \"C\" void SetCPerlObj(CPerlObj* pP)\n{\n\tpPerl = pP;\n}\n";
88print OUTFILE "#endif\n" unless ($separateObj == 0);
89
90while () {
91 last unless defined ($_ = <INFILE>);
92 if (/^VIRTUAL\s/) {
93 while (!/;$/) {
94 chomp;
95 $_ .= <INFILE>;
96 }
97 $_ =~ s/^VIRTUAL\s*//;
98 $_ =~ s/\s*__attribute__.*$/;/;
99 if ( /(.*)\s([A-z_]*[0-9A-z_]+\s)_\(\((.*)\)\);/ ||
100 /(.*)\*([A-z_]*[0-9A-z_]+\s)_\(\((.*)\)\);/ ) {
101 $type = $1;
102 $name = $2;
103 $args = $3;
104
105 $name =~ s/\s*$//;
106 $type =~ s/\s*$//;
107 next if (defined $skip_list{$name});
108
109 if($args eq "ARGSproto") {
110 $args = "void";
111 }
112
113 $return = ($type eq "void" or $type eq "Free_t") ? "\t" : "\treturn";
114
115 if(defined $embed{$name}) {
116 $funcName = $embed{$name};
117 } else {
118 $funcName = $name;
119 }
120
121 @args = split(',', $args);
122 if ($args[$#args] =~ /\s*\.\.\.\s*/) {
123 if(($name eq "croak") or ($name eq "deb") or ($name eq "die")
124 or ($name eq "form") or ($name eq "warn")) {
125 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
126 print OUTFILE "\n#undef $name\nextern \"C\" $type $funcName ($args)\n{\n";
127 $args[0] =~ /(\w+)\W*$/;
128 $arg = $1;
129 print OUTFILE "\tva_list args;\n\tva_start(args, $arg);\n";
130 print OUTFILE "$return pPerl->Perl_$name(pPerl->Perl_mess($arg, &args));\n";
131 print OUTFILE "\tva_end(args);\n}\n";
132 print OUTFILE "#endif\n" unless ($separateObj == 0);
133 }
134 elsif($name eq "newSVpvf") {
135 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
136 print OUTFILE "\n#undef $name\nextern \"C\" $type $funcName ($args)\n{\n";
137 $args[0] =~ /(\w+)\W*$/;
138 $arg = $1;
139 print OUTFILE "\tSV *sv;\n\tva_list args;\n\tva_start(args, $arg);\n";
140 print OUTFILE "\tsv = pPerl->Perl_newSV(0);\n";
141 print OUTFILE "\tpPerl->Perl_sv_vcatpvfn(sv, $arg, strlen($arg), &args, NULL, 0, NULL);\n";
142 print OUTFILE "\tva_end(args);\n\treturn sv;\n}\n";
143 print OUTFILE "#endif\n" unless ($separateObj == 0);
144 }
145 elsif($name eq "sv_catpvf") {
146 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
147 print OUTFILE "\n#undef $name\nextern \"C\" $type $funcName ($args)\n{\n";
148 $args[0] =~ /(\w+)\W*$/;
149 $arg0 = $1;
150 $args[1] =~ /(\w+)\W*$/;
151 $arg1 = $1;
152 print OUTFILE "\tva_list args;\n\tva_start(args, $arg1);\n";
153 print OUTFILE "\tpPerl->Perl_sv_vcatpvfn($arg0, $arg1, strlen($arg1), &args, NULL, 0, NULL);\n";
154 print OUTFILE "\tva_end(args);\n}\n";
155 print OUTFILE "#endif\n" unless ($separateObj == 0);
156 }
157 elsif($name eq "sv_setpvf") {
158 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
159 print OUTFILE "\n#undef $name\nextern \"C\" $type $funcName ($args)\n{\n";
160 $args[0] =~ /(\w+)\W*$/;
161 $arg0 = $1;
162 $args[1] =~ /(\w+)\W*$/;
163 $arg1 = $1;
164 print OUTFILE "\tva_list args;\n\tva_start(args, $arg1);\n";
165 print OUTFILE "\tpPerl->Perl_sv_vsetpvfn($arg0, $arg1, strlen($arg1), &args, NULL, 0, NULL);\n";
166 print OUTFILE "\tva_end(args);\n}\n";
167 print OUTFILE "#endif\n" unless ($separateObj == 0);
168 }
169 elsif($name eq "fprintf") {
170 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
171 print OUTFILE "\n#undef $name\nextern \"C\" $type $name ($args)\n{\n";
172 $args[0] =~ /(\w+)\W*$/;
173 $arg0 = $1;
174 $args[1] =~ /(\w+)\W*$/;
175 $arg1 = $1;
176 print OUTFILE "\tint nRet;\n\tva_list args;\n\tva_start(args, $arg1);\n";
177 print OUTFILE "\tnRet = PerlIO_vprintf($arg0, $arg1, args);\n";
178 print OUTFILE "\tva_end(args);\n\treturn nRet;\n}\n";
179 print OUTFILE "#endif\n" unless ($separateObj == 0);
180 } else {
181 print "Warning: can't handle varargs function '$name'\n";
182 }
183 next;
184 }
185
186 # newXS special case
187 if ($name eq "newXS") {
188 next;
189 }
190
191 print OUTFILE "\n#ifdef $name" . "defined" unless ($separateObj == 0);
192
193 # handle specical case for save_destructor
194 if ($name eq "save_destructor") {
195 next;
196 }
197 # handle specical case for sighandler
198 if ($name eq "sighandler") {
199 next;
200 }
201 # handle special case for sv_grow
202 if ($name eq "sv_grow" and $args eq "SV* sv, unsigned long newlen") {
203 next;
204 }
205 # handle special case for newSV
206 if ($name eq "newSV" and $args eq "I32 x, STRLEN len") {
207 next;
208 }
209 # handle special case for perl_parse
210 if ($name eq "perl_parse") {
211 print OUTFILE "\n#undef $name\nextern \"C\" $type $name ($args)\n{\n";
212 print OUTFILE "\treturn pPerl->perl_parse(xsinit, argc, argv, env);\n}\n";
213 print OUTFILE "#endif\n" unless ($separateObj == 0);
214 next;
215 }
216
217 # foo(void);
218 if ($args eq "void") {
219 print OUTFILE "\n#undef $name\nextern \"C\" $type $funcName ()\n{\n$return pPerl->$funcName();\n}\n";
220 print OUTFILE "#endif\n" unless ($separateObj == 0);
221 next;
222 }
223
224 # foo(char *s, const int bar);
225 print OUTFILE "\n#undef $name\nextern \"C\" $type $funcName ($args)\n{\n$return pPerl->$funcName";
226 $doneone = 0;
227 foreach $arg (@args) {
228 if ($arg =~ /(\w+)\W*$/) {
229 if ($doneone) {
230 print OUTFILE ", $1";
231 }
232 else {
233 print OUTFILE "($1";
234 $doneone++;
235 }
236 }
237 }
238 print OUTFILE ");\n}\n";
239 print OUTFILE "#endif\n" unless ($separateObj == 0);
240 }
241 else {
242 print "failed to match $_";
243 }
244 }
245}
246
247close INFILE;
248
249%skip_list = ();
250
251skip_these [qw(
252strchop
253filemode
254lastfd
255oldname
256curinterp
257Argv
258Cmd
259sortcop
260sortstash
261firstgv
262secondgv
263sortstack
264signalstack
265mystrk
266dumplvl
267oldlastpm
268gensym
269preambled
270preambleav
271Ilaststatval
272Ilaststype
273mess_sv
274ors
275opsave
276eval_mutex
277orslen
278ofmt
279mh
280modcount
281generation
282DBcv
283archpat_auto
284sortcxix
285lastgotoprobe
286regdummy
287regparse
288regxend
289regcode
290regnaughty
291regsawback
292regprecomp
293regnpar
294regsize
295regflags
296regseen
297seen_zerolen
298rx
299extralen
300colorset
301colors
302reginput
303regbol
304regeol
305regstartp
306regendp
307reglastparen
308regtill
309regprev
310reg_start_tmp
311reg_start_tmpl
312regdata
313bostr
314reg_flags
315reg_eval_set
316regnarrate
317regprogram
318regindent
319regcc
320in_clean_objs
321in_clean_all
322linestart
323pending_ident
324statusvalue_vms
325sublex_info
326thrsv
327threadnum
328piMem
329piENV
330piStdIO
331piLIO
332piDir
333piSock
334piProc
335cshname
336threadsv_names
337thread
338nthreads
339thr_key
340threads_mutex
341malloc_mutex
342svref_mutex
343sv_mutex
344nthreads_cond
345eval_cond
346cryptseen
347cshlen
348)];
349
350sub readvars(\%$$) {
351 my ($syms, $file, $pre) = @_;
352 %$syms = ();
353 local (*FILE, $_);
354 open(FILE, "< $file")
355 or die "$0: Can't open $file: $!\n";
356 while (<FILE>) {
357 s/[ \t]*#.*//; # Delete comments.
358 if (/PERLVARI?C?\($pre(\w+),\s*([^,)]+)/) {
359 $$syms{$1} = $2;
360 }
361 }
362 close(FILE);
363}
364
365my %intrp;
366my %thread;
367my %globvar;
368
369readvars %intrp, '..\intrpvar.h','I';
370readvars %thread, '..\thrdvar.h','T';
371readvars %globvar, '..\perlvars.h','G';
372
373open(HDRFILE, ">$hdrfile") or die "$0: Can't open $hdrfile: $!\n";
374print HDRFILE "\nvoid SetCPerlObj(void* pP);";
375print HDRFILE "\nCV* Perl_newXS(char* name, void (*subaddr)(CV* cv), char* filename);\n";
376
377sub DoVariable($$) {
378 my $name = shift;
379 my $type = shift;
380
381 return if (defined $skip_list{$name});
382 return if ($type eq 'struct perl_thread *');
383
384 print OUTFILE "\n#ifdef $name" . "_defined" unless ($separateObj == 0);
385 print OUTFILE "\nextern \"C\" $type * _Perl_$name ()\n{\n";
386 print OUTFILE "\treturn (($type *)&pPerl->Perl_$name);\n}\n";
387 print OUTFILE "#endif\n" unless ($separateObj == 0);
388
389 print HDRFILE "\n#undef Perl_$name\n$type * _Perl_$name ();";
390 print HDRFILE "\n#define Perl_$name (*_Perl_$name())\n\n";
391}
392
393foreach $key (keys %intrp) {
394 DoVariable ($key, $intrp{$key});
395}
396
397foreach $key (keys %thread) {
398 DoVariable ($key, $thread{$key});
399}
400
401foreach $key (keys %globvar) {
402 DoVariable ($key, $globvar{$key});
403}
404
405print OUTFILE <<EOCODE;
406
407
408extern "C" {
409void xs_handler(CV* cv, CPerlObj* pPerl)
410{
411 void(*func)(CV*);
412 SV* sv;
413 MAGIC* m = pPerl->Perl_mg_find((SV*)cv, '~');
414 if(m != NULL)
415 {
416 sv = m->mg_obj;
417 if(SvIOK(sv))
418 {
419 func = (void(*)(CV*))SvIVX(sv);
420 }
421 else
422 {
423 func = (void(*)(CV*))pPerl->Perl_sv_2iv(sv);
424 }
425 SetCPerlObj(pPerl);
426 func(cv);
427 }
428}
429
430CV* Perl_newXS(char* name, void (*subaddr)(CV* cv), char* filename)
431{
432 CV* cv = pPerl->Perl_newXS(name, xs_handler, filename);
433 pPerl->Perl_sv_magic((SV*)cv, pPerl->Perl_sv_2mortal(pPerl->Perl_newSViv((IV)subaddr)), '~', "CAPI", 4);
434 return cv;
435}
436
437#undef piMem
438#undef piENV
439#undef piStdIO
440#undef piLIO
441#undef piDir
442#undef piSock
443#undef piProc
444
445int * _win32_errno(void)
446{
447 return &pPerl->ErrorNo();
448}
449
450FILE* _win32_stdin(void)
451{
452 return (FILE*)pPerl->piStdIO->Stdin();
453}
454
455FILE* _win32_stdout(void)
456{
457 return (FILE*)pPerl->piStdIO->Stdout();
458}
459
460FILE* _win32_stderr(void)
461{
462 return (FILE*)pPerl->piStdIO->Stderr();
463}
464
465int _win32_ferror(FILE *fp)
466{
467 return pPerl->piStdIO->Error((PerlIO*)fp, ErrorNo());
468}
469
470int _win32_feof(FILE *fp)
471{
472 return pPerl->piStdIO->Eof((PerlIO*)fp, ErrorNo());
473}
474
475char* _win32_strerror(int e)
476{
477 return strerror(e);
478}
479
480void _win32_perror(const char *str)
481{
482 perror(str);
483}
484
485int _win32_vfprintf(FILE *pf, const char *format, va_list arg)
486{
487 return pPerl->piStdIO->Vprintf((PerlIO*)pf, ErrorNo(), format, arg);
488}
489
490int _win32_vprintf(const char *format, va_list arg)
491{
492 return pPerl->piStdIO->Vprintf(pPerl->piStdIO->Stdout(), ErrorNo(), format, arg);
493}
494
495int _win32_fprintf(FILE *pf, const char *format, ...)
496{
497 int ret;
498 va_list args;
499 va_start(args, format);
500 ret = _win32_vfprintf(pf, format, args);
501 va_end(args);
502 return ret;
503}
504
505int _win32_printf(const char *format, ...)
506{
507 int ret;
508 va_list args;
509 va_start(args, format);
510 ret = _win32_vprintf(format, args);
511 va_end(args);
512 return ret;
513}
514
515size_t _win32_fread(void *buf, size_t size, size_t count, FILE *pf)
516{
517 return pPerl->piStdIO->Read((PerlIO*)pf, buf, (size*count), ErrorNo());
518}
519
520size_t _win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf)
521{
522 return pPerl->piStdIO->Write((PerlIO*)pf, buf, (size*count), ErrorNo());
523}
524
525FILE* _win32_fopen(const char *path, const char *mode)
526{
527 return (FILE*)pPerl->piStdIO->Open(path, mode, ErrorNo());
528}
529
530FILE* _win32_fdopen(int fh, const char *mode)
531{
532 return (FILE*)pPerl->piStdIO->Fdopen(fh, mode, ErrorNo());
533}
534
535FILE* _win32_freopen(const char *path, const char *mode, FILE *pf)
536{
537 return (FILE*)pPerl->piStdIO->Reopen(path, mode, (PerlIO*)pf, ErrorNo());
538}
539
540int _win32_fclose(FILE *pf)
541{
542 return pPerl->piStdIO->Close((PerlIO*)pf, ErrorNo());
543}
544
545int _win32_fputs(const char *s,FILE *pf)
546{
547 return pPerl->piStdIO->Puts((PerlIO*)pf, s, ErrorNo());
548}
549
550int _win32_fputc(int c,FILE *pf)
551{
552 return pPerl->piStdIO->Putc((PerlIO*)pf, c, ErrorNo());
553}
554
555int _win32_ungetc(int c,FILE *pf)
556{
557 return pPerl->piStdIO->Ungetc((PerlIO*)pf, c, ErrorNo());
558}
559
560int _win32_getc(FILE *pf)
561{
562 return pPerl->piStdIO->Getc((PerlIO*)pf, ErrorNo());
563}
564
565int _win32_fileno(FILE *pf)
566{
567 return pPerl->piStdIO->Fileno((PerlIO*)pf, ErrorNo());
568}
569
570void _win32_clearerr(FILE *pf)
571{
572 pPerl->piStdIO->Clearerr((PerlIO*)pf, ErrorNo());
573}
574
575int _win32_fflush(FILE *pf)
576{
577 return pPerl->piStdIO->Flush((PerlIO*)pf, ErrorNo());
578}
579
580long _win32_ftell(FILE *pf)
581{
582 return pPerl->piStdIO->Tell((PerlIO*)pf, ErrorNo());
583}
584
585int _win32_fseek(FILE *pf,long offset,int origin)
586{
587 return pPerl->piStdIO->Seek((PerlIO*)pf, offset, origin, ErrorNo());
588}
589
590int _win32_fgetpos(FILE *pf,fpos_t *p)
591{
592 return pPerl->piStdIO->Getpos((PerlIO*)pf, p, ErrorNo());
593}
594
595int _win32_fsetpos(FILE *pf,const fpos_t *p)
596{
597 return pPerl->piStdIO->Setpos((PerlIO*)pf, p, ErrorNo());
598}
599
600void _win32_rewind(FILE *pf)
601{
602 pPerl->piStdIO->Rewind((PerlIO*)pf, ErrorNo());
603}
604
605FILE* _win32_tmpfile(void)
606{
607 return (FILE*)pPerl->piStdIO->Tmpfile(ErrorNo());
608}
609
610void _win32_setbuf(FILE *pf, char *buf)
611{
612 pPerl->piStdIO->SetBuf((PerlIO*)pf, buf, ErrorNo());
613}
614
615int _win32_setvbuf(FILE *pf, char *buf, int type, size_t size)
616{
617 return pPerl->piStdIO->SetVBuf((PerlIO*)pf, buf, type, size, ErrorNo());
618}
619
620int _win32_fgetc(FILE *pf)
621{
622 return pPerl->piStdIO->Getc((PerlIO*)pf, ErrorNo());
623}
624
625int _win32_putc(int c, FILE *pf)
626{
627 return pPerl->piStdIO->Putc((PerlIO*)pf, c, ErrorNo());
628}
629
630int _win32_puts(const char *s)
631{
632 return pPerl->piStdIO->Puts(pPerl->piStdIO->Stdout(), s, ErrorNo());
633}
634
635int _win32_getchar(void)
636{
637 return pPerl->piStdIO->Getc(pPerl->piStdIO->Stdin(), ErrorNo());
638}
639
640int _win32_putchar(int c)
641{
642 return pPerl->piStdIO->Putc(pPerl->piStdIO->Stdout(), c, ErrorNo());
643}
644
645void* _win32_malloc(size_t size)
646{
647 return pPerl->piMem->Malloc(size);
648}
649
650void* _win32_calloc(size_t numitems, size_t size)
651{
652 return pPerl->piMem->Malloc(numitems*size);
653}
654
655void* _win32_realloc(void *block, size_t size)
656{
657 return pPerl->piMem->Realloc(block, size);
658}
659
660void _win32_free(void *block)
661{
662 pPerl->piMem->Free(block);
663}
664
665void _win32_abort(void)
666{
667 pPerl->piProc->Abort();
668}
669
670int _win32_pipe(int *phandles, unsigned int psize, int textmode)
671{
672 return pPerl->piProc->Pipe(phandles);
673}
674
675FILE* _win32_popen(const char *command, const char *mode)
676{
677 return (FILE*)pPerl->piProc->Popen(command, mode);
678}
679
680int _win32_pclose(FILE *pf)
681{
682 return pPerl->piProc->Pclose((PerlIO*)pf);
683}
684
685unsigned _win32_sleep(unsigned int t)
686{
687 return pPerl->piProc->Sleep(t);
688}
689
690int _win32_spawnvp(int mode, const char *cmdname, const char *const *argv)
691{
692 return pPerl->piProc->Spawnvp(mode, cmdname, argv);
693}
694
695int _win32_mkdir(const char *dir, int mode)
696{
697 return pPerl->piDir->Makedir(dir, mode, ErrorNo());
698}
699
700int _win32_rmdir(const char *dir)
701{
702 return pPerl->piDir->Rmdir(dir, ErrorNo());
703}
704
705int _win32_chdir(const char *dir)
706{
707 return pPerl->piDir->Chdir(dir, ErrorNo());
708}
709
710#undef stat
711int _win32_fstat(int fd,struct stat *sbufptr)
712{
713 return pPerl->piLIO->FileStat(fd, sbufptr, ErrorNo());
714}
715
716int _win32_stat(const char *name,struct stat *sbufptr)
717{
718 return pPerl->piLIO->NameStat(name, sbufptr, ErrorNo());
719}
720
721int _win32_setmode(int fd, int mode)
722{
723 return pPerl->piLIO->Setmode(fd, mode, ErrorNo());
724}
725
726long _win32_lseek(int fd, long offset, int origin)
727{
728 return pPerl->piLIO->Lseek(fd, offset, origin, ErrorNo());
729}
730
731long _win32_tell(int fd)
732{
733 return pPerl->piStdIO->Tell((PerlIO*)fd, ErrorNo());
734}
735
736int _win32_dup(int fd)
737{
738 return pPerl->piLIO->Dup(fd, ErrorNo());
739}
740
741int _win32_dup2(int h1, int h2)
742{
743 return pPerl->piLIO->Dup2(h1, h2, ErrorNo());
744}
745
746int _win32_open(const char *path, int oflag,...)
747{
748 return pPerl->piLIO->Open(path, oflag, ErrorNo());
749}
750
751int _win32_close(int fd)
752{
753 return pPerl->piLIO->Close(fd, ErrorNo());
754}
755
756int _win32_read(int fd, void *buf, unsigned int cnt)
757{
758 return pPerl->piLIO->Read(fd, buf, cnt, ErrorNo());
759}
760
761int _win32_write(int fd, const void *buf, unsigned int cnt)
762{
763 return pPerl->piLIO->Write(fd, buf, cnt, ErrorNo());
764}
765
766int _win32_times(struct tms *timebuf)
767{
768 return pPerl->piProc->Times(timebuf);
769}
770
771int _win32_ioctl(int i, unsigned int u, char *data)
772{
773 return pPerl->piLIO->IOCtl(i, u, data, ErrorNo());
774}
775
776int _win32_utime(const char *f, struct utimbuf *t)
777{
778 return pPerl->piLIO->Utime((char*)f, t, ErrorNo());
779}
780
781char* _win32_getenv(const char *name)
782{
783 return pPerl->piENV->Getenv(name, ErrorNo());
784}
785
786int _win32_open_osfhandle(long handle, int flags)
787{
788 return pPerl->piStdIO->OpenOSfhandle(handle, flags);
789}
790
791long _win32_get_osfhandle(int fd)
792{
793 return pPerl->piStdIO->GetOSfhandle(fd);
794}
795} /* extern "C" */
796EOCODE
797
798
799print HDRFILE <<EOCODE;
800#undef win32_errno
801#undef win32_stdin
802#undef win32_stdout
803#undef win32_stderr
804#undef win32_ferror
805#undef win32_feof
806#undef win32_fprintf
807#undef win32_printf
808#undef win32_vfprintf
809#undef win32_vprintf
810#undef win32_fread
811#undef win32_fwrite
812#undef win32_fopen
813#undef win32_fdopen
814#undef win32_freopen
815#undef win32_fclose
816#undef win32_fputs
817#undef win32_fputc
818#undef win32_ungetc
819#undef win32_getc
820#undef win32_fileno
821#undef win32_clearerr
822#undef win32_fflush
823#undef win32_ftell
824#undef win32_fseek
825#undef win32_fgetpos
826#undef win32_fsetpos
827#undef win32_rewind
828#undef win32_tmpfile
829#undef win32_abort
830#undef win32_fstat
831#undef win32_stat
832#undef win32_pipe
833#undef win32_popen
834#undef win32_pclose
835#undef win32_setmode
836#undef win32_lseek
837#undef win32_tell
838#undef win32_dup
839#undef win32_dup2
840#undef win32_open
841#undef win32_close
842#undef win32_eof
843#undef win32_read
844#undef win32_write
845#undef win32_mkdir
846#undef win32_rmdir
847#undef win32_chdir
848#undef win32_setbuf
849#undef win32_setvbuf
850#undef win32_fgetc
851#undef win32_putc
852#undef win32_puts
853#undef win32_getchar
854#undef win32_putchar
855#undef win32_malloc
856#undef win32_calloc
857#undef win32_realloc
858#undef win32_free
859#undef win32_sleep
860#undef win32_times
861#undef win32_stat
862#undef win32_ioctl
863#undef win32_utime
864#undef win32_getenv
865
866#define win32_errno _win32_errno
867#define win32_stdin _win32_stdin
868#define win32_stdout _win32_stdout
869#define win32_stderr _win32_stderr
870#define win32_ferror _win32_ferror
871#define win32_feof _win32_feof
872#define win32_strerror _win32_strerror
873#define win32_perror _win32_perror
874#define win32_fprintf _win32_fprintf
875#define win32_printf _win32_printf
876#define win32_vfprintf _win32_vfprintf
877#define win32_vprintf _win32_vprintf
878#define win32_fread _win32_fread
879#define win32_fwrite _win32_fwrite
880#define win32_fopen _win32_fopen
881#define win32_fdopen _win32_fdopen
882#define win32_freopen _win32_freopen
883#define win32_fclose _win32_fclose
884#define win32_fputs _win32_fputs
885#define win32_fputc _win32_fputc
886#define win32_ungetc _win32_ungetc
887#define win32_getc _win32_getc
888#define win32_fileno _win32_fileno
889#define win32_clearerr _win32_clearerr
890#define win32_fflush _win32_fflush
891#define win32_ftell _win32_ftell
892#define win32_fseek _win32_fseek
893#define win32_fgetpos _win32_fgetpos
894#define win32_fsetpos _win32_fsetpos
895#define win32_rewind _win32_rewind
896#define win32_tmpfile _win32_tmpfile
897#define win32_abort _win32_abort
898#define win32_fstat _win32_fstat
899#define win32_stat _win32_stat
900#define win32_pipe _win32_pipe
901#define win32_popen _win32_popen
902#define win32_pclose _win32_pclose
903#define win32_setmode _win32_setmode
904#define win32_lseek _win32_lseek
905#define win32_tell _win32_tell
906#define win32_dup _win32_dup
907#define win32_dup2 _win32_dup2
908#define win32_open _win32_open
909#define win32_close _win32_close
910#define win32_eof _win32_eof
911#define win32_read _win32_read
912#define win32_write _win32_write
913#define win32_mkdir _win32_mkdir
914#define win32_rmdir _win32_rmdir
915#define win32_chdir _win32_chdir
916#define win32_setbuf _win32_setbuf
917#define win32_setvbuf _win32_setvbuf
918#define win32_fgetc _win32_fgetc
919#define win32_putc _win32_putc
920#define win32_puts _win32_puts
921#define win32_getchar _win32_getchar
922#define win32_putchar _win32_putchar
923#define win32_malloc _win32_malloc
924#define win32_calloc _win32_calloc
925#define win32_realloc _win32_realloc
926#define win32_free _win32_free
927#define win32_sleep _win32_sleep
928#define win32_spawnvp _win32_spawnvp
929#define win32_times _win32_times
930#define win32_stat _win32_stat
931#define win32_ioctl _win32_ioctl
932#define win32_utime _win32_utime
933#define win32_getenv _win32_getenv
934#define win32_open_osfhandle _win32_open_osfhandle
935#define win32_get_osfhandle _win32_get_osfhandle
936
937int * _win32_errno(void);
938FILE* _win32_stdin(void);
939FILE* _win32_stdout(void);
940FILE* _win32_stderr(void);
941int _win32_ferror(FILE *fp);
942int _win32_feof(FILE *fp);
943char* _win32_strerror(int e);
944void _win32_perror(const char *str);
945int _win32_fprintf(FILE *pf, const char *format, ...);
946int _win32_printf(const char *format, ...);
947int _win32_vfprintf(FILE *pf, const char *format, va_list arg);
948int _win32_vprintf(const char *format, va_list arg);
949size_t _win32_fread(void *buf, size_t size, size_t count, FILE *pf);
950size_t _win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf);
951FILE* _win32_fopen(const char *path, const char *mode);
952FILE* _win32_fdopen(int fh, const char *mode);
953FILE* _win32_freopen(const char *path, const char *mode, FILE *pf);
954int _win32_fclose(FILE *pf);
955int _win32_fputs(const char *s,FILE *pf);
956int _win32_fputc(int c,FILE *pf);
957int _win32_ungetc(int c,FILE *pf);
958int _win32_getc(FILE *pf);
959int _win32_fileno(FILE *pf);
960void _win32_clearerr(FILE *pf);
961int _win32_fflush(FILE *pf);
962long _win32_ftell(FILE *pf);
963int _win32_fseek(FILE *pf,long offset,int origin);
964int _win32_fgetpos(FILE *pf,fpos_t *p);
965int _win32_fsetpos(FILE *pf,const fpos_t *p);
966void _win32_rewind(FILE *pf);
967FILE* _win32_tmpfile(void);
968void _win32_abort(void);
969int _win32_fstat(int fd,struct stat *sbufptr);
970int _win32_stat(const char *name,struct stat *sbufptr);
971int _win32_pipe( int *phandles, unsigned int psize, int textmode );
972FILE* _win32_popen( const char *command, const char *mode );
973int _win32_pclose( FILE *pf);
974int _win32_setmode( int fd, int mode);
975long _win32_lseek( int fd, long offset, int origin);
976long _win32_tell( int fd);
977int _win32_dup( int fd);
978int _win32_dup2(int h1, int h2);
979int _win32_open(const char *path, int oflag,...);
980int _win32_close(int fd);
981int _win32_eof(int fd);
982int _win32_read(int fd, void *buf, unsigned int cnt);
983int _win32_write(int fd, const void *buf, unsigned int cnt);
984int _win32_mkdir(const char *dir, int mode);
985int _win32_rmdir(const char *dir);
986int _win32_chdir(const char *dir);
987void _win32_setbuf(FILE *pf, char *buf);
988int _win32_setvbuf(FILE *pf, char *buf, int type, size_t size);
989char* _win32_fgets(char *s, int n, FILE *pf);
990char* _win32_gets(char *s);
991int _win32_fgetc(FILE *pf);
992int _win32_putc(int c, FILE *pf);
993int _win32_puts(const char *s);
994int _win32_getchar(void);
995int _win32_putchar(int c);
996void* _win32_malloc(size_t size);
997void* _win32_calloc(size_t numitems, size_t size);
998void* _win32_realloc(void *block, size_t size);
999void _win32_free(void *block);
1000unsigned _win32_sleep(unsigned int);
1001int _win32_spawnvp(int mode, const char *cmdname, const char *const *argv);
1002int _win32_times(struct tms *timebuf);
1003int _win32_stat(const char *path, struct stat *buf);
1004int _win32_ioctl(int i, unsigned int u, char *data);
1005int _win32_utime(const char *f, struct utimbuf *t);
1006char* _win32_getenv(const char *name);
1007int _win32_open_osfhandle(long handle, int flags);
1008long _win32_get_osfhandle(int fd);
1009
1010#pragma warning(once : 4113)
1011EOCODE
1012
1013
1014close HDRFILE;
1015close OUTFILE;