. * * * ************************************************************************ * * BotLoader/saxdb.class.php * * Simple PHP P10 database. * */ class saxdb { const PARSER_ISSTRING = 0x0001; const PARSER_ISESCAPED = 0x0002; const PARSER_ISBLOCK = 0x0004; const PARSER_EXPECT_VALUE = 0x0008; const PARSER_STRING_LIST = 0x0010; private $database = array(); public function loadDB($name) { if(file_exists($name)) { $fp = fopen($name, "r"); $db = fread($fp, filesize($name)); fclose($fp); $this->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)) { echo"invalid type ".gettype($value)."\n"; continue; } $dbstring .= "\"".str_replace("\"","\\\"", $name)."\""; if(is_array($value)) { $dbstring .= "{"; $dbstring .= $this->serializeDB($value); $dbstring .= "}"; } else { $dbstring .= "\"".str_replace("\"","\\\"", $value)."\""; } } return $dbstring; } } ?>