diff options
Diffstat (limited to 'erts/emulator/utils/make_driver_tab')
-rwxr-xr-x | erts/emulator/utils/make_driver_tab | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/erts/emulator/utils/make_driver_tab b/erts/emulator/utils/make_driver_tab index fbbfa3e49e..06928a3a4a 100755 --- a/erts/emulator/utils/make_driver_tab +++ b/erts/emulator/utils/make_driver_tab @@ -27,7 +27,9 @@ use File::Basename; # usage: make_driver_tab [-o filename] drivers... my $file = ""; +my $nif = ""; my @drivers = (); +my @nifs = (); while (@ARGV) { my $d = shift; @@ -35,6 +37,12 @@ while (@ARGV) { $file = shift or die("-o requires argument"); next; } + if ( $d =~ /^.*\.a$/ ) { + $d = basename $d; + $d =~ s/\.a$//; # strip .a + push(@nifs, $d); + next; + } $d = basename $d; $d =~ s/drv(\..*|)$//; # strip drv.* or just drv push(@drivers, $d); @@ -52,6 +60,7 @@ print <<EOF; #include <stdio.h> #include "global.h" + EOF # "extern" declarations @@ -68,4 +77,50 @@ foreach (@drivers) { print " NULL\n};\n"; +print <<EOF; + +typedef struct ErtsStaticNifEntry_ { + const char *nif_name; + ErtsStaticNifInitFPtr nif_init; +} ErtsStaticNifEntry; + +EOF + +# prototypes +foreach (@nifs) { + my $d = ${_}; + $d =~ s/\.debug//; # strip .debug + print "void *".$d."_nif_init(void);\n"; +} + +# The array itself +print "static ErtsStaticNifEntry static_nif_tab[DRIVER_TAB_SIZE] =\n{\n"; + +foreach (@nifs) { + my $d = ${_}; + $d =~ s/\.debug//; # strip .debug + print "{\"${_}\",&".$d."_nif_init},\n"; +} + +print " {NULL,NULL}\n};\n"; + +print <<EOF; +ErtsStaticNifInitFPtr erts_static_nif_get_nif_init(const char *name) { + int i; + for (i = 0; static_nif_tab[i].nif_name != NULL; i++) + if (strcmp(name,static_nif_tab[i].nif_name) == 0) + return static_nif_tab[i].nif_init; + return NULL; +} + +int erts_is_static_nif(void *handle) { + int i; + for (i = 0; static_nif_tab[i].nif_name != NULL; i++) + if (((void*)static_nif_tab[i].nif_init) == handle) + return 1; + return 0; +} + +EOF + # That's it |