Code

* Created "old" branch and moved stuff
[gosa.git] / branches / old / gosa-plugins / mail / personal / mail / sieve / class_scanner.inc
diff --git a/branches/old/gosa-plugins/mail/personal/mail/sieve/class_scanner.inc b/branches/old/gosa-plugins/mail/personal/mail/sieve/class_scanner.inc
new file mode 100644 (file)
index 0000000..3e22bb1
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+class Scanner
+{
+       function Scanner(&$script)
+       {
+               $this->_construct($script);
+       }
+
+       function _construct(&$script)
+       {
+               if ($script === null)
+               {
+                       return;
+               }
+
+               $this->tokenize($script);
+       }
+
+       function setCommentFunc($callback)
+       {
+               if ($callback == null || is_callable($callback))
+               {
+                       $this->commentFn_ = $callback;
+               }
+       }
+
+       function tokenize(&$script)
+       {
+               $pos = 0;
+               $line = 1;
+               $script_length = mb_strlen($script);
+
+               while ($pos < $script_length)
+               {
+                       foreach ($this->token_match_ as $class => $regex)
+                       {
+                               if (preg_match('/^'. $regex .'/', mb_substr($script, $pos), $match))
+                               {
+                                       $length = mb_strlen($match[0]);
+
+                                       if ($class != 'whitespace')
+                                       {
+                                               array_push($this->tokens_, array(
+                                                       'class' => $class,
+                                                       'text'  => chop(mb_substr($script, $pos, $length)),
+                                                       'line'  => $line,
+                                               ));
+                                       }
+                                       if ($class == 'unknown')
+                                       {
+                                               return;
+                                       }
+
+                                       $pos += $length;
+                                       $line += mb_substr_count($match[0], "\n");
+                                       break;
+                               }
+                       }
+               }
+
+               array_push($this->tokens_, array(
+                       'class' => 'script-end',
+                       'text'  => 'script-end',
+                       'line'  => $line,
+               ));
+       }
+
+       function nextTokenIs($class)
+       {
+               $offset = 0;
+               do
+               {
+                       $next = $this->tokens_[$this->tokenPos_ + $offset++]['class'];
+               }
+               while ($next == 'comment');
+
+               if (is_array($class))
+               {
+                       return in_array($next, $class);
+               }
+               else if (is_string($class))
+               {
+                       return (strcmp($next, $class) == 0);
+               }
+               return false;
+       }
+
+       function peekNextToken()
+       {
+               return $this->tokens_[$this->tokenPos_];
+       }
+
+       function nextToken()
+       {
+               $token = $this->tokens_[$this->tokenPos_++];
+               while ($token['class'] == 'comment')
+               {
+                       if ($this->commentFn_ != null)
+                       {
+                               call_user_func($this->commentFn_, $token);
+                       }
+                       $token = $this->tokens_[$this->tokenPos_++];
+               }
+               return $token;
+       }
+
+       function scriptStart()
+       {
+               return array(
+                       'class' => 'script-start',
+                       'text'  => 'script-start',
+                       'line'  => 1,
+               );
+       }
+
+       var $commentFn_ = null;
+       var $tokenPos_ = 0;
+       var $tokens_ = array();
+       var $token_match_ = array (
+               'left-bracket'   =>  '\[',
+               'right-bracket'  =>  '\]',
+               'block-start'    =>  '\{',
+               'block-end'      =>  '\}',
+               'left-parant'    =>  '\(',
+               'right-parant'   =>  '\)',
+               'comma'          =>  ',',
+               'semicolon'      =>  ';',
+               'whitespace'     =>  '[ \r\n\t]+',
+               'tag'            =>  ':[[:alpha:]_][[:alnum:]_]*(?=\b)',
+               'quoted-string'  =>  '"(?:\\[\\"]|[^\x00"])*"',
+               'number'         =>  '[[:digit:]]+(?:[KMG])?(?=\b)',
+               'comment'        =>  '(?:\/\*(?:[^\*]|\*(?=[^\/]))*\*\/|#[^\r\n]*\r?\n)',
+               'multi-line'     =>  'text:[ \t]*(?:#[^\r\n]*)?\r?\n(\.[^\r\n]+\r?\n|[^\.]*\r?\n)*\.\r?\n',
+               'identifier'     =>  '[[:alpha:]_][[:alnum:]_]*(?=\b)',
+               'unknown token'  =>  '[^ \r\n\t]+'
+       );
+}
+
+?>
\ No newline at end of file