remove stray K&R-isms
[p5sagit/p5-mst-13.2.git] / win32 / makedef.pl
1 #!../miniperl
2
3 # Create the export list for perl. Needed by WIN32 for creating perl.dll.
4
5 # reads global.sym, pp.sym, perlvars.h, intrpvar.h, thrdvar.h, config.h
6
7 my $CCTYPE = "MSVC";    # default
8
9 while (@ARGV)
10  {
11   my $flag = shift;
12   $define{$1} = 1 if ($flag =~ /^-D(\w+)$/);
13   $CCTYPE = $1 if ($flag =~ /^CCTYPE=(\w+)$/);
14  } 
15
16 open(CFG,'config.h') || die "Cannot open config.h:$!";
17 while (<CFG>)
18  {
19   $define{$1} = 1 if /^\s*#\s*define\s+(MYMALLOC)\b/;
20   $define{$1} = 1 if /^\s*#\s*define\s+(USE_THREADS)\b/;
21   $define{$1} = 1 if /^\s*#\s*define\s+(MULTIPLICITY)\b/;
22  }
23 close(CFG);
24
25 warn join(' ',keys %define)."\n";
26
27 if ($define{PERL_OBJECT}) {
28     print "LIBRARY PerlCore\n";
29     print "DESCRIPTION 'Perl interpreter'\n";
30     print "EXPORTS\n";
31     output_symbol("perl_alloc");
32     exit(0);
33 }
34
35 if ($CCTYPE ne 'GCC') 
36  {
37   print "LIBRARY Perl\n";
38   print "DESCRIPTION 'Perl interpreter, export autogenerated'\n";
39  }
40 else
41  {
42   $define{'PERL_GLOBAL_STRUCT'} = 1;
43   $define{'MULTIPLICITY'} = 1;
44  }
45
46 print "EXPORTS\n";
47
48 my %skip;
49 my %export;
50
51 sub skip_symbols
52 {
53  my $list = shift;
54  foreach my $symbol (@$list)
55   {
56    $skip{$symbol} = 1;
57   }
58 }
59
60 sub emit_symbols
61 {
62  my $list = shift;
63  foreach my $symbol (@$list)
64   {
65    emit_symbol($symbol) unless exists $skip{$symbol};
66   }
67 }
68
69 skip_symbols [qw(
70 PL_statusvalue_vms
71 PL_archpat_auto
72 PL_cryptseen
73 PL_DBcv
74 PL_generation
75 PL_lastgotoprobe
76 PL_linestart
77 PL_modcount
78 PL_pending_ident
79 PL_sortcxix
80 PL_sublex_info
81 PL_timesbuf
82 Perl_do_exec3
83 Perl_do_ipcctl
84 Perl_do_ipcget
85 Perl_do_msgrcv
86 Perl_do_msgsnd
87 Perl_do_semop
88 Perl_do_shmio
89 Perl_dump_fds
90 Perl_init_thread_intern
91 Perl_my_bzero
92 Perl_my_htonl
93 Perl_my_ntohl
94 Perl_my_swap
95 Perl_my_chsize
96 Perl_same_dirent
97 Perl_setenv_getix
98 Perl_unlnk
99 Perl_watch
100 Perl_safexcalloc
101 Perl_safexmalloc
102 Perl_safexfree
103 Perl_safexrealloc
104 Perl_my_memcmp
105 Perl_my_memset
106 PL_cshlen
107 PL_cshname
108 PL_opsave
109 )];
110
111
112 if ($define{'MYMALLOC'})
113  {
114   emit_symbols [qw(
115     Perl_dump_mstats
116     Perl_malloc
117     Perl_mfree
118     Perl_realloc
119     Perl_calloc)];
120  }
121 else
122  {
123   skip_symbols [qw(
124     Perl_dump_mstats
125     Perl_malloced_size)];
126  }
127
128 unless ($define{'USE_THREADS'})
129  {
130   skip_symbols [qw(
131 PL_thr_key
132 PL_sv_mutex
133 PL_strtab_mutex
134 PL_svref_mutex
135 PL_malloc_mutex
136 PL_cred_mutex
137 PL_eval_mutex
138 PL_eval_cond
139 PL_eval_owner
140 PL_threads_mutex
141 PL_nthreads
142 PL_nthreads_cond
143 PL_threadnum
144 PL_threadsv_names
145 PL_thrsv
146 PL_vtbl_mutex
147 Perl_getTHR
148 Perl_setTHR
149 Perl_condpair_magic
150 Perl_new_struct_thread
151 Perl_per_thread_magicals
152 Perl_thread_create
153 Perl_find_threadsv
154 Perl_unlock_condpair
155 Perl_magic_mutexfree
156 )];
157  }
158
159 unless ($define{'FAKE_THREADS'})
160  {
161   skip_symbols [qw(PL_curthr)];
162  }
163
164 sub readvar
165 {
166  my $file = shift;
167  open(VARS,$file) || die "Cannot open $file:$!";
168  my @syms;
169  while (<VARS>)
170   {
171    # All symbols have a Perl_ prefix because that's what embed.h
172    # sticks in front of them.
173    push(@syms,"PL_".$1) if (/\bPERLVARI?C?\([IGT](\w+)/);
174   } 
175  close(VARS); 
176  return \@syms;
177 }
178
179 if ($define{'USE_THREADS'} || $define{'MULTIPLICITY'})
180  {
181   my $thrd = readvar("../thrdvar.h");
182   skip_symbols $thrd;
183  } 
184
185 if ($define{'MULTIPLICITY'})
186  {
187   my $interp = readvar("../intrpvar.h");
188   skip_symbols $interp;
189  } 
190
191 if ($define{'PERL_GLOBAL_STRUCT'})
192  {
193   my $global = readvar("../perlvars.h");
194   skip_symbols $global;
195   emit_symbols [qw(Perl_GetVars)];
196   emit_symbols [qw(PL_Vars PL_VarsPtr)] unless $CCTYPE eq 'GCC';
197  } 
198
199 unless ($define{'DEBUGGING'})
200  {
201   skip_symbols [qw(
202     Perl_deb
203     Perl_deb_growlevel
204     Perl_debop
205     Perl_debprofdump
206     Perl_debstack
207     Perl_debstackptrs
208     Perl_runops_debug
209     Perl_sv_peek
210     PL_block_type
211     PL_watchaddr
212     PL_watchok)];
213  }
214
215 if ($define{'HAVE_DES_FCRYPT'})
216  {
217   emit_symbols [qw(win32_crypt)];
218  }
219
220 # functions from *.sym files
221
222 for my $syms ('../global.sym','../pp.sym', '../globvar.sym')
223  {
224   open (GLOBAL, "<$syms") || die "failed to open $syms" . $!;
225   while (<GLOBAL>) 
226    {
227     next if (!/^[A-Za-z]/);
228     # Functions have a Perl_ prefix
229     # Variables have a PL_ prefix
230     chomp($_);
231     my $symbol = ($syms =~ /var\.sym$/i ? "PL_" : "Perl_");
232     $symbol .= $_;
233     emit_symbol($symbol) unless exists $skip{$symbol};
234    }
235   close(GLOBAL);
236  }
237
238 # variables
239
240 unless ($define{'PERL_GLOBAL_STRUCT'})
241  {
242   my $glob = readvar("../perlvars.h");
243   emit_symbols $glob;
244  } 
245
246 unless ($define{'MULTIPLICITY'})
247  {
248   my $glob = readvar("../intrpvar.h");
249   emit_symbols $glob;
250  } 
251
252 unless ($define{'MULTIPLICITY'} || $define{'USE_THREADS'})
253  {
254   my $glob = readvar("../thrdvar.h");
255   emit_symbols $glob;
256  } 
257
258 while (<DATA>) {
259         my $symbol;
260         next if (!/^[A-Za-z]/);
261         next if (/^#/);
262         s/\r//g;
263         chomp($_);
264         $symbol = $_;
265         next if exists $skip{$symbol};
266         emit_symbol($symbol);
267 }
268
269 foreach my $symbol (sort keys %export)
270  {
271    output_symbol($symbol);
272  }
273
274 sub emit_symbol {
275         my $symbol = shift;
276         chomp($symbol); 
277         $export{$symbol} = 1;
278 }
279
280 sub output_symbol {
281     my $symbol = shift;
282     if ($CCTYPE eq "BORLAND") {
283             # workaround Borland quirk by exporting both the straight
284             # name and a name with leading underscore.  Note the
285             # alias *must* come after the symbol itself, if both
286             # are to be exported. (Linker bug?)
287             print "\t_$symbol\n";
288             print "\t$symbol = _$symbol\n";
289     }
290     elsif ($CCTYPE eq 'GCC') {
291             # Symbols have leading _ whole process is $%£"% slow
292             # so skip aliases for now
293             print "\t$symbol\n";
294     }
295     else {
296             # for binary coexistence, export both the symbol and
297             # alias with leading underscore
298             print "\t$symbol\n";
299             print "\t_$symbol = $symbol\n";
300     }
301 }
302
303 1;
304 __DATA__
305 # extra globals not included above.
306 perl_init_i18nl10n
307 perl_alloc
308 perl_atexit
309 perl_construct
310 perl_destruct
311 perl_free
312 perl_parse
313 perl_run
314 perl_get_sv
315 perl_get_av
316 perl_get_hv
317 perl_get_cv
318 perl_call_argv
319 perl_call_pv
320 perl_call_method
321 perl_call_sv
322 perl_require_pv
323 perl_eval_pv
324 perl_eval_sv
325 perl_new_ctype
326 perl_new_collate
327 perl_new_numeric
328 perl_set_numeric_standard
329 perl_set_numeric_local
330 boot_DynaLoader
331 Perl_thread_create
332 win32_errno
333 win32_environ
334 win32_stdin
335 win32_stdout
336 win32_stderr
337 win32_ferror
338 win32_feof
339 win32_strerror
340 win32_fprintf
341 win32_printf
342 win32_vfprintf
343 win32_vprintf
344 win32_fread
345 win32_fwrite
346 win32_fopen
347 win32_fdopen
348 win32_freopen
349 win32_fclose
350 win32_fputs
351 win32_fputc
352 win32_ungetc
353 win32_getc
354 win32_fileno
355 win32_clearerr
356 win32_fflush
357 win32_ftell
358 win32_fseek
359 win32_fgetpos
360 win32_fsetpos
361 win32_rewind
362 win32_tmpfile
363 win32_abort
364 win32_fstat
365 win32_stat
366 win32_pipe
367 win32_popen
368 win32_pclose
369 win32_rename
370 win32_setmode
371 win32_lseek
372 win32_tell
373 win32_dup
374 win32_dup2
375 win32_open
376 win32_close
377 win32_eof
378 win32_read
379 win32_write
380 win32_spawnvp
381 win32_mkdir
382 win32_rmdir
383 win32_chdir
384 win32_flock
385 win32_execv
386 win32_execvp
387 win32_htons
388 win32_ntohs
389 win32_htonl
390 win32_ntohl
391 win32_inet_addr
392 win32_inet_ntoa
393 win32_socket
394 win32_bind
395 win32_listen
396 win32_accept
397 win32_connect
398 win32_send
399 win32_sendto
400 win32_recv
401 win32_recvfrom
402 win32_shutdown
403 win32_closesocket
404 win32_ioctlsocket
405 win32_setsockopt
406 win32_getsockopt
407 win32_getpeername
408 win32_getsockname
409 win32_gethostname
410 win32_gethostbyname
411 win32_gethostbyaddr
412 win32_getprotobyname
413 win32_getprotobynumber
414 win32_getservbyname
415 win32_getservbyport
416 win32_select
417 win32_endhostent
418 win32_endnetent
419 win32_endprotoent
420 win32_endservent
421 win32_getnetent
422 win32_getnetbyname
423 win32_getnetbyaddr
424 win32_getprotoent
425 win32_getservent
426 win32_sethostent
427 win32_setnetent
428 win32_setprotoent
429 win32_setservent
430 win32_getenv
431 win32_putenv
432 win32_perror
433 win32_setbuf
434 win32_setvbuf
435 win32_flushall
436 win32_fcloseall
437 win32_fgets
438 win32_gets
439 win32_fgetc
440 win32_putc
441 win32_puts
442 win32_getchar
443 win32_putchar
444 win32_malloc
445 win32_calloc
446 win32_realloc
447 win32_free
448 win32_sleep
449 win32_times
450 win32_alarm
451 win32_open_osfhandle
452 win32_get_osfhandle
453 win32_ioctl
454 win32_utime
455 win32_uname
456 win32_wait
457 win32_waitpid
458 win32_kill
459 win32_str_os_error
460 win32_opendir
461 win32_readdir
462 win32_telldir
463 win32_seekdir
464 win32_rewinddir
465 win32_closedir
466 win32_longpath
467 Perl_win32_init
468 Perl_init_os_extras
469 Perl_getTHR
470 Perl_setTHR
471 RunPerl
472