CHAPTER 15 – Macros Used to Access zval Values
All macros have three forms: one that accepts zvals, another one for zval *s, and finally one for zval **s. The difference in their names is that the first has no suffix, the zval * has a suffix of _P (as in one pointer), and the latter, zval **, has a suffix of _PP (two pointers). Now, you have enough information to complete the file_read() and file_write() functions on your own. Here's a possible implementation: PHP_FUNCTION(file_read) { int argc = ZEND_NUM_ARGS(); long size; zval *filehandle = NULL; FILE *fp; char *result; size_t bytes_read; if (zend_parse_parameters(argc TSRMLS_CC, "rl", &filehandle, &size) == FAILURE) { return; } ZEND_FETCH_RESOURCE(fp, FILE *, &filehandle, -1, "standard-c file", le_myfile); result = (char *) emalloc(size+1); bytes_read = fread(result, 1, size, fp); result[bytes_read] = ' '; RETURN_STRING(result, 0); } PHP_FUNCTION(file_write) { char *buffer = NULL; int argc = ZEND_NUM_ARGS(); int buffer_len; zval *filehandle = NULL; FILE *fp; if (zend_parse_parameters(argc TSRMLS_CC, "rs", &filehandle, &buffer, &buffer_len) == FAILURE) { return; } ZEND_FETCH_RESOURCE(fp, FILE *, &filehandle, -1, "standard-c file", le_myfile); if (fwrite(buffer, 1, buffer_len, fp) != buffer_len) { RETURN_FALSE; } RETURN_TRUE; }