Sean R. Bright points out the painfully obvious...
> Check your patch, I think you might have posted a reverse patch. Lots of
> "-"s and one or two "+"s.
Yep. I botched it. It is a shameful reversed diff patch.
Here it is in its unreversed form...
--
Jim Studt, President
The Federated Software Group, Inc.
--- ./ext/standard/basic_functions.c Wed Dec 13 17:02:09 2000
+++ ./ext/standard/basic_functions.c Wed Jan 10 16:27:28 2001
@@ -1104,6 +1104,7 @@
Flush the output buffer */
PHP_FUNCTION(flush)
{
+ if ( OG(php_body_encode_flush))
+OG(php_body_encode_flush)(OG(php_header_write));
sapi_flush();
}
/* }}} */
--- ./ext/standard/output.c Thu Nov 23 12:43:18 2000
+++ ./ext/standard/output.c Wed Jan 10 15:44:44 2001
@@ -359,7 +359,11 @@
str_length = new_length;
}
- result = OG(php_header_write)(str, str_length);
+ if ( OG(php_body_encode)) {
+ result = OG(php_body_encode)(str, str_length, OG(implicit_flush)?1:0,
+OG(php_header_write));
+ } else {
+ result = OG(php_header_write)(str, str_length);
+ }
if (newstr) {
free(newstr);
--- ./ext/standard/php_output.h Thu Nov 23 12:43:18 2000
+++ ./ext/standard/php_output.h Wed Jan 10 15:31:28 2001
@@ -57,6 +57,10 @@
typedef struct _php_output_globals {
int (*php_body_write)(const char *str, uint str_length); /*
string output */
int (*php_header_write)(const char *str, uint str_length); /* unbuffer
string output */
+ int (*php_body_encode)(const char *str, uint str_length, int flush_flag,
+ int (*output_func)(const char *str, uint str_length));
+ int (*php_body_encode_trailer)(int (*output_func)(const char *str, uint
+str_length));
+ int (*php_body_encode_flush)(int (*output_func)(const char *str, uint
+str_length));
php_ob_buffer active_ob_buffer;
unsigned char implicit_flush;
char *output_start_filename;
--- ./ext/zlib/php_zlib.h Mon Nov 20 18:40:12 2000
+++ ./ext/zlib/php_zlib.h Fri Jan 12 11:49:45 2001
@@ -32,6 +32,8 @@
int compression_coding;
z_stream stream;
uLong crc;
+ z_stream encoder;
+ uLong encoder_crc;
} php_zlib_globals;
extern zend_module_entry php_zlib_module_entry;
@@ -60,6 +62,8 @@
PHP_FUNCTION(gzinflate);
PHP_FUNCTION(gzencode);
PHP_FUNCTION(ob_gzhandler);
+PHP_FUNCTION(encode_deflate);
+PHP_FUNCTION(encode_gzip);
FILE *zlib_fopen_wrapper(char *path, char *mode, int options, int *issock, int
*socketd, char **opened_path);
--- ./ext/zlib/zlib.c Mon Nov 20 18:40:12 2000
+++ ./ext/zlib/zlib.c Fri Jan 12 14:10:01 2001
@@ -103,6 +103,8 @@
PHP_FE(gzinflate, NULL)
PHP_FE(gzencode, NULL)
PHP_FE(ob_gzhandler, NULL)
+ PHP_FE(encode_gzip, NULL)
+ PHP_FE(encode_deflate, NULL)
{NULL, NULL, NULL}
};
@@ -1127,6 +1129,138 @@
zval_copy_ctor(return_value);
}
}
+
+
+static int php_encode_deflate(const char *str, uint str_length, int flush_flag,
+ int (*output_func)(const
+char *str, uint str_length))
+{
+ z_stream *e = &ZLIBG(encoder);
+ int err;
+ int ff;
+
+ if ( e->total_in == 0) {
+ /* first call, initialize */
+ err = deflateInit2( e, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
+ -15, 8, Z_DEFAULT_STRATEGY);
+ if ( err != Z_OK) {
+ php_error(E_ERROR,"php_encode_deflate failed(%d)", err);
+ return 0;
+ }
+ ZLIBG(encoder_crc) = 0;
+ }
+
+ e->next_in = (void *)str;
+ e->avail_in = str_length;
+ ZLIBG(encoder_crc) = crc32(ZLIBG(encoder_crc), str, str_length);
+
+ ff = 0;
+ if ( flush_flag == 1) ff = Z_SYNC_FLUSH;
+ else if ( flush_flag == 2) ff = Z_FINISH;
+
+ for (;;) {
+ char buffer[1024];
+
+ e->next_out = buffer;
+ e->avail_out = sizeof(buffer);
+ err = deflate(e, ff);
+ if ( err != Z_OK && err != Z_STREAM_END) {
+ php_error(E_ERROR,"php_encode_deflate deflat() failed(%d)",
+err);
+ return 0;
+ }
+ if ( (char *)e->next_out != buffer) output_func(buffer, (char
+*)e->next_out - buffer);
+
+ if ( ff == Z_FINISH && err != Z_STREAM_END) continue;
+ if ( e->avail_in <= 0) break;
+ }
+
+ return str_length;
+}
+
+static int php_encode_deflate_trailer(int (*output_func)(const char *str, uint
+str_length))
+{
+ php_encode_deflate("",0,2,output_func);
+ return 1;
+}
+
+static int php_encode_deflate_flush(int (*output_func)(const char *str, uint
+str_length))
+{
+ php_encode_deflate("",0,1,output_func);
+ return 1;
+}
+
+
+
+
+static int php_encode_gzip(const char *str, uint str_length, int flush_flag,
+ int (*output_func)(const char *str,
+uint str_length))
+{
+ z_stream *e = &ZLIBG(encoder);
+
+ static const char header[] = "\037\213\010\0\0\0\0\0\0\3";
+
+ if ( e->total_in == 0) {
+ /* first call, inject header */
+ output_func(header, sizeof(header)-1);
+ }
+ return php_encode_deflate( str, str_length, flush_flag, output_func);
+}
+
+static int php_encode_gzip_trailer(int (*output_func)(const char *str, uint
+str_length))
+{
+ char buf[8];
+ char *b = buf;
+
+ php_encode_gzip("",0,2,output_func);
+
+ *b++ = (char) ZLIBG(encoder_crc) & 0xFF;
+ *b++ = (char) (ZLIBG(encoder_crc) >> 8) & 0xFF;
+ *b++ = (char) (ZLIBG(encoder_crc) >> 16) & 0xFF;
+ *b++ = (char) (ZLIBG(encoder_crc) >> 24) & 0xFF;
+ *b++ = (char) ZLIBG(encoder).total_in & 0xFF;
+ *b++ = (char) (ZLIBG(encoder).total_in >> 8) & 0xFF;
+ *b++ = (char) (ZLIBG(encoder).total_in >> 16) & 0xFF;
+ *b++ = (char) (ZLIBG(encoder).total_in >> 24) & 0xFF;
+
+ output_func(buf, 8);
+
+ return 1;
+}
+
+static int php_encode_gzip_flush(int (*output_func)(const char *str, uint str_length))
+{
+ php_encode_gzip("",0,1,output_func);
+ return 1;
+}
+
+
+PHP_FUNCTION(encode_deflate)
+{
+ static const char ce[] = "Content-Encoding: deflate";
+ if (sapi_add_header(ce, sizeof(ce) - 1, 1)==FAILURE) {
+ RETURN_LONG(0);
+ }
+ OG(php_body_encode) = php_encode_deflate;
+ OG(php_body_encode_trailer) = php_encode_deflate_trailer;
+ OG(php_body_encode_flush) = php_encode_deflate_flush;
+ memset(&ZLIBG(encoder),0,sizeof(ZLIBG(encoder)));
+
+ RETURN_LONG(1);
+}
+
+PHP_FUNCTION(encode_gzip)
+{
+ static const char ce[] = "Content-Encoding: gzip";
+ if (sapi_add_header(ce, sizeof(ce) - 1, 1)==FAILURE) {
+ RETURN_LONG(0);
+ }
+ OG(php_body_encode) = php_encode_gzip;
+ OG(php_body_encode_trailer) = php_encode_gzip_trailer;
+ OG(php_body_encode_flush) = php_encode_gzip_flush;
+ memset(&ZLIBG(encoder),0,sizeof(ZLIBG(encoder)));
+
+ RETURN_LONG(1);
+}
+
/*
--- ./main/main.c Tue Nov 28 19:02:27 2000
+++ ./main/main.c Fri Jan 12 14:26:20 2001
@@ -1224,6 +1224,10 @@
V_CHDIR(old_cwd);
free_alloca(old_cwd);
+ if ( OG(php_body_encode_trailer)) {
+ OG(php_body_encode_trailer)(OG(php_header_write));
+ }
+
return EG(exit_status);
}
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]