初始化PHP-Xlswrite扩展
This commit is contained in:
56
library/libxlsxio/lib/xlsxio_private.h
Normal file
56
library/libxlsxio/lib/xlsxio_private.h
Normal 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
|
1595
library/libxlsxio/lib/xlsxio_read.c
Normal file
1595
library/libxlsxio/lib/xlsxio_read.c
Normal file
File diff suppressed because it is too large
Load Diff
10
library/libxlsxio/lib/xlsxio_read.dep
Normal file
10
library/libxlsxio/lib/xlsxio_read.dep
Normal 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
|
208
library/libxlsxio/lib/xlsxio_read_sharedstrings.c
Normal file
208
library/libxlsxio/lib/xlsxio_read_sharedstrings.c
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
6
library/libxlsxio/lib/xlsxio_read_sharedstrings.dep
Normal file
6
library/libxlsxio/lib/xlsxio_read_sharedstrings.dep
Normal 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
|
56
library/libxlsxio/lib/xlsxio_read_sharedstrings.h
Normal file
56
library/libxlsxio/lib/xlsxio_read_sharedstrings.h
Normal 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
|
1081
library/libxlsxio/lib/xlsxio_write.c
Normal file
1081
library/libxlsxio/lib/xlsxio_write.c
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user