Advertisement
KeplerBR

[Macro Plugin] Variáveis locais (p1)

Feb 16th, 2015
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 8.03 KB | None | 0 0
  1. Index: Parser.pm
  2. ===================================================================
  3. --- Parser.pm   (revision 8956)
  4. +++ Parser.pm   (working copy)
  5. @@ -6,8 +6,7 @@
  6.  
  7.  require Exporter;
  8.  our @ISA = qw(Exporter);
  9. -our @EXPORT = qw(parseMacroFile parseCmd isNewCommandBlock);
  10. -our @EKSPORT_OK = qw(parseCmd isNewCommandBlock);
  11. +our @EXPORT = qw(parseMacroFile parseCmd isNewCommandBlock setVariable);
  12.  
  13.  use Globals;
  14.  use Utils qw/existsInList/;
  15. @@ -45,19 +44,40 @@
  16.         s/\s*[\r\n]?$//g;   # remove trailing whitespaces and eol
  17.         s/  +/ /g;      # trim down spaces - very cool for user's string data?
  18.         next unless ($_);
  19. -
  20. -       if (!%block && /{$/) {
  21. -           my ($key, $value) = $_ =~ /^(.*?)\s+(.*?)\s*{$/;
  22. -           if ($key eq 'macro') {
  23. -               %block = (name => $value, type => "macro");
  24. -               $macro{$value} = []
  25. -           } elsif ($key eq 'automacro') {
  26. -               %block = (name => $value, type => "auto")
  27. -           } elsif ($key eq 'sub') {
  28. -               %block = (name => $value, type => "sub")
  29. -           } else {
  30. -               %block = (type => "bogus");
  31. -               warning "$file: ignoring line '$_' in line $. (munch, munch, strange block)\n"
  32. +      
  33. +       if (!%block) {
  34. +           if (/{$/) {
  35. +               my ($key, $value) = $_ =~ /^(.*?)\s+(.*?)\s*{$/;
  36. +               if ($key eq 'macro') {
  37. +                   %block = (name => $value, type => "macro");
  38. +                   $macro{$value} = []
  39. +               } elsif ($key eq 'automacro') {
  40. +                   %block = (name => $value, type => "auto")
  41. +               } elsif ($key eq 'sub') {
  42. +                   %block = (name => $value, type => "sub")
  43. +               } else {
  44. +                   %block = (type => "bogus");
  45. +                   warning "$file: ignoring line '$_' in line $. (munch, munch, strange block)\n"
  46. +               }
  47. +           } elsif (/^\$[a-z]/i) {
  48. +               my ($var, $val);
  49. +               if (($var, $val) = $_ =~ /^\$([a-z][a-z\d]*?)\s+=\s+(.*)/i) {
  50. +                   my $placeError; # gambiarra para substituir o self, que armazena algo caso tenha erro
  51. +                   setVariable($var, $val, $placeError, "error in $.");
  52. +                   if (defined $placeError->{error}) {return warning $placeError->{error}}
  53. +               }
  54. +           } elsif (/^\$\{\$[.a-z]/i) {
  55. +               my ($dvar, $val);
  56. +               if (($dvar, $val) = $_ =~ /^\$\{\$([.a-z][a-z\d]*?)\}\s+=\s+(.*)/i) {
  57. +                   my $var = $varStack{$dvar};
  58. +                   unless (defined $var) {warning "$file: ignoring '$_' in line $. (munch, munch, $dvar not defined)\n"}
  59. +                   else {
  60. +                       my $placeError; # gambiarra para substituir o self, que armazena algo caso tenha erro
  61. +                       setVariable("#$var", $val, $placeError, "error in $.");
  62. +                       if (defined $placeError->{error}) {return warning $placeError->{error}}
  63. +                       # TODO: Falta ajeitar o tratamento de erro
  64. +                   }
  65. +               }
  66.             }
  67.             next
  68.         }
  69. @@ -373,4 +393,17 @@
  70.     }
  71.  }
  72.  
  73. +# TODO: Coloco aqui ou no Script.pm?
  74. +sub setVariable {
  75. +   my ($var, $val, $self, $errtpl) = @_;
  76. +
  77. +   my $pval = parseCmd($val, $self);
  78. +   if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
  79. +   if (defined $pval) {
  80. +       if ($pval =~ /^\s*(?:undef|unset)\s*$/i && exists $varStack{$var}) {undef $varStack{$var}}
  81. +       else {$varStack{$var} = $pval}
  82. +   }
  83. +   else {$self->{error} = "$errtpl: $val failed"}
  84. +}
  85. +
  86.  1;
  87. Index: Script.pm
  88. ===================================================================
  89. --- Script.pm   (revision 8956)
  90. +++ Script.pm   (working copy)
  91. @@ -10,7 +10,7 @@
  92.  use Globals;
  93.  use AI;
  94.  use Macro::Data;
  95. -use Macro::Parser qw(parseCmd isNewCommandBlock);
  96. +use Macro::Parser qw(parseCmd isNewCommandBlock setVariable);
  97.  use Macro::Utilities qw(cmpr);
  98.  use Macro::Automacro qw(releaseAM lockAM);
  99.  use Log qw(message warning);
  100. @@ -44,7 +44,9 @@
  101.             error => undef,
  102.             orphan => $::config{macro_orphans},
  103.             interruptible => 1,
  104. -           macro_block => 0
  105. +           macro_block => 0,
  106. +           countCurrentBlock => 0,
  107. +           listLocalVarStack => ()
  108.  
  109.     };
  110.     if (defined $lastname && defined $lastline) {
  111. @@ -219,6 +221,13 @@
  112.    
  113.     my $errtpl = "error in ".$self->{line};
  114.  
  115. +   #print("--------------------\n");
  116. +   #print($line . "\n");
  117. +   #print("countCurrentBlock: " . $self->{countCurrentBlock} . "\n");
  118. +   #if ($self->{listLocalVarStack}[$self->{countCurrentBlock}]) {
  119. +   #   print("listLocalVarStack: " . join(", ", @{$self->{listLocalVarStack}[$self->{countCurrentBlock}]}) . "\n");
  120. +   #}
  121. +  
  122.     # "If" postfix control
  123.     if ($line =~ /.+\s+if\s*\(.*\)$/) {
  124.         my ($text) = $line =~ /.+\s+if\s*\(\s*(.*)\s*\)$/;
  125. @@ -289,6 +298,7 @@
  126.                     if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
  127.                     $savetxt = particle($text, $self, $errtpl);
  128.                     if (multi($savetxt, $self, $errtpl)) {
  129. +                       $self->{countCurrentBlock}++;
  130.                         $countBlockIf--;
  131.                     }
  132.                 }
  133. @@ -364,6 +374,12 @@
  134.     ##########################################
  135.     # end block of "if" or "switch"
  136.     } elsif ($line eq '}') {
  137. +       if ($self->{listLocalVarStack}[$self->{countCurrentBlock}]) {
  138. +           foreach (@{$self->{listLocalVarStack}[$self->{countCurrentBlock}]}) {
  139. +               delete $varStack{$_};
  140. +           }
  141. +       }
  142. +       $self->{countCurrentBlock}--;
  143.         $self->{line}++;
  144.         $self->{timeout} = 0
  145.  
  146. @@ -399,24 +415,27 @@
  147.         return $self->{result} if $self->{result}
  148.     ##########################################
  149.     # set variable: $variable = value
  150. -   } elsif ($line =~ /^\$[a-z]/i) {
  151. -       my ($var, $val);
  152. +   } elsif ($line =~ /^(?:local\s+)?\$[a-z]/i) {
  153. +       my ($isLocal, $var, $val);
  154.         if ($line =~ /;/) {run_sublines($line, $self); if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}}
  155.         else {
  156. -           if (($var, $val) = $line =~ /^\$([a-z][a-z\d]*?)\s+=\s+(.*)/i) {
  157. -               my $pval = parseCmd($val, $self);
  158. -               if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
  159. -               if (defined $pval) {
  160. -                   if ($pval =~ /^\s*(?:undef|unset)\s*$/i && exists $varStack{$var}) {undef $varStack{$var}}
  161. -                   else {$varStack{$var} = $pval}
  162. -               }
  163. -               else {$self->{error} = "$errtpl: $val failed"}
  164. +           $line =~ /^(local\s+)?\$(.*)$/i;
  165. +           if ($1) {
  166. +               $isLocal = 1;
  167. +           } else {
  168. +               $isLocal = 0;
  169.             }
  170. -           elsif (($var, $val) = $line =~ /^\$([a-z][a-z\d]*?)([+-]{2})$/i) {
  171. +           if (($var, $val) = $2 =~ /^([a-z][a-z\d]*?)\s+=\s+(.*)/i) {
  172. +               setVariable($var, $val, $self, $errtpl);
  173. +           }
  174. +           elsif (($var, $val) = $2 =~ /^([a-z][a-z\d]*?)([+-]{2})$/i) {
  175.                 if ($val eq '++') {$varStack{$var} = ($varStack{$var} or 0)+1}
  176.                 else {$varStack{$var} = ($varStack{$var} or 0)-1}
  177.             }
  178.             else {$self->{error} = "$errtpl: unrecognized assignment"}
  179. +           if ($isLocal) {
  180. +               push(@{$self->{listLocalVarStack}[$self->{countCurrentBlock}]}, $var);
  181. +           }
  182.         }
  183.         $self->{line}++;
  184.         $self->{timeout} = 0 unless defined $self->{mainline_delay} && defined $self->{subline_delay};
  185. @@ -431,13 +450,7 @@
  186.                 my $var = $varStack{$dvar};
  187.                 unless (defined $var) {$self->{error} = "$errtpl: $dvar not defined"}
  188.                 else {
  189. -                   my $pval = parseCmd($val, $self);
  190. -                   if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
  191. -                   unless (defined $pval) {$self->{error} = "$errtpl: $val failed"}
  192. -                   else {
  193. -                       if ($pval =~ /^\s*(?:undef|unset)\s*$/i) {undef $varStack{"#$var"}}
  194. -                       else {$varStack{"#$var"} = $pval}
  195. -                   }
  196. +                   setVariable("#$var", $val, $self, $errtpl);
  197.                 }
  198.             }
  199.             elsif (($dvar, $val) = $line =~ /^\$\{\$([.a-z][a-z\d]*?)\}([+-]{2})$/i) {
  200. @@ -834,6 +847,9 @@
  201.             $self->{timeout} = $self->{macro_delay}
  202.         }
  203.     }
  204. +   elsif ($then =~ /^{$/) {
  205. +       $self->{countCurrentBlock}++;
  206. +   }
  207.     elsif ($then eq "stop") {$self->{finished} = 1}
  208.  }
  209.  
  210. Index: Utilities.pm
  211. ===================================================================
  212. --- Utilities.pm    (revision 8956)
  213. +++ Utilities.pm    (working copy)
  214. @@ -477,7 +477,17 @@
  215.             }
  216.         }
  217.         $queue->ok;
  218. -       if (defined $queue && $queue->finished) {undef $queue}
  219. +       if (defined $queue && $queue->finished) {
  220. +           while ($queue->{countCurrentBlock} >= 0) {
  221. +               if ($queue->{listLocalVarStack}[$queue->{countCurrentBlock}]) {
  222. +                   foreach (@{$queue->{listLocalVarStack}[$queue->{countCurrentBlock}]}) {
  223. +                       delete $varStack{$_};
  224. +                   }
  225. +               }
  226. +               $queue->{countCurrentBlock}--;
  227. +           }
  228. +           undef $queue
  229. +       }
  230.     } else {
  231.         my $name = (defined $queue->{subcall}) ? $queue->{subcall}->name : $queue->name;
  232.         my $error = $queue->error;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement