On Wed, 1 Sep 2004 17:24:33 -0400, Jason Garber <[EMAIL PROTECTED]> wrote:
>   Patch didn't come through...

Odd. I BCC'd it to my archive account and that got the attachment. Oh
well, something had to go wrong.

Hi All,

This is my first attempt at submitting a patch so please be gentle :).

The feature requested in #29416 is something I've wanted to see for a
while, so I decided to have a go at adding it.

I decided name ob_include described the method by which the function
did it's job rather than what it was for. I have implemented it as
eval_file_get_output which I feel is a better description of its
purpose. The requester suggests require and _once variations but those
make little sense to me so I haven't implemented those.

Index: ext/standard/basic_functions.c
===================================================================
RCS file: /repository/php-src/ext/standard/basic_functions.c,v
retrieving revision 1.543.2.41
diff -u -r1.543.2.41 basic_functions.c
--- ext/standard/basic_functions.c      30 Jul 2004 16:52:35 -0000      1.543.2.41
+++ ext/standard/basic_functions.c      1 Sep 2004 19:31:36 -0000
@@ -792,6 +792,7 @@
        PHP_FE(ob_get_contents,                                                        
                                         NULL)
        PHP_FE(ob_implicit_flush,                                                      
                                         NULL)
        PHP_FE(ob_list_handlers,                                                       
                                         NULL)
+       PHP_FE(eval_file_get_output,                                                   
                                         NULL)
 
        /* functions from array.c */
        PHP_FE(ksort,                                   first_arg_force_ref)
Index: main/output.c
===================================================================
RCS file: /repository/php-src/main/output.c,v
retrieving revision 1.142.2.15
diff -u -r1.142.2.15 output.c
--- main/output.c       8 Aug 2003 23:44:04 -0000       1.142.2.15
+++ main/output.c       1 Sep 2004 19:31:36 -0000
@@ -927,6 +927,59 @@
 }
 /* }}} */
 
+/* {{{ proto bool eval_file_get_output(STRING filename)
+   Execute a file and return the output. */
+PHP_FUNCTION(eval_file_get_output)
+{
+       zval *retval=NULL;
+       zval *inc_filename=NULL;
+       int argc = ZEND_NUM_ARGS();
+       
+       if (argc != 1) {
+               ZEND_WRONG_PARAM_COUNT();
+       }
+
+       if (zend_parse_parameters(argc TSRMLS_CC, "z", &inc_filename) == FAILURE) {
+               RETURN_FALSE;
+       }
+
+       /* create a buffer */
+       if (php_start_ob_buffer(NULL, 0, 1 TSRMLS_CC)==FAILURE) {
+               RETURN_FALSE;
+       }
+
+       /* compile the file */
+       zend_op_array * new_op_array = compile_filename(ZEND_INCLUDE, inc_filename);
+
+       if (new_op_array) {
+               /* execute the compiled file */
+               zend_execute(new_op_array);
+
+               efree(new_op_array);
+
+               /* get the output */
+               if (php_ob_get_buffer(return_value TSRMLS_CC) == FAILURE)
+                       RETURN_FALSE;
+
+               /* error checks */
+               if (!OG(ob_nesting_level)) {
+                       php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to
delete buffer. No buffer to delete.");
+                       RETURN_FALSE;
+               }
+               if (OG(ob_nesting_level) && !OG(active_ob_buffer).status &&
!OG(active_ob_buffer).erase) {
+                       php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed 
to
delete buffer %s.", OG(active_ob_buffer).handler_name);
+                       RETURN_FALSE;
+               }
+               /* delete buffer */
+               php_end_ob_buffer(0, 0 TSRMLS_CC);
+       }
+       else
+       {
+               RETURN_FALSE;
+       }
+}
+/* }}} */
+
 /* {{{ int php_ob_buffer_status(php_ob_buffer *ob_buffer, zval *result) */
 static int php_ob_buffer_status(php_ob_buffer *ob_buffer, zval *result) 
 {
Index: main/php_output.h
===================================================================
RCS file: /repository/php-src/main/php_output.h,v
retrieving revision 1.47.2.1
diff -u -r1.47.2.1 php_output.h
--- main/php_output.h   31 Dec 2002 16:26:19 -0000      1.47.2.1
+++ main/php_output.h   1 Sep 2004 19:31:36 -0000
@@ -58,6 +58,7 @@
 PHP_FUNCTION(ob_get_status);
 PHP_FUNCTION(ob_implicit_flush);
 PHP_FUNCTION(ob_list_handlers);
+PHP_FUNCTION(eval_file_get_output);
 
 typedef struct _php_ob_buffer {
        char *buffer;

-- 
Stuart

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to