csv.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. +----------------------------------------------------------------------+
  3. | XlsWriter Extension |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 2017-2018 The Viest |
  6. +----------------------------------------------------------------------+
  7. | http://www.viest.me |
  8. +----------------------------------------------------------------------+
  9. | Author: viest <[email protected]> |
  10. +----------------------------------------------------------------------+
  11. */
  12. #include "xlswriter.h"
  13. #include "php_streams.h"
  14. #include "ext/standard/file.h"
  15. /* {{{ */
  16. unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag, zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
  17. {
  18. zval *_zv_type_arr_t = NULL;
  19. php_stream *_stream_t;
  20. ssize_t ret = 0;
  21. char delimiter = ',';
  22. char enclosure = '"';
  23. int escape_char = (unsigned char) '\\';
  24. ZEND_ASSERT(Z_TYPE_P(stream_resource) == IS_RESOURCE);
  25. if (((_stream_t) = (php_stream *)zend_fetch_resource2((Z_RES_P(stream_resource)),
  26. "stream", php_file_le_stream(), php_file_le_pstream())) == NULL) {
  27. return XLSWRITER_FALSE;
  28. }
  29. if (Z_TYPE_P(zv_type_arr_t) == IS_ARRAY) {
  30. _zv_type_arr_t = zv_type_arr_t;
  31. }
  32. zval _zv_tmp_row;
  33. ZVAL_NULL(&_zv_tmp_row);
  34. while (sheet_read_row(sheet_t))
  35. {
  36. load_sheet_current_row_data(sheet_t, &_zv_tmp_row, _zv_type_arr_t, flag);
  37. if (fci != NULL && fci_cache != NULL) {
  38. zval retval;
  39. fci->retval = &retval;
  40. fci->params = &_zv_tmp_row;
  41. fci->param_count = 1;
  42. zend_call_function(fci, fci_cache);
  43. if (Z_TYPE(retval) == IS_ARRAY) {
  44. ret = php_fputcsv(_stream_t, &retval, delimiter, enclosure, escape_char);
  45. }
  46. zval_ptr_dtor(&retval);
  47. goto CLEAN_UP_SCENE;
  48. }
  49. ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char);
  50. CLEAN_UP_SCENE:
  51. zend_hash_clean(Z_ARRVAL(_zv_tmp_row));
  52. if (ret < 0) {
  53. return XLSWRITER_FALSE;
  54. }
  55. }
  56. zval_dtor(&_zv_tmp_row);
  57. return XLSWRITER_TRUE;
  58. }
  59. /* }}} */