#!/usr/bin/perl # # This script is documented in Perl Pod, you can pretty-print it using # # $ perldoc scripts/regsubst.pl. # # The real code starts after "=cut" below. =head1 NAME regsubst.pl - helper script to make use of defines =head1 SYNOPSIS B [B<-I> I] I =head1 DESCRIPTION B parses the given file recursively for #include directives and then substitutes raw hex values in I by definitions found and prints the result to stdout. This is targeted to make i.MX DCD tables more readable but for sure can be used elsewhere too. =head1 BUGS B is dumb and so might replace values to aggressively. So better double check the result. =head1 OPTIONS =over 4 =item B<-I> I Add I to the list of search paths for include files. =back =head1 EXAMPLE First you have to add the right #include directives to your file: $ cat flash-header-myboard.imxcfg soc imx6 loadaddr 0x20000000 dcdofs 0x400 #include #include wm 32 0x020e0774 0x000C0000 wm 32 0x020e0754 0x00000000 ... Then you can process the file with B: $ scripts/regsubst.pl -I arch/arm/mach-imx/include flash-header-myboard.imxcfg soc imx6 loadaddr 0x20000000 dcdofs 0x400 #include #include wm 32 MX6_IOM_GRP_DDR_TYPE 0x000C0000 wm 32 MX6_IOM_GRP_DDRPKE 0x00000000 ... If the result looks ok, you can replace the file: $ scripts/regsubst.pl -I arch/arm/mach-imx/include flash-header-myboard.imxcfg > u $ mv u flash-header-myboard.imxcfg =cut use strict; use warnings; use Getopt::Long qw(GetOptions); my @includepaths; GetOptions('I=s' => \@includepaths); my %regnamemap; sub scan { my @incfiles; push @incfiles, @_; foreach my $i (@incfiles) { foreach my $incpath (@includepaths) { if (-e "$incpath/$i") { open(my $fd, "<", "$incpath/$i") || die "Failed to open include file $incpath/$i"; while (<$fd>) { if (/^\s*#\s*include\s+["<](.*)[">]/) { push @incfiles, $1; }; if (/^\s*#\s*define\s+([A-Z_0-9]*)\s+(0x[0-9a-f]+)/) { my $regname = $1; my $regaddrre = $2 =~ s/^0x0*/0x0\*/r; $regnamemap{$regaddrre} = $regname; }; }; close($fd); last; } } } } while (<>) { my $line = $_; if (/#include ["<](.*)[">]/) { scan $1; } foreach my $regaddr (keys %regnamemap) { $line =~ s/$regaddr/$regnamemap{$regaddr}/ei; } print $line; };