iliaa Sat Jun 28 16:06:13 2003 EDT Added files: /php-src/ext/standard/tests/file 004.phpt
Modified files: /php-src/ext/standard file.c Log: Added array handling to file_put_contents() More verbose error reporting mechanism. Test case for file_put_contents(). Index: php-src/ext/standard/file.c diff -u php-src/ext/standard/file.c:1.350 php-src/ext/standard/file.c:1.351 --- php-src/ext/standard/file.c:1.350 Sat Jun 28 04:21:02 2003 +++ php-src/ext/standard/file.c Sat Jun 28 16:06:13 2003 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.c,v 1.350 2003/06/28 08:21:02 derick Exp $ */ +/* $Id: file.c,v 1.351 2003/06/28 20:06:13 iliaa Exp $ */ /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */ @@ -474,19 +474,20 @@ } /* }}} */ -/* {{{ proto int file_put_contents(string file, string data[, int flags[, resource context]]) - Write/Create a file with contents data and returns the number */ +/* {{{ proto int file_put_contents(string file, mixed data [, int flags [, resource context]]) + Write/Create a file with contents data and return the number of bytes written */ PHP_FUNCTION(file_put_contents) { php_stream *stream; - char *filename, *data; - size_t filename_len, data_len; - int numbytes, flags = 0; + char *filename; + size_t filename_len; + zval *data; + int numbytes = 0, flags = 0; zval *zcontext = NULL; php_stream_context *context = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|lr!", &filename, &filename_len, - &data, &data_len, &flags, &zcontext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz/|lr!", &filename, &filename_len, + &data, &flags, &zcontext) == FAILURE) { return; } @@ -497,15 +498,66 @@ if (stream == NULL) { RETURN_FALSE; } + switch (Z_TYPE_P(data)) { + case IS_NULL: + case IS_LONG: + case IS_DOUBLE: + case IS_BOOL: + case IS_CONSTANT: + convert_to_string_ex(&data); + + case IS_STRING: + if (Z_STRLEN_P(data)) { + numbytes = php_stream_write(stream, Z_STRVAL_P(data), Z_STRLEN_P(data)); + if (numbytes != Z_STRLEN_P(data)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only %d of %d bytes written, possibly out of free disk space.", numbytes, Z_STRLEN_P(data)); + numbytes = -1; + } + } + break; - if (data_len) { - numbytes = php_stream_write(stream, data, data_len); - if (numbytes < 0) { - RETURN_FALSE; - } + case IS_ARRAY: + if (zend_hash_num_elements(Z_ARRVAL_P(data))) { + int bytes_written; + zval **tmp; + HashPosition pos; + + zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(data), &pos); + while (zend_hash_get_current_data_ex(Z_ARRVAL_P(data), (void **) &tmp, &pos) == SUCCESS) { + if ((*tmp)->type != IS_STRING) { + SEPARATE_ZVAL(tmp); + convert_to_string(*tmp); + } + if (Z_STRLEN_PP(tmp)) { + numbytes += Z_STRLEN_PP(tmp); + bytes_written = php_stream_write(stream, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); + if (bytes_written < 0 || bytes_written != Z_STRLEN_PP(tmp)) { + if (bytes_written < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write %d bytes to %s.", Z_STRLEN_PP(tmp), filename); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only %d of %d bytes written, possibly out of free disk space.", bytes_written, Z_STRLEN_PP(tmp)); + } + numbytes = -1; + break; + } + } + zend_hash_move_forward_ex(Z_ARRVAL_P(data), &pos); + } + } + break; + + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "The 2nd parameter should be either a string or an array.", flags); + numbytes = -1; + break; + } php_stream_close(stream); - + + if (numbytes < 0) { + RETURN_FALSE; + } + RETURN_LONG(numbytes); } /* }}} */ Index: php-src/ext/standard/tests/file/004.phpt +++ php-src/ext/standard/tests/file/004.phpt --TEST-- file_put_contents() test --FILE-- <?php chdir(dirname(__FILE__)); for ($i = 1; $i < 6; $i++) { @unlink("./TEST{$i}"); } echo "String Test: "; echo file_put_contents("TEST1", file_get_contents(__FILE__)) !== FALSE ? 'OK' : 'FAIL'; echo "\n"; $old_int = $int = rand(); $ret = file_put_contents("TEST2", $int); echo "Integer Test: "; if ($int === $old_int && $ret !== FALSE && md5($int) == md5_file("TEST2")) { echo 'OK'; } else { echo 'FAIL'; } echo "\n"; $old_int = $int = time() / 1000; $ret = file_put_contents("TEST3", $int); echo "Float Test: "; if ($int === $old_int && $ret !== FALSE && md5($int) == md5_file("TEST3")) { echo 'OK'; } else { echo 'FAIL'; } echo "\n"; $ret = file_put_contents("TEST4", __FILE__); echo "Bool Test: "; if ($ret !== FALSE && md5(__FILE__) == md5_file("TEST4")) { echo 'OK'; } else { echo 'FAIL'; } echo "\n"; $ret = @file_put_contents("TEST5", $_SERVER); echo "Array Test: "; if ($ret !== FALSE && @md5(implode('', $_SERVER)) == md5_file("TEST5")) { echo 'OK'; } else { echo 'FAIL'; } echo "\n"; for ($i = 1; $i < 6; $i++) { @unlink("./TEST{$i}"); } ?> --EXPECT-- String Test: OK Integer Test: OK Float Test: OK Bool Test: OK Array Test: OK -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php