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);
>