sterling                Wed Mar 14 22:24:38 2001 EDT

  Modified files:              
    /php4/ext/bz2       bz2.c php_bz2.h 
  Log:
  Bit of a cleanup, added some inline docs, decreased the amount of 
  memory used.
  
  
  
Index: php4/ext/bz2/bz2.c
diff -u php4/ext/bz2/bz2.c:1.8 php4/ext/bz2/bz2.c:1.9
--- php4/ext/bz2/bz2.c:1.8      Sun Feb 25 22:06:48 2001
+++ php4/ext/bz2/bz2.c  Wed Mar 14 22:24:38 2001
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
  
-/* $Id: bz2.c,v 1.8 2001/02/26 06:06:48 andi Exp $ */
+/* $Id: bz2.c,v 1.9 2001/03/15 06:24:38 sterling Exp $ */
 
  
 #include "php.h"
@@ -28,12 +28,20 @@
 #include "ext/standard/file.h"
 #include "ext/standard/info.h"
 
-/* Std includes */
+/* for fileno() */
 #include <stdio.h>
 
 /* Bzip2 includes */
 #include <bzlib.h>
 
+/* Internal error constants */
+#define PHP_BZ_ERRNO   0
+#define PHP_BZ_ERRSTR  1
+#define PHP_BZ_ERRBOTH 2
+
+/* Blocksize of the decompression buffer */
+#define PHP_BZ_DECOMPRESS_SIZE 4096
+
 function_entry bz2_functions[] = {
        PHP_FE(bzopen,       NULL)
        PHP_FE(bzread,       NULL)
@@ -53,8 +61,8 @@
        bz2_functions,
        PHP_MINIT(bz2),
        NULL,
-       NULL,   
        NULL,
+       NULL,
        PHP_MINFO(bz2),
        STANDARD_MODULE_PROPERTIES
 };
@@ -63,14 +71,16 @@
 ZEND_GET_MODULE(bz2)
 #endif
 
-static void   _php_bz2_close_handle(zend_rsrc_list_entry *rsrc);
-static void   _php_bz2_error_machine(INTERNAL_FUNCTION_PARAMETERS, int);
+static int  le_bz2;
 
-static int le_bz2;
+static void php_bz2_close(zend_rsrc_list_entry *);
+static void php_bz2_error(INTERNAL_FUNCTION_PARAMETERS, int);
 
 PHP_MINIT_FUNCTION(bz2)
 {
-       le_bz2 = zend_register_list_destructors_ex(_php_bz2_close_handle, NULL, 
"bzip2", module_number);
+       /* Register the resource, with destructor (arg 1) and text description (arg 
+3), the 
+          other arguments are just standard placeholders */
+       le_bz2 = zend_register_list_destructors_ex(php_bz2_close, NULL, "BZip2 File 
+Handle", module_number);
 
        return SUCCESS;
 }
@@ -78,35 +88,35 @@
 PHP_MINFO_FUNCTION(bz2)
 {
        php_info_print_table_start();
-       php_info_print_table_row(2, "BZip2 support", "enabled");
-       php_info_print_table_row(2, "BZip2 Version", (char *)BZ2_bzlibVersion());
+       php_info_print_table_row(2, "BZip2 Support", "Enabled");
+       php_info_print_table_row(2, "BZip2 Version", (char *) BZ2_bzlibVersion());
        php_info_print_table_end();
-
 }
 
 /* {{{ proto int bzopen(string|int file|fp, string mode)
    Open a new BZip2 stream */
 PHP_FUNCTION(bzopen)
 {
-       zval **File,
-            **Mode;
-       BZFILE *bz;
+       zval    **file,   /* The file to open */
+               **mode;   /* The mode to open the stream with */
+       BZFILE   *bz;     /* The compressed file stream */
+       FILE     *fp;     /* If filepointer is given, its placed in here */
        
        if (ZEND_NUM_ARGS() != 2 ||
-           zend_get_parameters_ex(2, &File, &Mode) == FAILURE) {
+           zend_get_parameters_ex(2, &file, &mode) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       convert_to_string_ex(Mode);
+       convert_to_string_ex(mode);
        
-       if (Z_TYPE_PP(File) != IS_RESOURCE) {
-               convert_to_string_ex(File);
-               
-               bz = BZ2_bzopen(Z_STRVAL_PP(File), Z_STRVAL_PP(Mode));
-       } else {
-               FILE *fp;
-               ZEND_FETCH_RESOURCE(fp, FILE *, File, -1, "File-Handle", 
php_file_le_fopen());
-               
-               bz = BZ2_bzdopen(fileno(fp), Z_STRVAL_PP(Mode));
+       /* If it's not a resource its a string containing the filename to open */
+       if (Z_TYPE_PP(file) != IS_RESOURCE) {
+               convert_to_string_ex(file);
+               bz = BZ2_bzopen(Z_STRVAL_PP(file), Z_STRVAL_PP(mode));
+       } 
+       /* If it is a resource, than its a 'FILE *' resource */
+       else {
+               ZEND_FETCH_RESOURCE(fp, FILE *, file, -1, "File Handle", 
+php_file_le_fopen());
+               bz = BZ2_bzdopen(fileno(fp), Z_STRVAL_PP(mode));
        }
        
        ZEND_REGISTER_RESOURCE(return_value, bz, le_bz2);
@@ -117,30 +127,35 @@
    Read len bytes from the BZip2 stream given by bz */
 PHP_FUNCTION(bzread)
 {
-       zval **Bz,
-            **Len;
-       BZFILE *bz;
-       void *buf = NULL;
-       int ret,
-           len  = 1024,
-               argc = ZEND_NUM_ARGS();
-       
+       zval      **bzp,                       /* BZip2 Resource Pointer */
+                 **zlen;                      /* The (optional) length to read */
+       BZFILE     *bz;                        /* BZip2 File pointer */
+       void       *buf;                       /* Buffer to read data into */
+       int         len  = 1024,               /* Length to read, passed to the 
+BZ2_bzread function */
+                           argc = ZEND_NUM_ARGS();    /* Argument count */
+
        if (argc < 1 || argc > 2 ||
-           zend_get_parameters_ex(argc, &Bz, &Len) == FAILURE) {
+           zend_get_parameters_ex(argc, &bzp, &zlen) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       
-       ZEND_FETCH_RESOURCE(bz, BZFILE *, Bz, -1, "BZFile", le_bz2);
-       
+
+       ZEND_FETCH_RESOURCE(bz, BZFILE *, bzp, -1, "BZip2 File Handle", le_bz2);
+
+       /* Optional second argument, the length to read, if not given, it 
+          defaults to 1024 bytes (why not? :) */
        if (argc > 1) {
-               convert_to_long_ex(Len);
-               len = Z_LVAL_PP(Len);
+               convert_to_long_ex(zlen);
+               len = Z_LVAL_PP(zlen);
        }
-       
+
+       /* Allocate the buffer and read data into it */
        buf = emalloc(len + 1);
        BZ2_bzread(bz, buf, len);
+
+       RETVAL_STRINGL(buf, len, 1);
        
-       RETURN_STRING((char *)buf, 1);
+       /* We copied the buffer, so now we can free it */
+       efree(buf);
 }
 /* }}} */
 
@@ -148,31 +163,33 @@
    Write data to the BZip2 stream given by bz */
 PHP_FUNCTION(bzwrite)
 {
-       zval **Bz,
-            **Data,
-                **Len;
-       BZFILE *bz;
-       int ret,
-           len,
-               argc = ZEND_NUM_ARGS();
+       zval        **bzp,                        /* Bzip2 Resource Pointer */
+                   **data,                       /* The data to write */
+                               **zlen;                       /* The (optional) length 
+of the data to write */
+       BZFILE       *bz;                         /* BZip2 File pointer */
+       int           error,                      /* Error container */
+                     len,                        /* Length to read, passed to the 
+BZ2_bzwrite function */
+                                 argc = ZEND_NUM_ARGS();     /* Argument count */
        
        if (argc < 2 || argc > 3 ||
-           zend_get_parameters_ex(argc, &Bz, &Data, &Len) == FAILURE) {
+           zend_get_parameters_ex(argc, &bzp, &data, &zlen) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       convert_to_string_ex(Data);
-
-       ZEND_FETCH_RESOURCE(bz, BZFILE *, Bz, -1, "BZFile", le_bz2);
-
+       convert_to_string_ex(data);
+       
+       ZEND_FETCH_RESOURCE(bz, BZFILE *, bzp, -1, "BZip2 File Handle", le_bz2);
+       
+       /* If the length of the data is given, use that, otherwise, just use the
+          data's string length */
        if (argc > 2) {
-               convert_to_long_ex(Len);
-               len = Z_LVAL_PP(Len);
-       } else {
-               len = Z_STRLEN_PP(Data);
+               convert_to_long_ex(zlen);
+               len = Z_LVAL_PP(zlen);
        }
+       else { len = Z_STRLEN_PP(data); }
        
-       ret = BZ2_bzwrite(bz, (void *)Z_STRVAL_PP(Data), len);
-       RETURN_LONG(ret);
+       /* Write the data and return the error */
+       error = BZ2_bzwrite(bz, (void *) Z_STRVAL_PP(data), len);
+       RETURN_LONG(error);
 }
 /* }}} */
 
@@ -180,18 +197,18 @@
    Flush a BZip2 stream */
 PHP_FUNCTION(bzflush)
 {
-       zval **Bz;
-       BZFILE *bz;
-       int ret;
-       
+       zval      **bzp;    /* BZip2 Resource Pointer */
+       BZFILE     *bz;     /* BZip2 File pointer */
+       int         error;  /* Error container */
+
        if (ZEND_NUM_ARGS() != 1 ||
-           zend_get_parameters_ex(1, &Bz) == FAILURE) {
+           zend_get_parameters_ex(1, &bzp) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       ZEND_FETCH_RESOURCE(bz, BZFILE *, Bz, -1, "BZFile", le_bz2);
-
-       ret = BZ2_bzflush(bz);
-       RETURN_LONG(ret);
+       ZEND_FETCH_RESOURCE(bz, BZFILE *, bzp, -1, "BZip2 File Handle", le_bz2);
+       
+       error = BZ2_bzflush(bz);
+       RETURN_LONG(error);
 }
 /* }}} */
 
@@ -199,15 +216,15 @@
    Close a BZip2 stream */
 PHP_FUNCTION(bzclose)
 {
-       zval **Bz;
-       BZFILE *bz;
+       zval     **bzp;  /* BZip2 Resource Pointer */
+       BZFILE    *bz;   /* BZip2 File pointer */
        
        if (ZEND_NUM_ARGS() != 1 ||
-           zend_get_parameters_ex(1, &Bz) == FAILURE) {
+           zend_get_parameters_ex(1, &bzp) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       
-       ZEND_FETCH_RESOURCE(bz, BZFILE *, Bz, -1, "BZFile", le_bz2);
+       ZEND_FETCH_RESOURCE(bz, BZFILE *, bzp, -1, "BZip2 File Handle", le_bz2);
+
        zend_list_delete(Z_LVAL_PP(Bz));
 }
 /* }}} */
@@ -216,7 +233,7 @@
    Return the error number */
 PHP_FUNCTION(bzerrno)
 {
-       _php_bz2_error_machine(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+       php_bz2_error(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_BZ_ERRNO);
 }
 /* }}} */
 
@@ -224,7 +241,7 @@
    Return the error string */
 PHP_FUNCTION(bzerrstr)
 {
-       _php_bz2_error_machine(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+       php_bz2_error(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_BZ_ERRSTR);
 }
 /* }}} */
 
@@ -232,7 +249,7 @@
    Return the error number and error string in an associative array */
 PHP_FUNCTION(bzerror)
 {
-       _php_bz2_error_machine(INTERNAL_FUNCTION_PARAM_PASSTHRU, 2);
+       php_bz2_error(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_BZ_ERRBOTH);
 }
 /* }}} */
 
@@ -240,143 +257,164 @@
    Compress a string into BZip2 encoded data */
 PHP_FUNCTION(bzcompress)
 {
-       zval **Source,
-            **BlockSize100k,
-                **WorkFactor;
-       char *dest = NULL;
-       int ret,
-               iter = 1, 
-           blockSize100k = 4, 
-               workFactor = 0, 
-               argc = ZEND_NUM_ARGS();
-       unsigned int size, 
-                    destLen, 
-                                sourceLen;
+       zval            **source,                            /* Source data to 
+compress */
+                       **zblock_size,                       /* Optional block size to 
+use */
+                                       **zwork_factor;                      /* 
+Optional work factor to use */
+       char             *dest = NULL;                       /* Destination to place 
+the compressed data into */
+       int               error,                             /* Error Container */
+                         iter        = 1,                   /* Iteration count for 
+the do {} while loop */
+                                         block_size  = 4,                   /* Block 
+size for compression algorithm */
+                                         work_factor = 0,                   /* Work 
+factor for compression algorithm */
+                                         argc        = ZEND_NUM_ARGS();     /* 
+Argument count */
+       unsigned int      size,                              /* The size to "realloc" 
+if the initial buffer wasn't big enough */
+                         source_len,                        /* Length of the source 
+data */
+                                         dest_len;                          /* Length 
+of the destination buffer */ 
        
-       if (argc < 1 || argc > 3 ||
-           zend_get_parameters_ex(argc, &Source, &BlockSize100k, &WorkFactor) == 
FAILURE) {
+       if (argc < 1 || argc > 3 || 
+           zend_get_parameters_ex(argc, &source, &zblock_size, &zwork_factor) == 
+FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       convert_to_string_ex(Source);
-       sourceLen = destLen = Z_STRLEN_PP(Source);
-
-       dest = emalloc(destLen+1);
-
+       convert_to_string_ex(source);
+       
+       /* Assign them to easy to use variables, dest_len is initially the length of 
+the data
+          because, the compression buffer should be smaller than the size of the data 
+passed */
+       source_len = Z_STRLEN_PP(source);
+       dest_len   = Z_STRLEN_PP(source);
+       
+       /* Allocate the destination buffer */
+       dest = emalloc(dest_len + 1);
+       
+       /* Handle the optional arguments */
        if (argc > 1) {
-               convert_to_long_ex(BlockSize100k);
-               blockSize100k = Z_LVAL_PP(BlockSize100k);
+               convert_to_long_ex(zblock_size);
+               block_size = Z_LVAL_PP(zblock_size);
        }
        
        if (argc > 2) {
-               convert_to_long_ex(WorkFactor);
-               workFactor = Z_LVAL_PP(WorkFactor);
+               convert_to_long_ex(zwork_factor);
+               work_factor = Z_LVAL_PP(zwork_factor);
        }
-
+       
+       /* Compression loop */
        do {
-               size = destLen * iter;
-               if (iter > 1)
+               /* Handle the (re)allocation of the buffer */
+               size = dest_len * iter;
+               if (iter > 1) {
                        dest = erealloc(dest, size);
-               
-               ret = BZ2_bzBuffToBuffCompress(dest, &size, Z_STRVAL_PP(Source), 
sourceLen, blockSize100k, 0, workFactor);
+               }
                iter++;
-       } while (ret == BZ_OUTBUFF_FULL);
+               
+               /* Try and perform the compression */
+               error = BZ2_bzBuffToBuffCompress(dest, &size, Z_STRVAL_PP(source), 
+source_len, block_size, 0, work_factor);
+       } while (error == BZ_OUTBUFF_FULL);
        
-       if (ret != BZ_OK) {
-               RETURN_LONG(ret);
+       if (error != BZ_OK) {
+               RETVAL_LONG(error);
        } else {
-               RETURN_STRINGL(dest, destLen, 1);
+               /* Copy the buffer, we have perhaps allocate alot more than we need,
+                  so we want to copy the correct amount and then free the in-exactly 
+                  allocated buffer */
+               RETVAL_STRINGL(dest, size, 1);
        }
+       
+       /* Free the buffer */
+       efree(dest);
 }
 /* }}} */
 
-#define _PHP_BZ_DECOMPRESS_SIZE 4096
-
 /* {{{ proto string bzdecompress(string source[, int small])
    Decompress BZip2 compressed data */
 PHP_FUNCTION(bzdecompress)
 {
-       zval **Source,
-            **Small;
-       char *dest = emalloc(_PHP_BZ_DECOMPRESS_SIZE),
-            *source = NULL;
-       int ret,
-           iter = 1,
-               size,
-           destLen = _PHP_BZ_DECOMPRESS_SIZE,
-           small = 0,
-               argc  = ZEND_NUM_ARGS();
+       zval    **source,                                     /* Source data to 
+decompress */
+               **zsmall;                                     /* (Optional) user 
+specified small */
+       char     *dest   = emalloc(PHP_BZ_DECOMPRESS_SIZE),   /* Destination buffer, 
+initially allocated */
+       int       error,                                      /* Error container */
+                 iter = 1,                                   /* Iteration count for 
+the compression loop */
+                         size,                                       /* Current size 
+to realloc the dest buffer to */
+                         dest_len = PHP_BZ_DECOMPRESS_SIZE,          /* Size of the 
+destination length */
+                         small    = 0,                               /* The actual 
+small */
+                         argc     = ZEND_NUM_ARGS();                 /* Argument 
+count */
        
        if (argc < 1 || argc > 2 ||
-           zend_get_parameters_ex(argc, &Source, &Small) == FAILURE) {
+           zend_get_parameters_ex(argc, &source, &zsmall) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       convert_to_string_ex(Source);
-       source = estrndup(Z_STRVAL_PP(Source), Z_STRLEN_PP(Source));
+       convert_to_string_ex(source);
        
+       /* optional small argument handling */
        if (argc > 1) {
-               convert_to_long_ex(Small);
-               small = Z_LVAL_PP(Small);
+               convert_to_long_ex(zsmall);
+               small = Z_LVAL_PP(zsmall);
        }
-
-
+       
+       /* (de)Compression Loop */      
        do {
-               size = destLen * iter;
-               if (iter > 1)
+               /* Handle the (re)allocation of the buffer */
+               size = dest_len * iter;
+               if (iter > 1) {
                        dest = erealloc(dest, size);
-
-               ret = BZ2_bzBuffToBuffDecompress(dest, &size, source, 
Z_STRLEN_PP(Source), small, 0);
+               }
                iter++;
-       } while (ret == BZ_OUTBUFF_FULL);
-
-       if (ret != BZ_OK) {
-               RETURN_LONG(ret);
+               
+               /* Perform the decompression */
+               error = BZ2_bzBuffToBuffDecompress(dest, &size, Z_STRVAL_PP(source), 
+Z_STRLEN_PP(source), small, 0);
+       } while (error == BZ_OUTBUFF_FULL);
+       
+       if (error != BZ_OK) {
+               RETVAL_LONG(error);
        } else {
-               RETURN_STRINGL(dest, size, 0);
+               /* we might have allocated a little to much, so copy the exact size 
+and free the 
+                  in-exactly allocated buffer */
+               RETVAL_STRINGL(dest, size, 1);
        }
+       
+       efree(dest);
 }
 /* }}} */
 
-/* {{{ _php_bz2_close_handle() */
-static void _php_bz2_close_handle(zend_rsrc_list_entry *rsrc)
+/* {{{ php_bz2_close() 
+   Closes a BZip2 file pointer */
+static void php_bz2_close(zend_rsrc_list_entry *rsrc)
 {
-       BZFILE *bz = (BZFILE *)rsrc->ptr;
+       BZFILE *bz = (BZFILE *) rsrc->ptr;  /* The BZip2 File pointer */
        BZ2_bzclose(bz);
 }
 /* }}} */
 
-/* {{{ _php_bz2_error_machine() */
-static void _php_bz2_error_machine(INTERNAL_FUNCTION_PARAMETERS, int opt)
-{
-       zval **u_bz;
-       BZFILE *bz;
-       int errnum;
-       const char *errstr;
+/* {{{ php_bz2_error()
+   The central error handling interface, does the work for bzerrno, bzerrstr and 
+bzerror */
+static void php_bz2_error(INTERNAL_FUNCTION_PARAMETERS, int opt)
+{ 
+       zval        **bzp;     /* BZip2 Resource Pointer */
+       BZFILE       *bz;      /* BZip2 File pointer */
+       const char   *errstr;  /* Error string */
+       int           errnum;  /* Error number */
        
        if (ZEND_NUM_ARGS() != 1 ||
-           zend_get_parameters_ex(1, &u_bz) == FAILURE) {
+           zend_get_parameters_ex(1, &bzp) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
+       ZEND_FETCH_RESOURCE(bz, BZFILE *, bzp, -1, "BZip2 File pointer", le_bz2);
        
-       ZEND_FETCH_RESOURCE(bz, BZFILE *, u_bz, -1, "BZFile", le_bz2);
-       
+       /* Fetch the error information */
        errstr = BZ2_bzerror(bz, &errnum);
        
+       /* Determine what to return */
        switch (opt) {
-               case 0:
-                       RETURN_LONG(errnum);
-                       break;
-               case 1:
-                       RETURN_STRING((char *)errstr, 1);
-                       break;
-               case 2:
-                       if (array_init(return_value) == FAILURE) {
-                               php_error(E_WARNING, "Cannot initialize return value 
from bzerror()");
-                               RETURN_NULL();
-                       }
-                       
-                       add_assoc_long(return_value, "errno", errnum);
-                       add_assoc_string(return_value, "errstr", (char *)errstr, 1);
-                       break;
+       case PHP_BZ_ERRNO:
+               RETURN_LONG(errnum);
+               break;
+       case PHP_BZ_ERRSTR:
+               RETURN_STRING(errstr, 1);
+               break;
+       case PHP_BZ_ERRBOTH:
+               array_init(return_value);
+               
+               add_assoc_long  (return_value, "errno",  errnum);
+               add_assoc_string(return_value, "errstr", errstr, 1);
+               
+               break;
        }
 }
 /* }}} */
Index: php4/ext/bz2/php_bz2.h
diff -u php4/ext/bz2/php_bz2.h:1.4 php4/ext/bz2/php_bz2.h:1.5
--- php4/ext/bz2/php_bz2.h:1.4  Sun Feb 25 22:06:48 2001
+++ php4/ext/bz2/php_bz2.h      Wed Mar 14 22:24:38 2001
@@ -44,9 +44,7 @@
 PHP_FUNCTION(bzdecompress);
 
 #else
-
 #define phpext_bz2_ptr NULL
-
 #endif
 
 #endif

-- 
PHP CVS 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]

Reply via email to