X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/14c04a50fa02ad20cb6bfbc72d57c97dd098c235..37e08c82c2958b3b96ada2bf76a9578f1dbbb2b3:/tools/db.php diff --git a/tools/db.php b/tools/db.php index 85329bd..3f2a936 100644 --- a/tools/db.php +++ b/tools/db.php @@ -1,115 +1,178 @@ -
  reads in the DB, parses it then print_r's it
  if it comes across a syntax it doesnt know it stops parsing and puts the remaining data, all of it in ['parserror'] in whatever array its working in
-*/
-
-$conf['dbfile'] = "x3.db";
-
-$dh = fopen($conf['dbfile'], "r");
-
-$contents = fread($dh, filesize($conf['dbfile']));
-
-fclose($dh);
 
-function parse_data ($data = "") {
-    static $passback = "";
-    $working = $data;
-    $return = array();
-    $loop = true;
-
-    if ( $data != "" ) {
-        while ( $loop ) {
-            if ( preg_match("/^\s*\/\/([^\n\r]*)[\n\r]*(.*)\$/s", $working, $matches) ) {
-                /* ignore // comments */
-                $working = $matches[2];
-            } else if ( preg_match("/^\s*#([^\n\r]*)[\n\r]*(.*)\$/s", $working, $matches) ) {
-                /* ignore # comments */
-                $working = $matches[2];
-            } else if ( preg_match("/^\s*\/\*(.*?)\*\/\s*(.*)\$/s", $working, $matches) ) {
-                // ignore /* */ comments
-                $working = $matches[2];
-            } else if ( preg_match("/^\s*\}\s*;\s*(.*)\$/s", $working, $matches) ) {
-                /* section end */
-                $passback = $matches[1];
-                $loop = false;
-            } else if ( preg_match("/^\s*((\"(((\\\\\")|[^\"])+)\")|([^\s]+))\s*\{\s*(.*)\$/s", $working, $matches) ) {
-                /* section start (name quoted) */
-                if ( $matches[3] != "" ) {
-                    $return[strtolower($matches[3])] = parse_data($matches[7]);
-                } else {
-                    $return[strtolower($matches[1])] = parse_data($matches[7]);
-                }
-                $working = $passback;
-            } else if ( preg_match("/^\s*((\"(((\\\\\")|[^\"])+)\")|([^\s]+))\s*\(\s*((((\"(((\\\\\")|[^\"])+)\")|([^\s,]+))\s*(,\s*((\"(((\\\\\")|[^\"])+)\")|([^\s,]+))\s*)*)?)\s*\)\s*;\s*(.*)\$/s", $working, $matches) ) {
-                /* array */
-                $arraycontents = $matches[7];
-                $array = array();
-                while ( preg_match("/[^\s]+/", $arraycontents) ) {
-                    preg_match("/^\s*,?\s*((\"(((\\\\\")|[^\"])+)\")|([^\s,]+))\s*(.*)/s", $arraycontents, $arraymatches);
-                    if ( $arraymatches[3] != "" ) {
-                        $array[] = $arraymatches[3];
-                    } else {
-                        $array[] = $arraymatches[1];
-                    }
-                    $arraycontents = $arraymatches[7];
-                }
-                if ( $matches[3] != "" ) {
-                    $return[strtolower($matches[3])] = $array;
-                } else {
-                    $return[strtolower($matches[1])] = $array;
-                }
-                $working = $matches[22];
-            } else if ( preg_match("/^\s*((\"(((\\\\\")|[^\"])+)\")|([^\s,]+))\s*(((\"(((\\\\\")|[^\"])+)\")|([^\s,]+)))?\s*;\s*(.*)\$/s", $working, $matches) ) {
-                /* name value pair */
-                if ( $matches[3] != "" ) {
-                    $key = strtolower($matches[3]);
-                } else {
-                    $key = strtolower($matches[1]);
-                }
-                if ( $matches[7] != "" ) {
-                    if ( $matches[10] != "" ) {
-                        $val = $matches[10];
-                    } else {
-                        $val = $matches[7];
-                    }
-                    if ( isset($return[$key]) ) {
-                        if ( !is_array($return[$key]) ) {
-                            $temp = $return[$key];
-                            unset($return[$key]);
-                            $return[$key][] = $temp;
-                            $return[$key][] = $val;
-                        } else {
-                            $return[$key][] = $val;
-                        }
-                    } else {
-                        $return[$key] = $val;
-                    }
-                } else {
-                    $return[$key] = array();
-                }
-                $working = $matches[14];
-            } else {
-                if ( $working != "" ) {
-                    $return['parseerror'] = $working;
-                }
-                $passback = "";
-                $loop = false;
-            }
-        }
-    }
+See bottom of this file for examples of how to use this class
+*/
 
-    return $return;
+class X3SaxDB {
+	public $data;
+	private $raw = "";
+	
+	function X3SaxDB($filename = "") {
+		$this->data = Array();
+		if ($filename != "") {
+			$this->parse($filename);
+		}
+	}
+	
+	function parse($raw = "") {
+		$temp = Array();
+		$temparray = Array();
+		$key = "";
+		$array = false;
+		
+		if ($raw != "") {
+			$this->raw = $raw;
+		}
+		
+		while ($this->raw != "") {
+			if (preg_match("/^[\s\r\n]*#[^\r\n]*[\r\n]+[\s\r\n]*/s", $this->raw, $matches)) {
+				// Remove "#" comments
+				$this->raw = substr($this->raw, strLen($matches[0]));
+			} elseif (preg_match("/^[\s\r\n]*\/\/[^\r\n]*[\r\n]+[\s\r\n]*/s", $this->raw, $matches)) {
+				// Remove "//" comments
+				$this->raw = substr($this->raw, strLen($matches[0]));
+			} elseif (preg_match("/^\/\*.*?\*\/[\r\n]+[\s\r\n]*/s", $this->raw, $matches)) {
+				// Remove "/**/" comments
+				$this->raw = substr($this->raw, strLen($matches[0]));
+			} elseif (preg_match("/^\}[\s\r\n]*;[\s\r\n]*/s", $this->raw, $matches)) {
+				// Block End
+				$this->raw = substr($this->raw, strLen($matches[0]));
+				break;
+			} elseif (preg_match("/^\)[\s\r\n]*;[\s\r\n]*/s", $this->raw, $matches)) {
+				// Array End
+				$this->raw = substr($this->raw, strLen($matches[0]));
+				$temp[$key][] = $temparray;
+				$temparray = Array();
+				$array = false;
+				$key = "";
+			} elseif (($key != "") and preg_match("/^\([\s\r\n]*/s", $this->raw, $matches)) {
+				// Array Start
+				$this->raw = substr($this->raw, strLen($matches[0]));
+				$array = true;
+			} elseif (($key != "") and preg_match("/^\{[\s\r\n]*/s", $this->raw, $matches)) {
+				// Block
+				$this->raw = substr($this->raw, strLen($matches[0]));
+				$temp[$key][] = $this->parse();
+				$key = "";
+			} elseif ($array and ($key != "") and preg_match("/^(?:(?:\"(.*?)(?raw, $matches)) {
+				// Array Value
+				$this->raw = substr($this->raw, strLen($matches[0]));
+				$val = $matches[1];
+				if ($val == "") {
+					$val = $matches[2];
+				}
+				$temparray[] = stripslashes($val);
+			} elseif (($key != "") and preg_match("/^(?:=[\s\r\n]*)?(?:(?:\"(.*?)(?raw, $matches)) {
+				// Value
+				$this->raw = substr($this->raw, strLen($matches[0]));
+				$val = $matches[1];
+				if ($val == "") {
+					$val = $matches[2];
+				}
+				$temp[$key][] = stripslashes($val);
+				$key = "";
+			} elseif (preg_match("/^(?:(?:\"(.+?)(?raw, $matches)) {
+				// Key
+				$this->raw = substr($this->raw, strLen($matches[0]));
+				$key = $matches[1];
+				if ($key == "") {
+					$key = $matches[2];
+				}
+			} else {
+				// Error
+				$temp["parse_error"] = $this->raw;
+				$this->raw = "";
+				break;
+			}
+		}
+		
+		foreach (array_keys($temp) as $key) {
+			if (count($temp[$key]) == 1) {
+				$temp[$key] = $temp[$key][0];
+			}
+		}
+		
+		if ($raw != "") {
+			$this->data = $temp;
+			return $this->data;
+		} else {
+			return $temp;
+		}
+	}
+	
+	function parsefile($filename = "") {
+		
+		if ($filename != "") {
+			if (file_exists($filename) and is_readable($filename)) {
+				$this->raw = file_get_contents($filename);
+			}
+		}
+		
+		$this->parse($this->raw);
+		return $this->data;
+	}
+	
+	function getval($path, $array = null) {
+		$temp = $path;
+		$parts = Array();
+		$ret = Array();
+		
+		if (is_null($array)) {
+			$ret = $this->data;
+		} else {
+			$ret = $array;
+		}
+		
+		if (substr($temp, 0, 1) == "/") {
+			$temp = substr($temp, 1);
+		}
+		if (substr($temp, -1) != "/") {
+			$temp = $temp . "/";
+		}
+		
+		while ($temp != "") {
+			if (preg_match("/(?:(?:\"(.*?)(?parsefile("data/x3.db");
+// $data == copy of $x3db->data
+var_dump($x3db->data);
+var_dump($x3db->getval("/NickServ/Jobe/email_addr"));
 ?>
-
-