#!/usr/bin/perl #print &ReadE(&Assign("x=T&y=F","(x & (y | y))")); &main(); sub main { if (&ParseForm(*form)) { print "Content-type: text/plain","\n\n"; &Table(&GetExpr($form{'expr'} . " ")) } else { local $again; do { &Table(&GetExpr()); print "Again? "; $again = ; } while ($again =~ /y{1,1}?(es)?/i); } exit; } sub GetExpr { local $expr; if ($_[0] ne undef) { $expr = $_[0]; } else { print "Give me an expression (blank line to quit):"; $expr = ; } local %varlist; local @varlist; while ($expr =~ m/(\w+?)\W/g) { unless ($varlist{$1} == 1) { push @varlist,$1; $varlist{$1} = 1; } } chop($expr); $expr .= " "; if (scalar(@varlist) > 10) { print "Too many variables. 10 max."; die; } # foreach (@varlist) { print $_,"\n"; } # die; return $expr,@varlist; } sub Table { local ($expr,@varlist) = @_; local $len; @foo = @{&Construct(\@varlist)}; foreach(@varlist) { print $_," | "; $len += length($_) + 2; } print "\n"; print "-" x $len; print "-" x 3; print "\n"; foreach (@foo) { local %keyval; $val = &ReadE(&Assign($_,$expr,\%keyval)); foreach $var (@varlist) { print $keyval{$var}," " x length($var),"| "; } $val =~ s/\s//g; if (length($val) > 1) { print "Error\n"; } else { print $val,"\n"; } break; } } sub Construct { local ($array) = @_; local @array = @$array; local $key = pop @array; if (scalar(@array) <= 0) {return ["$key=T","$key=F"];} local @ret; local $vals = &Construct(\@array); foreach (@$vals) { push @ret,"$key=T&" . $_, "$key=F&" . $_; } return \@ret; } sub Assign { local ($assignments,$string,$hashref) = @_; @ass = split /\&/,$assignments; foreach (@ass) { my ($name,$value) = split /\=/,$_; if (!($name ne "T" || $name ne "F")) { $value = "F"; } $string =~ s/$name(\W)/$value$1/g; $$hashref{$name} = $value; } return $string; } sub ReadE { local ($string) = @_; local $i; for ($i = 0; $i < length($string); $i++) { $ch = substr($string,$i,1); if ($ch eq "(") { # print "going from $string\n"; substr($string,$i) = &ReadE(substr($string,$i + 1)); # print "received return $i\n"; # print "to $string\n"; } elsif ($ch eq ")") { #print "going from $string\n"; substr($string,0,$i + 1) = &EvalE(substr($string,0,$i)); #print "to $string on $i\n"; # print "returning"; return $string; # $i = 0; break; } # print "$string\n"; } return &EvalE($string); #return $string; } sub EvalE { local $string = $_[0]; local $i; # print "given $string\n"; do { $i = 0; $i += ($string =~ s/\~T/F/g); $i += ($string =~ s/\~F/T/g); $i += ($string =~ s/F\s*\&\s*F/F/g); $i += ($string =~ s/F\s*\&\s*T/F/g); $i += ($string =~ s/T\s*\&\s*F/F/g); $i += ($string =~ s/T\s*\&\s*T/T/g); $i += ($string =~ s/F\s*\|\s*F/F/g); $i += ($string =~ s/F\s*\|\s*T/T/g); $i += ($string =~ s/T\s*\|\s*F/T/g); $i += ($string =~ s/T\s*\|\s*T/T/g); $i += ($string =~ s/T\s*\-\>\s*T/T/g); $i += ($string =~ s/T\s*\-\>\s*F/F/g); $i += ($string =~ s/F\s*\-\>\s*T/T/g); $i += ($string =~ s/F\s*\-\>\s*F/T/g); $i += ($string =~ s/T\s*\<\-\s*T/T/g); $i += ($string =~ s/T\s*\<\-\s*F/T/g); $i += ($string =~ s/F\s*\<\-\s*T/F/g); $i += ($string =~ s/F\s*\<\-\s*F/T/g); $i += ($string =~ s/T\s*\<\-\>\s*T/T/g); $i += ($string =~ s/T\s*\<\-\>\s*F/F/g); $i += ($string =~ s/F\s*\<\-\>\s*T/F/g); $i += ($string =~ s/F\s*\<\-\>\s*F/T/g); # if ($i > 0) { print "$i is greater than 0 on $string\n"; } # else { print "found them all for $string\n"; } } while ($i > 0); # print "returining $string\n"; return $string; } sub ParseForm { if (! (defined $ENV{'QUERY_STRING'})) { return 0; } local (*FORM_DATA) = @_; local ($request_method, $query_string, @key_value_pairs, $key_value, $key, $value); $request_method = $ENV{'REQUEST_METHOD'}; if ($request_method eq "GET") { $query_string = $ENV{'QUERY_STRING'}; } elsif ($request_method eq "POST") { read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); } else { return 0; } @key_value_pairs = split (/&/, $query_string); foreach $key_value (@key_value_pairs) { ($key, $value) = split (/=/, $key_value); $value =~ tr/+/ /; $value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg; if (defined($FORM_DATA{$key})) { $FORM_DATA{$key} = join ("\0", $FORM_DATA{$key}, $value); } else { $FORM_DATA{$key} = $value; } } return 1; }