From 3c4d612a70d9521345a54f520f183c8551ff3ad4 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Wed, 15 Jul 2015 10:09:41 +0200 Subject: [PATCH] improve parse_config in JSONSchema and SectionConfig The old code used string substitution for every line of the input string, while perl can also iterate over all matches via the /g re modifier, and can turn ^ and $ to act as beginning/end of line via the /m modifier. Effectively allowing a "match over all lines" via a simple while ($data =~ /^.*$/gm); The situation is a little different in SectionConfig because there's a nested loop invovled which doesn't work with /g. For this there are two options and I chose the safer one by simply doing a split on newlines first. The alternative would be to open the data as a filehandle-to-string and use <$fh> to read lines, however I'd have to throw in an eval{} to be sure to close the handle afterwards. --- src/PVE/JSONSchema.pm | 9 ++++----- src/PVE/SectionConfig.pm | 27 ++++++++++++--------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index 36a2de9..d9d254a 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -1150,13 +1150,12 @@ sub parse_config { my $cfg = {}; - while ($raw && $raw =~ s/^(.*?)(\n|$)//) { + while ($raw =~ /^\s*(.+?)\s*$/gm) { my $line = $1; - - next if $line =~ m/^\#/; # skip comment lines - next if $line =~ m/^\s*$/; # skip empty lines - if ($line =~ m/^(\S+):\s*(\S+)\s*$/) { + next if $line =~ /^#/; + + if ($line =~ m/^(\S+?):\s*(.*)$/) { my $key = $1; my $value = $2; if ($schema->{properties}->{$key} && diff --git a/src/PVE/SectionConfig.pm b/src/PVE/SectionConfig.pm index 06ebbe7..5fc479e 100644 --- a/src/PVE/SectionConfig.pm +++ b/src/PVE/SectionConfig.pm @@ -231,19 +231,22 @@ sub parse_config { my $ids = {}; my $order = {}; - my $digest = Digest::SHA::sha1_hex(defined($raw) ? $raw : ''); + $raw = '' if !defined($raw); + + my $digest = Digest::SHA::sha1_hex($raw); my $pri = 1; my $lineno = 0; + my @lines = split(/\n/, $raw); + my $nextline = sub { + while (my $line = shift @lines) { + $lineno++; + return $line if $line !~ /^\s*(?:#|$)/; + } + }; - while ($raw && $raw =~ s/^(.*?)(\n|$)//) { - my $line = $1; - $lineno++; - - next if $line =~ m/^\#/; - next if $line =~ m/^\s*$/; - + while (my $line = &$nextline()) { my $errprefix = "file $filename line $lineno"; my ($type, $sectionId, $errmsg, $config) = $class->parse_section_header($line); @@ -266,13 +269,7 @@ sub parse_config { } } - while ($raw && $raw =~ s/^(.*?)(\n|$)//) { - $line = $1; - $lineno++; - - next if $line =~ m/^\#/; - last if $line =~ m/^\s*$/; - + while ($line = &$nextline()) { next if $ignore; # skip $errprefix = "file $filename line $lineno"; -- 2.39.2