App-UnifdefPlus
view release on metacpan or search on metacpan
lib/UnifdefPlus.pm view on Meta::CPAN
elsif ($expr =~ /^(\s*)!($BRACE_MATCH)$/ ) {
($ws1, $e1) =($1,$2);
($ws11,$op1,$ws12) = trimWs($self->kconfigSimplifyExpr($e1));
return $ws11.$N.$ws12 if ($op1 eq $Y);
return $ws11.$M.$ws12 if ($op1 eq $M);
return $ws11.$Y.$ws12 if ($op1 eq $N);
return "".$ws1."!".$ws11.$op1.$ws12;
}
elsif ($expr =~ /^(\s*)\(($BRACE_MATCH)\)(\s*)$/ ) {
($ws1, $e1, $ws2) =($1,$2,$3);
($ws11,$op1,$ws12) = trimWs($self->kconfigSimplifyExpr($e1));
return $ws1.$Y.$ws2 if ($op1 eq $Y);
return $ws1.$M.$ws2 if ($op1 eq $M);
return $ws1.$N.$ws2 if ($op1 eq $N);
#do not remove braces on unknown expressions:
#return $ws1.$op1.$ws2 if ($op1 =~ /^\s*\w+\s*$/);
return "".$ws1."(".$ws11.$op1.$ws12.")".$ws2;
}
elsif ($expr =~ /^($BRACE_MATCH)!=($BRACE_MATCH)$/ ) {
($e1, $e2) = ($1,$2);
($ws11,$op1,$ws12) = trimWs($self->kconfigSimplifyExpr($e1));
($ws21,$op2,$ws22) = trimWs($self->kconfigSimplifyExpr($e2));
if ( ($op1 eq $Y || $op1 eq $M || $op1 eq $N)
&& ($op2 eq $Y || $op2 eq $M || $op2 eq $N)) {
return $N if ($op1 eq $op2);
return $Y;
}
else {
return "".$ws11.$op1.$ws12."!=".$ws21.$op2.$ws22;
}
}
elsif ($expr =~ /^($BRACE_MATCH)=($BRACE_MATCH)$/) {
($e1, $e2) = ($1,$2);
($ws11,$op1,$ws12) = trimWs($self->kconfigSimplifyExpr($e1));
($ws21,$op2,$ws22) = trimWs($self->kconfigSimplifyExpr($e2));
if ( ($op1 eq $Y || $op1 eq $M || $op1 eq $N)
&& ($op2 eq $Y || $op2 eq $M || $op2 eq $N)) {
return $Y if ($op1 eq $op2);
return $N;
}
else {
return "".$ws11.$op1.$ws12."=".$ws21.$op2.$ws22;
}
}
elsif ($expr =~ /^(\s*)((?:\w|\")+)(\s*)$/) {
return $1.$self->{kDefines}{$2}.$3 if defined $self->{kDefines}{trim($expr)};
return $expr;
}
die "WARNING -- could not resolve <$expr>!!\n";
return $expr;
}
my $LINE_SEP = "\r\t \t \t \t \t \t \t \t\r";
# returns the visible lenght of whitespace (assuming tabs are 8 characters wide)
sub wslength {
my $str = shift;
# code taken from eugene y on
# http://stackoverflow.com/questions/5997404/perl-program-to-replace-tabs-with-spaces
while($str =~ s/\t/" " x (8 - $-[0]%8)/e) {}
return length($str);
}
# attempts to read attributes
# stops when a line without indents is found
sub kconfigReadAttributes {
my $self = shift;
my $outLinesRef = shift;
# clear output:
@$outLinesRef = ();
my $isVisible = 1;
while (1) {
my $line = shift(@{$self->{inlines}});
print DBGOUT " - $line...\n" if ($self->{dbg});
last unless defined($line);
chomp($line);
# hack: combine two lines into one.
while (substr($line, -1) eq "\\") {
$line = substr($line,0,-1) . $LINE_SEP . shift(@{$self->{inlines}});
chomp($line);
}
if ($line =~ $COMMENT) {
#comment: just push it
$line =~ s/$LINE_SEP/\\\n/g;
push(@$outLinesRef, $line."\n");
}
elsif ($line =~ /^(\s*)$/) {
#blank line -- end of attributes. Include blank line as
#part of item.
$line =~ s/$LINE_SEP/\\\n/g;
push(@$outLinesRef, $line."\n");
last;
}
elsif ($line =~ /^[^\s]/) {
#line with no preceding whitespace. Though the spec says there should
#be whitespace between entries, this rule isn't followed everywhere.
#unshif the line, and finish:
unshift(@{$self->{inlines}}, $line);
last;
}
elsif ($line =~ /^(\s+)-*\s*help\s*-*.*$/)
{
#special handling for help: it is multiline and ends when the
#first line of text has less indentation than the first.
$line =~ s/$LINE_SEP/\\\n/g;
push(@$outLinesRef, $line."\n");
my $line = shift(@{$self->{inlines}});
if (defined($line)) {
chomp($line);
if ($line =~ /^(\s+)/) {
# Grumble grumble: in at least one kernel Kconfig
# file, they mixed up tabs and spaces...:
my $blankLines = 0;
my $helpIndentLen = wslength($1);
( run in 2.268 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )