cvs: php4 /ext/standard file.c filestat.c php_filestat.h

From: Date: Fri, 11 May 2001 19:55:44 +0000
Subject: cvs: php4 /ext/standard file.c filestat.c php_filestat.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-5673@lists.php.net to get a copy of this message
jason Fri May 11 12:55:44 2001 EDT Modified files: /php4/ext/standard filestat.c file.c php_filestat.h Log: Rewrote stat() and fstat() to be memory efficient, due to a recent thread on php-dev. Note: I added a macro that might have use in other instances, but for now is included in php_filestat.h

Index: php4/ext/standard/filestat.c diff -u php4/ext/standard/filestat.c:1.63 php4/ext/standard/filestat.c:1.64 --- php4/ext/standard/filestat.c:1.63 Thu May 10 18:47:46 2001 +++ php4/ext/standard/filestat.c Fri May 11 12:55:43 2001 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: filestat.c,v 1.63 2001/05/11 01:47:46 jason Exp $ */ +/* $Id: filestat.c,v 1.64 2001/05/11 19:55:43 jason Exp $ */ #include "php.h" #include "safe_mode.h" @@ -450,8 +450,12 @@ static void php_stat(const char *filename, php_stat_len filename_length, int type, pval *return_value) { + zval *stat_dev,*stat_ino,*stat_mode,*stat_nlink,*stat_uid,*stat_gid,*stat_rdev, + *stat_size, *stat_atime, *stat_mtime, *stat_ctime, *stat_blksize, *stat_blocks; struct stat *stat_sb; int rmask=S_IROTH,wmask=S_IWOTH,xmask=S_IXOTH; /* access rights defaults to other */ + char *stat_sb_names[13]={"dev","ino","mode","nlink","uid","gid","rdev", + "size","atime","mtime","ctime","blksize","blocks"}; BLS_FETCH(); stat_sb = &BG(sb); @@ -593,54 +597,61 @@ if (array_init(return_value) == FAILURE) { RETURN_FALSE; } - add_next_index_long(return_value, stat_sb->st_dev); - add_next_index_long(return_value, stat_sb->st_ino); - add_next_index_long(return_value, stat_sb->st_mode); - add_next_index_long(return_value, stat_sb->st_nlink); - add_next_index_long(return_value, stat_sb->st_uid); - add_next_index_long(return_value, stat_sb->st_gid); + + MAKE_LONG_ZVAL_INCREF(stat_dev, stat_sb->st_dev); + MAKE_LONG_ZVAL_INCREF(stat_ino, stat_sb->st_ino); + MAKE_LONG_ZVAL_INCREF(stat_mode, stat_sb->st_mode); + MAKE_LONG_ZVAL_INCREF(stat_nlink, stat_sb->st_nlink); + MAKE_LONG_ZVAL_INCREF(stat_uid, stat_sb->st_uid); + MAKE_LONG_ZVAL_INCREF(stat_gid, stat_sb->st_gid); #ifdef HAVE_ST_RDEV - add_next_index_long(return_value, stat_sb->st_rdev); + MAKE_LONG_ZVAL_INCREF(stat_rdev, stat_sb->st_rdev); #else - add_next_index_long(return_value, -1); + MAKE_LONG_ZVAL_INCREF(stat_rdev, -1); #endif - add_next_index_long(return_value, stat_sb->st_size); - add_next_index_long(return_value, stat_sb->st_atime); - add_next_index_long(return_value, stat_sb->st_mtime); - add_next_index_long(return_value, stat_sb->st_ctime); + MAKE_LONG_ZVAL_INCREF(stat_size, stat_sb->st_size); + MAKE_LONG_ZVAL_INCREF(stat_atime, stat_sb->st_atime); + MAKE_LONG_ZVAL_INCREF(stat_mtime, stat_sb->st_mtime); + MAKE_LONG_ZVAL_INCREF(stat_ctime, stat_sb->st_ctime); #ifdef HAVE_ST_BLKSIZE - add_next_index_long(return_value, stat_sb->st_blksize); + MAKE_LONG_ZVAL_INCREF(stat_blksize, stat_sb->st_blksize); #else - add_next_index_long(return_value, -1); + MAKE_LONG_ZVAL_INCREF(stat_blksize,-1); #endif #ifdef HAVE_ST_BLOCKS - add_next_index_long(return_value, stat_sb->st_blocks); + MAKE_LONG_ZVAL_INCREF(stat_blocks, stat_sb->st_blocks); #else - add_next_index_long(return_value, -1); + MAKE_LONG_ZVAL_INCREF(stat_blocks,-1); #endif - /* Support string references as well as numerical*/ - add_assoc_long ( return_value , "dev" , stat_sb->st_dev ); - add_assoc_long ( return_value , "ino" , stat_sb->st_ino ); - add_assoc_long ( return_value , "mode" , stat_sb->st_mode ); - add_assoc_long ( return_value , "nlink" , stat_sb->st_nlink ); - add_assoc_long ( return_value , "uid" , stat_sb->st_uid ); - add_assoc_long ( return_value , "gid" , stat_sb->st_gid ); - -#ifdef HAVE_ST_RDEV - add_assoc_long ( return_value, "rdev" , stat_sb->st_rdev ); -#endif -#ifdef HAVE_ST_BLKSIZE - add_assoc_long ( return_value , "blksize" , stat_sb->st_blksize ); -#endif - - add_assoc_long ( return_value , "size" , stat_sb->st_size ); - add_assoc_long ( return_value , "atime" , stat_sb->st_atime ); - add_assoc_long ( return_value , "mtime" , stat_sb->st_mtime ); - add_assoc_long ( return_value , "ctime" , stat_sb->st_ctime ); - -#ifdef HAVE_ST_BLOCKS - add_assoc_long ( return_value , "blocks" , stat_sb->st_blocks ); -#endif + /* Store numeric indexes in propper order */ + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_dev, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_ino, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_mode, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_nlink, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_uid, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_gid, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_rdev, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_size, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_atime, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_mtime, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_ctime, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_blksize, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_blocks, sizeof(zval *), NULL); + + /* Store string indexes referencing the same zval*/ + zend_hash_update(HASH_OF(return_value),stat_sb_names[0],strlen(stat_sb_names[0])+1,(void *)&stat_dev, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[1],strlen(stat_sb_names[1])+1,(void *)&stat_ino, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[2],strlen(stat_sb_names[2])+1,(void *)&stat_mode, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[3],strlen(stat_sb_names[3])+1,(void *)&stat_nlink, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[4],strlen(stat_sb_names[4])+1,(void *)&stat_uid, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[5],strlen(stat_sb_names[5])+1,(void *)&stat_gid, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[6],strlen(stat_sb_names[6])+1,(void *)&stat_rdev, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[7],strlen(stat_sb_names[7])+1,(void *)&stat_size, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[8],strlen(stat_sb_names[8])+1,(void *)&stat_atime, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[9],strlen(stat_sb_names[9])+1,(void *)&stat_mtime, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[10],strlen(stat_sb_names[10])+1,(void *)&stat_ctime, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[11],strlen(stat_sb_names[11])+1,(void *)&stat_blksize, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[12],strlen(stat_sb_names[12])+1,(void *)&stat_blocks, sizeof(zval *), NULL); return; } Index: php4/ext/standard/file.c diff -u php4/ext/standard/file.c:1.156 php4/ext/standard/file.c:1.157 --- php4/ext/standard/file.c:1.156 Thu May 10 18:47:46 2001 +++ php4/ext/standard/file.c Fri May 11 12:55:43 2001 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.c,v 1.156 2001/05/11 01:47:46 jason Exp $ */ +/* $Id: file.c,v 1.157 2001/05/11 19:55:43 jason Exp $ */ /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */ @@ -1783,9 +1783,14 @@ PHP_NAMED_FUNCTION(php_if_fstat) { zval **fp; + zval *stat_dev,*stat_ino,*stat_mode,*stat_nlink,*stat_uid,*stat_gid,*stat_rdev, + *stat_size, *stat_atime, *stat_mtime, *stat_ctime, *stat_blksize, *stat_blocks; int type; void *what; struct stat stat_sb; + + char *stat_sb_names[13]={"dev","ino","mode","nlink","uid","gid","rdev", + "size","atime","mtime","ctime","blksize","blocks"}; if (ARG_COUNT(ht) != 1 || zend_get_parameters_ex(1, &fp) == FAILURE) { WRONG_PARAM_COUNT; @@ -1801,54 +1806,60 @@ array_init(return_value); - add_next_index_long(return_value, stat_sb.st_dev); - add_next_index_long(return_value, stat_sb.st_ino); - add_next_index_long(return_value, stat_sb.st_mode); - add_next_index_long(return_value, stat_sb.st_nlink); - add_next_index_long(return_value, stat_sb.st_uid); - add_next_index_long(return_value, stat_sb.st_gid); + MAKE_LONG_ZVAL_INCREF(stat_dev, stat_sb.st_dev); + MAKE_LONG_ZVAL_INCREF(stat_ino, stat_sb.st_ino); + MAKE_LONG_ZVAL_INCREF(stat_mode, stat_sb.st_mode); + MAKE_LONG_ZVAL_INCREF(stat_nlink, stat_sb.st_nlink); + MAKE_LONG_ZVAL_INCREF(stat_uid, stat_sb.st_uid); + MAKE_LONG_ZVAL_INCREF(stat_gid, stat_sb.st_gid); #ifdef HAVE_ST_RDEV - add_next_index_long(return_value, stat_sb.st_rdev); + MAKE_LONG_ZVAL_INCREF(stat_rdev, stat_sb.st_rdev); #else - add_next_index_long(return_value, -1); + MAKE_LONG_ZVAL_INCREF(stat_rdev, -1); #endif - add_next_index_long(return_value, stat_sb.st_size); - add_next_index_long(return_value, stat_sb.st_atime); - add_next_index_long(return_value, stat_sb.st_mtime); - add_next_index_long(return_value, stat_sb.st_ctime); + MAKE_LONG_ZVAL_INCREF(stat_size, stat_sb.st_size); + MAKE_LONG_ZVAL_INCREF(stat_atime, stat_sb.st_atime); + MAKE_LONG_ZVAL_INCREF(stat_mtime, stat_sb.st_mtime); + MAKE_LONG_ZVAL_INCREF(stat_ctime, stat_sb.st_ctime); #ifdef HAVE_ST_BLKSIZE - add_next_index_long(return_value, stat_sb.st_blksize); + MAKE_LONG_ZVAL_INCREF(stat_blksize, stat_sb.st_blksize); #else - add_next_index_long(return_value, -1); + MAKE_LONG_ZVAL_INCREF(stat_blksize,-1); #endif #ifdef HAVE_ST_BLOCKS - add_next_index_long(return_value, stat_sb.st_blocks); + MAKE_LONG_ZVAL_INCREF(stat_blocks, stat_sb.st_blocks); #else - add_next_index_long(return_value, -1); -#endif - /* Support string references as well as numerical*/ - add_assoc_long ( return_value , "dev" , stat_sb.st_dev ); - add_assoc_long ( return_value , "ino" , stat_sb.st_ino ); - add_assoc_long ( return_value , "mode" , stat_sb.st_mode ); - add_assoc_long ( return_value , "nlink" , stat_sb.st_nlink ); - add_assoc_long ( return_value , "uid" , stat_sb.st_uid ); - add_assoc_long ( return_value , "gid" , stat_sb.st_gid ); - -#ifdef HAVE_ST_RDEV - add_assoc_long ( return_value, "rdev" , stat_sb.st_rdev ); -#endif -#ifdef HAVE_ST_BLKSIZE - add_assoc_long ( return_value , "blksize" , stat_sb.st_blksize ); -#endif - - add_assoc_long ( return_value , "size" , stat_sb.st_size ); - add_assoc_long ( return_value , "atime" , stat_sb.st_atime ); - add_assoc_long ( return_value , "mtime" , stat_sb.st_mtime ); - add_assoc_long ( return_value , "ctime" , stat_sb.st_ctime ); - -#ifdef HAVE_ST_BLOCKS - add_assoc_long ( return_value , "blocks" , stat_sb.st_blocks ); + MAKE_LONG_ZVAL_INCREF(stat_blocks,-1); #endif + /* Store numeric indexes in propper order */ + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_dev, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_ino, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_mode, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_nlink, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_uid, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_gid, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_rdev, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_size, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_atime, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_mtime, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_ctime, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_blksize, sizeof(zval *), NULL); + zend_hash_next_index_insert(HASH_OF(return_value),(void *)&stat_blocks, sizeof(zval *), NULL); + + /* Store string indexes referencing the same zval*/ + zend_hash_update(HASH_OF(return_value),stat_sb_names[0],strlen(stat_sb_names[0])+1,(void *)&stat_dev, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[1],strlen(stat_sb_names[1])+1,(void *)&stat_ino, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[2],strlen(stat_sb_names[2])+1,(void *)&stat_mode, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[3],strlen(stat_sb_names[3])+1,(void *)&stat_nlink, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[4],strlen(stat_sb_names[4])+1,(void *)&stat_uid, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[5],strlen(stat_sb_names[5])+1,(void *)&stat_gid, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[6],strlen(stat_sb_names[6])+1,(void *)&stat_rdev, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[7],strlen(stat_sb_names[7])+1,(void *)&stat_size, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[8],strlen(stat_sb_names[8])+1,(void *)&stat_atime, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[9],strlen(stat_sb_names[9])+1,(void *)&stat_mtime, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[10],strlen(stat_sb_names[10])+1,(void *)&stat_ctime, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[11],strlen(stat_sb_names[11])+1,(void *)&stat_blksize, sizeof(zval *), NULL); + zend_hash_update(HASH_OF(return_value),stat_sb_names[12],strlen(stat_sb_names[12])+1,(void *)&stat_blocks, sizeof(zval *), NULL); } /* }}} */ Index: php4/ext/standard/php_filestat.h diff -u php4/ext/standard/php_filestat.h:1.9 php4/ext/standard/php_filestat.h:1.10 --- php4/ext/standard/php_filestat.h:1.9 Sun Feb 25 22:07:23 2001 +++ php4/ext/standard/php_filestat.h Fri May 11 12:55:44 2001 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_filestat.h,v 1.9 2001/02/26 06:07:23 andi Exp $ */ +/* $Id: php_filestat.h,v 1.10 2001/05/11 19:55:44 jason Exp $ */ #ifndef PHP_FILESTAT_H #define PHP_FILESTAT_H @@ -49,5 +49,10 @@ PHP_FUNCTION(chmod); PHP_FUNCTION(touch); PHP_FUNCTION(clearstatcache); + +#define MAKE_LONG_ZVAL_INCREF(name, val)\ + MAKE_STD_ZVAL(name); \ + ZVAL_LONG(name,val); \ + name->refcount++; #endif /* PHP_FILESTAT_H */
« previous php.cvs (#5673) next »