121 lines
2.8 KiB
C
121 lines
2.8 KiB
C
|
#include <stdio.h>
|
||
|
#include <stddef.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#include "quickjs.h"
|
||
|
|
||
|
static char *read_file(const char *filename, size_t *sz) {
|
||
|
FILE *f = fopen(filename, "rb");
|
||
|
if(!f) return NULL;
|
||
|
long fsize; { fseek(f, 0, SEEK_END); fsize = ftell(f); fseek(f, 0, SEEK_SET); }
|
||
|
char *buf = (char *)malloc(fsize * sizeof(char));
|
||
|
*sz = fread((void *) buf, 1, fsize, f);
|
||
|
fclose(f);
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
#define CLEANUP(v) { JS_FreeContext(ctx); JS_FreeRuntime(rt); return v; }
|
||
|
#define FREE(v) JS_FreeValue(ctx, v);
|
||
|
#define VALIDATE(v) { if(JS_IsException(v)) CLEANUP(1) }
|
||
|
#define VALINIT(xx,vv) \
|
||
|
JSValue xx = vv;\
|
||
|
VALIDATE(xx)
|
||
|
#define VALPROP(xx,vv,pp) VALINIT(xx, JS_GetPropertyStr(ctx, vv, pp))
|
||
|
|
||
|
int main(int argc, char *argv[]) {
|
||
|
JSRuntime *rt = JS_NewRuntime();
|
||
|
JSContext *ctx = JS_NewContext(rt);
|
||
|
|
||
|
/* load library */
|
||
|
{
|
||
|
size_t len; char * buf = read_file("xlsx.full.min.js", &len);
|
||
|
VALIDATE(JS_Eval(ctx, buf, len, "<input>", 0))
|
||
|
free(buf);
|
||
|
}
|
||
|
|
||
|
VALINIT(global, JS_GetGlobalObject(ctx))
|
||
|
VALPROP(XLSX, global, "XLSX");
|
||
|
FREE(global)
|
||
|
|
||
|
/* print version */
|
||
|
{
|
||
|
VALPROP(version, XLSX, "version")
|
||
|
size_t vlen; const char *vers = JS_ToCStringLen(ctx, &vlen, version);
|
||
|
printf("Version: %s\n", vers);
|
||
|
FREE(version)
|
||
|
}
|
||
|
|
||
|
/* parse workbook */
|
||
|
JSValue wb;
|
||
|
{
|
||
|
/* read file */
|
||
|
size_t dlen; uint8_t * dbuf = (uint8_t *)read_file(argv[1], &dlen);
|
||
|
|
||
|
/* load data into array buffer */
|
||
|
JSValue ab = JS_NewArrayBuffer(ctx, dbuf, dlen, NULL, NULL, 0);
|
||
|
{
|
||
|
VALPROP(byteLen, ab, "byteLength")
|
||
|
uint32_t byteLength; JS_ToUint32(ctx, &byteLength, byteLen);
|
||
|
FREE(byteLen)
|
||
|
printf("Size: %d\n", byteLength);
|
||
|
}
|
||
|
|
||
|
/* call XLSX.read(ab) */
|
||
|
{
|
||
|
VALPROP(XLSX_read, XLSX, "read");
|
||
|
JSValue args[] = { ab };
|
||
|
wb = JS_Call(ctx, XLSX_read, XLSX, 1, args);
|
||
|
FREE(XLSX_read)
|
||
|
}
|
||
|
|
||
|
/* cleanup */
|
||
|
FREE(ab)
|
||
|
free(dbuf);
|
||
|
}
|
||
|
|
||
|
/* print CSV of first worksheet */
|
||
|
{
|
||
|
/* get first worksheet */
|
||
|
JSValue ws;
|
||
|
{
|
||
|
/* get name of first sheet */
|
||
|
const char *wsname;
|
||
|
{
|
||
|
JSValue SheetNames = JS_GetPropertyStr(ctx, wb, "SheetNames");
|
||
|
JSValue Sheet1 = JS_GetPropertyStr(ctx, SheetNames, "0");
|
||
|
size_t wslen; wsname = JS_ToCStringLen(ctx, &wslen, Sheet1);
|
||
|
FREE(Sheet1)
|
||
|
FREE(SheetNames)
|
||
|
}
|
||
|
printf("Worksheet Name: %s\n", wsname);
|
||
|
|
||
|
/* get worksheet object */
|
||
|
{
|
||
|
VALPROP(Sheets, wb, "Sheets");
|
||
|
ws = JS_GetPropertyStr(ctx, Sheets, wsname);
|
||
|
FREE(Sheets)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* print CSV */
|
||
|
{
|
||
|
VALPROP(utils, XLSX, "utils")
|
||
|
VALPROP(sheet_to_csv, utils, "sheet_to_csv")
|
||
|
JSValue args[] = { ws };
|
||
|
JSValue csv = JS_Call(ctx, sheet_to_csv, utils, 1, args);
|
||
|
FREE(sheet_to_csv)
|
||
|
FREE(utils)
|
||
|
size_t csvlen; const char *csvstr = JS_ToCStringLen(ctx, &csvlen, csv);
|
||
|
printf("%s\n", csvstr);
|
||
|
FREE(csv)
|
||
|
}
|
||
|
|
||
|
FREE(ws)
|
||
|
}
|
||
|
|
||
|
FREE(wb)
|
||
|
FREE(XLSX)
|
||
|
CLEANUP(0)
|
||
|
}
|