]> git.proxmox.com Git - pve-common.git/commitdiff
improve parse_config in JSONSchema and SectionConfig
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Wed, 15 Jul 2015 08:09:41 +0000 (10:09 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Wed, 22 Jul 2015 06:15:54 +0000 (08:15 +0200)
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
src/PVE/SectionConfig.pm

index 36a2de994e35cf1c7f8f4655a4f13c0334e6f5fc..d9d254af6e886df4168eed6113c28e1d63d4d8c3 100644 (file)
@@ -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} && 
index 06ebbe79cf11cea7545dc21b71c279d085b08265..5fc479eb7b446d90ec228fa9e493cd7d1ccbfdee 100644 (file)
@@ -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";