初始化PHP-Xlswrite扩展

This commit is contained in:
ykxiao
2024-03-05 10:01:08 +08:00
commit 879cf9584d
2483 changed files with 1054962 additions and 0 deletions

View File

@ -0,0 +1,56 @@
#ifndef INCLUDED_XLSXIO_PRIVATE_H
#define INCLUDED_XLSXIO_PRIVATE_H
#if defined(_MSC_VER) || (defined(__MINGW32__) && !defined(__MINGW64__))
#define strcasecmp _stricmp
#endif
#ifdef _WIN32
#define wcscasecmp _wcsicmp
#endif
#define XLSXIOCHAR XML_Char
#if !defined(XML_UNICODE_WCHAR_T) && !defined(XML_UNICODE)
//UTF-8 version
#define X(s) s
#ifdef _WIN32
#define XML_Char_icmp stricmp
#else
#define XML_Char_icmp strcasecmp
#endif
#define XML_Char_len strlen
#define XML_Char_dup strdup
#define XML_Char_cpy strcpy
#define XML_Char_poscpy(d,p,s,l) memcpy(d + p, s, l)
#define XML_Char_malloc(n) ((char*)malloc(n))
#define XML_Char_realloc(m,n) ((char*)realloc((m), (n)))
#define XML_Char_tol(s) strtol((s), NULL, 10)
#define XML_Char_tod(s) strtod((s), NULL)
#define XML_Char_strtol strtol
#define XML_Char_sscanf sscanf
#define XML_Char_printf printf
#else
//UTF-16 version
#include <wchar.h>
#define X(s) L##s
#define XML_Char_icmp wcscasecmp
#define XML_Char_len wcslen
#define XML_Char_dup wcsdup
#define XML_Char_cpy wcscpy
#define XML_Char_poscpy(d,p,s,l) wmemcpy(d + p, s, l)
#define XML_Char_malloc(n) ((XML_Char*)malloc((n) * sizeof(XML_Char)))
#define XML_Char_realloc(m,n) ((XML_Char*)realloc((m), (n) * sizeof(XML_Char)))
#define XML_Char_tol(s) wcstol((s), NULL, 10)
#define XML_Char_tod(s) wcstod((s), NULL)
#define XML_Char_strtol wcstol
#define XML_Char_sscanf swscanf
#define XML_Char_printf wprintf
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
library/libxlsxio/lib/xlsxio_read.lo: \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libxlsxio/lib/xlsxio_read.c \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libxlsxio/lib/xlsxio_private.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libxlsxio/lib/xlsxio_read_sharedstrings.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libexpat/expat/lib/expat.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libexpat/expat/lib/expat_external.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libxlsxio/include/xlsxio_read.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libxlsxio/include/xlsxio_version.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/include/minizip/unzip.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/include/minizip/ioapi.h

View File

@ -0,0 +1,208 @@
#include "xlsxio_private.h"
#include "xlsxio_read_sharedstrings.h"
#include <stdlib.h>
//#include <inttypes.h>
#include <string.h>
#if defined(_MSC_VER) || (defined(__MINGW32__) && !defined(__MINGW64__))
#define strcasecmp _stricmp
#endif
#ifdef _WIN32
#define wcscasecmp _wcsicmp
#endif
struct sharedstringlist* sharedstringlist_create ()
{
struct sharedstringlist* sharedstrings;
if ((sharedstrings = (struct sharedstringlist*)malloc(sizeof(struct sharedstringlist))) != NULL) {
sharedstrings->strings = NULL;
sharedstrings->numstrings = 0;
}
return sharedstrings;
}
void sharedstringlist_destroy (struct sharedstringlist* sharedstrings)
{
if (sharedstrings) {
size_t i;
for (i = 0; i < sharedstrings->numstrings; i++)
free(sharedstrings->strings[i]);
free(sharedstrings->strings);
free(sharedstrings);
}
}
size_t sharedstringlist_size (struct sharedstringlist* sharedstrings)
{
if (!sharedstrings)
return 0;
return sharedstrings->numstrings;
}
int sharedstringlist_add_buffer (struct sharedstringlist* sharedstrings, const XML_Char* data, size_t datalen)
{
XML_Char* s;
XML_Char** p;
if (!sharedstrings)
return 1;
if (!data) {
s = NULL;
} else {
if ((s = XML_Char_malloc(datalen + 1)) == NULL)
return 2;
XML_Char_poscpy(s, 0, data, datalen);
s[datalen] = 0;
}
if ((p = (XML_Char**)realloc(sharedstrings->strings, (sharedstrings->numstrings + 1) * sizeof(sharedstrings->strings[0]))) == NULL) {
free(s);
return 3;
}
sharedstrings->strings = p;
sharedstrings->strings[sharedstrings->numstrings++] = s;
return 0;
}
int sharedstringlist_add_string (struct sharedstringlist* sharedstrings, const XML_Char* data)
{
return sharedstringlist_add_buffer(sharedstrings, data, (data ? XML_Char_len(data) : 0));
}
const XML_Char* sharedstringlist_get (struct sharedstringlist* sharedstrings, size_t index)
{
if (!sharedstrings || index >= sharedstrings->numstrings)
return NULL;
return sharedstrings->strings[index];
}
////////////////////////////////////////////////////////////////////////
void shared_strings_callback_data_initialize (struct shared_strings_callback_data* data, struct sharedstringlist* sharedstrings)
{
data->xmlparser = NULL;
data->sharedstrings = sharedstrings;
data->insst = 0;
data->insi = 0;
data->intext = 0;
data->text = NULL;
data->textlen = 0;
data->skiptag = NULL;
data->skiptagcount = 0;
data->skip_start = NULL;
data->skip_end = NULL;
data->skip_data = NULL;
}
void shared_strings_callback_data_cleanup (struct shared_strings_callback_data* data)
{
free(data->text);
free(data->skiptag);
}
void shared_strings_callback_skip_tag_start (void* callbackdata, const XML_Char* name, const XML_Char** atts)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if (name && XML_Char_icmp(name, data->skiptag) == 0) {
//increment nesting level
data->skiptagcount++;
}
}
void shared_strings_callback_skip_tag_end (void* callbackdata, const XML_Char* name)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if (!name || XML_Char_icmp(name, data->skiptag) == 0) {
if (--data->skiptagcount == 0) {
//restore handlers when done skipping
XML_SetElementHandler(data->xmlparser, data->skip_start, data->skip_end);
XML_SetCharacterDataHandler(data->xmlparser, data->skip_data);
free(data->skiptag);
data->skiptag = NULL;
}
}
}
void shared_strings_callback_find_sharedstringtable_start (void* callbackdata, const XML_Char* name, const XML_Char** atts)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if (XML_Char_icmp(name, X("sst")) == 0) {
XML_SetElementHandler(data->xmlparser, shared_strings_callback_find_shared_stringitem_start, NULL);
}
}
void shared_strings_callback_find_sharedstringtable_end (void* callbackdata, const XML_Char* name)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if (XML_Char_icmp(name, X("sst")) == 0) {
XML_SetElementHandler(data->xmlparser, shared_strings_callback_find_sharedstringtable_start, NULL);
}
}
void shared_strings_callback_find_shared_stringitem_start (void* callbackdata, const XML_Char* name, const XML_Char** atts)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if (XML_Char_icmp(name, X("si")) == 0) {
if (data->text)
free(data->text);
data->text = NULL;
data->textlen = 0;
XML_SetElementHandler(data->xmlparser, shared_strings_callback_find_shared_string_start, shared_strings_callback_find_sharedstringtable_end);
}
}
void shared_strings_callback_find_shared_stringitem_end (void* callbackdata, const XML_Char* name)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if (XML_Char_icmp(name, X("si")) == 0) {
sharedstringlist_add_buffer(data->sharedstrings, data->text, data->textlen);
if (data->text)
free(data->text);
data->text = NULL;
data->textlen = 0;
XML_SetElementHandler(data->xmlparser, shared_strings_callback_find_shared_stringitem_start, shared_strings_callback_find_sharedstringtable_end);
} else {
shared_strings_callback_find_sharedstringtable_end(callbackdata, name);
}
}
void shared_strings_callback_find_shared_string_start (void* callbackdata, const XML_Char* name, const XML_Char** atts)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if (XML_Char_icmp(name, X("t")) == 0) {
XML_SetElementHandler(data->xmlparser, NULL, shared_strings_callback_find_shared_string_end);
XML_SetCharacterDataHandler(data->xmlparser, shared_strings_callback_string_data);
} else if (XML_Char_icmp(name, X("rPh")) == 0) {
data->skiptag = XML_Char_dup(name);
data->skiptagcount = 1;
data->skip_start = shared_strings_callback_find_shared_string_start;
data->skip_end = shared_strings_callback_find_shared_stringitem_end;
data->skip_data = NULL;
XML_SetElementHandler(data->xmlparser, shared_strings_callback_skip_tag_start, shared_strings_callback_skip_tag_end);
XML_SetCharacterDataHandler(data->xmlparser, NULL);
}
}
void shared_strings_callback_find_shared_string_end (void* callbackdata, const XML_Char* name)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if (XML_Char_icmp(name, X("t")) == 0) {
XML_SetElementHandler(data->xmlparser, shared_strings_callback_find_shared_string_start, shared_strings_callback_find_shared_stringitem_end);
XML_SetCharacterDataHandler(data->xmlparser, NULL);
} else {
shared_strings_callback_find_shared_stringitem_end(callbackdata, name);
}
}
void shared_strings_callback_string_data (void* callbackdata, const XML_Char* buf, int buflen)
{
struct shared_strings_callback_data* data = (struct shared_strings_callback_data*)callbackdata;
if ((data->text = XML_Char_realloc(data->text, data->textlen + buflen)) == NULL) {
//memory allocation error
data->textlen = 0;
} else {
XML_Char_poscpy(data->text, data->textlen, buf, buflen);
data->textlen += buflen;
}
}
////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,6 @@
library/libxlsxio/lib/xlsxio_read_sharedstrings.lo: \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libxlsxio/lib/xlsxio_read_sharedstrings.c \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libxlsxio/lib/xlsxio_private.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libxlsxio/lib/xlsxio_read_sharedstrings.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libexpat/expat/lib/expat.h \
/Users/ykxiao/nginx/www/phpext/php-ext-xlswriter/library/libexpat/expat/lib/expat_external.h

View File

@ -0,0 +1,56 @@
#ifndef INCLUDED_XLSXIO_READ_SHAREDSTRINGS_H
#define INCLUDED_XLSXIO_READ_SHAREDSTRINGS_H
#include <stdint.h>
#include <expat.h>
#ifdef __cplusplus
extern "C" {
#endif
struct sharedstringlist {
XML_Char** strings;
size_t numstrings;
};
struct sharedstringlist* sharedstringlist_create ();
void sharedstringlist_destroy (struct sharedstringlist* sharedstrings);
size_t sharedstringlist_size (struct sharedstringlist* sharedstrings);
int sharedstringlist_add_buffer (struct sharedstringlist* sharedstrings, const XML_Char* data, size_t datalen);
int sharedstringlist_add_string (struct sharedstringlist* sharedstrings, const XML_Char* data);
const XML_Char* sharedstringlist_get (struct sharedstringlist* sharedstrings, size_t index);
////////////////////////////////////////////////////////////////////////
struct shared_strings_callback_data {
XML_Parser xmlparser;
struct sharedstringlist* sharedstrings;
int insst;
int insi;
int intext;
XML_Char* text;
size_t textlen;
XML_Char* skiptag; //tag to skip
size_t skiptagcount; //nesting level for current tag to skip
XML_StartElementHandler skip_start; //start handler to set after skipping
XML_EndElementHandler skip_end; //end handler to set after skipping
XML_CharacterDataHandler skip_data; //data handler to set after skipping
};
void shared_strings_callback_data_initialize (struct shared_strings_callback_data* data, struct sharedstringlist* sharedstrings);
void shared_strings_callback_data_cleanup (struct shared_strings_callback_data* data);
void shared_strings_callback_skip_tag_start (void* callbackdata, const XML_Char* name, const XML_Char** atts);
void shared_strings_callback_skip_tag_end (void* callbackdata, const XML_Char* name);
void shared_strings_callback_find_sharedstringtable_start (void* callbackdata, const XML_Char* name, const XML_Char** atts);
void shared_strings_callback_find_sharedstringtable_end (void* callbackdata, const XML_Char* name);
void shared_strings_callback_find_shared_stringitem_start (void* callbackdata, const XML_Char* name, const XML_Char** atts);
void shared_strings_callback_find_shared_stringitem_end (void* callbackdata, const XML_Char* name);
void shared_strings_callback_find_shared_string_start (void* callbackdata, const XML_Char* name, const XML_Char** atts);
void shared_strings_callback_find_shared_string_end (void* callbackdata, const XML_Char* name);
void shared_strings_callback_string_data (void* callbackdata, const XML_Char* buf, int buflen);
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because one or more lines are too long