*/ class IDF_Scm_Monotone_BasicIO extends IDF_Scm { /** * Parses monotone's basic_io format * * @param string $in * @return array of arrays */ public static function parse($in) { $pos = 0; $stanzas = array(); while ($pos < strlen($in)) { $stanza = array(); while ($pos < strlen($in)) { if ($in[$pos] == "\n") break; $stanzaLine = array('key' => '', 'values' => array(), 'hash' => null); while ($pos < strlen($in)) { $ch = $in[$pos]; if ($ch == '"' || $ch == '[') break; ++$pos; if ($ch == ' ') continue; $stanzaLine['key'] .= $ch; } if ($in[$pos] == '[') { ++$pos; // opening square bracket $stanzaLine['hash'] = substr($in, $pos, 40); $pos += 40; ++$pos; // closing square bracket } else { $valCount = 0; while ($in[$pos] == '"') { ++$pos; // opening quote $stanzaLine['values'][$valCount] = ''; while ($pos < strlen($in)) { $ch = $in[$pos]; $pr = $in[$pos-1]; if ($ch == '"' && $pr != '\\') break; ++$pos; $stanzaLine['values'][$valCount] .= $ch; } ++$pos; // closing quote if ($in[$pos] == ' ') { ++$pos; // space ++$valCount; } } for ($i = 0; $i <= $valCount; $i++) { $stanzaLine['values'][$i] = str_replace( array("\\\\", "\\\""), array("\\", "\""), $stanzaLine['values'][$i] ); } } $stanza[] = $stanzaLine; ++$pos; // newline } $stanzas[] = $stanza; ++$pos; // newline } return $stanzas; } /** * Compiles monotone's basicio format * * @param array $in Array of arrays * @return string */ public static function compile($in) { throw new IDF_Scm_Exception("not yet implemented"); } }