This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[win32] Revert to keeping (some) constant strings as globals
[perl5.git] / win32 / makedef.pl
index 31686d2..3b983d5 100644 (file)
 # that does not present in the WIN32 port but there is no easy
 # way to find them so I just put a exception list here
 
-while (@ARGV && $ARGV[0] =~ /^-/)
+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/;
+ }
+close(CFG);
+
 warn join(' ',keys %define)."\n";
 
-my $CCTYPE = shift || "MSVC";
+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_sym=<<'!END!OF!SKIP!';
+skip_symbols [qw(
+Perl_statusvalue_vms
 Perl_block_type
 Perl_additem
 Perl_cast_ulong
@@ -141,11 +186,26 @@ Perl_my_memset
 Perl_cshlen
 Perl_cshname
 Perl_opsave
-!END!OF!SKIP!
+)];
+
+
+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)];
+ }
 
 unless ($define{'USE_THREADS'})
  {
-  $skip_sym .= <<'!END!OF!SKIP!';
+  skip_symbols [qw(
 Perl_condpair_magic
 Perl_thr_key
 Perl_sv_mutex
@@ -158,6 +218,9 @@ Perl_new_struct_thread
 Perl_nthreads
 Perl_nthreads_cond
 Perl_per_thread_magicals
+Perl_thread_create
+Perl_find_threadsv
+Perl_threadsv_names
 Perl_thrsv
 Perl_unlock_condpair
 Perl_vtbl_mutex
@@ -167,47 +230,67 @@ Perl_sv_nv
 Perl_sv_true
 Perl_sv_uv
 Perl_sv_pvn
-Perl_newRV_noinc
-!END!OF!SKIP!
+Perl_newRV_noinc)];
  }
 
-if ($define{'USE_THISPTR'} || $define{'USE_THREADS'})
+unless ($define{'FAKE_THREADS'})
  {
-  open(THREAD,"<../thread.sym") || die "Cannot open thread.sym:$!";
-  while (<THREAD>)
-   {
-    next if (!/^[A-Za-z]/);
-    next if (/_amg[ \t]*$/);
-    $skip_sym .= "Perl_".$_;
-   } 
-  close(THREAD); 
-  $skip_sym .= "Perl_op\n";
- } 
+  skip_symbols [qw(Perl_curthr)];
+ }
 
-unless ($define{'USE_THREADS'})
+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?\([IGT](\w+)/);
+  } 
+ close(VARS); 
+ return \@syms;
+}
+
+if ($define{'USE_THREADS'} || $define{'MULTIPLICITY'})
  {
-  $skip_sym .= "Perl_thread_create\n";
- }
+  my $thrd = readvar("../thrdvar.h");
+  skip_symbols $thrd;
+ } 
 
-# All symbols have a Perl_ prefix because that's what embed.h
-# sticks in front of them.
+if ($define{'MULTIPLICITY'})
+ {
+  my $interp = readvar("../intrpvar.h");
+  skip_symbols $interp;
+ } 
 
+if ($define{'PERL_GLOBAL_STRUCT'})
+ {
+  my $global = readvar("../perlvars.h");
+  skip_symbols $global;
+ } 
 
-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{'DEBUGGING'})
+ {
+  skip_symbols [qw(
+    Perl_runops_debug
+    Perl_sv_peek
+    Perl_watchaddr
+    Perl_watchok)];
+ }
 
 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);
-       emit_symbol($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
@@ -215,33 +298,41 @@ 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";
-       emit_symbol("Perl_" . $symbol);
-}
+if ($define{'PERL_GLOBAL_STRUCT'})
+ {
+  emit_symbol( ($CCTYPE eq 'GCC') ? 'Perl_GetVars' : 'Perl_VarsPtr')
+ }
+else
+ {
+  my $glob = readvar("../perlvars.h");
+  emit_symbols $glob;
+ } 
+
+unless ($define{'MULTIPLICITY'})
+ {
+  my $glob = readvar("../intrpvar.h");
+  emit_symbols $glob;
+ } 
 
-#close(INTERP);
+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);
-        $symbol = "Perl_".$symbol if ($define{'USE_THISPTR'} 
-                                      && $symbol =~ /^perl/);
+       next if exists $skip{$symbol};
        emit_symbol($symbol);
 }
 
-sub emit_symbol {
-       my $symbol = shift;
-       chomp $symbol;
+foreach my $symbol (sort keys %export)
+ {
        if ($CCTYPE eq "BORLAND") {
                # workaround Borland quirk by exporting both the straight
                # name and a name with leading underscore.  Note the
@@ -250,12 +341,23 @@ sub emit_symbol {
                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";
        }
+ }
+
+sub emit_symbol {
+       my $symbol = shift;
+        chomp($symbol); 
+       $export{$symbol} = 1;
 }
 
 1;
@@ -395,10 +497,14 @@ win32_malloc
 win32_calloc
 win32_realloc
 win32_free
+win32_sleep
+win32_times
+win32_alarm
 win32_open_osfhandle
 win32_get_osfhandle
-win32stdio
 Perl_win32_init
+Perl_init_os_extras
+Perl_getTHR
+Perl_setTHR
 RunPerl
-SetIOSubSystem
-GetIOSubSystem
+