Simplified data parsing.

Instead of complicated regexes, I now simply do splits and joins. This paves the
way for per-curve extraValuesPerPoint
This commit is contained in:
Dima Kogan 2014-02-05 02:52:02 -08:00
parent 13268a1fa8
commit 4163e24956

View File

@ -347,8 +347,6 @@ sub interpretCommandline
my $Nfields = scalar split( ' ', $options{timefmt}); my $Nfields = scalar split( ' ', $options{timefmt});
$options{timefmt_Ncols} = $Nfields; $options{timefmt_Ncols} = $Nfields;
my $regex_str = join( '\s+', ('\S+') x $Nfields );
$options{timefmt_regex} = qr/$regex_str/;
# make sure --xlen is an integer. With a timefmt xlen goes through strptime # make sure --xlen is an integer. With a timefmt xlen goes through strptime
# and strftime, and those are integer-only # and strftime, and those are integer-only
@ -573,16 +571,6 @@ sub mainThread
setCurveAsHistogram( $_ ) foreach (@{$options{histogram}}); setCurveAsHistogram( $_ ) foreach (@{$options{histogram}});
# regexp for a possibly floating point, possibly scientific notation number
my $numRE = '-?\d*\.?\d+(?:[Ee][-+]?\d+)?';
my $domainRE = $options{timefmt_regex} || $numRE;
# a point may be preceded by an id
my $pointRE = $options{dataid} ? '(\S+)\s+' : '()';
$pointRE .= '(' . join('\s+', ($numRE) x $valuesPerPoint) . ')';
$pointRE = qr/$pointRE/;
# set all the axis ranges # set all the axis ranges
# If a bound isn't given I want to set it to the empty string, so I can communicate it simply to # If a bound isn't given I want to set it to the empty string, so I can communicate it simply to
# gnuplot # gnuplot
@ -651,18 +639,37 @@ sub mainThread
# line is used) # line is used)
# 3d plots require $options{domain}, and dictate "x y" for the domain instead of just "x" # 3d plots require $options{domain}, and dictate "x y" for the domain instead of just "x"
my @fields = split;
if($options{domain}) if($options{domain})
{ {
/($domainRE)/go or next; if( $options{timefmt} )
$domain[0] = $1;
$domain0_numeric = makeDomainNumeric( $domain[0] );
if($options{'3d'})
{ {
/($numRE)/go or next; # no point if doing anything unless I have at least the domain and
$domain[1] = $1; # 1 piece of data
next if @fields < $options{timefmt_Ncols}+1;
$domain[0] = join (' ', splice( @fields, 0, $options{timefmt_Ncols}) );
$domain0_numeric = makeDomainNumeric( $domain[0] );
} }
elsif( $options{monotonic} ) elsif(!$options{'3d'})
{
# no point if doing anything unless I have at least the domain and
# 1 piece of data
next if @fields < 1+1;
$domain[0] = $domain0_numeric = shift @fields;
}
else
{
# no point if doing anything unless I have at least the domain and
# 1 piece of data
next if @fields < 2+1;
@domain = splice(@fields, 0, 2);
}
if( $options{monotonic} )
{ {
if( defined $latestX && $domain0_numeric < $latestX ) if( defined $latestX && $domain0_numeric < $latestX )
{ {
@ -676,7 +683,6 @@ sub mainThread
else else
{ $latestX = $domain0_numeric; } { $latestX = $domain0_numeric; }
} }
} }
else else
{ {
@ -684,8 +690,7 @@ sub mainThread
# $. on the data queue in that case # $. on the data queue in that case
if(defined $dataQueue) if(defined $dataQueue)
{ {
s/ ([\d]+)$//o; $domain[0] = pop @fields;
$domain[0] = $1;
} }
else else
{ {
@ -695,13 +700,25 @@ sub mainThread
} }
my $id = -1; my $id = -1;
while (/$pointRE/go)
while(@fields)
{ {
if($1 ne '') {$id = $1;} if($options{dataid})
else {$id++; } {
last if @fields < 1 + $valuesPerPoint;
$id = shift @fields;
}
else
{
last if @fields < $valuesPerPoint;
$id++;
}
pushPoint(getCurve($id), pushPoint(getCurve($id),
"@domain $2\n", $domain0_numeric); join(' ',
@domain,
splice( @fields, 0, $valuesPerPoint ) ) . "\n",
$domain0_numeric);
} }
} }
} }