X-Git-Url: http://git.pk910.de/?p=PHP-P10.git;a=blobdiff_plain;f=BotLoader%2Fsaxdb.class.php;fp=BotLoader%2Fsaxdb.class.php;h=15b36c2669a4a97f40021705c6e2e021d7ad5b4a;hp=0000000000000000000000000000000000000000;hb=412e324075de1312fbc5f49b735180b46cdff82c;hpb=33c63e89baea7b16b507f55b0ea76a39cbc97f4f diff --git a/BotLoader/saxdb.class.php b/BotLoader/saxdb.class.php new file mode 100644 index 0000000..15b36c2 --- /dev/null +++ b/BotLoader/saxdb.class.php @@ -0,0 +1,172 @@ +database = $this->parseDB($db); + } + } + + public function writeDB($name) { + $fp = fopen($name, "w"); + $db = $this->serializeDB($this->database); + fwrite($fp, $db); + fclose($fp); + } + + public function getSection($name) { + if(array_key_exists($name, $this->database)) { + return $this->database[$name]; + } else { + return array(); + } + } + + public function setSection($name, $value) { + $this->database[$name] = $value; + } + + private function parseDB($db) { + $parserflags = 0; + $openblocks = 0; + $buffer = ""; + $cache = array(); + $output = array(); + for($i = 0; $i < strlen($db); $i++) { + if(($parserflags & self::PARSER_ISBLOCK) && $db[$i] != "{" && $db[$i] != "}") { + $buffer .= $db[$i]; + continue; + } + if(($parserflags & self::PARSER_ISSTRING) && $db[$i] != "\"") { + $buffer .= $db[$i]; + continue; + } + if($parserflags & self::PARSER_ISESCAPED) { + $buffer .= $db[$i]; + $parserflags &= ~self::PARSER_ISESCAPED; + continue; + } + switch($db[$i]) { + case "\\": + $parserflags |= self::PARSER_ISESCAPED; + break; + case "\"": + if($parserflags & self::PARSER_ISSTRING) { + $parserflags &= ~self::PARSER_ISSTRING; + if($parserflags & self::PARSER_STRING_LIST) { + $cache['list'][] = $buffer; + } else if($parserflags & self::PARSER_EXPECT_VALUE) { + //we've got a full entry + $output[$cache['name']] = $buffer; + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } else { + //we've only got the name of the next entry + $cache['name'] = $buffer; + $parserflags |= self::PARSER_EXPECT_VALUE; + } + } else { + $buffer = ""; //clear the buffer + $parserflags |= self::PARSER_ISSTRING; + } + break; + case "{": + //block (it must be a value) + if($parserflags & self::PARSER_ISBLOCK) { + $openblocks++; + $buffer .= $db[$i]; + } else { + $parserflags |= self::PARSER_ISBLOCK; + $buffer = ""; + } + break; + case "}": + if($parserflags & self::PARSER_ISBLOCK) { + $openblocks--; + if($openblocks == -1) { + $parserflags &= ~self::PARSER_ISBLOCK; + if($parserflags & self::PARSER_EXPECT_VALUE) { + $output[$cache['name']] = $this->parseDB($buffer); + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } + } else { + $buffer .= $db[$i]; + } + } + break; + case "(": + if(!($parserflags & self::PARSER_STRING_LIST)) { + $cache['list'] = array(); + $parserflags |= self::PARSER_STRING_LIST; + } + break; + case ")": + if(($parserflags & self::PARSER_STRING_LIST)) { + $parserflags &= ~self::PARSER_STRING_LIST; + if($parserflags & self::PARSER_EXPECT_VALUE) { + $output[$cache['name']] = $cache['list']; + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } + } + break; + default: + $buffer .= $db[$i]; + break; + } + } + return $output; + } + + private function serializeDB($db, $dbstring = "") { + foreach($db as $name => $value) { + if(!is_array($value) && !is_string($value) && !is_numeric($value)) continue; + $dbstring .= "\"".str_replace("\"","\\\"", $name)."\""; + if(is_array($value)) { + $dbstring .= "{"; + $dbstring .= $this->serializeDB($value, $dbstring); + $dbstring .= "}"; + } else { + $dbstring .= "\"".str_replace("\"","\\\"", $value)."\""; + } + } + return $dbstring; + } + +} + +?> \ No newline at end of file