// // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // See http://cr.yp.to/proto/netstrings.txt for the format specification. function netstrings_shift(&$string) { // Note: We limit to 9 digits to avoid overflowing a 32-bit signed integer $m = array(); if (!preg_match('#^(\d{1,9}):(.*)$#s', $string, $m)) { trigger_error("Invalid data passed to netstrings_shift", E_USER_NOTICE); return FALSE; } $count = $m[1]; $data = $m[2]; $retval = substr($data, 0, $count); if (substr($data, $count, 1) !== ',') { trigger_error("Invalid data passed to netstrings_shift", E_USER_NOTICE); return FALSE; } $string = substr($data, $count+1); return $retval; } function netstrings_decode($string) { $retval = @netstrings_shift($string); if ($retval === FALSE or strlen($string) != 0) { trigger_error("Invalid data passed to netstrings_decode", E_USER_NOTICE); return FALSE; } return $retval; } function netstrings_encode($string) { return strlen($string) . ':' . $string . ','; } function netstrings_implode($array) { $retval = array(); foreach($array as $item) { $retval[] = netstrings_encode($item); } return implode('', $retval); } function netstrings_explode($string) { if (!isset($string)) { trigger_error("Undefined variable passed to netstrings_explode", E_USER_WARNING); return FALSE; } $retval = array(); while (!empty($string)) { $r = netstrings_shift($string); if ($r === FALSE) { return FALSE; } $retval[] = $r; } return $retval; } // vim:set ts=4 sw=4 sts=4 expandtab: