getNumberOfQuotes($dir . "/" . $file); $amount += $number; $quotes[$index] = $amount; $files[$index] = $file; $index++; } } } srand((double)microtime() * 1000000); $index = rand(0, $amount); $i = 0; if ($amount) while ($quotes[$i] < $index) { $i++; } if (!empty($files)) return $this->getRandomQuote($dir . "/" . $files[$i]); } return -1; } /* Reads the number of quotes in the file. */ function getNumberOfQuotes($file) { $fd = fopen($file, "rb"); $this->readLong($fd); // Just move over the first long. Might as well be fseek. $len = $this->readLong($fd); fclose($fd); return $len; } /* Picks quote number $index from the dat-file in $file. */ function getExactQuote($file, $index) { if (is_file($file) == false) { echo "Input must be a file!
"; return; } if (($fd = fopen($file, "rb")) == false) { echo "Cannot open $file
"; return; } fseek($fd, 24 + 4 * $index); $phys_index = $this->readLong($fd); fclose($fd); $quotefile = substr($file, 0, strlen($file) - 4); if (($fd = fopen($quotefile, "rb")) == false) { echo "Cannot find file $quotefile!
"; } $res = $this->getQuote($fd, $phys_index); fclose($fd); return $res; } /* Returns a random quote from $file. */ function getRandomQuote($file) { $number = $this->getNumberOfQuotes($file); $index = rand(0, $number - 1); return $this->getExactQuote($file, $index); } /* Reads a quote from the specified index. */ function getQuote($fd, $index) { fseek($fd, $index); $line = ""; $res = ""; do { $res = $res . $line; $line = fgets($fd, 1024) . "
"; } while (($line[0] != "%") && (!feof($fd))); return $res; } /* Gets indexes from the file pointed to by the filedescriptor $fd. */ function getIndices($fd) { fseek($fd, 24, SEEK_SET); $i = 0; while (feof($fd) == FALSE) { $res[$i] = readLong($fd); $i++; } return $res; } function readLong($fd) { $res = fread($fd, 4); $l = ord($res[3]); $l += ord($res[2]) << 8; $l += ord($res[1]) << 16; $l += ord($res[0]) << 24; return $l; } function createIndexFile($file) { $fd = @fopen($file, "r"); if ($fd == false) { echo "File error!"; exit; } $i = 1; $length = 0; $longest = 0; $shortest = 100000; $indices[0] = 0; while (!feof($fd)) { $line = fgets($fd); if ($line == "%\n") { $indices[$i] = ftell($fd); $i++; if ($length > $longest) $longest = $length; if ($length < $shortest) $shortest = $length; $length = 0; } else { $length = $length + strlen($line); } } fclose($fd); $fd = @fopen($file . ".dat", "w"); if ($fd == false) { echo ""; exit; } // Write header. $this->writeLong($fd, 2); $this->writeLong($fd, count($indices)); $this->writeLong($fd, $longest); $this->writeLong($fd, $shortest); $this->writeLong($fd, 0); $this->writeLong($fd, 37 << 24); for ($i = 0; $i < count($indices); $i++) { $this->writeLong($fd, $indices[$i]); } fclose($fd); } function writeLong($fd, $l) { fwrite($fd, chr(($l >> 24) & 255)); fwrite($fd, chr(($l >> 16) & 255)); fwrite($fd, chr(($l >> 8) & 255)); fwrite($fd, chr($l & 255)); } } // End of class