1*00b67f09SDavid van Moolenbroek#!/usr/bin/perl 2*00b67f09SDavid van Moolenbroek# 3*00b67f09SDavid van Moolenbroek# Copyright (C) 2004, 2007, 2009, 2012-2014 Internet Systems Consortium, Inc. ("ISC") 4*00b67f09SDavid van Moolenbroek# Copyright (C) 2001 Internet Software Consortium. 5*00b67f09SDavid van Moolenbroek# 6*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any 7*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above 8*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies. 9*00b67f09SDavid van Moolenbroek# 10*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 11*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 12*00b67f09SDavid van Moolenbroek# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 13*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 14*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 15*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE. 17*00b67f09SDavid van Moolenbroek 18*00b67f09SDavid van Moolenbroek# Id 19*00b67f09SDavid van Moolenbroek 20*00b67f09SDavid van Moolenbroek# makedefs.pl 21*00b67f09SDavid van Moolenbroek# This script goes through all of the lib header files and creates a .def file 22*00b67f09SDavid van Moolenbroek# for each DLL for Win32. It recurses as necessary through the subdirectories 23*00b67f09SDavid van Moolenbroek# 24*00b67f09SDavid van Moolenbroek# This program should only be run if it is necessary to regenerate 25*00b67f09SDavid van Moolenbroek# the .def files. Normally these files should be updated by hand, adding 26*00b67f09SDavid van Moolenbroek# new functions to the end and removing obsolete ones. 27*00b67f09SDavid van Moolenbroek# If you do regenerate them you will also need to modify them by hand to 28*00b67f09SDavid van Moolenbroek# to pick up those routines not detected by this program (like openlog). 29*00b67f09SDavid van Moolenbroek# 30*00b67f09SDavid van Moolenbroek# Search String: ^(([_a-z0-9])*( ))*prefix_[_a-z0-9]+_[a-z0-9]+( )*\( 31*00b67f09SDavid van Moolenbroek# List of directories 32*00b67f09SDavid van Moolenbroek 33*00b67f09SDavid van Moolenbroek@prefixlist = ("isc", "isccfg", "dns", "isccc", "bind9", "lwres", "irs"); 34*00b67f09SDavid van Moolenbroek@iscdirlist = ("isc/include/isc","isc/win32/include/isc","isc/include/pk11", 35*00b67f09SDavid van Moolenbroek "isc/include/pkcs11","isc/win32/include/pkcs11"); 36*00b67f09SDavid van Moolenbroek@iscprefixlist = ("isc", "pk11", "pkcs"); 37*00b67f09SDavid van Moolenbroek 38*00b67f09SDavid van Moolenbroek@isccfgdirlist = ("isccfg/include/isccfg"); 39*00b67f09SDavid van Moolenbroek@isccfgprefixlist = ("cfg"); 40*00b67f09SDavid van Moolenbroek 41*00b67f09SDavid van Moolenbroek@iscccdirlist = ("isccc/include/isccc"); 42*00b67f09SDavid van Moolenbroek@iscccprefixlist = ("isccc"); 43*00b67f09SDavid van Moolenbroek 44*00b67f09SDavid van Moolenbroek@dnsdirlist = ("dns/include/dns","dns/include/dst"); 45*00b67f09SDavid van Moolenbroek@dnsprefixlist = ("dns", "dst"); 46*00b67f09SDavid van Moolenbroek 47*00b67f09SDavid van Moolenbroek@lwresdirlist = ("lwres/include/lwres","lwres/win32/include/lwres"); 48*00b67f09SDavid van Moolenbroek@lwresprefixlist = ("lwres"); 49*00b67f09SDavid van Moolenbroek 50*00b67f09SDavid van Moolenbroek@bind9dirlist = ("bind9/include/bind9"); 51*00b67f09SDavid van Moolenbroek@bind9prefixlist = ("bind9"); 52*00b67f09SDavid van Moolenbroek 53*00b67f09SDavid van Moolenbroek@irsdirlist = ("irs/include/irs","irs/win32/include/irs"); 54*00b67f09SDavid van Moolenbroek@irsprefixlist = ("irs"); 55*00b67f09SDavid van Moolenbroek 56*00b67f09SDavid van Moolenbroek# Run the changes for each directory in the directory list 57*00b67f09SDavid van Moolenbroek 58*00b67f09SDavid van Moolenbroek$ind = 0; 59*00b67f09SDavid van Moolenbroekcreateoutfile($iscprefixlist[0]); 60*00b67f09SDavid van Moolenbroekforeach $dir (@iscdirlist) { 61*00b67f09SDavid van Moolenbroek createdeffile($dir, $iscprefixlist[$ind]); 62*00b67f09SDavid van Moolenbroek $ind++; 63*00b67f09SDavid van Moolenbroek} 64*00b67f09SDavid van Moolenbroekclose OUTDEFFILE; 65*00b67f09SDavid van Moolenbroek 66*00b67f09SDavid van Moolenbroek$ind = 0; 67*00b67f09SDavid van Moolenbroekcreateoutfile($isccfgprefixlist[0]); 68*00b67f09SDavid van Moolenbroekforeach $dir (@isccfgdirlist) { 69*00b67f09SDavid van Moolenbroek createdeffile($dir, $isccfgprefixlist[$ind]); 70*00b67f09SDavid van Moolenbroek $ind++; 71*00b67f09SDavid van Moolenbroek} 72*00b67f09SDavid van Moolenbroekclose OUTDEFFILE; 73*00b67f09SDavid van Moolenbroek 74*00b67f09SDavid van Moolenbroek$ind = 0; 75*00b67f09SDavid van Moolenbroekcreateoutfile($dnsprefixlist[0]); 76*00b67f09SDavid van Moolenbroekforeach $dir (@dnsdirlist) { 77*00b67f09SDavid van Moolenbroek createdeffile($dir, $dnsprefixlist[$ind]); 78*00b67f09SDavid van Moolenbroek $ind++; 79*00b67f09SDavid van Moolenbroek} 80*00b67f09SDavid van Moolenbroekclose OUTDEFFILE; 81*00b67f09SDavid van Moolenbroek 82*00b67f09SDavid van Moolenbroek$ind = 0; 83*00b67f09SDavid van Moolenbroekcreateoutfile($iscccprefixlist[0]); 84*00b67f09SDavid van Moolenbroekforeach $dir (@iscccdirlist) { 85*00b67f09SDavid van Moolenbroek createdeffile($dir, $iscccprefixlist[$ind]); 86*00b67f09SDavid van Moolenbroek $ind++; 87*00b67f09SDavid van Moolenbroek} 88*00b67f09SDavid van Moolenbroekclose OUTDEFFILE; 89*00b67f09SDavid van Moolenbroek 90*00b67f09SDavid van Moolenbroek$ind = 0; 91*00b67f09SDavid van Moolenbroekcreateoutfile($lwresprefixlist[0]); 92*00b67f09SDavid van Moolenbroekforeach $dir (@lwresdirlist) { 93*00b67f09SDavid van Moolenbroek createdeffile($dir, $lwresprefixlist[$ind]); 94*00b67f09SDavid van Moolenbroek $ind++; 95*00b67f09SDavid van Moolenbroek} 96*00b67f09SDavid van Moolenbroekclose OUTDEFFILE; 97*00b67f09SDavid van Moolenbroek 98*00b67f09SDavid van Moolenbroek$ind = 0; 99*00b67f09SDavid van Moolenbroekcreateoutfile($bind9prefixlist[0]); 100*00b67f09SDavid van Moolenbroekforeach $dir (@bind9dirlist) { 101*00b67f09SDavid van Moolenbroek createdeffile($dir, $bind9prefixlist[$ind]); 102*00b67f09SDavid van Moolenbroek $ind++; 103*00b67f09SDavid van Moolenbroek} 104*00b67f09SDavid van Moolenbroekclose OUTDEFFILE; 105*00b67f09SDavid van Moolenbroek 106*00b67f09SDavid van Moolenbroek$ind = 0; 107*00b67f09SDavid van Moolenbroekcreateoutfile($irsprefixlist[0]); 108*00b67f09SDavid van Moolenbroekforeach $dir (@irsdirlist) { 109*00b67f09SDavid van Moolenbroek createdeffile($dir, $irsprefixlist[$ind]); 110*00b67f09SDavid van Moolenbroek $ind++; 111*00b67f09SDavid van Moolenbroek} 112*00b67f09SDavid van Moolenbroekclose OUTDEFFILE; 113*00b67f09SDavid van Moolenbroek 114*00b67f09SDavid van Moolenbroekexit; 115*00b67f09SDavid van Moolenbroek 116*00b67f09SDavid van Moolenbroek# 117*00b67f09SDavid van Moolenbroek# Subroutines 118*00b67f09SDavid van Moolenbroek# 119*00b67f09SDavid van Moolenbroeksub createdeffile { 120*00b67f09SDavid van Moolenbroek $xdir = $_[0]; 121*00b67f09SDavid van Moolenbroek 122*00b67f09SDavid van Moolenbroek # 123*00b67f09SDavid van Moolenbroek # Get the List of files in the directory to be processed. 124*00b67f09SDavid van Moolenbroek # 125*00b67f09SDavid van Moolenbroek #^(([_a-z0-9])*( ))*prefix_[_a-z]+_[a-z]+( )*\( 126*00b67f09SDavid van Moolenbroek $prefix = $_[1]; 127*00b67f09SDavid van Moolenbroek $pattern = "\^\(\(\[\_a\-z0\-9\]\)\*\( \)\)\*\(\\*\( \)\+\)\*$prefix"; 128*00b67f09SDavid van Moolenbroek $pattern = "$pattern\_\[\_a\-z0\-9\]\+_\[a\-z0\-9\]\+\( \)\*\\\("; 129*00b67f09SDavid van Moolenbroek 130*00b67f09SDavid van Moolenbroek opendir(DIR,$xdir) || die "No Directory: $!"; 131*00b67f09SDavid van Moolenbroek @files = grep(/\.h$/i, readdir(DIR)); 132*00b67f09SDavid van Moolenbroek closedir(DIR); 133*00b67f09SDavid van Moolenbroek 134*00b67f09SDavid van Moolenbroek foreach $filename (sort @files) { 135*00b67f09SDavid van Moolenbroek # 136*00b67f09SDavid van Moolenbroek # Open the file and locate the pattern. 137*00b67f09SDavid van Moolenbroek # 138*00b67f09SDavid van Moolenbroek open (HFILE, "$xdir/$filename") || 139*00b67f09SDavid van Moolenbroek die "Can't open file $filename : $!"; 140*00b67f09SDavid van Moolenbroek 141*00b67f09SDavid van Moolenbroek while (<HFILE>) { 142*00b67f09SDavid van Moolenbroek if(/$pattern/) { 143*00b67f09SDavid van Moolenbroek $func = $&; 144*00b67f09SDavid van Moolenbroek chop($func); 145*00b67f09SDavid van Moolenbroek $space = rindex($func, " ") + 1; 146*00b67f09SDavid van Moolenbroek if($space >= 0) { 147*00b67f09SDavid van Moolenbroek # strip out return values 148*00b67f09SDavid van Moolenbroek $func = substr($func, $space, 100); 149*00b67f09SDavid van Moolenbroek } 150*00b67f09SDavid van Moolenbroek print OUTDEFFILE "$func\n"; 151*00b67f09SDavid van Moolenbroek } 152*00b67f09SDavid van Moolenbroek } 153*00b67f09SDavid van Moolenbroek # Set up the Patterns 154*00b67f09SDavid van Moolenbroek close(HFILE); 155*00b67f09SDavid van Moolenbroek } 156*00b67f09SDavid van Moolenbroek} 157*00b67f09SDavid van Moolenbroek 158*00b67f09SDavid van Moolenbroek# This is the routine that applies the changes 159*00b67f09SDavid van Moolenbroek 160*00b67f09SDavid van Moolenbroek# output the result to the platform specific directory. 161*00b67f09SDavid van Moolenbroeksub createoutfile { 162*00b67f09SDavid van Moolenbroek $outfile = "lib$_[0].def"; 163*00b67f09SDavid van Moolenbroek 164*00b67f09SDavid van Moolenbroek open (OUTDEFFILE, ">$outfile") 165*00b67f09SDavid van Moolenbroek || die "Can't open output file $outfile: $!"; 166*00b67f09SDavid van Moolenbroek print OUTDEFFILE "LIBRARY lib$_[0]\n"; 167*00b67f09SDavid van Moolenbroek print OUTDEFFILE "\n"; 168*00b67f09SDavid van Moolenbroek print OUTDEFFILE "; Exported Functions\n"; 169*00b67f09SDavid van Moolenbroek print OUTDEFFILE "EXPORTS\n"; 170*00b67f09SDavid van Moolenbroek print OUTDEFFILE "\n"; 171*00b67f09SDavid van Moolenbroek} 172