Thread View: gnu.gcc.bug
2 messages
2 total messages
Started by Earl Killian
Mon, 24 Aug 1992 16:18
fixincludes
Author: Earl Killian
Date: Mon, 24 Aug 1992 16:18
Date: Mon, 24 Aug 1992 16:18
259 lines
6902 bytes
6902 bytes
I wrote the following perl script to fix include files on a MIPS
RISCos 5.0 system, since, as described in my last message, the include
hierarchy is too complicated for the existing script.
#!/usr/local/bin/perl
$myname = 'fixincludes.riscos';
die("Usage is: $myname destdir default\n") if $#ARGV != 1;
$dest = $ARGV[0];
$default = $ARGV[1];
@inctrees = ('/usr/bsd43/usr/include',
'/usr/svr4/usr/include',
'/usr/svr3/usr/include',
'/usr/RISCwindows4.1/include');
$new{'/usr/bsd43/usr/include'} = 'bsd43.include';
$new{'/usr/svr4/usr/include'} = 'svr4.include';
$new{'/usr/svr3/usr/include'} = 'svr3.include';
$new{'/usr/RISCwindows4.1/include'} = 'RISCwindows4.1.include';
sub path {
local($linkfromdir, $linktodir) = @_;
local($linktopwd, @t, @f, $i);
chdir($linkfromdir)
|| die("$myname: $!, chdir $linkfromdir\n");
chdir($linktodir)
|| die("$myname: $!, chdir $linktodir\n");
$linktopwd = `pwd`;
chop($linktopwd);
if ($linktopwd eq $linkfromdir) {
return '.';
}
elsif ($linktopwd eq $inctree) {
# to the head of the tree we're copying now
@f = split(m=/=, substr($linkfromdir, length($inctree)+1));
return '../' x $#f;
}
elsif ($linktopwd =~ m=^$inctree/=) {
# within the tree we're copying now
@t = split(m=/=, $');
@f = split(m=/=, substr($linkfromdir, length($inctree)+1));
for ($i = 0; $i <= $#t && $i <= $#f && $t[$i] eq $f[$i]; $i += 1) {
}
return ('../' x ($#f - $i + 1)) . join('/', @t[$i..$#t]);
}
else {
foreach $i (@inctrees) {
if ($linktopwd eq $i) {
# to a different include tree
@f = split(m=/=, substr($linkfromdir, length($inctree)+1));
return ('../' x ($#f + 2)) . $new{$i};
}
elsif ($linktopwd =~ m=^$i/=) {
# within a different include tree
@f = split(m=/=, substr($linkfromdir, length($inctree)+1));
return ('../' x ($#f + 2)) . $new{$i} . '/' . $';
}
}
print STDERR "$myname: link to outside standard include trees:\n $linkfromdir -> $linktodir\n";
$linktopwd;
}
};
sub fixlink {
local($srcdir, $dstdir, $name) = @_;
local($l, @l, $new);
if (-d "$srcdir/$name") {
$new = &path($srcdir, "$srcdir/$name");
}
else {
$l = readlink("$srcdir/$name");
@l = split(m=/=, $l);
$new = $#l == 0
? $l
: &path($srcdir, join('/', @l[0..$#l-1])) . '/' . $l[$#l];
}
$new = substr($new, 2) if substr($new, 0, 2) eq './';
symlink($new, "$dstdir/$name")
|| die("$myname: $!, symlink $new $dstdir/$name\n");
};
sub fixfile {
local($src, $dst) = @_;
open (I, "<$src")
|| die("$myname: $!, opening $src for input\n");
open (O, ">$dst")
|| die("$myname: $!, opening $dst for output\n");
$s = 0;
while (<I>) {
chop;
while (/\\$/) {
$_ .= "\n";
$_ .= <I>;
chop;
}
if (/[ \t]_IO[A-Z]*[ \t]*\(/) {
$s += s/\((.),/('$1',/;
}
if (/[ \t]BSD43__IO[A-Z]*[ \t]*\(/) {
$s += s/\((.),/('$1',/;
}
if (/#define._IO/) {
$s += s/'x'/x/g;
}
if (/#define.BSD43__IO/) {
$s += s/'x'/x/g;
}
if (/[^A-Z]CTRL[ \t]*\(/) {
$s += s/([^'])\)/'$1')/;
}
if (/#define.CTRL/) {
$s += s/'c'/c/g;
}
if (/#define._CTRL/) {
$s += s/'c'/c/g;
}
if (/#define.BSD43_CTRL/) {
$s += s/'c'/c/g;
}
if (/#[a-z]*if.*[\t \(]m68k/) {
$s += s/([^_])m68k/$1__m68k__/g;
}
if (/#[a-z]*if.*[\t \(]__i386/) {
$s += s/__i386/__i386__/g;
}
if (/#[a-z]*if.*[\t \(]i386/) {
$s += s/([^_])i386/$1__i386__/g;
}
if (/#[a-z]*if.*[\t \(]sparc/) {
$s += s/([^_])sparc/$1__sparc__/g;
}
if (/#[a-z]*if.*[\t \(]mc68000/) {
$s += s/([^_])mc68000/$1__mc68000__/g;
}
if (/#[a-z]*if.*[\t \(]vax/) {
$s += s/([^_])vax/$1__vax__/g;
}
if (/#[a-z]*if.*[\t \(]sun/) {
$s += s/([^_])(sun[a-z0-9]*)([^a-z0-9_])/$1__$2__$3/g;
}
if (/#[a-z]*if.*[\t \(]sun/) {
$s += s/([^_])(sun[a-z0-9]*)$/$1__$2__/g;
}
if (/#[a-z]*if.*[\t \(]ns32000/) {
$s += s/([^_])ns32000/$1__ns32000__/g;
}
if (/#[a-z]*if.*[\t \(]pyr/) {
$s += s/([^_])pyr/$1__pyr__/g;
}
if (/#[a-z]*if.*[\t \(]is68k/) {
$s += s/([^_])is68k/$1__is68k__/g;
}
if (/^#define.NULL[ \t]/) {
$_ .= "\n#undef NULL";
$s += 1;
}
print O $_,"\n";
}
close (I);
close (O);
unlink ($dst) if $s == 0;
};
sub fixdir {
local($src, $dst) = @_;
local(@d, $d);
opendir (D, $src)
|| die("$myname: $!, opening $src\n");
@d = readdir(D);
closedir (D);
mkdir($dst,0777)
|| die("$myname: $!, mkdir $dst\n");
foreach $d (@d) {
if ($d eq '.' || $d eq '..') {
# ignore
}
elsif (-l "$src/$d") {
&fixlink($src, $dst, $d);
}
elsif (-f "$src/$d") {
&fixfile("$src/$d", "$dst/$d");
}
elsif (-d "$src/$d") {
&fixdir("$src/$d", "$dst/$d");
}
}
};
sub clean {
local($dir) = @_;
local(@d, $d, $n, $e);
chdir($dir)
|| die("$myname: $!, chdir $dir\n");
$dir = `pwd`;
chop($dir);
return $clean{$dir} if defined($clean{$dir});
opendir (D, '.')
|| die("$myname: $!, opening $dir\n");
@d = readdir(D);
closedir (D);
$clean{$dir} = $#d;
$n = 0;
foreach $d (@d) {
$e = "$dir/$d";
if ($d eq '.' || $d eq '..') {
# ignore
}
elsif (-d $e) {
if (&clean($e) != 0) {
$n += 1;
}
elsif (-l $e) {
unlink($e)
|| die("$myname: $!, unlink $e\n");
}
else {
rmdir($e)
|| die("$myname: $!, rmdir $e\n");
}
}
elsif (-e $e) {
$n += 1;
}
else {
unlink($e)
|| die("$myname: $!, unlink $e\n");
}
}
$clean{$dir} = $n;
$n;
};
foreach $inctree (@inctrees) {
&fixdir($inctree, "$dest/$new{$inctree}");
}
foreach $inctree (@inctrees) {
&clean("$dest/$new{$inctree}");
}
opendir(D, "$dest/$default")
|| die("$myname: $!, opening $dest/$default\n");
@d = readdir(D);
closedir(D);
chdir("$dest/include")
|| die("$myname: $!, chdir $dest/include\n");
foreach $d (@d) {
if (! -e $d) {
symlink("../$default/$d", $d)
|| die("$myname: $!, symlink ../$default/$d $d\n");
}
}
#
# Local Variables:
# mode:perl
# perl-indent-level:2
# End:
fixincludes for MIPS
Author: Richard Stallman
Date: Tue, 25 Aug 1992 17:52
Date: Tue, 25 Aug 1992 17:52
8 lines
810 bytes
810 bytes
I can't install a perl script in GCC since that would make GCC depend on perl. Can you or someone write a script which uses ordinary standard utilities, as fixincludes does? I urge people not to redistribute the perl script, because if the 1% of users who *could* write another script use a perl script instead, then no one will write a script suitable for everyone to use.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads