csv.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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(
  17. zval *stream_resource,
  18. const char *delimiter_str, int delimiter_str_len,
  19. const char *enclosure_str, int enclosure_str_len,
  20. const char *escape_str, int escape_str_len,
  21. xlsxioreadersheet sheet_t,
  22. zval *zv_type_arr_t, zend_long data_type_default,
  23. unsigned int flag, zend_fcall_info *fci, zend_fcall_info_cache *fci_cache
  24. )
  25. {
  26. ssize_t ret = 0;
  27. zval *_zv_type_arr_t = NULL;
  28. php_stream *_stream_t = NULL;
  29. char delimiter = ',', enclosure = '"', escape_char = '\\';
  30. ZEND_ASSERT(Z_TYPE_P(stream_resource) == IS_RESOURCE);
  31. if (((_stream_t) = (php_stream *)zend_fetch_resource2((Z_RES_P(stream_resource)),
  32. "stream", php_file_le_stream(), php_file_le_pstream())) == NULL) {
  33. return XLSWRITER_FALSE;
  34. }
  35. if (delimiter_str != NULL) {
  36. if (delimiter_str_len < 1) {
  37. zend_throw_exception(vtiful_exception_ce, "delimiter must be a character", 190);
  38. return XLSWRITER_FALSE;
  39. } else if (delimiter_str_len > 1) {
  40. zend_throw_exception(vtiful_exception_ce, "delimiter must be a single character", 191);
  41. return XLSWRITER_FALSE;
  42. }
  43. delimiter = *delimiter_str;
  44. }
  45. if (enclosure_str != NULL) {
  46. if (enclosure_str_len < 1) {
  47. zend_throw_exception(vtiful_exception_ce, "enclosure must be a character", 192);
  48. return XLSWRITER_FALSE;
  49. } else if (enclosure_str_len > 1) {
  50. zend_throw_exception(vtiful_exception_ce, "enclosure must be a single character", 193);
  51. return XLSWRITER_FALSE;
  52. }
  53. enclosure = *enclosure_str;
  54. }
  55. if (escape_str != NULL) {
  56. if (escape_str_len < 1) {
  57. zend_throw_exception(vtiful_exception_ce, "escape must be a character", 194);
  58. return XLSWRITER_FALSE;
  59. } else if (escape_str_len > 1) {
  60. zend_throw_exception(vtiful_exception_ce, "escape must be a single character", 195);
  61. return XLSWRITER_FALSE;
  62. }
  63. escape_char = *escape_str;
  64. }
  65. if (Z_TYPE_P(zv_type_arr_t) == IS_ARRAY) {
  66. _zv_type_arr_t = zv_type_arr_t;
  67. }
  68. zval _zv_tmp_row;
  69. ZVAL_NULL(&_zv_tmp_row);
  70. while (sheet_read_row(sheet_t))
  71. {
  72. load_sheet_current_row_data(sheet_t, &_zv_tmp_row, _zv_type_arr_t, data_type_default, flag);
  73. if (fci != NULL && fci_cache != NULL) {
  74. zval retval;
  75. fci->retval = &retval;
  76. fci->params = &_zv_tmp_row;
  77. fci->param_count = 1;
  78. zend_call_function(fci, fci_cache);
  79. if (Z_TYPE(retval) == IS_ARRAY) {
  80. #if PHP_VERSION_ID >= 80100
  81. ret = php_fputcsv(_stream_t, &retval, delimiter, enclosure, escape_char, NULL);
  82. #else
  83. ret = php_fputcsv(_stream_t, &retval, delimiter, enclosure, escape_char);
  84. #endif
  85. }
  86. zval_ptr_dtor(&retval);
  87. goto CLEAN_UP_SCENE;
  88. }
  89. #if PHP_VERSION_ID >= 80100
  90. ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char, NULL);
  91. #else
  92. ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char);
  93. #endif
  94. CLEAN_UP_SCENE:
  95. zend_hash_clean(Z_ARRVAL(_zv_tmp_row));
  96. if (ret < 0) {
  97. return XLSWRITER_FALSE;
  98. }
  99. }
  100. zval_dtor(&_zv_tmp_row);
  101. return XLSWRITER_TRUE;
  102. }
  103. /* }}} */