This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[asperl] various changes to get asperl working under Borland
[perl5.git] / win32 / makedef.pl
index f080dcd..e688eb5 100644 (file)
 
 # There is some symbol defined in global.sym and interp.sym
 # that does not present in the WIN32 port but there is no easy
-# way to find them so I just put a exeception list here
+# way to find them so I just put a exception list here
 
-$skip_sym=<<'!END!OF!SKIP!';
-Perl_SvIV
-Perl_SvNV
-Perl_SvTRUE
-Perl_SvUV
+my $CCTYPE = "MSVC";   # default
+
+while (@ARGV)
+ {
+  my $flag = shift;
+  $define{$1} = 1 if ($flag =~ /^-D(\w+)$/);
+  $CCTYPE = $1 if ($flag =~ /^CCTYPE=(\w+)$/);
+ } 
+
+open(CFG,'config.h') || die "Cannot open config.h:$!";
+while (<CFG>)
+ {
+  $define{$1} = 1 if /^\s*#\s*define\s+(MYMALLOC)\b/;
+  $define{$1} = 1 if /^\s*#\s*define\s+(USE_THREADS)\b/;
+ }
+close(CFG);
+
+warn join(' ',keys %define)."\n";
+
+if ($define{PERL_OBJECT}) {
+    print "LIBRARY PerlCore\n";
+    print "DESCRIPTION 'Perl interpreter'\n";
+    print "EXPORTS\n";
+    output_symbol("perl_alloc");
+    exit(0);
+}
+
+if ($CCTYPE ne 'GCC') 
+ {
+  print "LIBRARY Perl\n";
+  print "DESCRIPTION 'Perl interpreter, export autogenerated'\n";
+  print "CODE LOADONCALL\n";
+  print "DATA LOADONCALL NONSHARED MULTIPLE\n";
+ }
+else
+ {
+  $define{'PERL_GLOBAL_STRUCT'} = 1;
+  $define{'MULTIPLICITY'} = 1;
+ }
+
+print "EXPORTS\n";
+
+my %skip;
+my %export;
+
+sub skip_symbols
+{
+ my $list = shift;
+ foreach my $symbol (@$list)
+  {
+   $skip{$symbol} = 1;
+  }
+}
+
+sub emit_symbols
+{
+ my $list = shift;
+ foreach my $symbol (@$list)
+  {
+   emit_symbol($symbol) unless exists $skip{$symbol};
+  }
+}
+
+skip_symbols [qw(
+Perl_statusvalue_vms
+Perl_archpat_auto
 Perl_block_type
-Perl_sv_pvn
+Perl_bostr
 Perl_additem
 Perl_cast_ulong
 Perl_check_uni
 Perl_checkcomma
 Perl_chsize
 Perl_ck_aelem
+Perl_colors
+Perl_colorset
 Perl_cryptseen
 Perl_cx_dump
-Perl_deb
-Perl_deb_growlevel
-Perl_debop
-Perl_debprofdump
-Perl_debstack
-Perl_debstackptrs
+Perl_DBcv
 Perl_do_ipcctl
 Perl_do_ipcget
 Perl_do_msgrcv
@@ -54,14 +112,23 @@ Perl_dump_packsubs
 Perl_dump_pm
 Perl_dump_sub
 Perl_expectterm
+Perl_error_no
+Perl_extralen
 Perl_fetch_gv
 Perl_fetch_io
 Perl_force_ident
 Perl_force_next
 Perl_force_word
+Perl_generation
 Perl_hv_stashpv
+Perl_in_clean_all
+Perl_in_clean_objs
 Perl_intuit_more
+Perl_init_thread_intern
 Perl_know_next
+Perl_lastgotoprobe
+Perl_linestart
+Perl_modcount
 Perl_modkids
 Perl_mstats
 Perl_my_bzero
@@ -74,6 +141,7 @@ Perl_no_fh_allowed
 Perl_no_op
 Perl_nointrp
 Perl_nomem
+Perl_pending_ident
 Perl_pp_cswitch
 Perl_pp_entersubr
 Perl_pp_evalonce
@@ -81,14 +149,43 @@ Perl_pp_interp
 Perl_pp_map
 Perl_pp_nswitch
 Perl_q
+Perl_rcsid
 Perl_reall_srchlen
+Perl_reg_eval_set
+Perl_reg_flags
+Perl_reg_start_tmp
+Perl_reg_start_tmpl
+Perl_regbol
+Perl_regcc
+Perl_regcode
+Perl_regdata
+Perl_regdummy
 Perl_regdump
 Perl_regfold
+Perl_regendp
+Perl_regeol
+Perl_regflags
+Perl_regindent
+Perl_reginput
+Perl_reglastparen
 Perl_regmyendp
 Perl_regmyp_size
 Perl_regmystartp
 Perl_regnarrate
+Perl_regnaughty
+Perl_regnpar
+Perl_regparse
+Perl_regprecomp
+Perl_regprev
+Perl_regprogram
 Perl_regprop
+Perl_regsawback
+Perl_regseen
+Perl_regsize
+Perl_regstartp
+Perl_regtill
+Perl_regxend
+Perl_rx
 Perl_same_dirent
 Perl_saw_return
 Perl_scan_const
@@ -102,63 +199,159 @@ Perl_scan_str
 Perl_scan_subst
 Perl_scan_trans
 Perl_scan_word
+Perl_seen_zerolen
 Perl_setenv_getix
 Perl_skipspace
+Perl_sort_mutex
+Perl_sortcxix
 Perl_sublex_done
+Perl_sublex_info
 Perl_sublex_start
-Perl_sv_peek
 Perl_sv_ref
 Perl_sv_setptrobj
 Perl_timesbuf
 Perl_too_few_arguments
 Perl_too_many_arguments
 Perl_unlnk
-Perl_wait4pid
 Perl_watch
 Perl_yyname
 Perl_yyrule
 allgvs
 curblock
-curcop
-curcopdb
 curcsv
-envgv
 lastretstr
 mystack_mark
 perl_init_ext
 perl_requirepv
-siggv
 stack
 statusvalue_vms
-tainting
 Perl_safexcalloc
 Perl_safexmalloc
 Perl_safexfree
 Perl_safexrealloc
 Perl_my_memcmp
+Perl_my_memset
 Perl_cshlen
 Perl_cshname
-!END!OF!SKIP!
+Perl_opsave
+)];
 
-# All symbols have a Perl_ prefix because that's what embed.h
-# sticks in front of them.
 
+if ($define{'MYMALLOC'})
+ {
+  skip_symbols [qw(
+    Perl_safefree
+    Perl_safemalloc
+    Perl_saferealloc
+    Perl_safecalloc)];
+  emit_symbols [qw(
+    Perl_malloc
+    Perl_free
+    Perl_realloc
+    Perl_calloc)];
+ }
 
-print "LIBRARY Perl\n";
-print "DESCRIPTION 'Perl interpreter, export autogenerated'\n";
-print "CODE LOADONCALL\n";
-print "DATA LOADONCALL NONSHARED MULTIPLE\n";
-print "EXPORTS\n";
+unless ($define{'USE_THREADS'})
+ {
+  skip_symbols [qw(
+Perl_condpair_magic
+Perl_thr_key
+Perl_sv_mutex
+Perl_svref_mutex
+Perl_malloc_mutex
+Perl_eval_mutex
+Perl_eval_cond
+Perl_eval_owner
+Perl_threads_mutex
+Perl_new_struct_thread
+Perl_nthreads
+Perl_nthreads_cond
+Perl_per_thread_magicals
+Perl_thread_create
+Perl_threadnum
+Perl_find_threadsv
+Perl_threadsv_names
+Perl_thrsv
+Perl_unlock_condpair
+Perl_vtbl_mutex
+Perl_magic_mutexfree
+Perl_sv_iv
+Perl_sv_nv
+Perl_sv_true
+Perl_sv_uv
+Perl_sv_pvn
+Perl_newRV_noinc)];
+ }
+
+unless ($define{'FAKE_THREADS'})
+ {
+  skip_symbols [qw(Perl_curthr)];
+ }
+
+sub readvar
+{
+ my $file = shift;
+ open(VARS,$file) || die "Cannot open $file:$!";
+ my @syms;
+ while (<VARS>)
+  {
+   # All symbols have a Perl_ prefix because that's what embed.h
+   # sticks in front of them.
+   push(@syms,"Perl_".$1) if (/\bPERLVARI?C?\([IGT](\w+)/);
+  } 
+ close(VARS); 
+ return \@syms;
+}
+
+if ($define{'USE_THREADS'} || $define{'MULTIPLICITY'})
+ {
+  my $thrd = readvar("../thrdvar.h");
+  skip_symbols $thrd;
+ } 
+
+if ($define{'MULTIPLICITY'})
+ {
+  my $interp = readvar("../intrpvar.h");
+  skip_symbols $interp;
+ } 
+
+if ($define{'PERL_GLOBAL_STRUCT'})
+ {
+  my $global = readvar("../perlvars.h");
+  skip_symbols $global;
+ } 
+
+unless ($define{'DEBUGGING'})
+ {
+  skip_symbols [qw(
+    Perl_deb
+    Perl_deb_growlevel
+    Perl_debop
+    Perl_debprofdump
+    Perl_debstack
+    Perl_debstackptrs
+    Perl_runops_debug
+    Perl_sv_peek
+    Perl_watchaddr
+    Perl_watchok)];
+ }
+
+if ($define{'HAVE_DES_FCRYPT'})
+ {
+  emit_symbols [qw(win32_crypt)];
+ }
 
 open (GLOBAL, "<../global.sym") || die "failed to open global.sym" . $!;
-while (<GLOBAL>) {
-       my $symbol;
-       next if (!/^[A-Za-z]/);
-       next if (/_amg[ \t]*$/);
-       $symbol = "Perl_$_";
-       next if ($skip_sym =~ m/$symbol/m);
-       print "\t$symbol";
-       };
+while (<GLOBAL>) 
+ {
+  next if (!/^[A-Za-z]/);
+  next if (/_amg[ \t]*$/);
+  # All symbols have a Perl_ prefix because that's what embed.h
+  # sticks in front of them.
+  chomp($_);
+  my $symbol = "Perl_$_";
+  emit_symbol($symbol) unless exists $skip{$symbol};
+ }
 close(GLOBAL);
 
 # also add symbols from interp.sym
@@ -166,27 +359,72 @@ close(GLOBAL);
 # doesn't hurt to include them anyway.
 # these don't have Perl prefix
 
-open (INTERP, "<../interp.sym") || die "failed to open interp.sym" . $!;
-while (<INTERP>) {
-       my $symbol;
-       next if (!/^[A-Za-z]/);
-       next if (/_amg[ \t]*$/);
-       $symbol = $_;
-       next if ($skip_sym =~ m/$symbol/m);
-       #print "\t$symbol";
-       print "\tPerl_$symbol";
-       };
+if ($define{'PERL_GLOBAL_STRUCT'})
+ {
+  emit_symbol( ($CCTYPE eq 'GCC') ? 'Perl_GetVars' : 'Perl_VarsPtr')
+ }
+else
+ {
+  my $glob = readvar("../perlvars.h");
+  emit_symbols $glob;
+ } 
 
-#close(INTERP);
+unless ($define{'MULTIPLICITY'})
+ {
+  my $glob = readvar("../intrpvar.h");
+  emit_symbols $glob;
+ } 
+
+unless ($define{'MULTIPLICITY'} || $define{'USE_THREADS'})
+ {
+  my $glob = readvar("../thrdvar.h");
+  emit_symbols $glob;
+ } 
 
 while (<DATA>) {
        my $symbol;
        next if (!/^[A-Za-z]/);
        next if (/^#/);
+        s/\r//g;
+        chomp($_);
        $symbol = $_;
-       next if ($skip_sym =~ m/^$symbol/m);
-       print "\t$symbol";
-       };
+       next if exists $skip{$symbol};
+       emit_symbol($symbol);
+}
+
+foreach my $symbol (sort keys %export)
+ {
+   output_symbol($symbol);
+ }
+
+sub emit_symbol {
+       my $symbol = shift;
+        chomp($symbol); 
+       $export{$symbol} = 1;
+}
+
+sub output_symbol {
+    my $symbol = shift;
+    if ($CCTYPE eq "BORLAND") {
+           # workaround Borland quirk by exporting both the straight
+           # name and a name with leading underscore.  Note the
+           # alias *must* come after the symbol itself, if both
+           # are to be exported. (Linker bug?)
+           print "\t_$symbol\n";
+           print "\t$symbol = _$symbol\n";
+    }
+    elsif ($CCTYPE eq 'GCC') {
+           # Symbols have leading _ whole process is $%£"% slow
+           # so skip aliases for now
+           print "\t$symbol\n";
+    }
+    else {
+           # for binary coexistence, export both the symbol and
+           # alias with leading underscore
+           print "\t$symbol\n";
+           print "\t_$symbol = $symbol\n";
+    }
+}
 
 1;
 __DATA__
@@ -210,6 +448,8 @@ perl_call_sv
 perl_require_pv
 perl_eval_pv
 perl_eval_sv
+boot_DynaLoader
+Perl_thread_create
 win32_errno
 win32_environ
 win32_stdin
@@ -257,11 +497,12 @@ win32_close
 win32_eof
 win32_read
 win32_write
-win32_spawnvpe
-win32_spawnle
+win32_spawnvp
 win32_mkdir
 win32_rmdir
 win32_chdir
+win32_flock
+win32_execvp
 win32_htons
 win32_ntohs
 win32_htonl
@@ -278,6 +519,7 @@ win32_sendto
 win32_recv
 win32_recvfrom
 win32_shutdown
+win32_closesocket
 win32_ioctlsocket
 win32_setsockopt
 win32_getsockopt
@@ -304,3 +546,35 @@ win32_sethostent
 win32_setnetent
 win32_setprotoent
 win32_setservent
+win32_getenv
+win32_perror
+win32_setbuf
+win32_setvbuf
+win32_flushall
+win32_fcloseall
+win32_fgets
+win32_gets
+win32_fgetc
+win32_putc
+win32_puts
+win32_getchar
+win32_putchar
+win32_malloc
+win32_calloc
+win32_realloc
+win32_free
+win32_sleep
+win32_times
+win32_alarm
+win32_open_osfhandle
+win32_get_osfhandle
+win32_ioctl
+win32_utime
+win32_wait
+win32_str_os_error
+Perl_win32_init
+Perl_init_os_extras
+Perl_getTHR
+Perl_setTHR
+RunPerl
+