Commit | Line | Data |
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 | |
6 | my $hdrfile = "$ARGV[0]\\PerlCAPI.h"; |
7 | my $infile = '..\\proto.h'; |
8 | my $embedfile = '..\\embed.h'; |
9 | my $separateObj = 0; |
10 | |
11 | my %skip_list; |
12 | my %embed; |
13 | |
14 | sub 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 | |
33 | readembed %embed, $embedfile; |
34 | |
35 | sub skip_these { |
36 | my $list = shift; |
37 | foreach my $symbol (@$list) { |
38 | $skip_list{$symbol} = 1; |
39 | } |
40 | } |
41 | |
42 | skip_these [qw( |
43 | cando |
44 | cast_ulong |
45 | my_chsize |
46 | condpair_magic |
47 | deb |
48 | deb_growlevel |
49 | debprofdump |
50 | debop |
51 | debstack |
52 | debstackptrs |
53 | fprintf |
54 | find_threadsv |
55 | magic_mutexfree |
56 | my_pclose |
57 | my_popen |
58 | my_swap |
59 | my_htonl |
60 | my_ntohl |
61 | new_struct_thread |
62 | same_dirent |
63 | unlnk |
64 | unlock_condpair |
65 | safexmalloc |
66 | safexcalloc |
67 | safexrealloc |
68 | safexfree |
69 | Perl_GetVars |
70 | )]; |
71 | |
72 | |
73 | |
74 | if (!open(INFILE, "<$infile")) { |
75 | print "open of $infile failed: $!\n"; |
76 | return 1; |
77 | } |
78 | |
79 | if (!open(OUTFILE, ">PerlCAPI.cpp")) { |
80 | print "open of PerlCAPI.cpp failed: $!\n"; |
81 | return 1; |
82 | } |
83 | |
84 | print OUTFILE "#include \"EXTERN.h\"\n#include \"perl.h\"\n#include \"XSUB.h\"\n\n"; |
85 | print OUTFILE "#define DESTRUCTORFUNC (void (*)(void*))\n\n"; |
86 | print OUTFILE "#ifdef SetCPerlObj_defined\n" unless ($separateObj == 0); |
87 | print OUTFILE "extern \"C\" void SetCPerlObj(CPerlObj* pP)\n{\n\tpPerl = pP;\n}\n"; |
88 | print OUTFILE "#endif\n" unless ($separateObj == 0); |
89 | |
90 | while () { |
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 | |
247 | close INFILE; |
248 | |
249 | %skip_list = (); |
250 | |
251 | skip_these [qw( |
252 | strchop |
253 | filemode |
254 | lastfd |
255 | oldname |
256 | curinterp |
257 | Argv |
258 | Cmd |
259 | sortcop |
260 | sortstash |
261 | firstgv |
262 | secondgv |
263 | sortstack |
264 | signalstack |
265 | mystrk |
266 | dumplvl |
267 | oldlastpm |
268 | gensym |
269 | preambled |
270 | preambleav |
271 | Ilaststatval |
272 | Ilaststype |
273 | mess_sv |
274 | ors |
275 | opsave |
276 | eval_mutex |
277 | orslen |
278 | ofmt |
279 | mh |
280 | modcount |
281 | generation |
282 | DBcv |
283 | archpat_auto |
284 | sortcxix |
285 | lastgotoprobe |
286 | regdummy |
287 | regparse |
288 | regxend |
289 | regcode |
290 | regnaughty |
291 | regsawback |
292 | regprecomp |
293 | regnpar |
294 | regsize |
295 | regflags |
296 | regseen |
297 | seen_zerolen |
298 | rx |
299 | extralen |
300 | colorset |
301 | colors |
302 | reginput |
303 | regbol |
304 | regeol |
305 | regstartp |
306 | regendp |
307 | reglastparen |
308 | regtill |
309 | regprev |
310 | reg_start_tmp |
311 | reg_start_tmpl |
312 | regdata |
313 | bostr |
314 | reg_flags |
315 | reg_eval_set |
316 | regnarrate |
317 | regprogram |
318 | regindent |
319 | regcc |
320 | in_clean_objs |
321 | in_clean_all |
322 | linestart |
323 | pending_ident |
324 | statusvalue_vms |
325 | sublex_info |
326 | thrsv |
327 | threadnum |
328 | piMem |
329 | piENV |
330 | piStdIO |
331 | piLIO |
332 | piDir |
333 | piSock |
334 | piProc |
335 | cshname |
336 | threadsv_names |
337 | thread |
338 | nthreads |
339 | thr_key |
340 | threads_mutex |
341 | malloc_mutex |
342 | svref_mutex |
343 | sv_mutex |
344 | nthreads_cond |
345 | eval_cond |
346 | cryptseen |
347 | cshlen |
348 | )]; |
349 | |
350 | sub 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 | |
365 | my %intrp; |
366 | my %thread; |
367 | my %globvar; |
368 | |
369 | readvars %intrp, '..\intrpvar.h','I'; |
370 | readvars %thread, '..\thrdvar.h','T'; |
371 | readvars %globvar, '..\perlvars.h','G'; |
372 | |
373 | open(HDRFILE, ">$hdrfile") or die "$0: Can't open $hdrfile: $!\n"; |
374 | print HDRFILE "\nvoid SetCPerlObj(void* pP);"; |
375 | print HDRFILE "\nCV* Perl_newXS(char* name, void (*subaddr)(CV* cv), char* filename);\n"; |
376 | |
377 | sub 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 | |
393 | foreach $key (keys %intrp) { |
394 | DoVariable ($key, $intrp{$key}); |
395 | } |
396 | |
397 | foreach $key (keys %thread) { |
398 | DoVariable ($key, $thread{$key}); |
399 | } |
400 | |
401 | foreach $key (keys %globvar) { |
402 | DoVariable ($key, $globvar{$key}); |
403 | } |
404 | |
405 | print OUTFILE <<EOCODE; |
406 | |
407 | |
408 | extern "C" { |
409 | void 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 | |
430 | CV* 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 | |
445 | int * _win32_errno(void) |
446 | { |
447 | return &pPerl->ErrorNo(); |
448 | } |
449 | |
450 | FILE* _win32_stdin(void) |
451 | { |
452 | return (FILE*)pPerl->piStdIO->Stdin(); |
453 | } |
454 | |
455 | FILE* _win32_stdout(void) |
456 | { |
457 | return (FILE*)pPerl->piStdIO->Stdout(); |
458 | } |
459 | |
460 | FILE* _win32_stderr(void) |
461 | { |
462 | return (FILE*)pPerl->piStdIO->Stderr(); |
463 | } |
464 | |
465 | int _win32_ferror(FILE *fp) |
466 | { |
467 | return pPerl->piStdIO->Error((PerlIO*)fp, ErrorNo()); |
468 | } |
469 | |
470 | int _win32_feof(FILE *fp) |
471 | { |
472 | return pPerl->piStdIO->Eof((PerlIO*)fp, ErrorNo()); |
473 | } |
474 | |
475 | char* _win32_strerror(int e) |
476 | { |
477 | return strerror(e); |
478 | } |
479 | |
480 | void _win32_perror(const char *str) |
481 | { |
482 | perror(str); |
483 | } |
484 | |
485 | int _win32_vfprintf(FILE *pf, const char *format, va_list arg) |
486 | { |
487 | return pPerl->piStdIO->Vprintf((PerlIO*)pf, ErrorNo(), format, arg); |
488 | } |
489 | |
490 | int _win32_vprintf(const char *format, va_list arg) |
491 | { |
492 | return pPerl->piStdIO->Vprintf(pPerl->piStdIO->Stdout(), ErrorNo(), format, arg); |
493 | } |
494 | |
495 | int _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 | |
505 | int _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 | |
515 | size_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 | |
520 | size_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 | |
525 | FILE* _win32_fopen(const char *path, const char *mode) |
526 | { |
527 | return (FILE*)pPerl->piStdIO->Open(path, mode, ErrorNo()); |
528 | } |
529 | |
530 | FILE* _win32_fdopen(int fh, const char *mode) |
531 | { |
532 | return (FILE*)pPerl->piStdIO->Fdopen(fh, mode, ErrorNo()); |
533 | } |
534 | |
535 | FILE* _win32_freopen(const char *path, const char *mode, FILE *pf) |
536 | { |
537 | return (FILE*)pPerl->piStdIO->Reopen(path, mode, (PerlIO*)pf, ErrorNo()); |
538 | } |
539 | |
540 | int _win32_fclose(FILE *pf) |
541 | { |
542 | return pPerl->piStdIO->Close((PerlIO*)pf, ErrorNo()); |
543 | } |
544 | |
545 | int _win32_fputs(const char *s,FILE *pf) |
546 | { |
547 | return pPerl->piStdIO->Puts((PerlIO*)pf, s, ErrorNo()); |
548 | } |
549 | |
550 | int _win32_fputc(int c,FILE *pf) |
551 | { |
552 | return pPerl->piStdIO->Putc((PerlIO*)pf, c, ErrorNo()); |
553 | } |
554 | |
555 | int _win32_ungetc(int c,FILE *pf) |
556 | { |
557 | return pPerl->piStdIO->Ungetc((PerlIO*)pf, c, ErrorNo()); |
558 | } |
559 | |
560 | int _win32_getc(FILE *pf) |
561 | { |
562 | return pPerl->piStdIO->Getc((PerlIO*)pf, ErrorNo()); |
563 | } |
564 | |
565 | int _win32_fileno(FILE *pf) |
566 | { |
567 | return pPerl->piStdIO->Fileno((PerlIO*)pf, ErrorNo()); |
568 | } |
569 | |
570 | void _win32_clearerr(FILE *pf) |
571 | { |
572 | pPerl->piStdIO->Clearerr((PerlIO*)pf, ErrorNo()); |
573 | } |
574 | |
575 | int _win32_fflush(FILE *pf) |
576 | { |
577 | return pPerl->piStdIO->Flush((PerlIO*)pf, ErrorNo()); |
578 | } |
579 | |
580 | long _win32_ftell(FILE *pf) |
581 | { |
582 | return pPerl->piStdIO->Tell((PerlIO*)pf, ErrorNo()); |
583 | } |
584 | |
585 | int _win32_fseek(FILE *pf,long offset,int origin) |
586 | { |
587 | return pPerl->piStdIO->Seek((PerlIO*)pf, offset, origin, ErrorNo()); |
588 | } |
589 | |
590 | int _win32_fgetpos(FILE *pf,fpos_t *p) |
591 | { |
592 | return pPerl->piStdIO->Getpos((PerlIO*)pf, p, ErrorNo()); |
593 | } |
594 | |
595 | int _win32_fsetpos(FILE *pf,const fpos_t *p) |
596 | { |
597 | return pPerl->piStdIO->Setpos((PerlIO*)pf, p, ErrorNo()); |
598 | } |
599 | |
600 | void _win32_rewind(FILE *pf) |
601 | { |
602 | pPerl->piStdIO->Rewind((PerlIO*)pf, ErrorNo()); |
603 | } |
604 | |
605 | FILE* _win32_tmpfile(void) |
606 | { |
607 | return (FILE*)pPerl->piStdIO->Tmpfile(ErrorNo()); |
608 | } |
609 | |
610 | void _win32_setbuf(FILE *pf, char *buf) |
611 | { |
612 | pPerl->piStdIO->SetBuf((PerlIO*)pf, buf, ErrorNo()); |
613 | } |
614 | |
615 | int _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 | |
620 | int _win32_fgetc(FILE *pf) |
621 | { |
622 | return pPerl->piStdIO->Getc((PerlIO*)pf, ErrorNo()); |
623 | } |
624 | |
625 | int _win32_putc(int c, FILE *pf) |
626 | { |
627 | return pPerl->piStdIO->Putc((PerlIO*)pf, c, ErrorNo()); |
628 | } |
629 | |
630 | int _win32_puts(const char *s) |
631 | { |
632 | return pPerl->piStdIO->Puts(pPerl->piStdIO->Stdout(), s, ErrorNo()); |
633 | } |
634 | |
635 | int _win32_getchar(void) |
636 | { |
637 | return pPerl->piStdIO->Getc(pPerl->piStdIO->Stdin(), ErrorNo()); |
638 | } |
639 | |
640 | int _win32_putchar(int c) |
641 | { |
642 | return pPerl->piStdIO->Putc(pPerl->piStdIO->Stdout(), c, ErrorNo()); |
643 | } |
644 | |
645 | void* _win32_malloc(size_t size) |
646 | { |
647 | return pPerl->piMem->Malloc(size); |
648 | } |
649 | |
650 | void* _win32_calloc(size_t numitems, size_t size) |
651 | { |
652 | return pPerl->piMem->Malloc(numitems*size); |
653 | } |
654 | |
655 | void* _win32_realloc(void *block, size_t size) |
656 | { |
657 | return pPerl->piMem->Realloc(block, size); |
658 | } |
659 | |
660 | void _win32_free(void *block) |
661 | { |
662 | pPerl->piMem->Free(block); |
663 | } |
664 | |
665 | void _win32_abort(void) |
666 | { |
667 | pPerl->piProc->Abort(); |
668 | } |
669 | |
670 | int _win32_pipe(int *phandles, unsigned int psize, int textmode) |
671 | { |
672 | return pPerl->piProc->Pipe(phandles); |
673 | } |
674 | |
675 | FILE* _win32_popen(const char *command, const char *mode) |
676 | { |
677 | return (FILE*)pPerl->piProc->Popen(command, mode); |
678 | } |
679 | |
680 | int _win32_pclose(FILE *pf) |
681 | { |
682 | return pPerl->piProc->Pclose((PerlIO*)pf); |
683 | } |
684 | |
685 | unsigned _win32_sleep(unsigned int t) |
686 | { |
687 | return pPerl->piProc->Sleep(t); |
688 | } |
689 | |
690 | int _win32_spawnvp(int mode, const char *cmdname, const char *const *argv) |
691 | { |
692 | return pPerl->piProc->Spawnvp(mode, cmdname, argv); |
693 | } |
694 | |
695 | int _win32_mkdir(const char *dir, int mode) |
696 | { |
697 | return pPerl->piDir->Makedir(dir, mode, ErrorNo()); |
698 | } |
699 | |
700 | int _win32_rmdir(const char *dir) |
701 | { |
702 | return pPerl->piDir->Rmdir(dir, ErrorNo()); |
703 | } |
704 | |
705 | int _win32_chdir(const char *dir) |
706 | { |
707 | return pPerl->piDir->Chdir(dir, ErrorNo()); |
708 | } |
709 | |
710 | #undef stat |
711 | int _win32_fstat(int fd,struct stat *sbufptr) |
712 | { |
713 | return pPerl->piLIO->FileStat(fd, sbufptr, ErrorNo()); |
714 | } |
715 | |
716 | int _win32_stat(const char *name,struct stat *sbufptr) |
717 | { |
718 | return pPerl->piLIO->NameStat(name, sbufptr, ErrorNo()); |
719 | } |
720 | |
721 | int _win32_setmode(int fd, int mode) |
722 | { |
723 | return pPerl->piLIO->Setmode(fd, mode, ErrorNo()); |
724 | } |
725 | |
726 | long _win32_lseek(int fd, long offset, int origin) |
727 | { |
728 | return pPerl->piLIO->Lseek(fd, offset, origin, ErrorNo()); |
729 | } |
730 | |
731 | long _win32_tell(int fd) |
732 | { |
733 | return pPerl->piStdIO->Tell((PerlIO*)fd, ErrorNo()); |
734 | } |
735 | |
736 | int _win32_dup(int fd) |
737 | { |
738 | return pPerl->piLIO->Dup(fd, ErrorNo()); |
739 | } |
740 | |
741 | int _win32_dup2(int h1, int h2) |
742 | { |
743 | return pPerl->piLIO->Dup2(h1, h2, ErrorNo()); |
744 | } |
745 | |
746 | int _win32_open(const char *path, int oflag,...) |
747 | { |
748 | return pPerl->piLIO->Open(path, oflag, ErrorNo()); |
749 | } |
750 | |
751 | int _win32_close(int fd) |
752 | { |
753 | return pPerl->piLIO->Close(fd, ErrorNo()); |
754 | } |
755 | |
756 | int _win32_read(int fd, void *buf, unsigned int cnt) |
757 | { |
758 | return pPerl->piLIO->Read(fd, buf, cnt, ErrorNo()); |
759 | } |
760 | |
761 | int _win32_write(int fd, const void *buf, unsigned int cnt) |
762 | { |
763 | return pPerl->piLIO->Write(fd, buf, cnt, ErrorNo()); |
764 | } |
765 | |
766 | int _win32_times(struct tms *timebuf) |
767 | { |
768 | return pPerl->piProc->Times(timebuf); |
769 | } |
770 | |
771 | int _win32_ioctl(int i, unsigned int u, char *data) |
772 | { |
773 | return pPerl->piLIO->IOCtl(i, u, data, ErrorNo()); |
774 | } |
775 | |
776 | int _win32_utime(const char *f, struct utimbuf *t) |
777 | { |
778 | return pPerl->piLIO->Utime((char*)f, t, ErrorNo()); |
779 | } |
780 | |
781 | char* _win32_getenv(const char *name) |
782 | { |
783 | return pPerl->piENV->Getenv(name, ErrorNo()); |
784 | } |
785 | |
786 | int _win32_open_osfhandle(long handle, int flags) |
787 | { |
788 | return pPerl->piStdIO->OpenOSfhandle(handle, flags); |
789 | } |
790 | |
791 | long _win32_get_osfhandle(int fd) |
792 | { |
793 | return pPerl->piStdIO->GetOSfhandle(fd); |
794 | } |
795 | } /* extern "C" */ |
796 | EOCODE |
797 | |
798 | |
799 | print 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 | |
937 | int * _win32_errno(void); |
938 | FILE* _win32_stdin(void); |
939 | FILE* _win32_stdout(void); |
940 | FILE* _win32_stderr(void); |
941 | int _win32_ferror(FILE *fp); |
942 | int _win32_feof(FILE *fp); |
943 | char* _win32_strerror(int e); |
944 | void _win32_perror(const char *str); |
945 | int _win32_fprintf(FILE *pf, const char *format, ...); |
946 | int _win32_printf(const char *format, ...); |
947 | int _win32_vfprintf(FILE *pf, const char *format, va_list arg); |
948 | int _win32_vprintf(const char *format, va_list arg); |
949 | size_t _win32_fread(void *buf, size_t size, size_t count, FILE *pf); |
950 | size_t _win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf); |
951 | FILE* _win32_fopen(const char *path, const char *mode); |
952 | FILE* _win32_fdopen(int fh, const char *mode); |
953 | FILE* _win32_freopen(const char *path, const char *mode, FILE *pf); |
954 | int _win32_fclose(FILE *pf); |
955 | int _win32_fputs(const char *s,FILE *pf); |
956 | int _win32_fputc(int c,FILE *pf); |
957 | int _win32_ungetc(int c,FILE *pf); |
958 | int _win32_getc(FILE *pf); |
959 | int _win32_fileno(FILE *pf); |
960 | void _win32_clearerr(FILE *pf); |
961 | int _win32_fflush(FILE *pf); |
962 | long _win32_ftell(FILE *pf); |
963 | int _win32_fseek(FILE *pf,long offset,int origin); |
964 | int _win32_fgetpos(FILE *pf,fpos_t *p); |
965 | int _win32_fsetpos(FILE *pf,const fpos_t *p); |
966 | void _win32_rewind(FILE *pf); |
967 | FILE* _win32_tmpfile(void); |
968 | void _win32_abort(void); |
969 | int _win32_fstat(int fd,struct stat *sbufptr); |
970 | int _win32_stat(const char *name,struct stat *sbufptr); |
971 | int _win32_pipe( int *phandles, unsigned int psize, int textmode ); |
972 | FILE* _win32_popen( const char *command, const char *mode ); |
973 | int _win32_pclose( FILE *pf); |
974 | int _win32_setmode( int fd, int mode); |
975 | long _win32_lseek( int fd, long offset, int origin); |
976 | long _win32_tell( int fd); |
977 | int _win32_dup( int fd); |
978 | int _win32_dup2(int h1, int h2); |
979 | int _win32_open(const char *path, int oflag,...); |
980 | int _win32_close(int fd); |
981 | int _win32_eof(int fd); |
982 | int _win32_read(int fd, void *buf, unsigned int cnt); |
983 | int _win32_write(int fd, const void *buf, unsigned int cnt); |
984 | int _win32_mkdir(const char *dir, int mode); |
985 | int _win32_rmdir(const char *dir); |
986 | int _win32_chdir(const char *dir); |
987 | void _win32_setbuf(FILE *pf, char *buf); |
988 | int _win32_setvbuf(FILE *pf, char *buf, int type, size_t size); |
989 | char* _win32_fgets(char *s, int n, FILE *pf); |
990 | char* _win32_gets(char *s); |
991 | int _win32_fgetc(FILE *pf); |
992 | int _win32_putc(int c, FILE *pf); |
993 | int _win32_puts(const char *s); |
994 | int _win32_getchar(void); |
995 | int _win32_putchar(int c); |
996 | void* _win32_malloc(size_t size); |
997 | void* _win32_calloc(size_t numitems, size_t size); |
998 | void* _win32_realloc(void *block, size_t size); |
999 | void _win32_free(void *block); |
1000 | unsigned _win32_sleep(unsigned int); |
1001 | int _win32_spawnvp(int mode, const char *cmdname, const char *const *argv); |
1002 | int _win32_times(struct tms *timebuf); |
1003 | int _win32_stat(const char *path, struct stat *buf); |
1004 | int _win32_ioctl(int i, unsigned int u, char *data); |
1005 | int _win32_utime(const char *f, struct utimbuf *t); |
1006 | char* _win32_getenv(const char *name); |
1007 | int _win32_open_osfhandle(long handle, int flags); |
1008 | long _win32_get_osfhandle(int fd); |
1009 | |
1010 | #pragma warning(once : 4113) |
1011 | EOCODE |
1012 | |
1013 | |
1014 | close HDRFILE; |
1015 | close OUTFILE; |