Merge branch 'v3.1.16'

This commit is contained in:
Uwe Tews
2014-10-31 02:05:49 +01:00
14 changed files with 420 additions and 267 deletions

35
3.1.16_RELEASE_NOTES.txt Normal file
View File

@@ -0,0 +1,35 @@
In Smarty 3.1 template inheritance is a compile time process. All the extending of {block} tags
is done at compile time and the parent and child templates are compiled in a single compiled template.
{include} subtemplate could also {block} tags. Such subtemplate could not compiled by it's own because
it could be used in other context where the {block} extended with a different result. For that reasion
the compiled code of {include} subtemplates gets also merged in compiled inheritance template.
Merging the code into a single compile template has some drawbacks.
1. You could not use variable file names in {include} Smarty would use the {include} of compilation time.
2. You could not use individual compile_id in {include}
3. Seperate caching of subtemplate was not possible
4. Any change of the template directory structure between calls was not necessarily seen.
Starting with 3.1.15 some of the above conditions got checked and resulted in an exception. It turned out
that a couple of users did use some of above and now got exceptions.
To resolve this starting with 3.1.16 there is a new configuration parameter $inheritance_merge_compiled_includes.
For most backward compatibility its default setting is true.
With this setting all {include} subtemplate will be merge into the compiled inheritance template, but the above cases
could be rejected by exception.
If $smarty->inheritance_merge_compiled_includes = false; {include} subtemplate will not be merged.
You must now manually merge all {include} subtemplate which do contain {block} tags. This is done by setting the "inline" option.
{include file='foo.bar' inline}
1. In case of a variable file name like {include file=$foo inline} you must you the variable in a compile_id $smarty->compile_id = $foo;
2. If you use individual compile_id in {include file='foo.tpl' compile_id=$bar inline} it must be used in the
global compile_id as well $smarty->compile_id = $foo;
3. If call templates with different template_dir configurations and a parent could same named child template from different folders
you must make the folder name part of the compile_id.
In the upcomming major release Smarty 3.2 inheritance will no longer be a compile time process.
All restrictions will be then removed.

View File

@@ -1,5 +1,37 @@
===== Smarty-3.1.16 =====
15.12.2013
- bugfix {include} with {block} tag handling (forum topic 24599, 24594, 24682) (Issue 161)
Read 3.1.16_RELEASE_NOTES for more details
- enhancement additional debug output at $smarty->_parserdebug = true;
07.11.2013
- bugfix too restrictive handling of {include} within {block} tags. 3.1.15 did throw errors where 3.1.14 did not (forum topic 24599)
- bugfix compiler could fail if PHP mbstring.func_overload is enabled (Issue 164)
28.10.2013
- bugfix variable resource name at custom resource plugin did not work within {block} tags (Issue 163)
- bugfix notice "Trying to get property of non-object" removed (Issue 163)
- bugfix correction of modifier capitalize fix from 3.10.2013 (issue 159)
- bugfix multiple {block}s with same name in parent did not work (forum topic 24631)
20.10.2013
- bugfix a variable file name at {extends} tag did fail (forum topic 24618)
14.10.2013
- bugfix yesterdays fix could result in an undefined variable
13.10.2013
- bugfix variable names on {include} in template inheritance did unextepted error message (forum topic 24594) (Issue 161)
.- bugfix relative includes with same name like {include './foo.tpl'} from different folder failed (forum topic 24590)(Issue 161)
===== Smarty-3.1.15 ===== 04.10.2013
- bugfix variable file names at {extends} had been disbabled by mistake with the rewrite of
template inheritance of 24.08.2013 (forum topic 24585)
03.10.2013
- bugfix loops using modifier capitalize did eat up memory (issue 159)
===== Smarty 3.1.15 =====
01.10.2013 01.10.2013
- use current delimiters in compiler error messages (issue 157) - use current delimiters in compiler error messages (issue 157)
- improvement on performance when using error handler and multiple template folders (issue 152) - improvement on performance when using error handler and multiple template folders (issue 152)

View File

@@ -299,6 +299,11 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var boolean * @var boolean
*/ */
public $merge_compiled_includes = false; public $merge_compiled_includes = false;
/**
* template inheritance merge compiled includes
* @var boolean
*/
public $inheritance_merge_compiled_includes = true;
/** /**
* cache lifetime in seconds * cache lifetime in seconds
* @var integer * @var integer

View File

@@ -30,36 +30,58 @@ function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = fals
$upper_string = mb_convert_case( $string, MB_CASE_TITLE, Smarty::$_CHARSET ); $upper_string = mb_convert_case( $string, MB_CASE_TITLE, Smarty::$_CHARSET );
} else { } else {
// uppercase word breaks // uppercase word breaks
$upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, create_function ('$matches', 'return stripslashes($matches[1]).mb_convert_case(stripslashes($matches[2]),MB_CASE_UPPER, "' . addslashes(Smarty::$_CHARSET) . '");'), $string); $upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_mbconvert_cb', $string);
} }
// check uc_digits case // check uc_digits case
if (!$uc_digits) { if (!$uc_digits) {
if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) {
foreach ($matches[1] as $match) { foreach($matches[1] as $match) {
$upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0])); $upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0]));
} }
} }
} }
$upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, create_function ('$matches', 'return stripslashes($matches[1]).mb_convert_case(stripslashes($matches[3]),MB_CASE_UPPER, "' . addslashes(Smarty::$_CHARSET) . '");'), $upper_string); $upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_mbconvert2_cb', $upper_string);
return $upper_string; return $upper_string;
} }
// lowercase first // lowercase first
if ($lc_rest) { if ($lc_rest) {
$string = strtolower($string); $string = strtolower($string);
} }
// uppercase (including hyphenated words) // uppercase (including hyphenated words)
$upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, create_function ('$matches', 'return stripslashes($matches[1]).ucfirst(stripslashes($matches[2]));'), $string); $upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_ucfirst_cb', $string);
// check uc_digits case // check uc_digits case
if (!$uc_digits) { if (!$uc_digits) {
if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) {
foreach ($matches[1] as $match) { foreach($matches[1] as $match) {
$upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0])); $upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0]));
} }
} }
} }
$upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, create_function ('$matches', 'return stripslashes($matches[1]).ucfirst(stripslashes($matches[3]));'), $upper_string); $upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_ucfirst2_cb', $upper_string);
return $upper_string; return $upper_string;
}
/*
*
* Bug: create_function() use exhausts memory when used in long loops
* Fix: use declared functions for callbacks instead of using create_function()
* Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3
*
* @author Kyle Renfrow
*/
function smarty_mod_cap_mbconvert_cb($matches){
return stripslashes($matches[1]).mb_convert_case(stripslashes($matches[2]),MB_CASE_UPPER, Smarty::$_CHARSET);
}
function smarty_mod_cap_mbconvert2_cb($matches){
return stripslashes($matches[1]).mb_convert_case(stripslashes($matches[3]),MB_CASE_UPPER, Smarty::$_CHARSET);
}
function smarty_mod_cap_ucfirst_cb($matches){
return stripslashes($matches[1]).ucfirst(stripslashes($matches[2]));
}
function smarty_mod_cap_ucfirst2_cb($matches){
return stripslashes($matches[1]).ucfirst(stripslashes($matches[3]));
} }

View File

@@ -160,6 +160,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase
if ($compiler->smarty->debugging) { if ($compiler->smarty->debugging) {
Smarty_Internal_Debug::ignore($_tpl); Smarty_Internal_Debug::ignore($_tpl);
} }
$_tpl->tpl_vars = $compiler->template->tpl_vars;
$_tpl->variable_filters = $compiler->template->variable_filters; $_tpl->variable_filters = $compiler->template->variable_filters;
$_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash']; $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
$_tpl->allow_relative_path = true; $_tpl->allow_relative_path = true;
@@ -330,8 +331,8 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase
} else { } else {
$_output = $compiler->parser->current_buffer->to_smarty_php(); $_output = $compiler->parser->current_buffer->to_smarty_php();
} }
unset($compiler->template->block_data[$_name]['compiled']);
} }
unset($compiler->template->block_data[$_name]['compiled']);
// reset flags // reset flags
$compiler->parser->current_buffer = $saved_data[2]; $compiler->parser->current_buffer = $saved_data[2];
if ($compiler->nocache) { if ($compiler->nocache) {

View File

@@ -50,17 +50,12 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase
if (strpos($_attr['file'], '$_tmp') !== false) { if (strpos($_attr['file'], '$_tmp') !== false) {
$compiler->trigger_template_error('illegal value for file attribute', $compiler->lex->taglineno); $compiler->trigger_template_error('illegal value for file attribute', $compiler->lex->taglineno);
} }
// add tag to call parent template at the end of source
if ($compiler->has_variable_string || !((substr_count($_attr['file'], '"') == 2 || substr_count($_attr['file'], "'") == 2)) $name = $_attr['file'];
|| substr_count($_attr['file'], '(') != 0 || substr_count($_attr['file'], '$_smarty_tpl->') != 0 $_smarty_tpl = $compiler->template;
) { eval("\$tpl_name = $name;");
$compiler->trigger_template_error('variable template file name not allowed', $compiler->lex->taglineno);
}
$name = trim($_attr['file'],"\"'");
// create template object // create template object
$_template = new $compiler->smarty->template_class($name, $compiler->smarty, $compiler->template); $_template = new $compiler->smarty->template_class($tpl_name, $compiler->smarty, $compiler->template);
// check for recursion // check for recursion
$uid = $_template->source->uid; $uid = $_template->source->uid;
if (isset($compiler->extends_uid[$uid])) { if (isset($compiler->extends_uid[$uid])) {

View File

@@ -85,7 +85,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
$_caching = Smarty::CACHING_OFF; $_caching = Smarty::CACHING_OFF;
// flag if included template code should be merged into caller // flag if included template code should be merged into caller
$merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr['inline'] === true) && !$compiler->template->source->recompiled; $merge_compiled_includes = ($compiler->smarty->merge_compiled_includes ||($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes)|| $_attr['inline'] === true) && !$compiler->template->source->recompiled;
// set default when in nocache mode // set default when in nocache mode
// if ($compiler->template->caching && ($compiler->nocache || $compiler->tag_nocache || $compiler->forceNocache == 2)) { // if ($compiler->template->caching && ($compiler->nocache || $compiler->tag_nocache || $compiler->forceNocache == 2)) {
@@ -121,7 +121,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
} }
if ($_attr['nocache'] === true) { if ($_attr['nocache'] === true) {
$compiler->tag_nocache = true; $compiler->tag_nocache = true;
if ($merge_compiled_includes || $compiler->inheritance) { if ($merge_compiled_includes) {
$_caching = self::CACHING_NOCACHE_CODE; $_caching = self::CACHING_NOCACHE_CODE;
} else { } else {
$_caching = Smarty::CACHING_OFF; $_caching = Smarty::CACHING_OFF;
@@ -129,13 +129,13 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
} }
$has_compiled_template = false; $has_compiled_template = false;
if ($merge_compiled_includes || $compiler->inheritance) { if ($merge_compiled_includes && $_attr['inline'] !== true) {
// variable template name ? // variable template name ?
if ($compiler->has_variable_string || !((substr_count($include_file, '"') == 2 || substr_count($include_file, "'") == 2)) if ($compiler->has_variable_string || !((substr_count($include_file, '"') == 2 || substr_count($include_file, "'") == 2))
|| substr_count($include_file, '(') != 0 || substr_count($include_file, '$_smarty_tpl->') != 0 || substr_count($include_file, '(') != 0 || substr_count($include_file, '$_smarty_tpl->') != 0
) { ) {
$merge_compiled_includes = false; $merge_compiled_includes = false;
if ($compiler->inheritance) { if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
$compiler->trigger_template_error(' variable template file names not allow within {block} tags'); $compiler->trigger_template_error(' variable template file names not allow within {block} tags');
} }
} }
@@ -145,23 +145,26 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|| substr_count($_attr['compile_id'], '(') != 0 || substr_count($_attr['compile_id'], '$_smarty_tpl->') != 0 || substr_count($_attr['compile_id'], '(') != 0 || substr_count($_attr['compile_id'], '$_smarty_tpl->') != 0
) { ) {
$merge_compiled_includes = false; $merge_compiled_includes = false;
if ($compiler->inheritance) { if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
$compiler->trigger_template_error(' variable compile_id not allow within {block} tags'); $compiler->trigger_template_error(' variable compile_id not allow within {block} tags');
} }
} }
} }
}
if ($merge_compiled_includes) {
if ($compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache) && $_caching != self::CACHING_NOCACHE_CODE) { if ($compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache) && $_caching != self::CACHING_NOCACHE_CODE) {
$merge_compiled_includes = false; $merge_compiled_includes = false;
if ($compiler->inheritance) { if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
$compiler->trigger_template_error(' invalid caching mode of subtemplate within {block} tags'); $compiler->trigger_template_error(' invalid caching mode of subtemplate within {block} tags');
} }
} }
} }
if ($merge_compiled_includes || $compiler->inheritance) { if ($merge_compiled_includes) {
// we must observe different compile_id // we must observe different compile_id
$uid = sha1($_compile_id); $uid = sha1($_compile_id);
$tpl_name = null; $tpl_name = null;
$nocache = false; $nocache = false;
$_smarty_tpl = $compiler->template;
eval("\$tpl_name = $include_file;"); eval("\$tpl_name = $include_file;");
if (!isset($compiler->smarty->merged_templates_func[$tpl_name][$uid]) || $compiler->inheritance) { if (!isset($compiler->smarty->merged_templates_func[$tpl_name][$uid]) || $compiler->inheritance) {
$tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id); $tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id);

View File

@@ -2,10 +2,10 @@
/** /**
* Smarty Internal Plugin Configfilelexer * Smarty Internal Plugin Configfilelexer
* *
* This is the lexer to break the config file source into tokens * This is the lexer to break the config file source into tokens
* @package Smarty * @package Smarty
* @subpackage Config * @subpackage Config
* @author Uwe Tews * @author Uwe Tews
*/ */
/** /**
* Smarty Internal Plugin Configfilelexer * Smarty Internal Plugin Configfilelexer
@@ -20,17 +20,21 @@ class Smarty_Internal_Configfilelexer
public $node; public $node;
public $line; public $line;
private $state = 1; private $state = 1;
public $yyTraceFILE;
public $yyTracePrompt;
public $state_name = array (1 => 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION', 6 => 'TRIPPLE');
public $smarty_token_names = array ( // Text for parser error messages public $smarty_token_names = array ( // Text for parser error messages
); );
public function __construct($data, $smarty)
function __construct($data, $smarty)
{ {
// set instance object // set instance object
self::instance($this); self::instance($this);
$this->data = $data . "\n"; //now all lines are \n-terminated $this->data = $data . "\n"; //now all lines are \n-terminated
$this->counter = 0; $this->counter = 0;
$this->line = 1; $this->line = 1;
$this->smarty = $smarty; $this->smarty = $smarty;
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2; $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
} }
public static function &instance($new_instance = null) public static function &instance($new_instance = null)
@@ -38,10 +42,16 @@ class Smarty_Internal_Configfilelexer
static $instance = null; static $instance = null;
if (isset($new_instance) && is_object($new_instance)) if (isset($new_instance) && is_object($new_instance))
$instance = $new_instance; $instance = $new_instance;
return $instance; return $instance;
}
public function PrintTrace()
{
$this->yyTraceFILE = fopen('php://output', 'w');
$this->yyTracePrompt = '<br>';
} }
private $_yy_state = 1; private $_yy_state = 1;
private $_yy_stack = array(); private $_yy_stack = array();
@@ -52,20 +62,39 @@ class Smarty_Internal_Configfilelexer
public function yypushstate($state) public function yypushstate($state)
{ {
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
array_push($this->_yy_stack, $this->_yy_state); array_push($this->_yy_stack, $this->_yy_state);
$this->_yy_state = $state; $this->_yy_state = $state;
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
} }
public function yypopstate() public function yypopstate()
{ {
$this->_yy_state = array_pop($this->_yy_stack); if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
$this->_yy_state = array_pop($this->_yy_stack);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
} }
public function yybegin($state) public function yybegin($state)
{ {
$this->_yy_state = $state; $this->_yy_state = $state;
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
} }
public function yylex1() public function yylex1()
{ {
$tokenMap = array ( $tokenMap = array (
@@ -129,50 +158,54 @@ class Smarty_Internal_Configfilelexer
} // end function } // end function
const START = 1; const START = 1;
public function yy_r1_1($yy_subpatterns) function yy_r1_1($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART; $this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART;
$this->yypushstate(self::COMMENT); $this->yypushstate(self::COMMENT);
} }
public function yy_r1_2($yy_subpatterns) function yy_r1_2($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_OPENB; $this->token = Smarty_Internal_Configfileparser::TPC_OPENB;
$this->yypushstate(self::SECTION); $this->yypushstate(self::SECTION);
} }
public function yy_r1_3($yy_subpatterns) function yy_r1_3($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB; $this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB;
} }
public function yy_r1_4($yy_subpatterns) function yy_r1_4($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_EQUAL; $this->token = Smarty_Internal_Configfileparser::TPC_EQUAL;
$this->yypushstate(self::VALUE); $this->yypushstate(self::VALUE);
} }
public function yy_r1_5($yy_subpatterns) function yy_r1_5($yy_subpatterns)
{ {
return false; return false;
} }
public function yy_r1_6($yy_subpatterns) function yy_r1_6($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
} }
public function yy_r1_7($yy_subpatterns) function yy_r1_7($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_ID; $this->token = Smarty_Internal_Configfileparser::TPC_ID;
} }
public function yy_r1_8($yy_subpatterns) function yy_r1_8($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_OTHER; $this->token = Smarty_Internal_Configfileparser::TPC_OTHER;
} }
public function yylex2() public function yylex2()
{ {
$tokenMap = array ( $tokenMap = array (
@@ -237,61 +270,62 @@ class Smarty_Internal_Configfilelexer
} // end function } // end function
const VALUE = 2; const VALUE = 2;
public function yy_r2_1($yy_subpatterns) function yy_r2_1($yy_subpatterns)
{ {
return false; return false;
} }
public function yy_r2_2($yy_subpatterns) function yy_r2_2($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_FLOAT; $this->token = Smarty_Internal_Configfileparser::TPC_FLOAT;
$this->yypopstate(); $this->yypopstate();
} }
public function yy_r2_3($yy_subpatterns) function yy_r2_3($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_INT; $this->token = Smarty_Internal_Configfileparser::TPC_INT;
$this->yypopstate(); $this->yypopstate();
} }
public function yy_r2_4($yy_subpatterns) function yy_r2_4($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES; $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES;
$this->yypushstate(self::TRIPPLE); $this->yypushstate(self::TRIPPLE);
} }
public function yy_r2_5($yy_subpatterns) function yy_r2_5($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING; $this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING;
$this->yypopstate(); $this->yypopstate();
} }
public function yy_r2_6($yy_subpatterns) function yy_r2_6($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING; $this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING;
$this->yypopstate(); $this->yypopstate();
} }
public function yy_r2_7($yy_subpatterns) function yy_r2_7($yy_subpatterns)
{ {
if (!$this->smarty->config_booleanize || !in_array(strtolower($this->value), Array("true", "false", "on", "off", "yes", "no")) ) { if (!$this->smarty->config_booleanize || !in_array(strtolower($this->value), Array("true", "false", "on", "off", "yes", "no")) ) {
$this->yypopstate(); $this->yypopstate();
$this->yypushstate(self::NAKED_STRING_VALUE); $this->yypushstate(self::NAKED_STRING_VALUE);
return true; //reprocess in new state return true; //reprocess in new state
} else { } else {
$this->token = Smarty_Internal_Configfileparser::TPC_BOOL; $this->token = Smarty_Internal_Configfileparser::TPC_BOOL;
$this->yypopstate(); $this->yypopstate();
} }
} }
public function yy_r2_8($yy_subpatterns) function yy_r2_8($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
$this->yypopstate(); $this->yypopstate();
} }
public function yy_r2_9($yy_subpatterns) function yy_r2_9($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
@@ -299,6 +333,8 @@ class Smarty_Internal_Configfilelexer
$this->yypopstate(); $this->yypopstate();
} }
public function yylex3() public function yylex3()
{ {
$tokenMap = array ( $tokenMap = array (
@@ -355,14 +391,17 @@ class Smarty_Internal_Configfilelexer
} // end function } // end function
const NAKED_STRING_VALUE = 3; const NAKED_STRING_VALUE = 3;
public function yy_r3_1($yy_subpatterns) function yy_r3_1($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
$this->yypopstate(); $this->yypopstate();
} }
public function yylex4() public function yylex4()
{ {
$tokenMap = array ( $tokenMap = array (
@@ -421,23 +460,27 @@ class Smarty_Internal_Configfilelexer
} // end function } // end function
const COMMENT = 4; const COMMENT = 4;
public function yy_r4_1($yy_subpatterns) function yy_r4_1($yy_subpatterns)
{ {
return false; return false;
} }
public function yy_r4_2($yy_subpatterns) function yy_r4_2($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
} }
public function yy_r4_3($yy_subpatterns) function yy_r4_3($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
$this->yypopstate(); $this->yypopstate();
} }
public function yylex5() public function yylex5()
{ {
$tokenMap = array ( $tokenMap = array (
@@ -495,19 +538,21 @@ class Smarty_Internal_Configfilelexer
} // end function } // end function
const SECTION = 5; const SECTION = 5;
public function yy_r5_1($yy_subpatterns) function yy_r5_1($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_DOT; $this->token = Smarty_Internal_Configfileparser::TPC_DOT;
} }
public function yy_r5_2($yy_subpatterns) function yy_r5_2($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_SECTION; $this->token = Smarty_Internal_Configfileparser::TPC_SECTION;
$this->yypopstate(); $this->yypopstate();
} }
public function yylex6() public function yylex6()
{ {
$tokenMap = array ( $tokenMap = array (
@@ -565,15 +610,16 @@ class Smarty_Internal_Configfilelexer
} // end function } // end function
const TRIPPLE = 6; const TRIPPLE = 6;
public function yy_r6_1($yy_subpatterns) function yy_r6_1($yy_subpatterns)
{ {
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END; $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END;
$this->yypopstate(); $this->yypopstate();
$this->yypushstate(self::START); $this->yypushstate(self::START);
} }
public function yy_r6_2($yy_subpatterns) function yy_r6_2($yy_subpatterns)
{ {
if ($this->mbstring_overload) { if ($this->mbstring_overload) {
@@ -586,7 +632,7 @@ class Smarty_Internal_Configfilelexer
$to = $match[0][1]; $to = $match[0][1];
} else { } else {
$this->compiler->trigger_template_error ("missing or misspelled literal closing tag"); $this->compiler->trigger_template_error ("missing or misspelled literal closing tag");
} }
if ($this->mbstring_overload) { if ($this->mbstring_overload) {
$this->value = mb_substr($this->data,$this->counter,$to-$this->counter,'latin1'); $this->value = mb_substr($this->data,$this->counter,$to-$this->counter,'latin1');
} else { } else {
@@ -595,4 +641,6 @@ class Smarty_Internal_Configfilelexer
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT; $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT;
} }
} }

View File

@@ -83,8 +83,9 @@ class TPC_yyStackEntry
** is the value of the token */ ** is the value of the token */
}; };
#line 12 "smarty_internal_configfileparser.y" #line 12 "smarty_internal_configfileparser.y"
class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser.php" class Smarty_Internal_Configfileparser#line 80 "smarty_internal_configfileparser.php"
{ {
#line 14 "smarty_internal_configfileparser.y" #line 14 "smarty_internal_configfileparser.y"
@@ -94,12 +95,11 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
private $lex; private $lex;
private $internalError = false; private $internalError = false;
public function __construct($lex, $compiler) function __construct($lex, $compiler) {
{
// set instance object // set instance object
self::instance($this); self::instance($this);
$this->lex = $lex; $this->lex = $lex;
$this->smarty = $compiler->smarty; $this->smarty = $compiler->smarty;
$this->compiler = $compiler; $this->compiler = $compiler;
} }
public static function &instance($new_instance = null) public static function &instance($new_instance = null)
@@ -107,25 +107,21 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
static $instance = null; static $instance = null;
if (isset($new_instance) && is_object($new_instance)) if (isset($new_instance) && is_object($new_instance))
$instance = $new_instance; $instance = $new_instance;
return $instance; return $instance;
} }
private function parse_bool($str) private function parse_bool($str) {
{
if (in_array(strtolower($str) ,array('on','yes','true'))) { if (in_array(strtolower($str) ,array('on','yes','true'))) {
$res = true; $res = true;
} else { } else {
$res = false; $res = false;
} }
return $res; return $res;
} }
private static $escapes_single = Array('\\' => '\\', private static $escapes_single = Array('\\' => '\\',
'\'' => '\''); '\'' => '\'');
private static function parse_single_quoted_string($qstr) private static function parse_single_quoted_string($qstr) {
{
$escaped_string = substr($qstr, 1, strlen($qstr)-2); //remove outer quotes $escaped_string = substr($qstr, 1, strlen($qstr)-2); //remove outer quotes
$ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE); $ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE);
@@ -144,20 +140,16 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
return $str; return $str;
} }
private static function parse_double_quoted_string($qstr) private static function parse_double_quoted_string($qstr) {
{
$inner_str = substr($qstr, 1, strlen($qstr)-2); $inner_str = substr($qstr, 1, strlen($qstr)-2);
return stripcslashes($inner_str); return stripcslashes($inner_str);
} }
private static function parse_tripple_double_quoted_string($qstr) private static function parse_tripple_double_quoted_string($qstr) {
{
return stripcslashes($qstr); return stripcslashes($qstr);
} }
private function set_var(Array $var, Array &$target_array) private function set_var(Array $var, Array &$target_array) {
{
$key = $var["key"]; $key = $var["key"];
$value = $var["value"]; $value = $var["value"];
@@ -169,8 +161,7 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
} }
} }
private function add_global_vars(Array $vars) private function add_global_vars(Array $vars) {
{
if (!isset($this->compiler->config_data['vars'])) { if (!isset($this->compiler->config_data['vars'])) {
$this->compiler->config_data['vars'] = Array(); $this->compiler->config_data['vars'] = Array();
} }
@@ -179,8 +170,7 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
} }
} }
private function add_section_vars($section_name, Array $vars) private function add_section_vars($section_name, Array $vars) {
{
if (!isset($this->compiler->config_data['sections'][$section_name]['vars'])) { if (!isset($this->compiler->config_data['sections'][$section_name]['vars'])) {
$this->compiler->config_data['sections'][$section_name]['vars'] = Array(); $this->compiler->config_data['sections'][$section_name]['vars'] = Array();
} }
@@ -188,7 +178,7 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
$this->set_var($var, $this->compiler->config_data['sections'][$section_name]); $this->set_var($var, $this->compiler->config_data['sections'][$section_name]);
} }
} }
#line 173 "smarty_internal_configfileparser.php" #line 174 "smarty_internal_configfileparser.php"
const TPC_OPENB = 1; const TPC_OPENB = 1;
const TPC_SECTION = 2; const TPC_SECTION = 2;
@@ -219,7 +209,7 @@ static public $yy_action = array(
/* 20 */ 15, 17, 23, 18, 27, 26, 4, 5, 6, 32, /* 20 */ 15, 17, 23, 18, 27, 26, 4, 5, 6, 32,
/* 30 */ 2, 11, 28, 22, 16, 9, 7, 10, /* 30 */ 2, 11, 28, 22, 16, 9, 7, 10,
); );
public static $yy_lookahead = array( static public $yy_lookahead = array(
/* 0 */ 7, 8, 9, 10, 11, 12, 5, 27, 15, 16, /* 0 */ 7, 8, 9, 10, 11, 12, 5, 27, 15, 16,
/* 10 */ 20, 21, 23, 23, 17, 18, 13, 14, 17, 18, /* 10 */ 20, 21, 23, 23, 17, 18, 13, 14, 17, 18,
/* 20 */ 15, 2, 17, 4, 25, 26, 6, 3, 3, 14, /* 20 */ 15, 2, 17, 4, 25, 26, 6, 3, 3, 14,
@@ -227,17 +217,17 @@ static public $yy_action = array(
); );
const YY_SHIFT_USE_DFLT = -8; const YY_SHIFT_USE_DFLT = -8;
const YY_SHIFT_MAX = 19; const YY_SHIFT_MAX = 19;
public static $yy_shift_ofst = array( static public $yy_shift_ofst = array(
/* 0 */ -8, 1, 1, 1, -7, -3, -3, 30, -8, -8, /* 0 */ -8, 1, 1, 1, -7, -3, -3, 30, -8, -8,
/* 10 */ -8, 19, 5, 3, 15, 16, 24, 25, 32, 20, /* 10 */ -8, 19, 5, 3, 15, 16, 24, 25, 32, 20,
); );
const YY_REDUCE_USE_DFLT = -21; const YY_REDUCE_USE_DFLT = -21;
const YY_REDUCE_MAX = 10; const YY_REDUCE_MAX = 10;
public static $yy_reduce_ofst = array( static public $yy_reduce_ofst = array(
/* 0 */ -10, -1, -1, -1, -20, 10, 12, 8, 14, 7, /* 0 */ -10, -1, -1, -1, -20, 10, 12, 8, 14, 7,
/* 10 */ -11, /* 10 */ -11,
); );
public static $yyExpectedTokens = array( static public $yyExpectedTokens = array(
/* 0 */ array(), /* 0 */ array(),
/* 1 */ array(5, 17, 18, ), /* 1 */ array(5, 17, 18, ),
/* 2 */ array(5, 17, 18, ), /* 2 */ array(5, 17, 18, ),
@@ -275,7 +265,7 @@ static public $yy_action = array(
/* 34 */ array(), /* 34 */ array(),
/* 35 */ array(), /* 35 */ array(),
); );
public static $yy_default = array( static public $yy_default = array(
/* 0 */ 44, 37, 41, 40, 58, 58, 58, 36, 39, 44, /* 0 */ 44, 37, 41, 40, 58, 58, 58, 36, 39, 44,
/* 10 */ 44, 58, 58, 58, 58, 58, 58, 58, 58, 58, /* 10 */ 44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
/* 20 */ 55, 54, 57, 56, 50, 45, 43, 42, 38, 46, /* 20 */ 55, 54, 57, 56, 50, 45, 43, 42, 38, 46,
@@ -290,37 +280,37 @@ static public $yy_action = array(
const YYFALLBACK = 0; const YYFALLBACK = 0;
public static $yyFallback = array( public static $yyFallback = array(
); );
public static function Trace($TraceFILE, $zTracePrompt) public function Trace($TraceFILE, $zTracePrompt)
{ {
if (!$TraceFILE) { if (!$TraceFILE) {
$zTracePrompt = 0; $zTracePrompt = 0;
} elseif (!$zTracePrompt) { } elseif (!$zTracePrompt) {
$TraceFILE = 0; $TraceFILE = 0;
} }
self::$yyTraceFILE = $TraceFILE; $this->yyTraceFILE = $TraceFILE;
self::$yyTracePrompt = $zTracePrompt; $this->yyTracePrompt = $zTracePrompt;
} }
public static function PrintTrace() public function PrintTrace()
{ {
self::$yyTraceFILE = fopen('php://output', 'w'); $this->yyTraceFILE = fopen('php://output', 'w');
self::$yyTracePrompt = '<br>'; $this->yyTracePrompt = '<br>';
} }
public static $yyTraceFILE; public $yyTraceFILE;
public static $yyTracePrompt; public $yyTracePrompt;
public $yyidx; /* Index of top element in stack */ public $yyidx; /* Index of top element in stack */
public $yyerrcnt; /* Shifts left before out of the error */ public $yyerrcnt; /* Shifts left before out of the error */
public $yystack = array(); /* The parser's stack */ public $yystack = array(); /* The parser's stack */
public $yyTokenName = array( public $yyTokenName = array(
'$', 'OPENB', 'SECTION', 'CLOSEB', '$', 'OPENB', 'SECTION', 'CLOSEB',
'DOT', 'ID', 'EQUAL', 'FLOAT', 'DOT', 'ID', 'EQUAL', 'FLOAT',
'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING', 'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING',
'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING', 'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING',
'OTHER', 'NEWLINE', 'COMMENTSTART', 'error', 'OTHER', 'NEWLINE', 'COMMENTSTART', 'error',
'start', 'global_vars', 'sections', 'var_list', 'start', 'global_vars', 'sections', 'var_list',
'section', 'newline', 'var', 'value', 'section', 'newline', 'var', 'value',
); );
public static $yyRuleName = array( public static $yyRuleName = array(
@@ -373,9 +363,9 @@ static public $yy_action = array(
return; return;
} }
$yytos = array_pop($this->yystack); $yytos = array_pop($this->yystack);
if (self::$yyTraceFILE && $this->yyidx >= 0) { if ($this->yyTraceFILE && $this->yyidx >= 0) {
fwrite(self::$yyTraceFILE, fwrite($this->yyTraceFILE,
self::$yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] . $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
"\n"); "\n");
} }
$yymajor = $yytos->major; $yymajor = $yytos->major;
@@ -390,8 +380,8 @@ static public $yy_action = array(
while ($this->yystack !== Array()) { while ($this->yystack !== Array()) {
$this->yy_pop_parser_stack(); $this->yy_pop_parser_stack();
} }
if (is_resource(self::$yyTraceFILE)) { if (is_resource($this->yyTraceFILE)) {
fclose(self::$yyTraceFILE); fclose($this->yyTraceFILE);
} }
} }
@@ -559,8 +549,8 @@ static public $yy_action = array(
self::$yy_lookahead[$i] != $iLookAhead) { self::$yy_lookahead[$i] != $iLookAhead) {
if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
&& ($iFallback = self::$yyFallback[$iLookAhead]) != 0) { && ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " . fwrite($this->yyTraceFILE, $this->yyTracePrompt . "FALLBACK " .
$this->yyTokenName[$iLookAhead] . " => " . $this->yyTokenName[$iLookAhead] . " => " .
$this->yyTokenName[$iFallback] . "\n"); $this->yyTokenName[$iFallback] . "\n");
} }
@@ -602,8 +592,8 @@ static public $yy_action = array(
$this->yyidx++; $this->yyidx++;
if ($this->yyidx >= self::YYSTACKDEPTH) { if ($this->yyidx >= self::YYSTACKDEPTH) {
$this->yyidx--; $this->yyidx--;
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt); fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt);
} }
while ($this->yyidx >= 0) { while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack(); $this->yy_pop_parser_stack();
@@ -612,7 +602,7 @@ static public $yy_action = array(
$this->internalError = true; $this->internalError = true;
$this->compiler->trigger_config_file_error("Stack overflow in configfile parser"); $this->compiler->trigger_config_file_error("Stack overflow in configfile parser");
#line 593 "smarty_internal_configfileparser.php" #line 601 "smarty_internal_configfileparser.php"
return; return;
} }
@@ -621,15 +611,15 @@ static public $yy_action = array(
$yytos->major = $yyMajor; $yytos->major = $yyMajor;
$yytos->minor = $yypMinor; $yytos->minor = $yypMinor;
array_push($this->yystack, $yytos); array_push($this->yystack, $yytos);
if (self::$yyTraceFILE && $this->yyidx > 0) { if ($this->yyTraceFILE && $this->yyidx > 0) {
fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt, fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt,
$yyNewState); $yyNewState);
fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt); fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
for ($i = 1; $i <= $this->yyidx; $i++) { for ($i = 1; $i <= $this->yyidx; $i++) {
fprintf(self::$yyTraceFILE, " %s", fprintf($this->yyTraceFILE, " %s",
$this->yyTokenName[$this->yystack[$i]->major]); $this->yyTokenName[$this->yystack[$i]->major]);
} }
fwrite(self::$yyTraceFILE,"\n"); fwrite($this->yyTraceFILE,"\n");
} }
} }
@@ -683,115 +673,99 @@ static public $yy_action = array(
18 => 17, 18 => 17,
); );
#line 131 "smarty_internal_configfileparser.y" #line 131 "smarty_internal_configfileparser.y"
public function yy_r0() function yy_r0(){
{
$this->_retvalue = null; $this->_retvalue = null;
} }
#line 666 "smarty_internal_configfileparser.php" #line 675 "smarty_internal_configfileparser.php"
#line 136 "smarty_internal_configfileparser.y" #line 136 "smarty_internal_configfileparser.y"
public function yy_r1() function yy_r1(){
{
$this->add_global_vars($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = null; $this->add_global_vars($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = null;
} }
#line 671 "smarty_internal_configfileparser.php" #line 680 "smarty_internal_configfileparser.php"
#line 149 "smarty_internal_configfileparser.y" #line 149 "smarty_internal_configfileparser.y"
public function yy_r4() function yy_r4(){
{
$this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor); $this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor);
$this->_retvalue = null; $this->_retvalue = null;
} }
#line 677 "smarty_internal_configfileparser.php" #line 686 "smarty_internal_configfileparser.php"
#line 154 "smarty_internal_configfileparser.y" #line 154 "smarty_internal_configfileparser.y"
public function yy_r5() function yy_r5(){
{
if ($this->smarty->config_read_hidden) { if ($this->smarty->config_read_hidden) {
$this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor); $this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor);
} }
$this->_retvalue = null; $this->_retvalue = null;
} }
#line 685 "smarty_internal_configfileparser.php" #line 694 "smarty_internal_configfileparser.php"
#line 162 "smarty_internal_configfileparser.y" #line 162 "smarty_internal_configfileparser.y"
public function yy_r6() function yy_r6(){
{
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
} }
#line 690 "smarty_internal_configfileparser.php" #line 699 "smarty_internal_configfileparser.php"
#line 166 "smarty_internal_configfileparser.y" #line 166 "smarty_internal_configfileparser.y"
public function yy_r7() function yy_r7(){
{
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor, Array($this->yystack[$this->yyidx + 0]->minor)); $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor, Array($this->yystack[$this->yyidx + 0]->minor));
} }
#line 695 "smarty_internal_configfileparser.php" #line 704 "smarty_internal_configfileparser.php"
#line 170 "smarty_internal_configfileparser.y" #line 170 "smarty_internal_configfileparser.y"
public function yy_r8() function yy_r8(){
{
$this->_retvalue = Array(); $this->_retvalue = Array();
} }
#line 700 "smarty_internal_configfileparser.php" #line 709 "smarty_internal_configfileparser.php"
#line 176 "smarty_internal_configfileparser.y" #line 176 "smarty_internal_configfileparser.y"
public function yy_r9() function yy_r9(){
{
$this->_retvalue = Array("key" => $this->yystack[$this->yyidx + -2]->minor, "value" => $this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = Array("key" => $this->yystack[$this->yyidx + -2]->minor, "value" => $this->yystack[$this->yyidx + 0]->minor);
} }
#line 705 "smarty_internal_configfileparser.php" #line 714 "smarty_internal_configfileparser.php"
#line 181 "smarty_internal_configfileparser.y" #line 181 "smarty_internal_configfileparser.y"
public function yy_r10() function yy_r10(){
{
$this->_retvalue = (float) $this->yystack[$this->yyidx + 0]->minor; $this->_retvalue = (float) $this->yystack[$this->yyidx + 0]->minor;
} }
#line 710 "smarty_internal_configfileparser.php" #line 719 "smarty_internal_configfileparser.php"
#line 185 "smarty_internal_configfileparser.y" #line 185 "smarty_internal_configfileparser.y"
public function yy_r11() function yy_r11(){
{
$this->_retvalue = (int) $this->yystack[$this->yyidx + 0]->minor; $this->_retvalue = (int) $this->yystack[$this->yyidx + 0]->minor;
} }
#line 715 "smarty_internal_configfileparser.php" #line 724 "smarty_internal_configfileparser.php"
#line 189 "smarty_internal_configfileparser.y" #line 189 "smarty_internal_configfileparser.y"
public function yy_r12() function yy_r12(){
{
$this->_retvalue = $this->parse_bool($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->parse_bool($this->yystack[$this->yyidx + 0]->minor);
} }
#line 720 "smarty_internal_configfileparser.php" #line 729 "smarty_internal_configfileparser.php"
#line 193 "smarty_internal_configfileparser.y" #line 193 "smarty_internal_configfileparser.y"
public function yy_r13() function yy_r13(){
{
$this->_retvalue = self::parse_single_quoted_string($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = self::parse_single_quoted_string($this->yystack[$this->yyidx + 0]->minor);
} }
#line 725 "smarty_internal_configfileparser.php" #line 734 "smarty_internal_configfileparser.php"
#line 197 "smarty_internal_configfileparser.y" #line 197 "smarty_internal_configfileparser.y"
public function yy_r14() function yy_r14(){
{
$this->_retvalue = self::parse_double_quoted_string($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = self::parse_double_quoted_string($this->yystack[$this->yyidx + 0]->minor);
} }
#line 730 "smarty_internal_configfileparser.php" #line 739 "smarty_internal_configfileparser.php"
#line 201 "smarty_internal_configfileparser.y" #line 201 "smarty_internal_configfileparser.y"
public function yy_r15() function yy_r15(){
{
$this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[$this->yyidx + -1]->minor); $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[$this->yyidx + -1]->minor);
} }
#line 735 "smarty_internal_configfileparser.php" #line 744 "smarty_internal_configfileparser.php"
#line 205 "smarty_internal_configfileparser.y" #line 205 "smarty_internal_configfileparser.y"
public function yy_r16() function yy_r16(){
{
$this->_retvalue = ''; $this->_retvalue = '';
} }
#line 740 "smarty_internal_configfileparser.php" #line 749 "smarty_internal_configfileparser.php"
#line 209 "smarty_internal_configfileparser.y" #line 209 "smarty_internal_configfileparser.y"
public function yy_r17() function yy_r17(){
{
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
} }
#line 745 "smarty_internal_configfileparser.php" #line 754 "smarty_internal_configfileparser.php"
private $_retvalue; private $_retvalue;
public function yy_reduce($yyruleno) public function yy_reduce($yyruleno)
{ {
$yymsp = $this->yystack[$this->yyidx]; $yymsp = $this->yystack[$this->yyidx];
if (self::$yyTraceFILE && $yyruleno >= 0 if ($this->yyTraceFILE && $yyruleno >= 0
&& $yyruleno < count(self::$yyRuleName)) { && $yyruleno < count(self::$yyRuleName)) {
fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n", fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n",
self::$yyTracePrompt, $yyruleno, $this->yyTracePrompt, $yyruleno,
self::$yyRuleName[$yyruleno]); self::$yyRuleName[$yyruleno]);
} }
@@ -811,7 +785,7 @@ static public $yy_action = array(
} }
$yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto); $yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
if ($yyact < self::YYNSTATE) { if ($yyact < self::YYNSTATE) {
if (!self::$yyTraceFILE && $yysize) { if (!$this->yyTraceFILE && $yysize) {
$this->yyidx++; $this->yyidx++;
$x = new TPC_yyStackEntry; $x = new TPC_yyStackEntry;
$x->stateno = $yyact; $x->stateno = $yyact;
@@ -828,8 +802,8 @@ static public $yy_action = array(
public function yy_parse_failed() public function yy_parse_failed()
{ {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt); fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt);
} while ($this->yyidx >= 0) { } while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack(); $this->yy_pop_parser_stack();
} }
@@ -842,13 +816,13 @@ static public $yy_action = array(
$this->internalError = true; $this->internalError = true;
$this->yymajor = $yymajor; $this->yymajor = $yymajor;
$this->compiler->trigger_config_file_error(); $this->compiler->trigger_config_file_error();
#line 808 "smarty_internal_configfileparser.php" #line 816 "smarty_internal_configfileparser.php"
} }
public function yy_accept() public function yy_accept()
{ {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt); fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
} while ($this->yyidx >= 0) { } while ($this->yyidx >= 0) {
$stack = $this->yy_pop_parser_stack(); $stack = $this->yy_pop_parser_stack();
} }
@@ -858,7 +832,7 @@ static public $yy_action = array(
$this->internalError = false; $this->internalError = false;
$this->retvalue = $this->_retvalue; $this->retvalue = $this->_retvalue;
//echo $this->retvalue."\n\n"; //echo $this->retvalue."\n\n";
#line 826 "smarty_internal_configfileparser.php" #line 833 "smarty_internal_configfileparser.php"
} }
public function doParse($yymajor, $yytokenvalue) public function doParse($yymajor, $yytokenvalue)
@@ -876,9 +850,9 @@ static public $yy_action = array(
} }
$yyendofinput = ($yymajor==0); $yyendofinput = ($yymajor==0);
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sInput %s\n", fprintf($this->yyTraceFILE, "%sInput %s\n",
self::$yyTracePrompt, $this->yyTokenName[$yymajor]); $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
} }
do { do {
@@ -899,9 +873,9 @@ static public $yy_action = array(
} elseif ($yyact < self::YYNSTATE + self::YYNRULE) { } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
$this->yy_reduce($yyact - self::YYNSTATE); $this->yy_reduce($yyact - self::YYNSTATE);
} elseif ($yyact == self::YY_ERROR_ACTION) { } elseif ($yyact == self::YY_ERROR_ACTION) {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sSyntax Error!\n", fprintf($this->yyTraceFILE, "%sSyntax Error!\n",
self::$yyTracePrompt); $this->yyTracePrompt);
} }
if (self::YYERRORSYMBOL) { if (self::YYERRORSYMBOL) {
if ($this->yyerrcnt < 0) { if ($this->yyerrcnt < 0) {
@@ -909,9 +883,9 @@ static public $yy_action = array(
} }
$yymx = $this->yystack[$this->yyidx]->major; $yymx = $this->yystack[$this->yyidx]->major;
if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) { if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sDiscard input token %s\n", fprintf($this->yyTraceFILE, "%sDiscard input token %s\n",
self::$yyTracePrompt, $this->yyTokenName[$yymajor]); $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
} }
$this->yy_destructor($yymajor, $yytokenvalue); $this->yy_destructor($yymajor, $yytokenvalue);
$yymajor = self::YYNOCODE; $yymajor = self::YYNOCODE;

View File

@@ -98,8 +98,10 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom
// start state on child templates // start state on child templates
$this->lex->yypushstate(Smarty_Internal_Templatelexer::CHILDBODY); $this->lex->yypushstate(Smarty_Internal_Templatelexer::CHILDBODY);
} }
if ($this->smarty->_parserdebug) if ($this->smarty->_parserdebug) {
$this->parser->PrintTrace(); $this->parser->PrintTrace();
$this->lex->PrintTrace();
}
// get tokens from lexer and parse them // get tokens from lexer and parse them
while ($this->lex->yylex() && !$this->abort_and_recompile) { while ($this->lex->yylex() && !$this->abort_and_recompile) {
if ($this->smarty->_parserdebug) { if ($this->smarty->_parserdebug) {

View File

@@ -243,7 +243,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
{ {
// already in template cache? // already in template cache?
if ($this->smarty->allow_ambiguous_resources) { if ($this->smarty->allow_ambiguous_resources) {
$_templateId = Smarty_Resource::getUniqueTemplateName($this->smarty, $template) . $cache_id . $compile_id; $_templateId = Smarty_Resource::getUniqueTemplateName($this, $template) . $cache_id . $compile_id;
} else { } else {
$_templateId = $this->smarty->joined_template_dir . '#' . $template . $cache_id . $compile_id; $_templateId = $this->smarty->joined_template_dir . '#' . $template . $cache_id . $compile_id;
} }

View File

@@ -21,6 +21,9 @@ class Smarty_Internal_Templatelexer
public $taglineno; public $taglineno;
public $state = 1; public $state = 1;
private $heredoc_id_stack = Array(); private $heredoc_id_stack = Array();
public $yyTraceFILE;
public $yyTracePrompt;
public $state_name = array (1 => 'TEXT', 2 => 'SMARTY', 3 => 'LITERAL', 4 => 'DOUBLEQUOTEDSTRING', 5 => 'CHILDBODY');
public $smarty_token_names = array ( // Text for parser error messages public $smarty_token_names = array ( // Text for parser error messages
'IDENTITY' => '===', 'IDENTITY' => '===',
'NONEIDENTITY' => '!==', 'NONEIDENTITY' => '!==',
@@ -91,6 +94,12 @@ class Smarty_Internal_Templatelexer
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2; $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
} }
public function PrintTrace()
{
$this->yyTraceFILE = fopen('php://output', 'w');
$this->yyTracePrompt = '<br>';
}
private $_yy_state = 1; private $_yy_state = 1;
private $_yy_stack = array(); private $_yy_stack = array();
@@ -102,18 +111,34 @@ class Smarty_Internal_Templatelexer
public function yypushstate($state) public function yypushstate($state)
{ {
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
array_push($this->_yy_stack, $this->_yy_state); array_push($this->_yy_stack, $this->_yy_state);
$this->_yy_state = $state; $this->_yy_state = $state;
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
} }
public function yypopstate() public function yypopstate()
{ {
$this->_yy_state = array_pop($this->_yy_stack); if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
$this->_yy_state = array_pop($this->_yy_stack);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
} }
public function yybegin($state) public function yybegin($state)
{ {
$this->_yy_state = $state; $this->_yy_state = $state;
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
} }
@@ -205,7 +230,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_4($yy_subpatterns) function yy_r1_4($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_STRIPON; $this->token = Smarty_Internal_Templateparser::TP_STRIPON;
@@ -214,7 +239,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_5($yy_subpatterns) function yy_r1_5($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_STRIPOFF; $this->token = Smarty_Internal_Templateparser::TP_STRIPOFF;
@@ -223,7 +248,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_6($yy_subpatterns) function yy_r1_6($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LITERALSTART; $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
@@ -233,7 +258,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_7($yy_subpatterns) function yy_r1_7($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELIF; $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
@@ -244,7 +269,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_9($yy_subpatterns) function yy_r1_9($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELFOR; $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
@@ -255,7 +280,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_10($yy_subpatterns) function yy_r1_10($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH; $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
@@ -266,7 +291,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_11($yy_subpatterns) function yy_r1_11($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER; $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER;
@@ -277,7 +302,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_12($yy_subpatterns) function yy_r1_12($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
@@ -288,7 +313,7 @@ class Smarty_Internal_Templatelexer
function yy_r1_13($yy_subpatterns) function yy_r1_13($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDEL; $this->token = Smarty_Internal_Templateparser::TP_LDEL;
@@ -786,7 +811,7 @@ class Smarty_Internal_Templatelexer
function yy_r2_70($yy_subpatterns) function yy_r2_70($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELIF; $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
@@ -797,7 +822,7 @@ class Smarty_Internal_Templatelexer
function yy_r2_72($yy_subpatterns) function yy_r2_72($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELFOR; $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
@@ -808,7 +833,7 @@ class Smarty_Internal_Templatelexer
function yy_r2_73($yy_subpatterns) function yy_r2_73($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH; $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
@@ -819,7 +844,7 @@ class Smarty_Internal_Templatelexer
function yy_r2_74($yy_subpatterns) function yy_r2_74($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
@@ -830,7 +855,7 @@ class Smarty_Internal_Templatelexer
function yy_r2_75($yy_subpatterns) function yy_r2_75($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDEL; $this->token = Smarty_Internal_Templateparser::TP_LDEL;
@@ -913,7 +938,7 @@ class Smarty_Internal_Templatelexer
function yy_r3_1($yy_subpatterns) function yy_r3_1($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LITERALSTART; $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
@@ -923,7 +948,7 @@ class Smarty_Internal_Templatelexer
function yy_r3_2($yy_subpatterns) function yy_r3_2($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LITERALEND; $this->token = Smarty_Internal_Templateparser::TP_LITERALEND;
@@ -1049,7 +1074,7 @@ class Smarty_Internal_Templatelexer
function yy_r4_1($yy_subpatterns) function yy_r4_1($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELIF; $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
@@ -1060,7 +1085,7 @@ class Smarty_Internal_Templatelexer
function yy_r4_3($yy_subpatterns) function yy_r4_3($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELFOR; $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
@@ -1071,7 +1096,7 @@ class Smarty_Internal_Templatelexer
function yy_r4_4($yy_subpatterns) function yy_r4_4($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH; $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
@@ -1082,7 +1107,7 @@ class Smarty_Internal_Templatelexer
function yy_r4_5($yy_subpatterns) function yy_r4_5($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
@@ -1093,7 +1118,7 @@ class Smarty_Internal_Templatelexer
function yy_r4_6($yy_subpatterns) function yy_r4_6($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_TEXT; $this->token = Smarty_Internal_Templateparser::TP_TEXT;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_LDEL; $this->token = Smarty_Internal_Templateparser::TP_LDEL;
@@ -1211,7 +1236,7 @@ class Smarty_Internal_Templatelexer
function yy_r5_1($yy_subpatterns) function yy_r5_1($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
return false; return false;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_STRIPON; $this->token = Smarty_Internal_Templateparser::TP_STRIPON;
@@ -1220,7 +1245,7 @@ class Smarty_Internal_Templatelexer
function yy_r5_2($yy_subpatterns) function yy_r5_2($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
return false; return false;
} else { } else {
$this->token = Smarty_Internal_Templateparser::TP_STRIPOFF; $this->token = Smarty_Internal_Templateparser::TP_STRIPOFF;
@@ -1229,7 +1254,7 @@ class Smarty_Internal_Templatelexer
function yy_r5_3($yy_subpatterns) function yy_r5_3($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
return false; return false;
} else { } else {
$this->yypopstate(); $this->yypopstate();
@@ -1321,7 +1346,7 @@ class Smarty_Internal_Templatelexer
function yy_r6_1($yy_subpatterns) function yy_r6_1($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE;
} else { } else {
$this->yypopstate(); $this->yypopstate();
@@ -1331,7 +1356,7 @@ class Smarty_Internal_Templatelexer
function yy_r6_2($yy_subpatterns) function yy_r6_2($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE;
} else { } else {
$this->yypopstate(); $this->yypopstate();
@@ -1341,7 +1366,7 @@ class Smarty_Internal_Templatelexer
function yy_r6_3($yy_subpatterns) function yy_r6_3($yy_subpatterns)
{ {
if ($this->smarty->auto_literal && (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false)) { if ($this->smarty->auto_literal && ($this->mbstring_overload ? (mb_strpos(" \n\t\r",mb_substr($this->value,$this->ldel_length,1,'latin1'),0,'latin1') !== false) : (strpos(" \n\t\r",substr($this->value,$this->ldel_length,1)) !== false))) {
$this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE; $this->token = Smarty_Internal_Templateparser::TP_BLOCKSOURCE;
} else { } else {
$this->yypopstate(); $this->yypopstate();

View File

@@ -1179,25 +1179,25 @@ static public $yy_action = array(
const YYFALLBACK = 0; const YYFALLBACK = 0;
public static $yyFallback = array( public static $yyFallback = array(
); );
public static function Trace($TraceFILE, $zTracePrompt) public function Trace($TraceFILE, $zTracePrompt)
{ {
if (!$TraceFILE) { if (!$TraceFILE) {
$zTracePrompt = 0; $zTracePrompt = 0;
} elseif (!$zTracePrompt) { } elseif (!$zTracePrompt) {
$TraceFILE = 0; $TraceFILE = 0;
} }
self::$yyTraceFILE = $TraceFILE; $this->yyTraceFILE = $TraceFILE;
self::$yyTracePrompt = $zTracePrompt; $this->yyTracePrompt = $zTracePrompt;
} }
public static function PrintTrace() public function PrintTrace()
{ {
self::$yyTraceFILE = fopen('php://output', 'w'); $this->yyTraceFILE = fopen('php://output', 'w');
self::$yyTracePrompt = '<br>'; $this->yyTracePrompt = '<br>';
} }
public static $yyTraceFILE; public $yyTraceFILE;
public static $yyTracePrompt; public $yyTracePrompt;
public $yyidx; /* Index of top element in stack */ public $yyidx; /* Index of top element in stack */
public $yyerrcnt; /* Shifts left before out of the error */ public $yyerrcnt; /* Shifts left before out of the error */
public $yystack = array(); /* The parser's stack */ public $yystack = array(); /* The parser's stack */
@@ -1469,9 +1469,9 @@ static public $yy_action = array(
return; return;
} }
$yytos = array_pop($this->yystack); $yytos = array_pop($this->yystack);
if (self::$yyTraceFILE && $this->yyidx >= 0) { if ($this->yyTraceFILE && $this->yyidx >= 0) {
fwrite(self::$yyTraceFILE, fwrite($this->yyTraceFILE,
self::$yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] . $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
"\n"); "\n");
} }
$yymajor = $yytos->major; $yymajor = $yytos->major;
@@ -1486,8 +1486,8 @@ static public $yy_action = array(
while ($this->yystack !== Array()) { while ($this->yystack !== Array()) {
$this->yy_pop_parser_stack(); $this->yy_pop_parser_stack();
} }
if (is_resource(self::$yyTraceFILE)) { if (is_resource($this->yyTraceFILE)) {
fclose(self::$yyTraceFILE); fclose($this->yyTraceFILE);
} }
} }
@@ -1655,8 +1655,8 @@ static public $yy_action = array(
self::$yy_lookahead[$i] != $iLookAhead) { self::$yy_lookahead[$i] != $iLookAhead) {
if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
&& ($iFallback = self::$yyFallback[$iLookAhead]) != 0) { && ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " . fwrite($this->yyTraceFILE, $this->yyTracePrompt . "FALLBACK " .
$this->yyTokenName[$iLookAhead] . " => " . $this->yyTokenName[$iLookAhead] . " => " .
$this->yyTokenName[$iFallback] . "\n"); $this->yyTokenName[$iFallback] . "\n");
} }
@@ -1698,8 +1698,8 @@ static public $yy_action = array(
$this->yyidx++; $this->yyidx++;
if ($this->yyidx >= self::YYSTACKDEPTH) { if ($this->yyidx >= self::YYSTACKDEPTH) {
$this->yyidx--; $this->yyidx--;
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt); fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt);
} }
while ($this->yyidx >= 0) { while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack(); $this->yy_pop_parser_stack();
@@ -1717,15 +1717,15 @@ static public $yy_action = array(
$yytos->major = $yyMajor; $yytos->major = $yyMajor;
$yytos->minor = $yypMinor; $yytos->minor = $yypMinor;
array_push($this->yystack, $yytos); array_push($this->yystack, $yytos);
if (self::$yyTraceFILE && $this->yyidx > 0) { if ($this->yyTraceFILE && $this->yyidx > 0) {
fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt, fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt,
$yyNewState); $yyNewState);
fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt); fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
for ($i = 1; $i <= $this->yyidx; $i++) { for ($i = 1; $i <= $this->yyidx; $i++) {
fprintf(self::$yyTraceFILE, " %s", fprintf($this->yyTraceFILE, " %s",
$this->yyTokenName[$this->yystack[$i]->major]); $this->yyTokenName[$this->yystack[$i]->major]);
} }
fwrite(self::$yyTraceFILE,"\n"); fwrite($this->yyTraceFILE,"\n");
} }
} }
@@ -3079,10 +3079,10 @@ static public $yy_action = array(
public function yy_reduce($yyruleno) public function yy_reduce($yyruleno)
{ {
$yymsp = $this->yystack[$this->yyidx]; $yymsp = $this->yystack[$this->yyidx];
if (self::$yyTraceFILE && $yyruleno >= 0 if ($this->yyTraceFILE && $yyruleno >= 0
&& $yyruleno < count(self::$yyRuleName)) { && $yyruleno < count(self::$yyRuleName)) {
fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n", fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n",
self::$yyTracePrompt, $yyruleno, $this->yyTracePrompt, $yyruleno,
self::$yyRuleName[$yyruleno]); self::$yyRuleName[$yyruleno]);
} }
@@ -3102,7 +3102,7 @@ static public $yy_action = array(
} }
$yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto); $yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
if ($yyact < self::YYNSTATE) { if ($yyact < self::YYNSTATE) {
if (!self::$yyTraceFILE && $yysize) { if (!$this->yyTraceFILE && $yysize) {
$this->yyidx++; $this->yyidx++;
$x = new TP_yyStackEntry; $x = new TP_yyStackEntry;
$x->stateno = $yyact; $x->stateno = $yyact;
@@ -3119,8 +3119,8 @@ static public $yy_action = array(
public function yy_parse_failed() public function yy_parse_failed()
{ {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt); fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt);
} while ($this->yyidx >= 0) { } while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack(); $this->yy_pop_parser_stack();
} }
@@ -3138,8 +3138,8 @@ static public $yy_action = array(
public function yy_accept() public function yy_accept()
{ {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt); fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
} while ($this->yyidx >= 0) { } while ($this->yyidx >= 0) {
$stack = $this->yy_pop_parser_stack(); $stack = $this->yy_pop_parser_stack();
} }
@@ -3167,9 +3167,9 @@ static public $yy_action = array(
} }
$yyendofinput = ($yymajor==0); $yyendofinput = ($yymajor==0);
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sInput %s\n", fprintf($this->yyTraceFILE, "%sInput %s\n",
self::$yyTracePrompt, $this->yyTokenName[$yymajor]); $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
} }
do { do {
@@ -3190,9 +3190,9 @@ static public $yy_action = array(
} elseif ($yyact < self::YYNSTATE + self::YYNRULE) { } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
$this->yy_reduce($yyact - self::YYNSTATE); $this->yy_reduce($yyact - self::YYNSTATE);
} elseif ($yyact == self::YY_ERROR_ACTION) { } elseif ($yyact == self::YY_ERROR_ACTION) {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sSyntax Error!\n", fprintf($this->yyTraceFILE, "%sSyntax Error!\n",
self::$yyTracePrompt); $this->yyTracePrompt);
} }
if (self::YYERRORSYMBOL) { if (self::YYERRORSYMBOL) {
if ($this->yyerrcnt < 0) { if ($this->yyerrcnt < 0) {
@@ -3200,9 +3200,9 @@ static public $yy_action = array(
} }
$yymx = $this->yystack[$this->yyidx]->major; $yymx = $this->yystack[$this->yyidx]->major;
if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) { if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) {
if (self::$yyTraceFILE) { if ($this->yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sDiscard input token %s\n", fprintf($this->yyTraceFILE, "%sDiscard input token %s\n",
self::$yyTracePrompt, $this->yyTokenName[$yymajor]); $this->yyTracePrompt, $this->yyTokenName[$yymajor]);
} }
$this->yy_destructor($yymajor, $yytokenvalue); $this->yy_destructor($yymajor, $yytokenvalue);
$yymajor = self::YYNOCODE; $yymajor = self::YYNOCODE;
@@ -3241,4 +3241,4 @@ static public $yy_action = array(
} }
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
} }
} }

View File

@@ -491,17 +491,21 @@ abstract class Smarty_Resource
/** /**
* modify template_resource according to resource handlers specifications * modify template_resource according to resource handlers specifications
* *
* @param string $smarty Smarty instance * @param Smarty_Internal_template $template Smarty instance
* @param string $template_resource template_resource to extracate resource handler and name of * @param string $template_resource template_resource to extracate resource handler and name of
* @return string unique resource name * @return string unique resource name
*/ */
public static function getUniqueTemplateName($smarty, $template_resource) public static function getUniqueTemplateName($template, $template_resource)
{ {
self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type); self::parseResourceName($template_resource, $template->smarty->default_resource_type, $name, $type);
// TODO: optimize for Smarty's internal resource types // TODO: optimize for Smarty's internal resource types
$resource = Smarty_Resource::load($smarty, $type); $resource = Smarty_Resource::load($template->smarty, $type);
// go relative to a given template?
return $resource->buildUniqueResourceName($smarty, $name); $_file_is_dotted = $name[0] == '.' && ($name[1] == '.' || $name[1] == '/' || $name[1] == "\\");
if ($template instanceof Smarty_Internal_Template && $_file_is_dotted && ($template->source->type == 'file' || $template->parent->source->type == 'extends')) {
$name = dirname($template->source->filepath) . DS . $name;
}
return $resource->buildUniqueResourceName($template->smarty, $name);
} }
/** /**
@@ -524,7 +528,14 @@ abstract class Smarty_Resource
// parse resource_name, load resource handler, identify unique resource name // parse resource_name, load resource handler, identify unique resource name
self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type); self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type);
$resource = Smarty_Resource::load($smarty, $type); $resource = Smarty_Resource::load($smarty, $type);
$unique_resource_name = $resource->buildUniqueResourceName($smarty, $name); // go relative to a given template?
$_file_is_dotted = isset($name[0]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/' || $name[1] == "\\");
if ($_file_is_dotted && isset($_template) && $_template->parent instanceof Smarty_Internal_Template && ($_template->parent->source->type == 'file' || $_template->parent->source->type == 'extends')) {
$name2 = dirname($_template->parent->source->filepath) . DS . $name;
} else {
$name2 = $name;
}
$unique_resource_name = $resource->buildUniqueResourceName($smarty, $name2);
// check runtime cache // check runtime cache
$_cache_key = 'template|' . $unique_resource_name; $_cache_key = 'template|' . $unique_resource_name;