2
0
mirror of https://github.com/boostorg/website.git synced 2026-01-19 04:42:17 +00:00
Files
website/common/code/boost_state.php
Daniel James b8120cc53c Adjust a lot of the error handling.
Use exceptions for most internal errors. Return error codes for most errors.
2016-09-29 02:08:52 +01:00

135 lines
4.5 KiB
PHP

<?php
# Copyright 2011, 2015 Daniel James
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt || http://www.boost.org/LICENSE_1_0.txt)
class BoostState_ParseError extends BoostException {}
class BoostState {
static function load($file_path) {
$state = Array();
if ($file_path && is_file($file_path)) {
$file = fopen($file_path, 'rb');
while (true) {
$c = fgetc($file);
if ($c === false) { break; }
if ($c == '#') {
fgets($file);
} else if ($c == '(') {
$record_key = rtrim(fgets($file));
if (!$record_key) {
fclose($file);
throw new BoostState_ParseError();
}
$state[$record_key] = self::read_record($file);
} else {
fclose($file);
throw new BoostState_ParseError();
}
}
fclose($file);
}
return $state;
}
static function read_record($file) {
$record = Array();
# This function sometimes needs to lookahead at the first character in a
# line, so always read it in advance.
$c = fgetc($file);
while (true) {
if (!$c) { throw new BoostState_ParseError(); }
if ($c == ')') {
if (fgets($file) != "\n") { throw new BoostState_ParseError(); }
return $record;
}
if ($c != '-') { throw new BoostState_ParseError(); }
$key = rtrim(fgets($file));
$c = fgetc($file);
if ($c == ')' || $c == '-') {
# The key has no value, so don't read anything. This '$c' will
# be dealt with in the next loop.
$record["$key"] = null;
} else if ($c == '.') {
$record["$key"] = floatval(fgets($file));
$c = fgetc($file);
} else if ($c == '!') {
$record["$key"] = boolval(fgets($file));
$c = fgetc($file);
} else if ($c == '=') {
$record["$key"] = intval(fgets($file));
$c = fgetc($file);
} else if ($c == '"') {
$values = Array();
while ($c == '"') {
$values[] = fgets($file);
$c = fgetc($file);
}
$record["$key"] = substr(implode('', $values), 0, -1);
} else if ($c == '@') {
$record["$key"] = new DateTime(fgets($file));
$c = fgetc($file);
} else {
throw new BoostState_ParseError();
}
}
}
static function save($state, $file_path) {
$file = fopen($file_path, "wb");
ksort($state);
foreach ($state as $record_key => $record) {
fputs($file, "(");
fputs($file, $record_key);
fputs($file, "\n");
ksort($record);
foreach ($record as $key => $value) {
fputs($file, "-");
fputs($file, $key);
fputs($file, "\n");
if ($value !== null) {
if (is_string($value)) {
fputs($file, '"');
fputs($file, str_replace("\n", "\n\"", $value));
fputs($file, "\n");
} else if (is_bool($value)) {
fputs($file, '!');
fputs($file, $value ? 1 : 0);
fputs($file, "\n");
} else if (is_int($value)) {
fputs($file, '=');
fputs($file, $value);
fputs($file, "\n");
} else if (is_float($value)) {
fputs($file, '.');
fputs($file, $value);
fputs($file, "\n");
} else if ($value instanceof \DateTime || $value instanceof \DateTimeInterface) {
fputs($file, '@');
fputs($file, $value->format(DATE_RSS));
fputs($file, "\n");
} else {
print_r($value);
assert(false);
}
}
}
fputs($file, ")\n");
}
fclose($file);
}
}