stop allowing NOTs to endlessly nest
authorIan Beckwith <ianb@erislabs.net>
Sat, 2 Oct 2010 02:45:25 +0000 (03:45 +0100)
committerIan Beckwith <ianb@erislabs.net>
Sat, 2 Oct 2010 02:45:25 +0000 (03:45 +0100)
lib/ID3FS/Path.pm

index 09ab418..fdef5c3 100644 (file)
@@ -85,7 +85,14 @@ sub dirents
     }
     elsif($state==$STATE_BOOLEAN)
     {
-       @dents=("NOT", $self->{db}->tags(@{$self->{elements}}));
+       my $parent=$self->{elements}->[$#{$self->{elements}}];
+       unless(defined($parent) &&
+              ref($parent) eq "ID3FS::PathElement::Boolean" &&
+              $parent->{name} eq "NOT")
+       {
+           push(@dents, "NOT");
+       }
+       push(@dents, $self->{db}->tags(@{$self->{elements}}));
     }
     elsif($state==$STATE_ROOT)
     {
@@ -208,9 +215,18 @@ sub parse
        elsif($state==$STATE_BOOLEAN)
        {
 #          print "SM: BOOLEAN: $name\n";
-           if($name eq "NOT")
+           my $parent=$self->{elements}->[$#{$self->{elements}}];
+           my $allownot=1;
+           if(defined($parent) &&
+              ref($parent) eq "ID3FS::PathElement::Boolean" &&
+              $parent->{name} eq "NOT")
+           {
+               $allownot=0;
+           }
+           if($allownot && $name eq "NOT")
            {
                $self->state($STATE_BOOLEAN);
+               push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name));
            }
            else
            {