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
?>