// Mortal, 2007-03-25 // breaks down a whitespace-separated list into an array // needs a little tweaking to allow tabs to separate and maybe some other things, but it does C-style as well as C++-style comments just fine. /* input = // Userlist. // Nick Reg date Access Mortal 1174816255 100 foobarbaz 1174842314 20 output = array( array('Mortal', '1174816255', '100'), array('foobarbaz', '1174842314', '20'), ) */ function quotedchar($c) { if ($c == 't') return "\t"; if ($c == 'n') return "\n"; if ($c == '0') return "\0"; return $c; } function xplode($s) { $i = 0; $n = strlen($s); $ret = array(); while ($i < $n and $s{$i} == ' ') $i++; if ($i >= $n) return $ret; $j = $n; while ($n and $s{$n-1} == ' ') $n--; $cur = ''; for ($i = $i; $i < $n; $i++) { if ($s{$i} === ' ') { if (!empty($cur)) $ret[] = $cur; $cur = ''; continue; } if ($s{$i} === '\\') { $cur .= quotedchar($s{++$i}); continue; } if ($s{$i} === '#' or ($i+1 < $n and ($s{$i}.$s{$i+1} === '//'))) break; if ($s{$i} === '"') { if (!empty($cur)) $ret[] = $cur; $cur = ''; while (++$i < $n and $s{$i} != '"') { if ($s{$i} == '\\') { $cur .= quotedchar($s{++$i}); continue; } else $cur .= $s{$i}; } $i++; $ret[] = $cur; $cur = ''; continue; } $cur .= $s{$i}; } if (!empty($cur)) $ret[] = $cur; $cur = ''; return $ret; }