123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /*
- +----------------------------------------------------------------------+
- | XlsWriter Extension |
- +----------------------------------------------------------------------+
- | Copyright (c) 2017-2018 The Viest |
- +----------------------------------------------------------------------+
- | http://www.viest.me |
- +----------------------------------------------------------------------+
- | Author: viest <[email protected]> |
- +----------------------------------------------------------------------+
- */
- #include "xlswriter.h"
- #include "php_streams.h"
- #include "ext/standard/file.h"
- /* {{{ */
- unsigned int xlsx_to_csv(
- zval *stream_resource,
- const char *delimiter_str, int delimiter_str_len,
- const char *enclosure_str, int enclosure_str_len,
- const char *escape_str, int escape_str_len,
- xlsxioreadersheet sheet_t,
- zval *zv_type_arr_t, zend_long data_type_default,
- unsigned int flag, zend_fcall_info *fci, zend_fcall_info_cache *fci_cache
- )
- {
- ssize_t ret = 0;
- zval *_zv_type_arr_t = NULL;
- php_stream *_stream_t = NULL;
- char delimiter = ',', enclosure = '"', escape_char = '\\';
- ZEND_ASSERT(Z_TYPE_P(stream_resource) == IS_RESOURCE);
- if (((_stream_t) = (php_stream *)zend_fetch_resource2((Z_RES_P(stream_resource)),
- "stream", php_file_le_stream(), php_file_le_pstream())) == NULL) {
- return XLSWRITER_FALSE;
- }
- if (delimiter_str != NULL) {
- if (delimiter_str_len < 1) {
- zend_throw_exception(vtiful_exception_ce, "delimiter must be a character", 190);
- return XLSWRITER_FALSE;
- } else if (delimiter_str_len > 1) {
- zend_throw_exception(vtiful_exception_ce, "delimiter must be a single character", 191);
- return XLSWRITER_FALSE;
- }
- delimiter = *delimiter_str;
- }
- if (enclosure_str != NULL) {
- if (enclosure_str_len < 1) {
- zend_throw_exception(vtiful_exception_ce, "enclosure must be a character", 192);
- return XLSWRITER_FALSE;
- } else if (enclosure_str_len > 1) {
- zend_throw_exception(vtiful_exception_ce, "enclosure must be a single character", 193);
- return XLSWRITER_FALSE;
- }
- enclosure = *enclosure_str;
- }
- if (escape_str != NULL) {
- if (escape_str_len < 1) {
- zend_throw_exception(vtiful_exception_ce, "escape must be a character", 194);
- return XLSWRITER_FALSE;
- } else if (escape_str_len > 1) {
- zend_throw_exception(vtiful_exception_ce, "escape must be a single character", 195);
- return XLSWRITER_FALSE;
- }
- escape_char = *escape_str;
- }
- if (Z_TYPE_P(zv_type_arr_t) == IS_ARRAY) {
- _zv_type_arr_t = zv_type_arr_t;
- }
- zval _zv_tmp_row;
- ZVAL_NULL(&_zv_tmp_row);
- while (sheet_read_row(sheet_t))
- {
- load_sheet_current_row_data(sheet_t, &_zv_tmp_row, _zv_type_arr_t, data_type_default, flag);
- if (fci != NULL && fci_cache != NULL) {
- zval retval;
- fci->retval = &retval;
- fci->params = &_zv_tmp_row;
- fci->param_count = 1;
- zend_call_function(fci, fci_cache);
- if (Z_TYPE(retval) == IS_ARRAY) {
- #if PHP_VERSION_ID >= 80100
- ret = php_fputcsv(_stream_t, &retval, delimiter, enclosure, escape_char, NULL);
- #else
- ret = php_fputcsv(_stream_t, &retval, delimiter, enclosure, escape_char);
- #endif
- }
- zval_ptr_dtor(&retval);
- goto CLEAN_UP_SCENE;
- }
- #if PHP_VERSION_ID >= 80100
- ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char, NULL);
- #else
- ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char);
- #endif
- CLEAN_UP_SCENE:
- zend_hash_clean(Z_ARRVAL(_zv_tmp_row));
- if (ret < 0) {
- return XLSWRITER_FALSE;
- }
- }
- zval_dtor(&_zv_tmp_row);
- return XLSWRITER_TRUE;
- }
- /* }}} */
|