$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); } static function load_json($file_path) { if ($file_path && is_file($file_path)) { $v = json_decode(file_get_contents($file_path), true); if (is_null($v)) { throw new BoostState_ParseError(); } return $v; } else { return array(); } } static function save_json($state, $file_path) { $file = fopen($file_path, "wb"); ksort($state); fputs($file, "{\n"); $first_record = true; foreach ($state as $record_key => $record) { if (!$first_record) { fputs($file, ",\n"); } $first_record = false; fputs($file, " "); fputs($file, json_encode($record_key)); fputs($file, ": {\n"); ksort($record); $first = true; foreach ($record as $key => $value) { if (!$first) { fputs($file, ",\n"); } $first = false; fputs($file, " "); fputs($file, json_encode($key)); fputs($file, ":\n"); fputs($file, " "); if (is_float($value)) { $v = json_encode($value); if (ctype_digit($v)) { $v .= '.0'; } fputs($file, $v); } else if ($value instanceof \DateTime || $value instanceof \DateTimeInterface) { // Will load as a string, but can be decoded. fputs($file, json_encode($value->format(DATE_RSS))); } else { // Should possibly check that this is an atom. // Maybe write a recursive thing? fputs($file, json_encode($value)); } } fputs($file, "\n"); fputs($file, " }"); } fputs($file, "\n"); fputs($file, "}\n"); fclose($file); } }