function string_test($str, $hr) { $out = fshlHelper::getStringSource($str, $hr); @eval('$cmp='.$out.';'); if(isset($cmp) && $cmp === $str) { return $out."\n"; } return $out." - <b>FAILED</b> correct form is ".var_export($str,true)."\n"; }
function getVarSource($varname, $mixed_var, $human_readable = false) { return '$'.$varname."=".fshlHelper::getVarContentSource($mixed_var, $human_readable).";\n"; }
function make_state_code($state) { $statename=array_keys($this->_states,$state); $tab = "\t"; $tab2 = "\t\t"; $tab3 = "\t\t\t"; $nl = "\n"; $this->out.="// $statename[0]\n"; $this->out.=fshlHelper::getFncSource("getw$state", '&$s, $i, $l'); // // generate local variables initialization // $max = 1; $var_init = null; $transitions = 0; $all_break = false; foreach($this->_delim[$state] as $del) { $transitions++; if(isset($this->groups[$del])) { // group delimiter if($del == '_ALL') { $all_break = true; $tab3 = $tab2; $tab2 = $tab; } // length for group delims is stored in array now $len = $this->groups[$del]; } else { // normal delimiter $len = strlen($del); } if($max < $len) { $max = $len; } } if($max > 1) { $var_init.= $tab2.'$p=$i;'.$nl; // p - stream pointer if($transitions > 1) { $var_init.= $tab2.'$c1=$s[$p++];'.$nl; for($x=2;$x<=$max;$x++) { $xx=$x-1; if($x!=$max) { $var_init.= $tab2."\$c$x=\$c$xx.\$s[\$p++];".$nl; } else { $var_init.= $tab2."\$c$x=\$c$xx.\$s[\$p];".$nl; } } } else { // only one transition $var_init.= $tab2.'$c1='; for($x=1;$x<=$max;$x++) { if($x!=$max) { $var_init.= '$s[$p++].'; } else { $var_init.= '$s[$p];'.$nl; } } } } else { $var_init.= $tab2.'$c1=$s[$i];'.$nl; } $this->out.= $tab.'$o = false;'. $nl; $this->out.= $tab.'$start = $i;'. $nl; if(!$all_break) { $this->out.= $tab.'while($i<$l) {'. $nl; } $this->out.= $var_init; // // generate conditions and transitions // $this->inject_statistic_code($state, -1, false); $cond = null; $i = 0; foreach($this->_delim[$state] as $del) { $size = strlen($del); $delstring=get_string_source($del); if(isset($this->groups[$del])) { // delimiter is group delimiter // make condition $size = $this->groups[$del]; if( FSHL_USE_CTYPE ) $cond = $this->get_ctype_condition($del); else $cond = $this->get_older_condition($del); if($cond == "1") break; $this->out.= $tab2."if($cond){".$nl; $this->inject_statistic_code($state, $i); $this->out.= $tab3."return array($i,\$c1,\$o,$size,\$i-\$start);".$nl; $this->out.= $tab2.'}'.$nl; } else { // delimiter is not group delimiter //$i_str = $size == 1 ? '$i' : '$i+'.($size-1); $this->out.= $tab2."if(\$c$size==$delstring){".$nl; $this->inject_statistic_code($state, $i); //$this->out.= $tab3."return array($i,$delstring,\$o,$i_str);".$nl; $this->out.= $tab3."return array($i,$delstring,\$o,$size,\$i-\$start);".$nl; $this->out.= $tab2.'}'.$nl; } $i++; } // END foreach() $this->inject_statistic_code($state, $i, false); if($cond == "1") { $this->out.= $tab2."return array($i,\$c1,false,\$i-\$start);".$nl; } else { $this->out.= $tab2.'$o.=$c1;'.$nl; $this->out.= $tab2.'$i++;'.$nl; } if(!$all_break) { $this->out.= $tab."}".$nl; //end while() $this->out.= $tab.'return array(-1,-1,$o,-1,-1);'.$nl; } $this->out.= "}".$nl.$nl; //end getw() function } // END make_state_code()