Index: src/php_amule_lib.cpp
===================================================================
--- src/php_amule_lib.cpp	(revision 10745)
+++ src/php_amule_lib.cpp	(working copy)
@@ -45,6 +45,7 @@
  * datastructre
  *
  */
+#include <src/PartFile.h>
 
 void php_native_shared_file_cmd(PHP_VALUE_NODE *)
 {
@@ -64,7 +65,7 @@
 	si = get_scope_item(g_current_scope, "__param_2");
 	PHP_VAR_NODE *opt_param = si ? si->var : 0;
 
-	if ( !strcmp(cmd_name, "prio") && !opt_param ) {
+	if ( (!strcmp(cmd_name, "prio") ) && !opt_param ) {
 		php_report_error(PHP_ERROR, "Command 'prio' need 3-rd argument");
 		return;
 	}
@@ -846,6 +847,35 @@
 	} else if ( strcmp(prop_name, "hash") == 0 ) {
 		result->type = PHP_VAL_STRING;
 		result->str_val = strdup((const char *)unicode2UTF8(obj->sFileHash));
+	} else if ( strcmp(prop_name, "sourcenames") == 0 ) {
+		int i=0;
+		const SourcenameItemMap &sources = obj->GetSourcenameItemMap();
+		SourcenameItemMap::const_iterator end = sources.end();		
+		cast_value_array(result);
+		for (SourcenameItemMap::const_iterator it = sources.begin(); it != sources.end(); ++it) {
+			const SourcenameItem *cur_src = &(it->second);
+			PHP_VAR_NODE *src_node = array_get_by_int_key(result, i++);
+			value_value_free(&src_node->value);
+			src_node->value.type = PHP_VAL_OBJECT;
+			src_node->value.obj_val.class_name = "AmuleDownloadFileSourceNames";
+			src_node->value.obj_val.inst_ptr = (void *)cur_src;
+			i++;
+		}
+	} else if ( strcmp(prop_name, "comments") == 0 ) {
+		int i=0;
+		const SimplerFileRatingList &comments= obj->GetFileRatingList();
+		SimplerFileRatingList::const_iterator end = comments.end();		
+		cast_value_array(result);
+		for (SimplerFileRatingList::const_iterator it = comments.begin(); it != comments.end(); ++it) {
+			PHP_VAR_NODE *rating_node = array_get_by_int_key(result, i++);
+			value_value_free(&rating_node->value);
+			rating_node->value.type = PHP_VAL_OBJECT;
+			rating_node->value.obj_val.class_name = "AmuleDownloadFileRatings";
+			rating_node->value.obj_val.inst_ptr = (void *) reinterpret_cast<wxUIntPtr>(new SSimplerFileRating(*it));
+			i++;
+		}	
+	} else if ( strcmp(prop_name, "average_rating") == 0 ) {
+		result->int_val= obj->iUserRating;
 	} else if ( strcmp(prop_name, "progress") == 0 ) {
 		result->type = PHP_VAL_STRING;
 		result->str_val = strdup((const char *)unicode2UTF8(obj->m_Image->GetHTML()));
@@ -882,6 +912,49 @@
 		php_report_error(PHP_ERROR, "'DownloadFile' property [%s] is unknown", prop_name);
 	}
 }
+void amule_download_file_sourcenames_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result)
+{
+	if ( !ptr ) {
+		value_value_free(result);
+		return;
+	}
+	
+	SourcenameItem *obj = (SourcenameItem *)ptr;
+	result->type = PHP_VAL_INT;
+	if ( strcmp(prop_name, "name") == 0 ) {
+		result->type = PHP_VAL_STRING;
+		result->str_val = strdup((const char *)unicode2UTF8(obj->name));
+	} else if ( strcmp(prop_name, "count") == 0 ) {
+		result->type = PHP_VAL_INT;
+		result->int_val= obj->count;
+	} else {
+		php_report_error(PHP_ERROR, "'DownloadFileSourceNames' property [%s] is unknown", prop_name);
+	}
+}
+void amule_download_file_ratings_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result)
+{
+	if ( !ptr ) {
+		value_value_free(result);
+		return;
+	}
+	SSimplerFileRating *obj = (SSimplerFileRating *)ptr;
+	result->type = PHP_VAL_INT;
+	if ( strcmp(prop_name, "username") == 0 ) {
+		result->type = PHP_VAL_STRING;
+		result->str_val = strdup((const char *)unicode2UTF8(obj->UserName));
+	} else if ( strcmp(prop_name, "filename") == 0 ) {
+		result->type = PHP_VAL_STRING;
+		result->str_val = strdup((const char *)unicode2UTF8(obj->FileName));
+	} else if ( strcmp(prop_name, "rating") == 0 ) {
+		result->type = PHP_VAL_INT;
+		result->int_val= obj->Rating;
+	} else if ( strcmp(prop_name, "comment") == 0 ) {
+		result->type = PHP_VAL_STRING;
+		result->str_val = strdup((const char *)unicode2UTF8(obj->Comment));
+	} else {
+		php_report_error(PHP_ERROR, "'DownloadFileRatings' property [%s] is unknown", prop_name);
+	}
+}
 
 void amule_upload_file_prop_get(void *ptr, char *prop_name, PHP_VALUE_NODE *result)
 {
@@ -1149,6 +1222,8 @@
 	}
 	// load object definitions
 	php_add_native_class("AmuleDownloadFile", amule_download_file_prop_get);
+	php_add_native_class("AmuleDownloadFileRatings", amule_download_file_ratings_prop_get);
+	php_add_native_class("AmuleDownloadFileSourceNames", amule_download_file_sourcenames_prop_get);
 	php_add_native_class("AmuleUploadFile", amule_upload_file_prop_get);
 	php_add_native_class("AmuleServer", amule_server_prop_get);
 	php_add_native_class("AmuleSharedFile", amule_shared_file_prop_get);
Index: src/php_lexer.c
===================================================================
--- src/php_lexer.c	(revision 10745)
+++ src/php_lexer.c	(working copy)
@@ -6,10 +6,29 @@
 
 /* A lexical scanner generated by flex */
 
+#define yy_create_buffer php_create_buffer
+#define yy_delete_buffer php_delete_buffer
+#define yy_flex_debug php_flex_debug
+#define yy_init_buffer php_init_buffer
+#define yy_flush_buffer php_flush_buffer
+#define yy_load_buffer_state php_load_buffer_state
+#define yy_switch_to_buffer php_switch_to_buffer
+#define yyin phpin
+#define yyleng phpleng
+#define yylex phplex
+#define yylineno phplineno
+#define yyout phpout
+#define yyrestart phprestart
+#define yytext phptext
+#define yywrap phpwrap
+#define yyalloc phpalloc
+#define yyrealloc phprealloc
+#define yyfree phpfree
+
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 33
+#define YY_FLEX_SUBMINOR_VERSION 35
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -31,7 +50,7 @@
 
 /* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
 
-#if __STDC_VERSION__ >= 199901L
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 
 /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
  * if you want the limit (max/min) macros for int types. 
@@ -54,7 +73,6 @@
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -85,6 +103,8 @@
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -94,11 +114,12 @@
 
 #else	/* ! __cplusplus */
 
-#if __STDC__
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
 
 #define YY_USE_CONST
 
-#endif	/* __STDC__ */
+#endif	/* defined (__STDC__) */
 #endif	/* ! __cplusplus */
 
 #ifdef YY_USE_CONST
@@ -140,7 +161,15 @@
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
 /* The state buf must be large enough to hold one state per character in the main buffer.
@@ -191,14 +220,9 @@
 
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-
 #ifndef YY_TYPEDEF_YY_SIZE_T
 #define YY_TYPEDEF_YY_SIZE_T
-typedef unsigned int yy_size_t;
+typedef size_t yy_size_t;
 #endif
 
 #ifndef YY_STRUCT_YY_BUFFER_STATE
@@ -713,7 +737,7 @@
 
 
 
-#line 717 "php_lexer.c"
+#line 741 "php_lexer.c"
 
 #define INITIAL 0
 #define BLOCK_COMMENT 1
@@ -734,6 +758,35 @@
 
 static int yy_init_globals (void );
 
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int phplex_destroy (void );
+
+int phpget_debug (void );
+
+void phpset_debug (int debug_flag  );
+
+YY_EXTRA_TYPE phpget_extra (void );
+
+void phpset_extra (YY_EXTRA_TYPE user_defined  );
+
+FILE *phpget_in (void );
+
+void phpset_in  (FILE * in_str  );
+
+FILE *phpget_out (void );
+
+void phpset_out  (FILE * out_str  );
+
+int phpget_leng (void );
+
+char *phpget_text (void );
+
+int phpget_lineno (void );
+
+void phpset_lineno (int line_number  );
+
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
  */
@@ -778,7 +831,12 @@
     
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
@@ -786,7 +844,7 @@
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO (void) fwrite( phptext, phpleng, 1, phpout )
+#define ECHO do { if (fwrite( phptext, phpleng, 1, phpout )) {} } while (0)
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -882,7 +940,7 @@
 #line 73 "php_lexer.l"
 
 
-#line 886 "php_lexer.c"
+#line 944 "php_lexer.c"
 
 	if ( !(yy_init) )
 		{
@@ -1441,7 +1499,7 @@
 #line 251 "php_lexer.l"
 ECHO;
 	YY_BREAK
-#line 1445 "php_lexer.c"
+#line 1503 "php_lexer.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(BLOCK_COMMENT):
 case YY_STATE_EOF(LINE_COMMENT):
@@ -1675,7 +1733,7 @@
 
 		/* Read in more data. */
 		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			(yy_n_chars), num_to_read );
+			(yy_n_chars), (size_t) num_to_read );
 
 		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
 		}
@@ -1699,6 +1757,14 @@
 	else
 		ret_val = EOB_ACT_CONTINUE_SCAN;
 
+	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+		/* Extend the array by 50%, plus the number we really need. */
+		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) phprealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
+		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+	}
+
 	(yy_n_chars) += number_to_move;
 	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
 	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
@@ -1854,7 +1920,7 @@
 				case EOB_ACT_END_OF_FILE:
 					{
 					if ( phpwrap( ) )
-						return 0;
+						return EOF;
 
 					if ( ! (yy_did_buffer_switch_on_eof) )
 						YY_NEW_FILE;
@@ -2123,7 +2189,9 @@
 		(yy_buffer_stack) = (struct yy_buffer_state**)phpalloc
 								(num_to_alloc * sizeof(struct yy_buffer_state*)
 								);
-		
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in phpensure_buffer_stack()" );
+								  
 		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
 				
 		(yy_buffer_stack_max) = num_to_alloc;
@@ -2141,6 +2209,8 @@
 								((yy_buffer_stack),
 								num_to_alloc * sizeof(struct yy_buffer_state*)
 								);
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in phpensure_buffer_stack()" );
 
 		/* zero only the new slots.*/
 		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
@@ -2185,7 +2255,7 @@
 
 /** Setup the input buffer state to scan a string. The next call to phplex() will
  * scan from a @e copy of @a str.
- * @param str a NUL-terminated string to scan
+ * @param yystr a NUL-terminated string to scan
  * 
  * @return the newly allocated buffer state object.
  * @note If you want to scan bytes that may contain NUL values, then use
@@ -2199,8 +2269,8 @@
 
 /** Setup the input buffer state to scan the given bytes. The next call to phplex() will
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * 
  * @return the newly allocated buffer state object.
  */
@@ -2250,8 +2320,7 @@
 			(yy_start_stack) = (int *) phprealloc((void *) (yy_start_stack),new_size  );
 
 		if ( ! (yy_start_stack) )
-			YY_FATAL_ERROR(
-			"out of memory expanding start-condition stack" );
+			YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
 		}
 
 	(yy_start_stack)[(yy_start_stack_ptr)++] = YY_START;
Index: src/php_parser.c
===================================================================
--- src/php_parser.c	(revision 10745)
+++ src/php_parser.c	(working copy)
@@ -1,23 +1,23 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
 
+/* A Bison parser, made by GNU Bison 2.4.1.  */
+
 /* Skeleton implementation for Bison's Yacc-like parsers in C
-
+   
+      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -28,7 +28,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -46,7 +46,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.3"
+#define YYBISON_VERSION "2.4.1"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -54,19 +54,117 @@
 /* Pure parsers.  */
 #define YYPURE 0
 
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
 /* Using locations.  */
 #define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
-#define yyparse phpparse
-#define yylex   phplex
-#define yyerror phperror
-#define yylval  phplval
-#define yychar  phpchar
-#define yydebug phpdebug
-#define yynerrs phpnerrs
+#define yyparse         phpparse
+#define yylex           phplex
+#define yyerror         phperror
+#define yylval          phplval
+#define yychar          phpchar
+#define yydebug         phpdebug
+#define yynerrs         phpnerrs
 
 
+/* Copy the first part of user declarations.  */
+
+/* Line 189 of yacc.c  */
+#line 1 "php_parser.y"
+
+//
+// This file is part of the aMule Project.
+//
+// Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
+// Copyright (c) 2005-2011 Froenchenko Leonid ( lfroen@gmail.com / http://www.amule.org )
+//
+// Any parts of this program derived from the xMule, lMule or eMule project,
+// or contributed by third-party developers are copyrighted by their
+// respective authors.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
+//
+
+#include <stdio.h>
+#include <string.h>
+
+#include "php_syntree.h"
+
+int phplex();
+
+// add item to syntree list
+PHP_SYN_NODE *add_statement_2_list(PHP_SYN_NODE *list, PHP_SYN_NODE *st)
+{
+	if ( st && list) {
+		PHP_SYN_NODE *last = list;
+		while ( last->next_node ) {
+			last = last->next_node;
+		}
+		last->next_node = st;
+		return list;
+	} else if ( st ) {
+		return st;
+	} else {
+		return list;
+	}
+}
+
+PHP_SYN_NODE *add_branch_2_elseif(PHP_SYN_NODE *list, PHP_SYN_NODE *branch)
+{
+	if ( list ) {
+		PHP_SYN_NODE *curr_if = list;
+		while ( curr_if->node_if.code_else ) {
+			curr_if = curr_if->node_if.code_else;
+		}
+		curr_if->node_if.code_else = branch;
+		return list;
+	} else {
+		return branch;
+	}
+}
+
+
+
+/* Line 189 of yacc.c  */
+#line 148 "php_parser.c"
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 1
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
@@ -163,209 +261,37 @@
      END_SCRIPT = 345
    };
 #endif
-/* Tokens.  */
-#define FNUMBER 258
-#define DNUMBER 259
-#define STRING 260
-#define IDENT 261
-#define VARIABLE 262
-#define T_ECHO 263
-#define EXIT 264
-#define IF 265
-#define DO 266
-#define WHILE 267
-#define ENDWHILE 268
-#define FOR 269
-#define ENDFOR 270
-#define FOREACH 271
-#define ENDFOREACH 272
-#define DECLARE 273
-#define ENDDECLARE 274
-#define AS 275
-#define CONST 276
-#define GLOBAL 277
-#define UNSET 278
-#define ISSET 279
-#define EMPTY 280
-#define SWITCH 281
-#define ENDSWITCH 282
-#define CASE 283
-#define DEFAULT 284
-#define BREAK 285
-#define CONTINUE 286
-#define FUNCTION 287
-#define RETURN 288
-#define CLASS 289
-#define INTERFACE 290
-#define EXTENDS 291
-#define IMPLEMENTS 292
-#define OBJECT_OPERATOR 293
-#define HASH_ASSIGN 294
-#define LIST 295
-#define ARRAY 296
-#define CLASS_SCOPE 297
-#define PRINT 298
-#define SR_EQ 299
-#define SL_EQ 300
-#define XOR_EQ 301
-#define OR_EQ 302
-#define AND_EQ 303
-#define MOD_EQ 304
-#define CONCAT_EQ 305
-#define DIV_EQ 306
-#define MUL_EQ 307
-#define MINUS_EQ 308
-#define PLUS_EQ 309
-#define LOG_OR 310
-#define LOG_XOR 311
-#define LOG_AND 312
-#define BOOLEAN_OR 313
-#define BOOLEAN_AND 314
-#define IS_NOIDENTICAL 315
-#define IS_IDENTICAL 316
-#define IS_NOEQUAL 317
-#define IS_EQ 318
-#define IS_GREATER_OR_EQ 319
-#define IS_SMALLER_OR_EQ 320
-#define SR 321
-#define SL 322
-#define INSTANCEOF 323
-#define UNSET_CAST 324
-#define BOOL_CAST 325
-#define OBJECT_CAST 326
-#define ARRAY_CAST 327
-#define STRING_CAST 328
-#define DOUBLE_CAST 329
-#define INT_CAST 330
-#define DEC 331
-#define INC 332
-#define CLONE 333
-#define NEW 334
-#define ELSEIF 335
-#define ELSE 336
-#define ENDIF 337
-#define PUBLIC 338
-#define PROTECTED 339
-#define PRIVATE 340
-#define FINAL 341
-#define ABSTRACT 342
-#define STATIC 343
-#define START_SCRIPT 344
-#define END_SCRIPT 345
 
 
 
-
-/* Copy the first part of user declarations.  */
-#line 1 "php_parser.y"
-
-//
-// This file is part of the aMule Project.
-//
-// Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
-// Copyright (c) 2005-2011 Froenchenko Leonid ( lfroen@gmail.com / http://www.amule.org )
-//
-// Any parts of this program derived from the xMule, lMule or eMule project,
-// or contributed by third-party developers are copyrighted by their
-// respective authors.
-//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
-//
-
-#include <stdio.h>
-#include <string.h>
-
-#include "php_syntree.h"
-
-int phplex();
-
-// add item to syntree list
-PHP_SYN_NODE *add_statement_2_list(PHP_SYN_NODE *list, PHP_SYN_NODE *st)
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
 {
-	if ( st && list) {
-		PHP_SYN_NODE *last = list;
-		while ( last->next_node ) {
-			last = last->next_node;
-		}
-		last->next_node = st;
-		return list;
-	} else if ( st ) {
-		return st;
-	} else {
-		return list;
-	}
-}
 
-PHP_SYN_NODE *add_branch_2_elseif(PHP_SYN_NODE *list, PHP_SYN_NODE *branch)
-{
-	if ( list ) {
-		PHP_SYN_NODE *curr_if = list;
-		while ( curr_if->node_if.code_else ) {
-			curr_if = curr_if->node_if.code_else;
-		}
-		curr_if->node_if.code_else = branch;
-		return list;
-	} else {
-		return branch;
-	}
-}
+/* Line 214 of yacc.c  */
+#line 67 "php_parser.y"
 
+	PHP_SYN_NODE *syn_node;
+	PHP_EXP_NODE *exp_node;
 
+	char str_val[256];
 
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 1
-#endif
 
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 67 "php_parser.y"
-{
-	PHP_SYN_NODE *syn_node;
-	PHP_EXP_NODE *exp_node;
-
-	char str_val[256];
-}
-/* Line 193 of yacc.c.  */
-#line 357 "php_parser.c"
-	YYSTYPE;
+/* Line 214 of yacc.c  */
+#line 283 "php_parser.c"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 
-
 /* Copy the second part of user declarations.  */
 
 
-/* Line 216 of yacc.c.  */
-#line 370 "php_parser.c"
+/* Line 264 of yacc.c  */
+#line 295 "php_parser.c"
 
 #ifdef short
 # undef short
@@ -415,7 +341,7 @@
 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
 
 #ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
+# if YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
@@ -440,14 +366,14 @@
 #if (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 static int
-YYID (int i)
+YYID (int yyi)
 #else
 static int
-YYID (i)
-    int i;
+YYID (yyi)
+    int yyi;
 #endif
 {
-  return i;
+  return yyi;
 }
 #endif
 
@@ -528,9 +454,9 @@
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  yytype_int16 yyss;
-  YYSTYPE yyvs;
-  };
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
 
 /* The size of the maximum gap between one aligned stack and the next.  */
 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
@@ -564,12 +490,12 @@
    elements in the stack, and YYPTR gives the new location of the
    stack.  Advance YYPTR to a properly aligned location for the next
    stack.  */
-# define YYSTACK_RELOCATE(Stack)					\
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
     do									\
       {									\
 	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack, Stack, yysize);				\
-	Stack = &yyptr->Stack;						\
+	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
+	Stack = &yyptr->Stack_alloc;					\
 	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
@@ -780,7 +706,7 @@
   "program_tree", "top_statement_list", "top_statement", "statement",
   "decl_list", "expr_list", "variable_list", "global_var_list",
   "global_var", "static_var_list", "static_var", "function_decl_statement",
-  "@1", "parameter_list", "optional_class_type", "for_statement",
+  "$@1", "parameter_list", "optional_class_type", "for_statement",
   "foreach_statement", "for_expr", "elseif_list", "else_statement",
   "while_statement", "switch_case_list", "case_list", "case_list_item",
   "case_separator", "const_value", "variable", "deref_variable",
@@ -1709,7 +1635,7 @@
    we won't break user code: when these are the locations we know.  */
 
 #ifndef YY_LOCATION_PRINT
-# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
+# if YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)			\
      fprintf (File, "%d.%d-%d.%d",			\
 	      (Loc).first_line, (Loc).first_column,	\
@@ -1820,17 +1746,20 @@
 #if (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 static void
-yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
 #else
 static void
-yy_stack_print (bottom, top)
-    yytype_int16 *bottom;
-    yytype_int16 *top;
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
 #endif
 {
   YYFPRINTF (stderr, "Stack now");
-  for (; bottom <= top; ++bottom)
-    YYFPRINTF (stderr, " %d", *bottom);
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
   YYFPRINTF (stderr, "\n");
 }
 
@@ -1864,11 +1793,11 @@
   /* The symbols being reduced.  */
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
-      fprintf (stderr, "   $%d = ", yyi + 1);
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
       yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
 		       &(yyvsp[(yyi + 1) - (yynrhs)])
 		       		       );
-      fprintf (stderr, "\n");
+      YYFPRINTF (stderr, "\n");
     }
 }
 
@@ -2148,10 +2077,8 @@
 	break;
     }
 }
-
 
 /* Prevent warnings from -Wmissing-prototypes.  */
-
 #ifdef YYPARSE_PARAM
 #if defined __STDC__ || defined __cplusplus
 int yyparse (void *YYPARSE_PARAM);
@@ -2167,11 +2094,10 @@
 #endif /* ! YYPARSE_PARAM */
 
 
-
-/* The look-ahead symbol.  */
+/* The lookahead symbol.  */
 int yychar;
 
-/* The semantic value of the look-ahead symbol.  */
+/* The semantic value of the lookahead symbol.  */
 YYSTYPE yylval;
 
 /* Number of syntax errors so far.  */
@@ -2179,9 +2105,9 @@
 
 
 
-/*----------.
-| yyparse.  |
-`----------*/
+/*-------------------------.
+| yyparse or yypush_parse.  |
+`-------------------------*/
 
 #ifdef YYPARSE_PARAM
 #if (defined __STDC__ || defined __C99__FUNC__ \
@@ -2205,66 +2131,68 @@
 #endif
 #endif
 {
-  
-  int yystate;
-  int yyn;
-  int yyresult;
-  /* Number of tokens to shift before error messages enabled.  */
-  int yyerrstatus;
-  /* Look-ahead token as an internal (translated) token number.  */
-  int yytoken = 0;
-#if YYERROR_VERBOSE
-  /* Buffer for error messages, and its allocated size.  */
-  char yymsgbuf[128];
-  char *yymsg = yymsgbuf;
-  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
 
-  /* Three stacks and their tools:
-     `yyss': related to states,
-     `yyvs': related to semantic values,
-     `yyls': related to locations.
 
-     Refer to the stacks thru separate pointers, to allow yyoverflow
-     to reallocate them elsewhere.  */
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
 
-  /* The state stack.  */
-  yytype_int16 yyssa[YYINITDEPTH];
-  yytype_int16 *yyss = yyssa;
-  yytype_int16 *yyssp;
+    /* The stacks and their tools:
+       `yyss': related to states.
+       `yyvs': related to semantic values.
 
-  /* The semantic value stack.  */
-  YYSTYPE yyvsa[YYINITDEPTH];
-  YYSTYPE *yyvs = yyvsa;
-  YYSTYPE *yyvsp;
+       Refer to the stacks thru separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
 
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
 
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
 
-#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+    YYSIZE_T yystacksize;
 
-  YYSIZE_T yystacksize = YYINITDEPTH;
-
+  int yyn;
+  int yyresult;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
 
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
 
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
   /* The number of symbols on the RHS of the reduced rule.
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
+  yytoken = 0;
+  yyss = yyssa;
+  yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
+
   YYDPRINTF ((stderr, "Starting parse\n"));
 
   yystate = 0;
   yyerrstatus = 0;
   yynerrs = 0;
-  yychar = YYEMPTY;		/* Cause a token to be read.  */
+  yychar = YYEMPTY; /* Cause a token to be read.  */
 
   /* Initialize stack pointers.
      Waste one element of value and location stack
      so that they stay on the same level as the state stack.
      The wasted elements are never initialized.  */
-
   yyssp = yyss;
   yyvsp = yyvs;
 
@@ -2294,7 +2222,6 @@
 	YYSTYPE *yyvs1 = yyvs;
 	yytype_int16 *yyss1 = yyss;
 
-
 	/* Each stack pointer address is followed by the size of the
 	   data in use in that stack, in bytes.  This used to be a
 	   conditional around just the two extra args, but that might
@@ -2302,7 +2229,6 @@
 	yyoverflow (YY_("memory exhausted"),
 		    &yyss1, yysize * sizeof (*yyssp),
 		    &yyvs1, yysize * sizeof (*yyvsp),
-
 		    &yystacksize);
 
 	yyss = yyss1;
@@ -2325,9 +2251,8 @@
 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 	if (! yyptr)
 	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss);
-	YYSTACK_RELOCATE (yyvs);
-
+	YYSTACK_RELOCATE (yyss_alloc, yyss);
+	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
 #  undef YYSTACK_RELOCATE
 	if (yyss1 != yyssa)
 	  YYSTACK_FREE (yyss1);
@@ -2338,7 +2263,6 @@
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
 
-
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 		  (unsigned long int) yystacksize));
 
@@ -2348,6 +2272,9 @@
 
   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
 
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
   goto yybackup;
 
 /*-----------.
@@ -2356,16 +2283,16 @@
 yybackup:
 
   /* Do appropriate processing given the current state.  Read a
-     look-ahead token if we need one and don't already have one.  */
+     lookahead token if we need one and don't already have one.  */
 
-  /* First try to decide what to do without reference to look-ahead token.  */
+  /* First try to decide what to do without reference to lookahead token.  */
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
 
-  /* Not known => get a look-ahead token if don't already have one.  */
+  /* Not known => get a lookahead token if don't already have one.  */
 
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
@@ -2397,20 +2324,16 @@
       goto yyreduce;
     }
 
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
   /* Count tokens shifted since error; after three, turn off error
      status.  */
   if (yyerrstatus)
     yyerrstatus--;
 
-  /* Shift the look-ahead token.  */
+  /* Shift the lookahead token.  */
   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 
-  /* Discard the shifted token unless it is eof.  */
-  if (yychar != YYEOF)
-    yychar = YYEMPTY;
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
 
   yystate = yyn;
   *++yyvsp = yylval;
@@ -2450,111 +2373,155 @@
   switch (yyn)
     {
         case 2:
+
+/* Line 1455 of yacc.c  */
 #line 142 "php_parser.y"
     { g_syn_tree_top = (yyvsp[(2) - (3)].syn_node); ;}
     break;
 
   case 3:
+
+/* Line 1455 of yacc.c  */
 #line 146 "php_parser.y"
     { (yyval.syn_node) = add_statement_2_list((yyvsp[(1) - (2)].syn_node), (yyvsp[(2) - (2)].syn_node)); ;}
     break;
 
   case 4:
+
+/* Line 1455 of yacc.c  */
 #line 147 "php_parser.y"
     { (yyval.syn_node) = 0; ;}
     break;
 
   case 6:
+
+/* Line 1455 of yacc.c  */
 #line 153 "php_parser.y"
     { (yyval.syn_node) = (yyvsp[(2) - (3)].syn_node); ;}
     break;
 
   case 8:
+
+/* Line 1455 of yacc.c  */
 #line 159 "php_parser.y"
     { (yyval.syn_node) = (yyvsp[(2) - (3)].syn_node); ;}
     break;
 
   case 9:
+
+/* Line 1455 of yacc.c  */
 #line 160 "php_parser.y"
     { (yyval.syn_node) = make_expr_syn_node(PHP_ST_EXPR, (yyvsp[(1) - (2)].exp_node)); ;}
     break;
 
   case 10:
+
+/* Line 1455 of yacc.c  */
 #line 161 "php_parser.y"
     { (yyval.syn_node) = 0; ;}
     break;
 
   case 11:
+
+/* Line 1455 of yacc.c  */
 #line 162 "php_parser.y"
     { (yyval.syn_node) = (yyvsp[(2) - (3)].syn_node); ;}
     break;
 
   case 12:
+
+/* Line 1455 of yacc.c  */
 #line 163 "php_parser.y"
     { (yyval.syn_node) = make_ifelse_syn_node((yyvsp[(3) - (7)].exp_node), (yyvsp[(5) - (7)].syn_node), (yyvsp[(6) - (7)].syn_node), (yyvsp[(7) - (7)].syn_node)); ;}
     break;
 
   case 13:
+
+/* Line 1455 of yacc.c  */
 #line 164 "php_parser.y"
     { (yyval.syn_node) = make_while_loop_syn_node((yyvsp[(3) - (5)].exp_node), (yyvsp[(5) - (5)].syn_node), 1); ;}
     break;
 
   case 14:
+
+/* Line 1455 of yacc.c  */
 #line 165 "php_parser.y"
     { (yyval.syn_node) = make_while_loop_syn_node((yyvsp[(5) - (7)].exp_node), (yyvsp[(2) - (7)].syn_node), 0); ;}
     break;
 
   case 15:
+
+/* Line 1455 of yacc.c  */
 #line 166 "php_parser.y"
     { (yyval.syn_node) = make_for_syn_node((yyvsp[(3) - (9)].exp_node), (yyvsp[(5) - (9)].exp_node), (yyvsp[(7) - (9)].exp_node), (yyvsp[(9) - (9)].syn_node)); ;}
     break;
 
   case 16:
+
+/* Line 1455 of yacc.c  */
 #line 167 "php_parser.y"
     { (yyval.syn_node) = make_switch_syn_node((yyvsp[(3) - (5)].exp_node), (yyvsp[(5) - (5)].exp_node)); ;}
     break;
 
   case 17:
+
+/* Line 1455 of yacc.c  */
 #line 168 "php_parser.y"
     { (yyval.syn_node) = make_expr_syn_node(PHP_ST_CONTINUE, 0); ;}
     break;
 
   case 18:
+
+/* Line 1455 of yacc.c  */
 #line 169 "php_parser.y"
     { (yyval.syn_node) = make_expr_syn_node(PHP_ST_CONTINUE, (yyvsp[(2) - (3)].exp_node)); ;}
     break;
 
   case 19:
+
+/* Line 1455 of yacc.c  */
 #line 170 "php_parser.y"
     { (yyval.syn_node) = make_expr_syn_node(PHP_ST_BREAK, 0); ;}
     break;
 
   case 20:
+
+/* Line 1455 of yacc.c  */
 #line 171 "php_parser.y"
     { (yyval.syn_node) = make_expr_syn_node(PHP_ST_BREAK, (yyvsp[(2) - (3)].exp_node)); ;}
     break;
 
   case 21:
+
+/* Line 1455 of yacc.c  */
 #line 172 "php_parser.y"
     { (yyval.syn_node) = make_expr_syn_node(PHP_ST_RET, 0); ;}
     break;
 
   case 22:
+
+/* Line 1455 of yacc.c  */
 #line 173 "php_parser.y"
     { (yyval.syn_node) = make_expr_syn_node(PHP_ST_RET, (yyvsp[(2) - (3)].exp_node)); ;}
     break;
 
   case 23:
+
+/* Line 1455 of yacc.c  */
 #line 174 "php_parser.y"
     { (yyval.syn_node) = make_expr_syn_node(PHP_ST_ECHO, (yyvsp[(2) - (3)].exp_node)); ;}
     break;
 
   case 24:
+
+/* Line 1455 of yacc.c  */
 #line 175 "php_parser.y"
     {  ;}
     break;
 
   case 25:
+
+/* Line 1455 of yacc.c  */
 #line 176 "php_parser.y"
     {
 				(yyval.syn_node) = make_foreach_loop_syn_node((yyvsp[(3) - (7)].exp_node), 0, (yyvsp[(5) - (7)].exp_node), (yyvsp[(7) - (7)].syn_node), 0);
@@ -2562,6 +2529,8 @@
     break;
 
   case 26:
+
+/* Line 1455 of yacc.c  */
 #line 179 "php_parser.y"
     {
 				(yyval.syn_node) = make_foreach_loop_syn_node((yyvsp[(3) - (9)].exp_node), (yyvsp[(5) - (9)].exp_node), (yyvsp[(7) - (9)].exp_node), (yyvsp[(9) - (9)].syn_node), 0);
@@ -2569,6 +2538,8 @@
     break;
 
   case 27:
+
+/* Line 1455 of yacc.c  */
 #line 182 "php_parser.y"
     {
 				(yyval.syn_node) = make_foreach_loop_syn_node((yyvsp[(3) - (10)].exp_node), (yyvsp[(5) - (10)].exp_node), (yyvsp[(8) - (10)].exp_node), (yyvsp[(10) - (10)].syn_node), 1);
@@ -2576,36 +2547,50 @@
     break;
 
   case 28:
+
+/* Line 1455 of yacc.c  */
 #line 185 "php_parser.y"
     { ;}
     break;
 
   case 29:
+
+/* Line 1455 of yacc.c  */
 #line 186 "php_parser.y"
     { ;}
     break;
 
   case 30:
+
+/* Line 1455 of yacc.c  */
 #line 187 "php_parser.y"
     { (yyval.syn_node) = 0; ;}
     break;
 
   case 31:
+
+/* Line 1455 of yacc.c  */
 #line 190 "php_parser.y"
     {  ;}
     break;
 
   case 32:
+
+/* Line 1455 of yacc.c  */
 #line 191 "php_parser.y"
     {  ;}
     break;
 
   case 33:
+
+/* Line 1455 of yacc.c  */
 #line 194 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_LIST, 0); (yyval.exp_node)->exp_node = (yyvsp[(1) - (1)].exp_node); ;}
     break;
 
   case 34:
+
+/* Line 1455 of yacc.c  */
 #line 195 "php_parser.y"
     {
 				PHP_EXP_NODE *last = (yyvsp[(1) - (3)].exp_node);
@@ -2617,16 +2602,22 @@
     break;
 
   case 37:
+
+/* Line 1455 of yacc.c  */
 #line 211 "php_parser.y"
     { (yyval.syn_node) = 0; ;}
     break;
 
   case 38:
+
+/* Line 1455 of yacc.c  */
 #line 212 "php_parser.y"
     {  ;}
     break;
 
   case 39:
+
+/* Line 1455 of yacc.c  */
 #line 216 "php_parser.y"
     {
 		const char *varname = get_scope_var_name(g_current_scope, (yyvsp[(1) - (1)].exp_node)->var_si_node->var);
@@ -2644,21 +2635,29 @@
     break;
 
   case 40:
+
+/* Line 1455 of yacc.c  */
 #line 231 "php_parser.y"
     { (yyval.syn_node) = 0; ;}
     break;
 
   case 41:
+
+/* Line 1455 of yacc.c  */
 #line 232 "php_parser.y"
     {  ;}
     break;
 
   case 42:
+
+/* Line 1455 of yacc.c  */
 #line 235 "php_parser.y"
     { (yyvsp[(1) - (1)].exp_node)->var_node->flags |= PHP_VARFLAG_STATIC; (yyval.exp_node) = (yyvsp[(1) - (1)].exp_node); ;}
     break;
 
   case 43:
+
+/* Line 1455 of yacc.c  */
 #line 236 "php_parser.y"
     {
 			(yyvsp[(1) - (3)].exp_node)->var_node->flags |= PHP_VARFLAG_STATIC; (yyval.exp_node) = (yyvsp[(1) - (3)].exp_node);
@@ -2667,6 +2666,8 @@
     break;
 
   case 44:
+
+/* Line 1455 of yacc.c  */
 #line 244 "php_parser.y"
     {
 				switch_push_scope_table(make_scope_table())
@@ -2674,6 +2675,8 @@
     break;
 
   case 45:
+
+/* Line 1455 of yacc.c  */
 #line 246 "php_parser.y"
     {
 				(yyval.syn_node) = make_func_decl_syn_node((yyvsp[(2) - (9)].str_val), (yyvsp[(5) - (9)].exp_node));
@@ -2687,106 +2690,148 @@
     break;
 
   case 46:
+
+/* Line 1455 of yacc.c  */
 #line 255 "php_parser.y"
     {  ;}
     break;
 
   case 47:
+
+/* Line 1455 of yacc.c  */
 #line 259 "php_parser.y"
     { (yyval.exp_node) = make_func_param(0, (yyvsp[(2) - (2)].exp_node), (yyvsp[(1) - (2)].str_val), 0); ;}
     break;
 
   case 48:
+
+/* Line 1455 of yacc.c  */
 #line 260 "php_parser.y"
     { (yyval.exp_node) = make_func_param(0, (yyvsp[(3) - (3)].exp_node), (yyvsp[(1) - (3)].str_val), 1); ;}
     break;
 
   case 49:
+
+/* Line 1455 of yacc.c  */
 #line 261 "php_parser.y"
     { (yyval.exp_node) = make_func_param((yyvsp[(1) - (4)].exp_node), (yyvsp[(4) - (4)].exp_node), (yyvsp[(3) - (4)].str_val), 0); ;}
     break;
 
   case 50:
+
+/* Line 1455 of yacc.c  */
 #line 262 "php_parser.y"
     { (yyval.exp_node) = make_func_param((yyvsp[(1) - (5)].exp_node), (yyvsp[(5) - (5)].exp_node), (yyvsp[(3) - (5)].str_val), 1); ;}
     break;
 
   case 51:
+
+/* Line 1455 of yacc.c  */
 #line 263 "php_parser.y"
     { (yyval.exp_node) = 0; ;}
     break;
 
   case 52:
+
+/* Line 1455 of yacc.c  */
 #line 267 "php_parser.y"
     { (yyval.str_val)[0] = 0; ;}
     break;
 
   case 55:
+
+/* Line 1455 of yacc.c  */
 #line 273 "php_parser.y"
     { (yyval.syn_node) = (yyvsp[(2) - (4)].syn_node); ;}
     break;
 
   case 57:
+
+/* Line 1455 of yacc.c  */
 #line 278 "php_parser.y"
     { (yyval.syn_node) = (yyvsp[(2) - (4)].syn_node); ;}
     break;
 
   case 59:
+
+/* Line 1455 of yacc.c  */
 #line 282 "php_parser.y"
     { (yyval.exp_node) = 0; ;}
     break;
 
   case 60:
+
+/* Line 1455 of yacc.c  */
 #line 286 "php_parser.y"
     { (yyval.syn_node) = add_branch_2_elseif((yyvsp[(1) - (6)].syn_node), make_ifelse_syn_node((yyvsp[(4) - (6)].exp_node), (yyvsp[(6) - (6)].syn_node), 0, 0)); ;}
     break;
 
   case 61:
+
+/* Line 1455 of yacc.c  */
 #line 287 "php_parser.y"
     { (yyval.syn_node) = 0; ;}
     break;
 
   case 62:
+
+/* Line 1455 of yacc.c  */
 #line 291 "php_parser.y"
     { (yyval.syn_node) = 0; ;}
     break;
 
   case 63:
+
+/* Line 1455 of yacc.c  */
 #line 292 "php_parser.y"
     { (yyval.syn_node) = (yyvsp[(2) - (2)].syn_node); ;}
     break;
 
   case 65:
+
+/* Line 1455 of yacc.c  */
 #line 296 "php_parser.y"
     { (yyval.syn_node) = (yyvsp[(2) - (4)].syn_node); ;}
     break;
 
   case 66:
+
+/* Line 1455 of yacc.c  */
 #line 300 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(2) - (3)].exp_node); ;}
     break;
 
   case 67:
+
+/* Line 1455 of yacc.c  */
 #line 301 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(3) - (4)].exp_node); ;}
     break;
 
   case 68:
+
+/* Line 1455 of yacc.c  */
 #line 302 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(2) - (4)].exp_node); ;}
     break;
 
   case 69:
+
+/* Line 1455 of yacc.c  */
 #line 303 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(3) - (5)].exp_node); ;}
     break;
 
   case 70:
+
+/* Line 1455 of yacc.c  */
 #line 307 "php_parser.y"
     {  (yyval.exp_node) = 0; ;}
     break;
 
   case 71:
+
+/* Line 1455 of yacc.c  */
 #line 308 "php_parser.y"
     {
 			(yyvsp[(2) - (4)].exp_node)->tree_node.syn_right = (yyvsp[(4) - (4)].syn_node);
@@ -2804,421 +2849,589 @@
     break;
 
   case 72:
+
+/* Line 1455 of yacc.c  */
 #line 323 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LIST, (yyvsp[(2) - (2)].exp_node), 0); ;}
     break;
 
   case 73:
+
+/* Line 1455 of yacc.c  */
 #line 324 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LIST, 0, 0); ;}
     break;
 
   case 79:
+
+/* Line 1455 of yacc.c  */
 #line 335 "php_parser.y"
     { (yyval.exp_node) = make_known_const((yyvsp[(1) - (1)].str_val)); ;}
     break;
 
   case 81:
+
+/* Line 1455 of yacc.c  */
 #line 339 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_CLASS_DEREF, make_const_exp_str((yyvsp[(1) - (3)].str_val), 0), make_const_exp_str((yyvsp[(3) - (3)].str_val), 0)); ;}
     break;
 
   case 82:
+
+/* Line 1455 of yacc.c  */
 #line 340 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_OBJECT_DEREF, (yyvsp[(1) - (3)].exp_node), make_const_exp_str((yyvsp[(3) - (3)].str_val), 0)); ;}
     break;
 
   case 84:
+
+/* Line 1455 of yacc.c  */
 #line 345 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_BY_KEY, (yyvsp[(1) - (3)].exp_node), 0); ;}
     break;
 
   case 85:
+
+/* Line 1455 of yacc.c  */
 #line 346 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_BY_KEY, (yyvsp[(1) - (4)].exp_node), (yyvsp[(3) - (4)].exp_node));;}
     break;
 
   case 86:
+
+/* Line 1455 of yacc.c  */
 #line 347 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_BY_KEY, (yyvsp[(1) - (4)].exp_node), (yyvsp[(3) - (4)].exp_node));;}
     break;
 
   case 87:
+
+/* Line 1455 of yacc.c  */
 #line 348 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_VAR_BY_EXP, (yyvsp[(3) - (4)].exp_node)); ;}
     break;
 
   case 88:
+
+/* Line 1455 of yacc.c  */
 #line 352 "php_parser.y"
     { (yyval.exp_node) = make_func_call_exp((yyvsp[(1) - (4)].str_val), (yyvsp[(3) - (4)].exp_node)); ;}
     break;
 
   case 89:
+
+/* Line 1455 of yacc.c  */
 #line 353 "php_parser.y"
     { ;}
     break;
 
   case 90:
+
+/* Line 1455 of yacc.c  */
 #line 354 "php_parser.y"
     { ;}
     break;
 
   case 91:
+
+/* Line 1455 of yacc.c  */
 #line 357 "php_parser.y"
     { (yyval.exp_node) = make_func_call_param_list(); func_call_add_expr((yyval.exp_node)->var_node, (yyvsp[(1) - (1)].exp_node), 0); ;}
     break;
 
   case 92:
+
+/* Line 1455 of yacc.c  */
 #line 358 "php_parser.y"
     { (yyval.exp_node) = make_func_call_param_list(); func_call_add_expr((yyval.exp_node)->var_node, (yyvsp[(2) - (2)].exp_node), 1); ;}
     break;
 
   case 93:
+
+/* Line 1455 of yacc.c  */
 #line 359 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(1) - (3)].exp_node); func_call_add_expr((yyval.exp_node)->var_node, (yyvsp[(3) - (3)].exp_node), 0); ;}
     break;
 
   case 94:
+
+/* Line 1455 of yacc.c  */
 #line 360 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(1) - (4)].exp_node); func_call_add_expr((yyval.exp_node)->var_node, (yyvsp[(4) - (4)].exp_node), 1); ;}
     break;
 
   case 95:
+
+/* Line 1455 of yacc.c  */
 #line 361 "php_parser.y"
     { (yyval.exp_node) = make_func_call_param_list(); ;}
     break;
 
   case 96:
+
+/* Line 1455 of yacc.c  */
 #line 366 "php_parser.y"
     { ;}
     break;
 
   case 98:
+
+/* Line 1455 of yacc.c  */
 #line 368 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 99:
+
+/* Line 1455 of yacc.c  */
 #line 369 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(1) - (1)].exp_node); ;}
     break;
 
   case 100:
+
+/* Line 1455 of yacc.c  */
 #line 370 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_MAKE_REF, (yyvsp[(1) - (4)].exp_node), (yyvsp[(4) - (4)].exp_node)); ;}
     break;
 
   case 101:
+
+/* Line 1455 of yacc.c  */
 #line 375 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_ADD, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 102:
+
+/* Line 1455 of yacc.c  */
 #line 376 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_SUB, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 103:
+
+/* Line 1455 of yacc.c  */
 #line 377 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_MUL, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 104:
+
+/* Line 1455 of yacc.c  */
 #line 378 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_DIV, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 105:
+
+/* Line 1455 of yacc.c  */
 #line 379 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_CAT, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 106:
+
+/* Line 1455 of yacc.c  */
 #line 380 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_REM, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 107:
+
+/* Line 1455 of yacc.c  */
 #line 381 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_AND, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 108:
+
+/* Line 1455 of yacc.c  */
 #line 382 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_OR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 109:
+
+/* Line 1455 of yacc.c  */
 #line 383 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_XOR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 110:
+
+/* Line 1455 of yacc.c  */
 #line 384 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_SHL, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 111:
+
+/* Line 1455 of yacc.c  */
 #line 385 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (3)].exp_node), make_exp_2(PHP_OP_SHR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node))); ;}
     break;
 
   case 112:
+
+/* Line 1455 of yacc.c  */
 #line 387 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (2)].exp_node), make_exp_2(PHP_OP_ADD, (yyvsp[(1) - (2)].exp_node), make_const_exp_dnum(1))); ;}
     break;
 
   case 113:
+
+/* Line 1455 of yacc.c  */
 #line 388 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(2) - (2)].exp_node), make_exp_2(PHP_OP_ADD, (yyvsp[(2) - (2)].exp_node), make_const_exp_dnum(1))); ;}
     break;
 
   case 114:
+
+/* Line 1455 of yacc.c  */
 #line 389 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(1) - (2)].exp_node), make_exp_2(PHP_OP_SUB, (yyvsp[(1) - (2)].exp_node), make_const_exp_dnum(1))); ;}
     break;
 
   case 115:
+
+/* Line 1455 of yacc.c  */
 #line 390 "php_parser.y"
     { (yyval.exp_node) = make_exp_2_self(PHP_OP_ASS, (yyvsp[(2) - (2)].exp_node), make_exp_2(PHP_OP_SUB, (yyvsp[(2) - (2)].exp_node), make_const_exp_dnum(1))); ;}
     break;
 
   case 116:
+
+/* Line 1455 of yacc.c  */
 #line 392 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_OR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 117:
+
+/* Line 1455 of yacc.c  */
 #line 393 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_AND, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 118:
+
+/* Line 1455 of yacc.c  */
 #line 394 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_OR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 119:
+
+/* Line 1455 of yacc.c  */
 #line 395 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_AND, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 120:
+
+/* Line 1455 of yacc.c  */
 #line 396 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LOG_XOR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 121:
+
+/* Line 1455 of yacc.c  */
 #line 397 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_OR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 122:
+
+/* Line 1455 of yacc.c  */
 #line 398 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_AND, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 123:
+
+/* Line 1455 of yacc.c  */
 #line 399 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_XOR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 124:
+
+/* Line 1455 of yacc.c  */
 #line 400 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_CAT, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 125:
+
+/* Line 1455 of yacc.c  */
 #line 401 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_ADD, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 126:
+
+/* Line 1455 of yacc.c  */
 #line 402 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_SUB, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 127:
+
+/* Line 1455 of yacc.c  */
 #line 403 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_MUL, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 128:
+
+/* Line 1455 of yacc.c  */
 #line 404 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_DIV, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 129:
+
+/* Line 1455 of yacc.c  */
 #line 405 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_REM, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 130:
+
+/* Line 1455 of yacc.c  */
 #line 406 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_SHL, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 131:
+
+/* Line 1455 of yacc.c  */
 #line 407 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_SHR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 132:
+
+/* Line 1455 of yacc.c  */
 #line 408 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(2) - (2)].exp_node); ;}
     break;
 
   case 133:
+
+/* Line 1455 of yacc.c  */
 #line 409 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_SUB, make_const_exp_dnum(0), (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
   case 134:
+
+/* Line 1455 of yacc.c  */
 #line 410 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_LOG_NOT, (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
   case 135:
+
+/* Line 1455 of yacc.c  */
 #line 411 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_NOT, (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
   case 136:
+
+/* Line 1455 of yacc.c  */
 #line 412 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_SAME, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 137:
+
+/* Line 1455 of yacc.c  */
 #line 413 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_NOT_SAME, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 138:
+
+/* Line 1455 of yacc.c  */
 #line 414 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_EQ, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 139:
+
+/* Line 1455 of yacc.c  */
 #line 415 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_NEQ, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 140:
+
+/* Line 1455 of yacc.c  */
 #line 416 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LWR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 141:
+
+/* Line 1455 of yacc.c  */
 #line 417 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_LWR_EQ, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 142:
+
+/* Line 1455 of yacc.c  */
 #line 418 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_GRT, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 143:
+
+/* Line 1455 of yacc.c  */
 #line 419 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_GRT_EQ, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 144:
+
+/* Line 1455 of yacc.c  */
 #line 420 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(2) - (3)].exp_node); ;}
     break;
 
   case 145:
+
+/* Line 1455 of yacc.c  */
 #line 421 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_MUX, (yyvsp[(3) - (5)].exp_node), (yyvsp[(5) - (5)].exp_node)); (yyval.exp_node)->exp_node = (yyvsp[(1) - (5)].exp_node); ;}
     break;
 
   case 146:
+
+/* Line 1455 of yacc.c  */
 #line 422 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_CAST_INT, (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
   case 147:
+
+/* Line 1455 of yacc.c  */
 #line 423 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_CAST_FLOAT, (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
   case 148:
+
+/* Line 1455 of yacc.c  */
 #line 424 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_CAST_STR, (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
   case 149:
+
+/* Line 1455 of yacc.c  */
 #line 425 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_CAST_BOOL, (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
   case 150:
+
+/* Line 1455 of yacc.c  */
 #line 428 "php_parser.y"
     {  ;}
     break;
 
   case 151:
+
+/* Line 1455 of yacc.c  */
 #line 429 "php_parser.y"
     {  ;}
     break;
 
   case 152:
+
+/* Line 1455 of yacc.c  */
 #line 430 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(2) - (2)].exp_node); ;}
     break;
 
   case 153:
+
+/* Line 1455 of yacc.c  */
 #line 432 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(1) - (1)].exp_node); ;}
     break;
 
   case 154:
+
+/* Line 1455 of yacc.c  */
 #line 433 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_ARRAY, (yyvsp[(3) - (4)].exp_node)); ;}
     break;
 
   case 155:
+
+/* Line 1455 of yacc.c  */
 #line 434 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_PRINT, (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
   case 156:
+
+/* Line 1455 of yacc.c  */
 #line 437 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(2) - (3)].exp_node); ;}
     break;
 
   case 157:
+
+/* Line 1455 of yacc.c  */
 #line 438 "php_parser.y"
     { (yyval.exp_node) = 0; ;}
     break;
 
   case 158:
+
+/* Line 1455 of yacc.c  */
 #line 439 "php_parser.y"
     { (yyval.exp_node) = 0; ;}
     break;
 
   case 161:
+
+/* Line 1455 of yacc.c  */
 #line 447 "php_parser.y"
     { /*$$ = make_assign_node($1);*/ ;}
     break;
 
   case 162:
+
+/* Line 1455 of yacc.c  */
 #line 448 "php_parser.y"
     { (yyval.exp_node) = (yyvsp[(3) - (4)].exp_node); ;}
     break;
 
   case 163:
+
+/* Line 1455 of yacc.c  */
 #line 449 "php_parser.y"
     { /*$$ = make_assign_node(0);*/ ;}
     break;
 
   case 164:
+
+/* Line 1455 of yacc.c  */
 #line 452 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_LIST, 0); (yyval.exp_node)->exp_node = (yyvsp[(1) - (1)].exp_node); ;}
     break;
 
   case 165:
+
+/* Line 1455 of yacc.c  */
 #line 453 "php_parser.y"
     {
 				PHP_EXP_NODE *last = (yyvsp[(1) - (3)].exp_node);
@@ -3230,28 +3443,37 @@
     break;
 
   case 166:
+
+/* Line 1455 of yacc.c  */
 #line 462 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_ARRAY_PAIR, (yyvsp[(1) - (1)].exp_node)); ;}
     break;
 
   case 167:
+
+/* Line 1455 of yacc.c  */
 #line 463 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_PAIR, (yyvsp[(1) - (3)].exp_node), (yyvsp[(3) - (3)].exp_node)); ;}
     break;
 
   case 168:
+
+/* Line 1455 of yacc.c  */
 #line 464 "php_parser.y"
     { (yyval.exp_node) = make_exp_2(PHP_OP_ARRAY_REF_PAIR, (yyvsp[(1) - (4)].exp_node), (yyvsp[(4) - (4)].exp_node)); ;}
     break;
 
   case 169:
+
+/* Line 1455 of yacc.c  */
 #line 465 "php_parser.y"
     { (yyval.exp_node) = make_exp_1(PHP_OP_ARRAY_REF_PAIR, (yyvsp[(2) - (2)].exp_node)); ;}
     break;
 
 
-/* Line 1267 of yacc.c.  */
-#line 3256 "php_parser.c"
+
+/* Line 1455 of yacc.c  */
+#line 3477 "php_parser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3262,7 +3484,6 @@
 
   *++yyvsp = yyval;
 
-
   /* Now `shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
@@ -3327,7 +3548,7 @@
 
   if (yyerrstatus == 3)
     {
-      /* If just tried and failed to reuse look-ahead token after an
+      /* If just tried and failed to reuse lookahead token after an
 	 error, discard it.  */
 
       if (yychar <= YYEOF)
@@ -3344,7 +3565,7 @@
 	}
     }
 
-  /* Else will try to reuse look-ahead token after shifting the error
+  /* Else will try to reuse lookahead token after shifting the error
      token.  */
   goto yyerrlab1;
 
@@ -3401,9 +3622,6 @@
       YY_STACK_PRINT (yyss, yyssp);
     }
 
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
   *++yyvsp = yylval;
 
 
@@ -3428,7 +3646,7 @@
   yyresult = 1;
   goto yyreturn;
 
-#ifndef yyoverflow
+#if !defined(yyoverflow) || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -3439,7 +3657,7 @@
 #endif
 
 yyreturn:
-  if (yychar != YYEOF && yychar != YYEMPTY)
+  if (yychar != YYEMPTY)
      yydestruct ("Cleanup: discarding lookahead",
 		 yytoken, &yylval);
   /* Do not reclaim the symbols of the rule which action triggered
Index: src/php_parser.h
===================================================================
--- src/php_parser.h	(revision 10745)
+++ src/php_parser.h	(working copy)
@@ -1,23 +1,23 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Skeleton interface for Bison's Yacc-like parsers in C
+/* A Bison parser, made by GNU Bison 2.4.1.  */
 
-   Copyright (c) 1984-2008 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
+/* Skeleton interface for Bison's Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
@@ -28,10 +28,11 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-
+   
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
@@ -128,115 +129,31 @@
      END_SCRIPT = 345
    };
 #endif
-/* Tokens.  */
-#define FNUMBER 258
-#define DNUMBER 259
-#define STRING 260
-#define IDENT 261
-#define VARIABLE 262
-#define T_ECHO 263
-#define EXIT 264
-#define IF 265
-#define DO 266
-#define WHILE 267
-#define ENDWHILE 268
-#define FOR 269
-#define ENDFOR 270
-#define FOREACH 271
-#define ENDFOREACH 272
-#define DECLARE 273
-#define ENDDECLARE 274
-#define AS 275
-#define CONST 276
-#define GLOBAL 277
-#define UNSET 278
-#define ISSET 279
-#define EMPTY 280
-#define SWITCH 281
-#define ENDSWITCH 282
-#define CASE 283
-#define DEFAULT 284
-#define BREAK 285
-#define CONTINUE 286
-#define FUNCTION 287
-#define RETURN 288
-#define CLASS 289
-#define INTERFACE 290
-#define EXTENDS 291
-#define IMPLEMENTS 292
-#define OBJECT_OPERATOR 293
-#define HASH_ASSIGN 294
-#define LIST 295
-#define ARRAY 296
-#define CLASS_SCOPE 297
-#define PRINT 298
-#define SR_EQ 299
-#define SL_EQ 300
-#define XOR_EQ 301
-#define OR_EQ 302
-#define AND_EQ 303
-#define MOD_EQ 304
-#define CONCAT_EQ 305
-#define DIV_EQ 306
-#define MUL_EQ 307
-#define MINUS_EQ 308
-#define PLUS_EQ 309
-#define LOG_OR 310
-#define LOG_XOR 311
-#define LOG_AND 312
-#define BOOLEAN_OR 313
-#define BOOLEAN_AND 314
-#define IS_NOIDENTICAL 315
-#define IS_IDENTICAL 316
-#define IS_NOEQUAL 317
-#define IS_EQ 318
-#define IS_GREATER_OR_EQ 319
-#define IS_SMALLER_OR_EQ 320
-#define SR 321
-#define SL 322
-#define INSTANCEOF 323
-#define UNSET_CAST 324
-#define BOOL_CAST 325
-#define OBJECT_CAST 326
-#define ARRAY_CAST 327
-#define STRING_CAST 328
-#define DOUBLE_CAST 329
-#define INT_CAST 330
-#define DEC 331
-#define INC 332
-#define CLONE 333
-#define NEW 334
-#define ELSEIF 335
-#define ELSE 336
-#define ENDIF 337
-#define PUBLIC 338
-#define PROTECTED 339
-#define PRIVATE 340
-#define FINAL 341
-#define ABSTRACT 342
-#define STATIC 343
-#define START_SCRIPT 344
-#define END_SCRIPT 345
 
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 67 "php_parser.y"
 {
+
+/* Line 1676 of yacc.c  */
+#line 67 "php_parser.y"
+
 	PHP_SYN_NODE *syn_node;
 	PHP_EXP_NODE *exp_node;
 
 	char str_val[256];
-}
-/* Line 1529 of yacc.c.  */
-#line 236 "php_parser.h"
-	YYSTYPE;
+
+
+
+/* Line 1676 of yacc.c  */
+#line 151 "php_parser.h"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 extern YYSTYPE phplval;
 
+
Index: src/WebServer.cpp
===================================================================
--- src/WebServer.cpp	(revision 10745)
+++ src/WebServer.cpp	(working copy)
@@ -48,6 +48,8 @@
 #include "php_syntree.h"
 #include "php_core_lib.h"
 
+#include <../../PartFile.h>
+
 //-------------------------------------------------------------------
 typedef uint32_t COLORTYPE;
 
@@ -55,6 +57,21 @@
 #undef RGB
 #endif
 
+
+
+SSimplerFileRating::SSimplerFileRating(const wxString &u, const wxString &f, sint16 r, const wxString &c)
+:
+UserName(u),
+FileName(f),
+Rating(r),
+Comment(c)
+{
+}
+
+SSimplerFileRating::~SSimplerFileRating()
+{
+}
+
 inline unsigned long RGB(int r, int g, int b)
 {
 	return ((b & 0xff) << 16) | ((g & 0xff) << 8) | (r & 0xff);
@@ -736,8 +753,77 @@
 			m_ReqParts[i].end   = reqs[2*i+1];
 		}
 	}
+	
+	// Get source names and counts
+	CECTag *srcnametag = tag->GetTagByName(EC_TAG_PARTFILE_SOURCE_NAMES);
+	if (srcnametag) {
+		SourcenameItemMap &map = GetSourcenameItemMap();
+		for (CECTag::const_iterator it = srcnametag->begin(); it != srcnametag->end(); it++) {
+			
+			uint32 key = it->GetInt();
+			int count = it->GetTagByNameSafe(EC_TAG_PARTFILE_SOURCE_NAMES_COUNTS)->GetInt();
+			if (count == 0) {
+				map.erase(key);
+			} else {
+				SourcenameItem &item = map[key];
+				item.count = count;
+				const CECTag *nametag = it->GetTagByName(EC_TAG_PARTFILE_SOURCE_NAMES);
+				if (nametag) {
+					item.name = nametag->GetStringData();
+				}
+			}
+		}
+	}
+	
+	// Get comments
+	CECTag *commenttag = tag->GetTagByName(EC_TAG_PARTFILE_COMMENTS);
+	if (commenttag) {
+		ClearFileRatingList();
+		for (CECTag::const_iterator it = commenttag->begin(); it != commenttag->end(); ) {
+			wxString u = (it++)->GetStringData();
+			wxString f = (it++)->GetStringData();
+			int r = (it++)->GetInt();
+			wxString c = (it++)->GetStringData();
+			AddFileRatingList(u, f, r, c);
+		}
+		UpdateFileRatingCommentAvail();
+	}
 }
 
+void DownloadFile::UpdateFileRatingCommentAvail()
+{
+	bool prevComment = bHasComment ;
+	int prevRating = iUserRating;
+
+	bHasComment = false;
+	iUserRating = 0;
+	int ratingCount = 0;
+
+	SimplerFileRatingList::iterator it = m_FileRatingList.begin();
+	for (; it != m_FileRatingList.end(); ++it) {
+		SSimplerFileRating& cur_rat = *it;
+
+		if (!cur_rat.Comment.IsEmpty()) {
+			bHasComment = true;
+		}
+
+		uint8 rating = cur_rat.Rating;
+		if (rating) {
+			wxASSERT(rating <= 5);
+
+			ratingCount++;
+			iUserRating += rating;
+		}
+	}
+
+	if (ratingCount) {
+		iUserRating /= ratingCount;
+		wxASSERT(iUserRating > 0 && iUserRating <= 5);
+	}
+}
+
+
+
 DownloadFileInfo *DownloadFile::GetContainerInstance()
 {
 	return DownloadFileInfo::m_This;
@@ -779,8 +865,8 @@
 
 bool DownloadFileInfo::ReQuery()
 {
-	DoRequery(EC_OP_GET_DLOAD_QUEUE, EC_TAG_PARTFILE);
-
+	DoRequery(EC_OP_GET_DLOAD_QUEUE, EC_TAG_PARTFILE);  
+	
 	return true;
 }
 
@@ -1067,7 +1153,10 @@
 		for(int i = 1; i <= colored_gaps_size;i++) {
 			uint32 start = colored_gaps[i].start / factor;
 			uint32 end = colored_gaps[i].end / factor;
-			for(uint32 j = start; j < end; j++) {
+			if(end > m_width){
+				end=m_width;
+			}
+			for(uint32 j = start; j < end ; j++) {
 				m_ColorLine[j] = colored_gaps[i].color;
 			}
 		}
@@ -1075,7 +1164,10 @@
 		for(uint32 i = 0; i < m_file->m_ReqParts.size(); i++) {
 			uint32 start = m_file->m_ReqParts[i].start / factor;
 			uint32 end = m_file->m_ReqParts[i].end / factor;
-			for(uint32 j = start; j < end; j++) {
+			if(end > m_width){
+				end=m_width;
+			}
+			for(uint32 j = start; j < end ; j++) {				
 				m_ColorLine[j] = RGB(255, 208, 0);
 			}
 		}
Index: src/WebServer.h
===================================================================
--- src/WebServer.h	(revision 10745)
+++ src/WebServer.h	(working copy)
@@ -43,6 +43,8 @@
 
 #include <wx/datetime.h>  // For DownloadFile::wxtLastSeenComplete
 
+#include <../../PartFile.h>
+
 #ifdef _MSC_VER
 #define strncasecmp _strnicmp
 #define snprintf sprintf_s
@@ -71,7 +73,30 @@
 	static wxString	Decode(const wxString& url);
 };
 
+
+class SSimplerFileRating //redefinition of SFileRating to not use the CUPDownClient's constructor
+{
+public:
+	wxString UserName;
+	wxString FileName;
+	sint16   Rating;
+	wxString Comment;
+public:
+	SSimplerFileRating(const wxString &u, const wxString &f, sint16 r, const wxString &c);
+	~SSimplerFileRating();
+};
+
+typedef std::list<SSimplerFileRating> SimplerFileRatingList;
+
 class DownloadFile : public CECID {
+	private:
+		SourcenameItemMap m_SourcenameItemMap;		
+		SimplerFileRatingList m_FileRatingList;
+		
+		void ClearFileRatingList() { m_FileRatingList.clear(); }
+		void AddFileRatingList(const wxString & u, const wxString & f, sint16 r, const wxString & c) {
+		m_FileRatingList.push_back(SSimplerFileRating(u, f, r, c)); }	
+		
 	public:
 		wxString	sFileName;
 		uint8		nFileStatus;
@@ -90,7 +115,14 @@
 		wxString	sED2kLink;
 		uint8		nCat;
 		wxDateTime	wxtLastSeenComplete;
-
+		
+		bool bHasComment;
+		int iUserRating;
+ 		void	UpdateFileRatingCommentAvail();		
+		const SimplerFileRatingList	 &GetFileRatingList() { return m_FileRatingList; }		
+		
+		SourcenameItemMap &GetSourcenameItemMap()	{ return m_SourcenameItemMap; }
+		
 		CMD4Hash	nHash;
 
 		CProgressImage *m_Image;
