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";
	}
Example #2
0
	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()