From 49b8c6c96781d7d70662231b1a699701b3e4be15 Mon Sep 17 00:00:00 2001 From: Sven Eden Date: Mon, 25 Nov 2013 09:03:59 +0100 Subject: Added error messages and reporting of those if the file parsing failes. --- Portage.pm | 13 +++++++------ ufed.pl.in | 43 ++++++++++++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/Portage.pm b/Portage.pm index dc7b964..e9edaab 100644 --- a/Portage.pm +++ b/Portage.pm @@ -953,14 +953,14 @@ sub _read_sh { for(;;) { /\G$BLANK/gc; last if ((pos || 0) == (length || 0)); - /\G$IDENT/gc or die; + /\G$IDENT/gc or die "Empty file detected, no identifier found."; my $name = $1; /\G$BLANK/gc; if($name ne 'source') { - /\G$ASSIG/gc or die; + /\G$ASSIG/gc or die "Bare keyword $name detected."; /\G$BLANK/gc; } - die if pos == length; + pos == length and die "Bumped into unexpected EOF after $name."; my $value = ''; for(;;) { if(/\G$UQVAL/gc || /\G$DQVAL/gc) { @@ -989,17 +989,18 @@ sub _read_sh { substr($_, pos, 0) = do { local $/; my $text = <$f>; - die if not defined $text; + defined $text or die "Error parsing $value"; $text; }; pos = $pos; - close $f or die "Unable to open $value\n$!\n"; + close $f or die "Unable to close $value\n$!\n"; } else { $env{$name} = $value; } } }; - die "Parse error in $fname\n" if $@; + defined($@) and length($@) and + die "Parse error in $fname\n - Error: \"$@\"\n"; } _merge_env(\%env); return %env if wantarray; diff --git a/ufed.pl.in b/ufed.pl.in index be20b02..37f7957 100644 --- a/ufed.pl.in +++ b/ufed.pl.in @@ -213,31 +213,36 @@ sub save_flags { my $line = substr($_, $linestart, pos()-$linestart); $line !~ /[^ \t]/; }; - /\G$IDENT/gc or die; + /\G$IDENT/gc or die "No identifier found to start with."; my $name = $1; /\G$BLANK/gc; if($name ne 'source') { - /\G$ASSIG/gc or die; - /\G$BLANK/gc; + /\G$ASSIG/gc or die "Identifier $name without assignement detected."; + /\G$BLANK/gc; } else { $sourcing = 1; } - die if pos == length; + pos == length and die "Bumped into early EOF."; if($name ne 'USE') { - /\G(?:$UQVAL|$SQVAL|$DQVAL)+/gc or die; + /\G(?:$UQVAL|$SQVAL|$DQVAL)+/gc or die "Blank assignement for $name detected."; } else { my $start = pos; - /\G(?:$BNUQV|$SQVAL|$BNDQV)+/gc or die; + m/\G(?:$BNUQV|$SQVAL|$BNDQV)+/gc or die "Empty USE assignement detected."; my $end = pos; + # save whether user uses backslash-newline my $bsnl = defined $1 || defined $2; + # start of the line is one past the last newline; also handles first line my $linestart = 1+rindex $_, "\n", $start-1; + # everything on the current line before the USE flags, plus one for the " my $line = substr($_, $linestart, $start-$linestart).' '; + # only indent if USE starts a line my $blank = $flagatstartofline ? $line : ""; $blank =~ s/[^ \t]/ /g; + # word wrap if(@flags != 0) { my $length = 0; @@ -251,10 +256,12 @@ sub save_flags { } } my $blanklength = $blank ne '' ? $length : 0; + # new line, using backslash-newline if the user did that my $nl = ($bsnl ? " \\\n" : "\n").$blank; my $linelength = $bsnl ? 76 : 78; my $flag = $flags[0]; + if($blanklength != 0 || length $flag <= $linelength) { $flags = $flag; $length += length $flag; @@ -272,16 +279,22 @@ sub save_flags { } } } + # replace the current USE flags with the modified ones substr($_, $start, $end-$start) = "\"$flags\""; + # and have the next search start after our new flags pos = $start + 2 + length $flags; + # and end this undef $flags; last; } } - if(defined $flags) { # if we didn't replace the flags, tack them after the last #USE= or at the end + + if(defined $flags) { + + # if we didn't replace the flags, tack them after the last #USE= or at the end $flags = ''; if(@flags != 0) { $flags = $flags[0]; @@ -297,21 +310,23 @@ sub save_flags { } } substr($_, $ucs, $uce-$ucs) = "\nUSE=\"$flags\"\n"; - } else { # if we replaced the flags, delete any further overrides + } else { + + # if we replaced the flags, delete any further overrides for(;;) { my $start = pos; /\G$BLANK/gc; last if pos == length; - /\G$IDENT/gc or die; + /\G$IDENT/gc or die "Identifier detection failed."; my $name = $1; /\G$BLANK/gc; if($name ne 'source') { - /\G$ASSIG/gc or die; - /\G$BLANK/gc; + /\G$ASSIG/gc or die "Identifier $name without assignement detected."; + /\G$BLANK/gc; } else { $sourcing = 1; } - /\G(?:$UQVAL|$SQVAL|$DQVAL)+/gc or die; + m/\G(?:$UQVAL|$SQVAL|$DQVAL)+/gc or die "Empty assignement for $name detected."; my $end = pos; if($name eq 'USE') { substr($_, $start, $end-$start) = ''; @@ -320,7 +335,9 @@ sub save_flags { } } }; - die "Parse error when writing make.conf - did you modify it while ufed was running?\n" if $@; + defined($@) and length($@) and die "\nParse error when writing make.conf" + . " - did you modify it while ufed was running?\n" + . " - Error: \"$@\"\n"; print STDERR <