Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2(PHP_5_3) / zend_compile.c zend_compile.h zend_language_parser.y zend_language_scanner.l

[email protected] (Dmitry Stogov)
Newsgroups php.doc,php.zend-engine.cvs
Message-ID <[email protected]>
Hi Stas,

You've broken a lot of ext/tokenizer tests.
I think, it is possible to avoid this break, by moving new %token 
declaration into the bottom of list.

Thanks. Dmitry.

Stanislav Malyshev wrote:
> stas		Tue Feb 12 00:20:33 2008 UTC
> 
>   Modified files:              (Branch: PHP_5_3)
>     /ZendEngine2	zend_compile.c zend_compile.h zend_language_parser.y 
>                 	zend_language_scanner.l 
>   Log:
>   [DOC] Add compile-time __DIR__ constant which implements dirname(__FILE__)
>   
>   
> http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.41.2.39&r2=1.647.2.27.2.41.2.40&diff_format=u
> Index: ZendEngine2/zend_compile.c
> diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.39 ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.40
> --- ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.39	Tue Jan 29 00:07:26 2008
> +++ ZendEngine2/zend_compile.c	Tue Feb 12 00:20:32 2008
> @@ -17,7 +17,7 @@
>     +----------------------------------------------------------------------+
>  */
>  
> -/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.39 2008/01/29 00:07:26 tony2001 Exp $ */
> +/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.40 2008/02/12 00:20:32 stas Exp $ */
>  
>  #include <zend_language_parser.h>
>  #include "zend.h"
> @@ -26,6 +26,7 @@
>  #include "zend_llist.h"
>  #include "zend_API.h"
>  #include "zend_exceptions.h"
> +#include "tsrm_virtual_cwd.h"
>  
>  #ifdef ZEND_MULTIBYTE
>  #include "zend_multibyte.h"
> @@ -4944,6 +4945,97 @@
>  }
>  /* }}} */
>  
> +ZEND_API size_t zend_dirname(char *path, size_t len)
> +{
> +	register char *end = path + len - 1;
> +	unsigned int len_adjust = 0;
> +
> +#ifdef PHP_WIN32
> +	/* Note that on Win32 CWD is per drive (heritage from CP/M).
> +	 * This means dirname("c:foo") maps to "c:." or "c:" - which means CWD on C: drive.
> +	 */
> +	if ((2 <= len) && isalpha((int)((unsigned char *)path)[0]) && (':' == path[1])) {
> +		/* Skip over the drive spec (if any) so as not to change */
> +		path += 2;
> +		len_adjust += 2;
> +		if (2 == len) {
> +			/* Return "c:" on Win32 for dirname("c:").
> +			 * It would be more consistent to return "c:." 
> +			 * but that would require making the string *longer*.
> +			 */
> +			return len;
> +		}
> +	}
> +#elif defined(NETWARE)
> +	/*
> +	 * Find the first occurence of : from the left 
> +	 * move the path pointer to the position just after :
> +	 * increment the len_adjust to the length of path till colon character(inclusive)
> +	 * If there is no character beyond : simple return len
> +	 */
> +	char *colonpos = NULL;
> +	colonpos = strchr(path, ':');
> +	if (colonpos != NULL) {
> +		len_adjust = ((colonpos - path) + 1);
> +		path += len_adjust;
> +		if (len_adjust == len) {
> +			return len;
> +		}
> +    }
> +#endif
> +
> +	if (len == 0) {
> +		/* Illegal use of this function */
> +		return 0;
> +	}
> +
> +	/* Strip trailing slashes */
> +	while (end >= path && IS_SLASH_P(end)) {
> +		end--;
> +	}
> +	if (end < path) {
> +		/* The path only contained slashes */
> +		path[0] = DEFAULT_SLASH;
> +		path[1] = '\0';
> +		return 1 + len_adjust;
> +	}
> +
> +	/* Strip filename */
> +	while (end >= path && !IS_SLASH_P(end)) {
> +		end--;
> +	}
> +	if (end < path) {
> +		/* No slash found, therefore return '.' */
> +#ifdef NETWARE
> +		if (len_adjust == 0) {
> +			path[0] = '.';
> +			path[1] = '\0';
> +			return 1; //only one character
> +		} else {
> +			path[0] = '\0';
> +			return len_adjust;
> +		}
> +#else
> +		path[0] = '.';
> +		path[1] = '\0';
> +		return 1 + len_adjust;
> +#endif
> +	}
> +
> +	/* Strip slashes which came before the file name */
> +	while (end >= path && IS_SLASH_P(end)) {
> +		end--;
> +	}
> +	if (end < path) {
> +		path[0] = DEFAULT_SLASH;
> +		path[1] = '\0';
> +		return 1 + len_adjust;
> +	}
> +	*(end+1) = '\0';
> +
> +	return (size_t)(end + 1 - path) + len_adjust;
> +}
> +/* }}} */
>  /*
>   * Local variables:
>   * tab-width: 4
> http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.h?r1=1.316.2.8.2.12.2.13&r2=1.316.2.8.2.12.2.14&diff_format=u
> Index: ZendEngine2/zend_compile.h
> diff -u ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.13 ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.14
> --- ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.13	Thu Jan 24 09:41:37 2008
> +++ ZendEngine2/zend_compile.h	Tue Feb 12 00:20:33 2008
> @@ -17,7 +17,7 @@
>     +----------------------------------------------------------------------+
>  */
>  
> -/* $Id: zend_compile.h,v 1.316.2.8.2.12.2.13 2008/01/24 09:41:37 dmitry Exp $ */
> +/* $Id: zend_compile.h,v 1.316.2.8.2.12.2.14 2008/02/12 00:20:33 stas Exp $ */
>  
>  #ifndef ZEND_COMPILE_H
>  #define ZEND_COMPILE_H
> @@ -570,6 +570,7 @@
>  ZEND_API int zend_register_auto_global(char *name, uint name_len, zend_auto_global_callback auto_global_callback TSRMLS_DC);
>  ZEND_API zend_bool zend_is_auto_global(char *name, uint name_len TSRMLS_DC);
>  ZEND_API int zend_auto_global_disable_jit(char *varname, zend_uint varname_length TSRMLS_DC);
> +ZEND_API size_t zend_dirname(char *path, size_t len);
>  
>  int zendlex(znode *zendlval TSRMLS_DC);
>  
> http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_parser.y?r1=1.160.2.4.2.8.2.14&r2=1.160.2.4.2.8.2.15&diff_format=u
> Index: ZendEngine2/zend_language_parser.y
> diff -u ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.14 ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.15
> --- ZendEngine2/zend_language_parser.y:1.160.2.4.2.8.2.14	Sun Feb  3 14:32:48 2008
> +++ ZendEngine2/zend_language_parser.y	Tue Feb 12 00:20:33 2008
> @@ -18,7 +18,7 @@
>     +----------------------------------------------------------------------+
>  */
>  
> -/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.14 2008/02/03 14:32:48 helly Exp $ */
> +/* $Id: zend_language_parser.y,v 1.160.2.4.2.8.2.15 2008/02/12 00:20:33 stas Exp $ */
>  
>  /*
>   * LALR shift/reduce conflicts and how they are resolved:
> @@ -132,6 +132,7 @@
>  %token T_FUNC_C
>  %token T_LINE
>  %token T_FILE
> +%token T_DIR
>  %token T_COMMENT
>  %token T_DOC_COMMENT
>  %token T_OPEN_TAG
> @@ -715,6 +716,7 @@
>  	|	T_CONSTANT_ENCAPSED_STRING	{ $$ = $1; }
>  	|	T_LINE 						{ $$ = $1; }
>  	|	T_FILE 						{ $$ = $1; }
> +	|	T_DIR   					{ $$ = $1; }
>  	|	T_CLASS_C					{ $$ = $1; }
>  	|	T_METHOD_C					{ $$ = $1; }
>  	|	T_FUNC_C					{ $$ = $1; }
> http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_scanner.l?r1=1.131.2.11.2.13.2.4&r2=1.131.2.11.2.13.2.5&diff_format=u
> Index: ZendEngine2/zend_language_scanner.l
> diff -u ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.4 ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.5
> --- ZendEngine2/zend_language_scanner.l:1.131.2.11.2.13.2.4	Mon Jan 21 19:39:55 2008
> +++ ZendEngine2/zend_language_scanner.l	Tue Feb 12 00:20:33 2008
> @@ -19,7 +19,7 @@
>     +----------------------------------------------------------------------+
>  */
>  
> -/* $Id: zend_language_scanner.l,v 1.131.2.11.2.13.2.4 2008/01/21 19:39:55 dmitry Exp $ */
> +/* $Id: zend_language_scanner.l,v 1.131.2.11.2.13.2.5 2008/02/12 00:20:33 stas Exp $ */
>  
>  #define yyleng SCNG(yy_leng)
>  #define yytext SCNG(yy_text)
> @@ -62,6 +62,8 @@
>  #include "zend_API.h"
>  #include "zend_strtod.h"
>  #include "zend_exceptions.h"
> +#include "tsrm_virtual_cwd.h"
> +#include "tsrm_config_common.h"
>  
>  #ifdef HAVE_STDARG_H
>  # include <stdarg.h>
> @@ -1545,6 +1547,33 @@
>  	return T_FILE;
>  }
>  
> +<ST_IN_SCRIPTING>"__DIR__" {
> +	char *filename = zend_get_compiled_filename(TSRMLS_C);
> +	const size_t filename_len = strlen(filename);
> +	char *dirname;
> +
> +	if (!filename) {
> +		filename = "";
> +	}
> +
> +	dirname = estrndup(filename, filename_len);
> +	zend_dirname(dirname, filename_len);
> +
> +	if (strcmp(dirname, ".") == 0) {
> +		dirname = erealloc(dirname, MAXPATHLEN);
> +#if HAVE_GETCWD
> +		VCWD_GETCWD(dirname, MAXPATHLEN);
> +#elif HAVE_GETWD
> +		VCWD_GETWD(dirname);
> +#endif
> +	}
> +
> +	zendlval->value.str.len = strlen(dirname);
> +	zendlval->value.str.val = dirname;
> +	zendlval->type = IS_STRING;
> +	return T_DIR;
> +}
> +
>  <ST_IN_SCRIPTING>"__NAMESPACE__" {
>  	if (CG(current_namespace)) {
>  		*zendlval = *CG(current_namespace);
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.