php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login

Patch strip-comments-whitespace for CGI/CLI related Bug #53622

Patch version 2011-01-04 15:01 UTC

Return to Bug #53622 | Download this patch
Patch Revisions:

Developer: aharvey@php.net

Index: Zend/zend_highlight.c
===================================================================
--- Zend/zend_highlight.c	(revision 307076)
+++ Zend/zend_highlight.c	(working copy)
@@ -166,7 +166,7 @@
 	zend_printf("</code>");
 }
 
-ZEND_API void zend_strip(TSRMLS_D)
+ZEND_API void zend_strip(zend_bool comments, zend_bool whitespace TSRMLS_DC)
 {
 	zval token;
 	int token_type;
@@ -176,15 +176,30 @@
 	while ((token_type=lex_scan(&token TSRMLS_CC))) {
 		switch (token_type) {
 			case T_WHITESPACE:
-				if (!prev_space) {
-					zend_write(" ", sizeof(" ") - 1);
-					prev_space = 1;
+				if (whitespace) {
+					if (!prev_space) {
+						zend_write(" ", sizeof(" ") - 1);
+						prev_space = 1;
+					}
+
+					token.type = 0;
+					continue;
 				}
-						/* lack of break; is intentional */
+				else {
+					zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
+					break;
+				}
+
 			case T_COMMENT:
 			case T_DOC_COMMENT:
-				token.type = 0;
-				continue;
+				if (comments) {
+					token.type = 0;
+					continue;
+				}
+				else {
+					zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
+					break;
+				}
 			
 			case T_END_HEREDOC:
 				zend_write(LANG_SCNG(yy_text), LANG_SCNG(yy_leng));
Index: Zend/zend_highlight.h
===================================================================
--- Zend/zend_highlight.h	(revision 307076)
+++ Zend/zend_highlight.h	(working copy)
@@ -40,7 +40,7 @@
 
 BEGIN_EXTERN_C()
 ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini TSRMLS_DC);
-ZEND_API void zend_strip(TSRMLS_D);
+ZEND_API void zend_strip(zend_bool comments, zend_bool whitespace TSRMLS_DC);
 ZEND_API int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini TSRMLS_DC);
 ZEND_API int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini, char *str_name TSRMLS_DC);
 ZEND_API void zend_html_putc(char c);
Index: sapi/cgi/cgi_main.c
===================================================================
--- sapi/cgi/cgi_main.c	(revision 307076)
+++ sapi/cgi/cgi_main.c	(working copy)
@@ -2435,7 +2435,7 @@
 					break;
 				case PHP_MODE_STRIP:
 					if (open_file_for_scanning(&file_handle TSRMLS_CC) == SUCCESS) {
-						zend_strip(TSRMLS_C);
+						zend_strip(1, 1 TSRMLS_CC);
 						zend_file_handle_dtor(&file_handle TSRMLS_CC);
 						php_output_teardown();
 					}
Index: sapi/cli/php_cli.c
===================================================================
--- sapi/cli/php_cli.c	(revision 307076)
+++ sapi/cli/php_cli.c	(working copy)
@@ -120,6 +120,8 @@
 #define PHP_MODE_REFLECTION_EXT_INFO    11
 #define PHP_MODE_REFLECTION_ZEND_EXTENSION 12
 #define PHP_MODE_SHOW_INI_CONFIG        13
+#define PHP_MODE_STRIP_COMMENTS         14
+#define PHP_MODE_STRIP_WHITESPACE       15
 
 const char HARDCODED_INI[] =
 	"html_errors=0\n"
@@ -174,6 +176,8 @@
 	{14,  1, "ri"},
 	{14,  1, "rextinfo"},
 	{15,  0, "ini"},
+	{16,  0, "strip-comments"},
+	{17,  0, "strip-whitespace"},
 	{'-', 0, NULL} /* end of args */
 };
 
@@ -551,6 +555,10 @@
 #endif
 				"  --ri <name>      Show configuration for extension <name>.\n"
 				"\n"
+				"  --strip-comments\n"
+				"                   Output source with stripped comments.\n"
+				"  --strip-whitespace\n"
+				"                   Output source with stripped whitespace.\n"
 				, prog, prog, prog, prog, prog, prog);
 }
 /* }}} */
@@ -1057,6 +1065,12 @@
 			case 15:
 				behavior = PHP_MODE_SHOW_INI_CONFIG;
 				break;
+			case 16:
+				behavior = (behavior == PHP_MODE_STRIP_WHITESPACE) ? PHP_MODE_STRIP : PHP_MODE_STRIP_COMMENTS;
+				break;
+			case 17:
+				behavior = (behavior == PHP_MODE_STRIP_COMMENTS) ? PHP_MODE_STRIP : PHP_MODE_STRIP_WHITESPACE;
+				break;
 			default:
 				break;
 			}
@@ -1264,10 +1278,22 @@
 			break;
 		case PHP_MODE_STRIP:
 			if (open_file_for_scanning(&file_handle TSRMLS_CC)==SUCCESS) {
-				zend_strip(TSRMLS_C);
+				zend_strip(1, 1 TSRMLS_CC);
 			}
 			goto out;
 			break;
+		case PHP_MODE_STRIP_COMMENTS:
+			if (open_file_for_scanning(&file_handle TSRMLS_CC)==SUCCESS) {
+				zend_strip(1, 0 TSRMLS_CC);
+			}
+			goto out;
+			break;
+		case PHP_MODE_STRIP_WHITESPACE:
+			if (open_file_for_scanning(&file_handle TSRMLS_CC)==SUCCESS) {
+				zend_strip(0, 1 TSRMLS_CC);
+			}
+			goto out;
+			break;
 		case PHP_MODE_HIGHLIGHT:
 			{
 				zend_syntax_highlighter_ini syntax_highlighter_ini;
Index: ext/standard/basic_functions.c
===================================================================
--- ext/standard/basic_functions.c	(revision 307076)
+++ ext/standard/basic_functions.c	(working copy)
@@ -742,8 +742,10 @@
 	ZEND_ARG_INFO(0, return)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_INFO(arginfo_php_strip_whitespace, 0)
+ZEND_BEGIN_ARG_INFO_EX(arginfo_php_strip_whitespace, 0, 0, 1)
 	ZEND_ARG_INFO(0, file_name)
+	ZEND_ARG_INFO(0, strip_comments)
+	ZEND_ARG_INFO(0, strip_whitespace)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_highlight_string, 0, 0, 1)
@@ -5099,16 +5101,17 @@
 }
 /* }}} */
 
-/* {{{ proto string php_strip_whitespace(string file_name)
+/* {{{ proto string php_strip_whitespace(string file_name [, bool strip_comments [, bool strip_whitespace]] )
    Return source with stripped comments and whitespace */
 PHP_FUNCTION(php_strip_whitespace)
 {
 	char *filename;
 	int filename_len;
+	zend_bool strip_comments = 1, strip_whitespace = 1;
 	zend_lex_state original_lex_state;
 	zend_file_handle file_handle = {0};
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|bb", &filename, &filename_len, &strip_comments, &strip_whitespace) == FAILURE) {
 		RETURN_FALSE;
 	}
 
@@ -5125,7 +5128,7 @@
 		RETURN_EMPTY_STRING();
 	}
 
-	zend_strip(TSRMLS_C);
+	zend_strip(strip_comments, strip_whitespace TSRMLS_CC);
 
 	zend_destroy_file_handle(&file_handle TSRMLS_CC);
 	zend_restore_lexical_state(&original_lex_state TSRMLS_CC);
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Apr 25 02:01:30 2024 UTC