Tip: Click lines to highlight, hold ctrl/cmd to multi-select
http://codedumper.com/edeve (30-Apr @ 05:09)
Syntax Highlighted Code
- <?php
- function debug_this($value)
- {
- echo $value;
- }
- function is_escaped($escape_index,$current_index)
- {
- return ($escape_index != -1 && $escape_index == ($current_index - 1));
- }
- {
- if (isset($context[$scope]) && is_array($context[$scope])) $criteria = array_merge($criteria,$context[$scope]);
- $context[$scope] = $criteria;
- $scope = "";
- }
- function add_new_criteria(&$criteria,$initial_character)
- {
- $criteria[] = $initial_character;
- }
- function add_to_current_criteria(&$criteria,$value){
- $criteria[$last] .= $value;
- debug_this("\10\tCURRENT: " . $criteria[$last] . "\n");
- }
- function setState(&$state,$newState,$line = -1) {
- else $out .= "\"$state\"";
- else $out .= "NULL";
- debug_this($out);
- $state = $newState;
- }
- function BBranch($branch,$state,$value,$line = -1)
- {
- global $STATES;
- }
- function parse($str,$default_scope = 'group'){
- //states
- global $STATES;
- foreach ($STATES as $INDEX => $STATENAME) {
- debug_this($STATENAME . " = " . $$STATENAME . "\n");
- }
- debug_this("\$WAIT = $WAIT\n");
- $escape = -1;
- $quote = $item = $scope = "";
- setState($state,($pre_quote_state = $WAIT),__LINE__);
- $str .= " ";
- foreach (str_split($str) as $index => $value)
- {
- if ($state > $QUOTE) setState($state,$WAIT,__LINE__);
- BBranch('WHITESPACE',$state,$value,__LINE__);
- if($state == $ITEM)
- {
- if (is_escaped($escape,$index)) $item .= $value;
- else {
- add_to_current_criteria($criteria,"",__LINE__);
- setState($state,$WAIT,__LINE__);
- }
- }
- elseif($state == $QUOTE)
- {
- add_to_current_criteria($criteria,$value);
- }
- elseif($state == $SCOPE)
- {
- if($default_scope != ""){
- add_new_criteria($criteria,$scope);
- add_and_reset_scope($context,$default_scope,$criteria);
- setState($state,$WAIT,__LINE__);
- }
- else add_and_reset_scope($context,$scope);
- setState($state,$WAIT,__LINE__);
- }
- }
- BBranch('EQUIV',$state,$value,__LINE__);
- //add_and_reset_scope($context,$scope);
- setState($state,$CRITERIA,__LINE__);
- }
- elseif($state & ( $ITEM | $QUOTE )) add_to_current_criteria($criteria,$value);
- }
- BBranch('ESCAPE',$state,$value,__LINE__);
- if (! is_escaped($escape,$index)) $escape = $index;
- else {
- if($state & ( $ITEM | $QUOTE )) {
- add_to_current_criteria($criteria,$value);
- }
- if($state & $CRITERIA)
- {
- add_new_criteria($criteria,$value);
- setState($state,$ITEM);
- }
- }
- }
- BBranch('COMMA',$state,$value,__LINE__);
- if($state == $ITEM)
- {
- setState($state,$CRITERIA,__LINE__);
- }
- elseif($state == $SCOPE)
- {
- add_new_criteria($criteria,$scope);
- if($default_scope != ""){
- $scope = $default_scope;
- setState($state,$CRITERIA,__LINE__);
- }
- else {
- add_and_reset_scope($context,$scope = null,$criteria);
- $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED <INDEX: $Index>";
- setState($state,$WAIT,__LINE__);
- }
- }
- elseif($state & ( $CRITERIA | $WAIT)) $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED <INDEX: $Index>";
- }
- BBranch('QUOTE',$state,$value,__LINE__);
- if($state == $QUOTE){
- debug_this("IS QUOTE ESCAPED: " . ((is_escaped($escape,$index)) ? "YES" : "NO") . "\n");
- if ($value == $quote && !is_escaped($escape,$index))
- {
- setState($state,$pre_quote_state,__LINE__);
- $quote = "";
- }
- elseif($pre_quote_state & ( $CRITERIA | $ITEM))
- {
- add_to_current_criteria($criteria,$value);
- }
- elseif($pre_quote_state & ( $WAIT | $SCOPE ))
- {
- $scope .= $value;
- }
- }
- elseif($state & ( $WAIT | $CRITERIA ))
- {
- $pre_quote_state = $state;
- $quote = $value;
- setState($state,$QUOTE,__LINE__);
- }
- }
- else {
- BBranch('WORD',$state,$value,__LINE__);
- if($state == $WAIT) {
- setState($state,$SCOPE,__LINE__);
- $scope = $value;
- }
- elseif($state == $SCOPE) $scope .= $value;
- elseif ($state == $CRITERIA)
- {
- setState($state,$ITEM,__LINE__);
- add_new_criteria($criteria,$value);
- }
- elseif ($state == $ITEM) add_to_current_criteria($criteria,$value);
- elseif($state == $QUOTE){
- if($pre_quote_state == $WAIT){
- $pre_quote_state = $SCOPE;
- $scope = $value;
- }
- elseif($pre_quote_state == $CRITERIA) {
- $pre_quote_state = $ITEM;
- add_new_criteria($criteria,$value);
- }
- else
- {
- add_to_current_criteria($criteria,$value);
- }
- }
- }
- }
- return $context;
- }
- function interpret($arr){
- $str = "";
- return $str;
- }
- "file:hello.fa start:0 end:1322251",
- "file:hello.fa group:\"wild dogs\"",
- "file:hello.fa group:\"12 angry men\" group:\"11 'angry' men\"",
- "file:hello.fa group:\"12 angry men\",\"11 \\\"angry\\\" men\""
- );
- foreach ($strs as $search){
- }
Plain Code
<?php
$STATES = array("WAIT","SCOPE","CRITERIA","ITEM","QUOTE");
function debug_this($value)
{
echo $value;
}
function is_escaped($escape_index,$current_index)
{
return ($escape_index != -1 && $escape_index == ($current_index - 1));
}
function add_and_reset_scope(&$context, &$scope,&$criteria = array())
{
if (isset($context[$scope]) && is_array($context[$scope])) $criteria = array_merge($criteria,$context[$scope]);
$context[$scope] = $criteria;
$criteria = array();
$scope = "";
}
function add_new_criteria(&$criteria,$initial_character)
{
$criteria[] = $initial_character;
debug_this( "\10\tNEW CRITERIA BEGINS: " . $criteria[count($criteria) - 1] . "\n");
}
function add_to_current_criteria(&$criteria,$value){
$last = count($criteria) - 1;
$criteria[$last] .= $value;
debug_this("\10\tCURRENT: " . $criteria[$last] . "\n");
}
function setState(&$state,$newState,$line = -1) {
global $STATES; $out = "[$line]: STATE ";
if(isset($state)) if (isset($STATES[($index = log($state,2))])) $out .= $STATES[$index]. "($state)";
else $out .= "\"$state\"";
else $out .= "NULL";
$out .= ", CHANGING TO " . $STATES[log($newState,2)] . "($newState)\n";
debug_this($out);
$state = $newState;
}
function BBranch($branch,$state,$value,$line = -1)
{
global $STATES;
debug_this("[$line] BRANCH {$branch} [" . $STATES[log($state,2)] . "]: $value \n" );
}
function parse($str,$default_scope = 'group'){
//states
global $STATES;
foreach ($STATES as $INDEX => $STATENAME) {
$$STATENAME = pow(2,$INDEX);
debug_this($STATENAME . " = " . $$STATENAME . "\n");
}
debug_this("\$WAIT = $WAIT\n");
$ERRORS = array();
$escape = -1;
$context = array();
$criteria = array();
$quote = $item = $scope = "";
setState($state,($pre_quote_state = $WAIT),__LINE__);
$str .= " ";
foreach (str_split($str) as $index => $value)
{
if ($state > $QUOTE) setState($state,$WAIT,__LINE__);
if(preg_match("/\s/",$value)){
BBranch('WHITESPACE',$state,$value,__LINE__);
if($state == $ITEM)
{
if (is_escaped($escape,$index)) $item .= $value;
else {
add_to_current_criteria($criteria,"",__LINE__);
if(count($scope)) add_and_reset_scope($context,$scope,$criteria);
setState($state,$WAIT,__LINE__);
}
}
elseif($state == $QUOTE)
{
add_to_current_criteria($criteria,$value);
}
elseif($state == $SCOPE)
{
if($default_scope != ""){
add_new_criteria($criteria,$scope);
add_and_reset_scope($context,$default_scope,$criteria);
setState($state,$WAIT,__LINE__);
}
else add_and_reset_scope($context,$scope);
setState($state,$WAIT,__LINE__);
}
}
elseif(preg_match("/[\:\=]/",$value)) {
BBranch('EQUIV',$state,$value,__LINE__);
if($state == $SCOPE && strlen($scope)) {
//add_and_reset_scope($context,$scope);
setState($state,$CRITERIA,__LINE__);
}
elseif($state & ( $ITEM | $QUOTE )) add_to_current_criteria($criteria,$value);
}
elseif(strstr("\\",$value)){
BBranch('ESCAPE',$state,$value,__LINE__);
if (! is_escaped($escape,$index)) $escape = $index;
else {
if($state & ( $ITEM | $QUOTE )) {
add_to_current_criteria($criteria,$value);
}
if($state & $CRITERIA)
{
add_new_criteria($criteria,$value);
setState($state,$ITEM);
}
}
}
elseif(strstr(",",$value)){
BBranch('COMMA',$state,$value,__LINE__);
if($state == $ITEM)
{
setState($state,$CRITERIA,__LINE__);
}
elseif($state == $SCOPE)
{
add_new_criteria($criteria,$scope);
if($default_scope != ""){
$scope = $default_scope;
setState($state,$CRITERIA,__LINE__);
}
else {
add_and_reset_scope($context,$scope = null,$criteria);
$ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED <INDEX: $Index>";
setState($state,$WAIT,__LINE__);
}
}
elseif($state & ( $CRITERIA | $WAIT)) $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED <INDEX: $Index>";
}
elseif(preg_match("/[\"']/",$value)){
BBranch('QUOTE',$state,$value,__LINE__);
if($state == $QUOTE){
debug_this("IS QUOTE ESCAPED: " . ((is_escaped($escape,$index)) ? "YES" : "NO") . "\n");
if ($value == $quote && !is_escaped($escape,$index))
{
setState($state,$pre_quote_state,__LINE__);
$quote = "";
}
elseif($pre_quote_state & ( $CRITERIA | $ITEM))
{
add_to_current_criteria($criteria,$value);
}
elseif($pre_quote_state & ( $WAIT | $SCOPE ))
{
$scope .= $value;
}
}
elseif($state & ( $WAIT | $CRITERIA ))
{
$pre_quote_state = $state;
$quote = $value;
setState($state,$QUOTE,__LINE__);
}
}
else {
BBranch('WORD',$state,$value,__LINE__);
if($state == $WAIT) {
setState($state,$SCOPE,__LINE__);
$scope = $value;
}
elseif($state == $SCOPE) $scope .= $value;
elseif ($state == $CRITERIA)
{
setState($state,$ITEM,__LINE__);
add_new_criteria($criteria,$value);
}
elseif ($state == $ITEM) add_to_current_criteria($criteria,$value);
elseif($state == $QUOTE){
if($pre_quote_state == $WAIT){
$pre_quote_state = $SCOPE;
$scope = $value;
}
elseif($pre_quote_state == $CRITERIA) {
$pre_quote_state = $ITEM;
add_new_criteria($criteria,$value);
}
else
{
add_to_current_criteria($criteria,$value);
}
}
}
}
return $context;
}
function interpret($arr){
$str = "";
$str = print_r($arr,true);
return $str;
}
$strs = array(
"file:hello.fa start:0 end:1322251",
"file:hello.fa group:\"wild dogs\"",
"file:hello.fa group:\"12 angry men\" group:\"11 'angry' men\"",
"file:hello.fa group:\"12 angry men\",\"11 \\\"angry\\\" men\""
);
foreach ($strs as $search){
echo $search . ":\n " . str_replace("\n", "\n\t", interpret(parse($search))). "\n";
}