applied patch, with indentation tweaks
[p5sagit/p5-mst-13.2.git] / win32 / makedef.pl
1 #!../miniperl
2
3 # Written: 10 April 1996 Gary Ng (71564.1743@compuserve.com)
4
5 # Create the export list for perl.
6 # Needed by WIN32 for creating perl.dll
7 # based on perl_exp.SH in the main perl distribution directory
8
9 # This simple program relys on 'global.sym' being up to date
10 # with all of the global symbols that a dynamicly link library
11 # might want to access.
12
13 # There is some symbol defined in global.sym and interp.sym
14 # that does not present in the WIN32 port but there is no easy
15 # way to find them so I just put a exception list here
16
17 my $CCTYPE = "MSVC";    # default
18
19 while (@ARGV)
20  {
21   my $flag = shift;
22   $define{$1} = 1 if ($flag =~ /^-D(\w+)$/);
23   $CCTYPE = $1 if ($flag =~ /^CCTYPE=(\w+)$/);
24  } 
25
26 open(CFG,'config.h') || die "Cannot open config.h:$!";
27 while (<CFG>)
28  {
29   $define{$1} = 1 if /^\s*#\s*define\s+(MYMALLOC)\b/;
30   $define{$1} = 1 if /^\s*#\s*define\s+(USE_THREADS)\b/;
31  }
32 close(CFG);
33
34 warn join(' ',keys %define)."\n";
35
36 if ($define{PERL_OBJECT}) {
37     print "LIBRARY PerlCore\n";
38     print "DESCRIPTION 'Perl interpreter'\n";
39     print "EXPORTS\n";
40     output_symbol("perl_alloc");
41     exit(0);
42 }
43
44 if ($CCTYPE ne 'GCC') 
45  {
46   print "LIBRARY Perl\n";
47   print "DESCRIPTION 'Perl interpreter, export autogenerated'\n";
48   print "CODE LOADONCALL\n";
49   print "DATA LOADONCALL NONSHARED MULTIPLE\n";
50  }
51 else
52  {
53   $define{'PERL_GLOBAL_STRUCT'} = 1;
54   $define{'MULTIPLICITY'} = 1;
55  }
56
57 print "EXPORTS\n";
58
59 my %skip;
60 my %export;
61
62 sub skip_symbols
63 {
64  my $list = shift;
65  foreach my $symbol (@$list)
66   {
67    $skip{$symbol} = 1;
68   }
69 }
70
71 sub emit_symbols
72 {
73  my $list = shift;
74  foreach my $symbol (@$list)
75   {
76    emit_symbol($symbol) unless exists $skip{$symbol};
77   }
78 }
79
80 skip_symbols [qw(
81 Perl_statusvalue_vms
82 Perl_archpat_auto
83 Perl_block_type
84 Perl_bostr
85 Perl_additem
86 Perl_cast_ulong
87 Perl_check_uni
88 Perl_checkcomma
89 Perl_chsize
90 Perl_ck_aelem
91 Perl_colors
92 Perl_colorset
93 Perl_cryptseen
94 Perl_cx_dump
95 Perl_DBcv
96 Perl_do_ipcctl
97 Perl_do_ipcget
98 Perl_do_msgrcv
99 Perl_do_msgsnd
100 Perl_do_semop
101 Perl_do_shmio
102 Perl_doeval
103 Perl_dofindlabel
104 Perl_dopoptoeval
105 Perl_dump_eval
106 Perl_dump_fds
107 Perl_dump_form
108 Perl_dump_gv
109 Perl_dump_mstats
110 Perl_dump_op
111 Perl_dump_packsubs
112 Perl_dump_pm
113 Perl_dump_sub
114 Perl_expectterm
115 Perl_extralen
116 Perl_fetch_gv
117 Perl_fetch_io
118 Perl_force_ident
119 Perl_force_next
120 Perl_force_word
121 Perl_generation
122 Perl_hv_stashpv
123 Perl_in_clean_all
124 Perl_in_clean_objs
125 Perl_intuit_more
126 Perl_init_thread_intern
127 Perl_know_next
128 Perl_lastgotoprobe
129 Perl_linestart
130 Perl_modcount
131 Perl_modkids
132 Perl_mstats
133 Perl_my_bzero
134 Perl_my_htonl
135 Perl_my_ntohl
136 Perl_my_swap
137 Perl_my_chsize
138 Perl_newXSUB
139 Perl_no_fh_allowed
140 Perl_no_op
141 Perl_nointrp
142 Perl_nomem
143 Perl_pending_ident
144 Perl_pp_cswitch
145 Perl_pp_entersubr
146 Perl_pp_evalonce
147 Perl_pp_interp
148 Perl_pp_map
149 Perl_pp_nswitch
150 Perl_q
151 Perl_rcsid
152 Perl_reall_srchlen
153 Perl_reg_eval_set
154 Perl_reg_flags
155 Perl_reg_start_tmp
156 Perl_reg_start_tmpl
157 Perl_regbol
158 Perl_regcc
159 Perl_regcode
160 Perl_regdata
161 Perl_regdummy
162 Perl_regdump
163 Perl_regfold
164 Perl_regendp
165 Perl_regeol
166 Perl_regflags
167 Perl_regindent
168 Perl_reginput
169 Perl_reglastparen
170 Perl_regmyendp
171 Perl_regmyp_size
172 Perl_regmystartp
173 Perl_regnarrate
174 Perl_regnaughty
175 Perl_regnpar
176 Perl_regcomp_parse
177 Perl_regprecomp
178 Perl_regprev
179 Perl_regprogram
180 Perl_regprop
181 Perl_regsawback
182 Perl_regseen
183 Perl_regsize
184 Perl_regstartp
185 Perl_regtill
186 Perl_regxend
187 Perl_regcomp_rx
188 Perl_same_dirent
189 Perl_saw_return
190 Perl_scan_const
191 Perl_scan_formline
192 Perl_scan_heredoc
193 Perl_scan_ident
194 Perl_scan_inputsymbol
195 Perl_scan_pat
196 Perl_scan_prefix
197 Perl_scan_str
198 Perl_scan_subst
199 Perl_scan_trans
200 Perl_scan_word
201 Perl_seen_zerolen
202 Perl_setenv_getix
203 Perl_skipspace
204 Perl_sort_mutex
205 Perl_sortcxix
206 Perl_sublex_done
207 Perl_sublex_info
208 Perl_sublex_start
209 Perl_sv_ref
210 Perl_sv_setptrobj
211 Perl_timesbuf
212 Perl_too_few_arguments
213 Perl_too_many_arguments
214 Perl_unlnk
215 Perl_watch
216 Perl_yyname
217 Perl_yyrule
218 allgvs
219 curblock
220 curcsv
221 lastretstr
222 mystack_mark
223 perl_init_ext
224 perl_requirepv
225 stack
226 statusvalue_vms
227 Perl_safexcalloc
228 Perl_safexmalloc
229 Perl_safexfree
230 Perl_safexrealloc
231 Perl_my_memcmp
232 Perl_my_memset
233 Perl_cshlen
234 Perl_cshname
235 Perl_opsave
236 )];
237
238
239 if ($define{'MYMALLOC'})
240  {
241   skip_symbols [qw(
242     Perl_safefree
243     Perl_safemalloc
244     Perl_saferealloc
245     Perl_safecalloc)];
246   emit_symbols [qw(
247     Perl_malloc
248     Perl_free
249     Perl_realloc
250     Perl_calloc)];
251  }
252
253 unless ($define{'USE_THREADS'})
254  {
255   skip_symbols [qw(
256 Perl_getTHR
257 Perl_setTHR
258 Perl_condpair_magic
259 Perl_thr_key
260 Perl_sv_mutex
261 Perl_svref_mutex
262 Perl_malloc_mutex
263 Perl_eval_mutex
264 Perl_eval_cond
265 Perl_eval_owner
266 Perl_threads_mutex
267 Perl_new_struct_thread
268 Perl_nthreads
269 Perl_nthreads_cond
270 Perl_per_thread_magicals
271 Perl_thread_create
272 Perl_threadnum
273 Perl_find_threadsv
274 Perl_threadsv_names
275 Perl_thrsv
276 Perl_unlock_condpair
277 Perl_vtbl_mutex
278 Perl_magic_mutexfree
279 Perl_sv_iv
280 Perl_sv_nv
281 Perl_sv_true
282 Perl_sv_uv
283 Perl_sv_pvn
284 Perl_newRV_noinc)];
285  }
286
287 unless ($define{'FAKE_THREADS'})
288  {
289   skip_symbols [qw(Perl_curthr)];
290  }
291
292 sub readvar
293 {
294  my $file = shift;
295  open(VARS,$file) || die "Cannot open $file:$!";
296  my @syms;
297  while (<VARS>)
298   {
299    # All symbols have a Perl_ prefix because that's what embed.h
300    # sticks in front of them.
301    push(@syms,"Perl_".$1) if (/\bPERLVARI?C?\([IGT](\w+)/);
302   } 
303  close(VARS); 
304  return \@syms;
305 }
306
307 if ($define{'USE_THREADS'} || $define{'MULTIPLICITY'})
308  {
309   my $thrd = readvar("../thrdvar.h");
310   skip_symbols $thrd;
311  } 
312
313 if ($define{'MULTIPLICITY'})
314  {
315   my $interp = readvar("../intrpvar.h");
316   skip_symbols $interp;
317  } 
318
319 if ($define{'PERL_GLOBAL_STRUCT'})
320  {
321   my $global = readvar("../perlvars.h");
322   skip_symbols $global;
323  } 
324
325 unless ($define{'DEBUGGING'})
326  {
327   skip_symbols [qw(
328     Perl_deb
329     Perl_deb_growlevel
330     Perl_debop
331     Perl_debprofdump
332     Perl_debstack
333     Perl_debstackptrs
334     Perl_runops_debug
335     Perl_sv_peek
336     Perl_watchaddr
337     Perl_watchok)];
338  }
339
340 if ($define{'HAVE_DES_FCRYPT'})
341  {
342   emit_symbols [qw(win32_crypt)];
343  }
344
345 open (GLOBAL, "<../global.sym") || die "failed to open global.sym" . $!;
346 while (<GLOBAL>) 
347  {
348   next if (!/^[A-Za-z]/);
349   next if (/_amg[ \t]*$/);
350   # All symbols have a Perl_ prefix because that's what embed.h
351   # sticks in front of them.
352   chomp($_);
353   my $symbol = "Perl_$_";
354   emit_symbol($symbol) unless exists $skip{$symbol};
355  }
356 close(GLOBAL);
357
358 # also add symbols from interp.sym
359 # They are only needed if -DMULTIPLICITY is not set but it
360 # doesn't hurt to include them anyway.
361 # these don't have Perl prefix
362
363 if ($define{'PERL_GLOBAL_STRUCT'})
364  {
365   emit_symbol( ($CCTYPE eq 'GCC') ? 'Perl_GetVars' : 'Perl_VarsPtr')
366  }
367 else
368  {
369   my $glob = readvar("../perlvars.h");
370   emit_symbols $glob;
371  } 
372
373 unless ($define{'MULTIPLICITY'})
374  {
375   my $glob = readvar("../intrpvar.h");
376   emit_symbols $glob;
377  } 
378
379 unless ($define{'MULTIPLICITY'} || $define{'USE_THREADS'})
380  {
381   my $glob = readvar("../thrdvar.h");
382   emit_symbols $glob;
383  } 
384
385 while (<DATA>) {
386         my $symbol;
387         next if (!/^[A-Za-z]/);
388         next if (/^#/);
389         s/\r//g;
390         chomp($_);
391         $symbol = $_;
392         next if exists $skip{$symbol};
393         emit_symbol($symbol);
394 }
395
396 foreach my $symbol (sort keys %export)
397  {
398    output_symbol($symbol);
399  }
400
401 sub emit_symbol {
402         my $symbol = shift;
403         chomp($symbol); 
404         $export{$symbol} = 1;
405 }
406
407 sub output_symbol {
408     my $symbol = shift;
409     if ($CCTYPE eq "BORLAND") {
410             # workaround Borland quirk by exporting both the straight
411             # name and a name with leading underscore.  Note the
412             # alias *must* come after the symbol itself, if both
413             # are to be exported. (Linker bug?)
414             print "\t_$symbol\n";
415             print "\t$symbol = _$symbol\n";
416     }
417     elsif ($CCTYPE eq 'GCC') {
418             # Symbols have leading _ whole process is $%£"% slow
419             # so skip aliases for now
420             print "\t$symbol\n";
421     }
422     else {
423             # for binary coexistence, export both the symbol and
424             # alias with leading underscore
425             print "\t$symbol\n";
426             print "\t_$symbol = $symbol\n";
427     }
428 }
429
430 1;
431 __DATA__
432 # extra globals not included above.
433 perl_init_i18nl10n
434 perl_init_ext
435 perl_alloc
436 perl_atexit
437 perl_construct
438 perl_destruct
439 perl_free
440 perl_parse
441 perl_run
442 perl_get_sv
443 perl_get_av
444 perl_get_hv
445 perl_get_cv
446 perl_call_argv
447 perl_call_pv
448 perl_call_method
449 perl_call_sv
450 perl_require_pv
451 perl_eval_pv
452 perl_eval_sv
453 perl_new_ctype
454 perl_new_collate
455 perl_new_numeric
456 perl_set_numeric_standard
457 perl_set_numeric_local
458 boot_DynaLoader
459 Perl_thread_create
460 win32_errno
461 win32_environ
462 win32_stdin
463 win32_stdout
464 win32_stderr
465 win32_ferror
466 win32_feof
467 win32_strerror
468 win32_fprintf
469 win32_printf
470 win32_vfprintf
471 win32_vprintf
472 win32_fread
473 win32_fwrite
474 win32_fopen
475 win32_fdopen
476 win32_freopen
477 win32_fclose
478 win32_fputs
479 win32_fputc
480 win32_ungetc
481 win32_getc
482 win32_fileno
483 win32_clearerr
484 win32_fflush
485 win32_ftell
486 win32_fseek
487 win32_fgetpos
488 win32_fsetpos
489 win32_rewind
490 win32_tmpfile
491 win32_abort
492 win32_fstat
493 win32_stat
494 win32_pipe
495 win32_popen
496 win32_pclose
497 win32_setmode
498 win32_lseek
499 win32_tell
500 win32_dup
501 win32_dup2
502 win32_open
503 win32_close
504 win32_eof
505 win32_read
506 win32_write
507 win32_spawnvp
508 win32_mkdir
509 win32_rmdir
510 win32_chdir
511 win32_flock
512 win32_execvp
513 win32_htons
514 win32_ntohs
515 win32_htonl
516 win32_ntohl
517 win32_inet_addr
518 win32_inet_ntoa
519 win32_socket
520 win32_bind
521 win32_listen
522 win32_accept
523 win32_connect
524 win32_send
525 win32_sendto
526 win32_recv
527 win32_recvfrom
528 win32_shutdown
529 win32_closesocket
530 win32_ioctlsocket
531 win32_setsockopt
532 win32_getsockopt
533 win32_getpeername
534 win32_getsockname
535 win32_gethostname
536 win32_gethostbyname
537 win32_gethostbyaddr
538 win32_getprotobyname
539 win32_getprotobynumber
540 win32_getservbyname
541 win32_getservbyport
542 win32_select
543 win32_endhostent
544 win32_endnetent
545 win32_endprotoent
546 win32_endservent
547 win32_getnetent
548 win32_getnetbyname
549 win32_getnetbyaddr
550 win32_getprotoent
551 win32_getservent
552 win32_sethostent
553 win32_setnetent
554 win32_setprotoent
555 win32_setservent
556 win32_getenv
557 win32_perror
558 win32_setbuf
559 win32_setvbuf
560 win32_flushall
561 win32_fcloseall
562 win32_fgets
563 win32_gets
564 win32_fgetc
565 win32_putc
566 win32_puts
567 win32_getchar
568 win32_putchar
569 win32_malloc
570 win32_calloc
571 win32_realloc
572 win32_free
573 win32_sleep
574 win32_times
575 win32_alarm
576 win32_open_osfhandle
577 win32_get_osfhandle
578 win32_ioctl
579 win32_utime
580 win32_wait
581 win32_str_os_error
582 Perl_win32_init
583 Perl_init_os_extras
584 Perl_getTHR
585 Perl_setTHR
586 RunPerl
587