forked from sheetjs/docs.sheetjs.com
89 lines
2.5 KiB
C++
89 lines
2.5 KiB
C++
|
/* this sample is based off of the official ChakraCore examples */
|
||
|
#include "ChakraCore.h"
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string>
|
||
|
#include <cstring>
|
||
|
|
||
|
#define FAIL_CHECK(cmd) \
|
||
|
do { \
|
||
|
JsErrorCode errCode = cmd; \
|
||
|
if (errCode != JsNoError) { \
|
||
|
printf("Error %d at '%s'\n", errCode, #cmd); \
|
||
|
return 1; \
|
||
|
} \
|
||
|
} while(0)
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
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 EVAL_FILE(path) {\
|
||
|
JsValueRef filename; \
|
||
|
JsValueRef result; \
|
||
|
FAIL_CHECK(JsCreateString(path, strlen(path), &filename)); \
|
||
|
size_t len; const char* script = read_file(path, &len);\
|
||
|
JsValueRef src;\
|
||
|
FAIL_CHECK(JsCreateExternalArrayBuffer((void*)script, len, nullptr, nullptr, &src));\
|
||
|
FAIL_CHECK(JsRun(src, cookie++, filename, JsParseScriptAttributeNone, &result)); \
|
||
|
}
|
||
|
|
||
|
|
||
|
int main(int argc, char *argv[]) {
|
||
|
JsRuntimeHandle runtime;
|
||
|
JsContextRef context;
|
||
|
JsValueRef result;
|
||
|
size_t cookie = 0;
|
||
|
|
||
|
FAIL_CHECK(JsCreateRuntime(JsRuntimeAttributeNone, nullptr, &runtime));
|
||
|
FAIL_CHECK(JsCreateContext(runtime, &context));
|
||
|
FAIL_CHECK(JsSetCurrentContext(context));
|
||
|
|
||
|
JsValueRef global;
|
||
|
FAIL_CHECK(JsGetGlobalObject(&global));
|
||
|
|
||
|
EVAL_FILE("shim.min.js")
|
||
|
|
||
|
EVAL_FILE("xlsx.full.min.js")
|
||
|
|
||
|
JsValueRef buf_str;
|
||
|
FAIL_CHECK(JsCreateString("buf", strlen("buf"), &buf_str));
|
||
|
|
||
|
size_t len; char *buf = read_file(argv[1], &len);
|
||
|
JsValueRef ab;
|
||
|
FAIL_CHECK(JsCreateExternalArrayBuffer((void*)buf, len, nullptr, nullptr, &ab));
|
||
|
FAIL_CHECK(JsObjectSetProperty(global, buf_str, ab, true));
|
||
|
|
||
|
JsValueRef fname;
|
||
|
FAIL_CHECK(JsCreateString("<script>", strlen("<script>"), &fname));
|
||
|
|
||
|
const char* script_str =
|
||
|
"var wb = XLSX.read(buf);"
|
||
|
"var ws = wb.Sheets[wb.SheetNames[0]];"
|
||
|
"XLSX.utils.sheet_to_csv(ws);";
|
||
|
|
||
|
JsValueRef script;
|
||
|
FAIL_CHECK(JsCreateExternalArrayBuffer((void*)script_str, (size_t)strlen(script_str), nullptr, nullptr, &script));
|
||
|
FAIL_CHECK(JsRun(script, cookie++, fname, JsParseScriptAttributeNone, &result));
|
||
|
|
||
|
free(buf);
|
||
|
FAIL_CHECK(JsCopyString(result, nullptr, 0, &len));
|
||
|
buf = (char*)malloc(len + 1);
|
||
|
FAIL_CHECK(JsCopyString(result, buf, len + 1, nullptr));
|
||
|
buf[len] = 0;
|
||
|
|
||
|
printf("%s\n", buf);
|
||
|
free(buf);
|
||
|
|
||
|
FAIL_CHECK(JsSetCurrentContext(JS_INVALID_REFERENCE));
|
||
|
FAIL_CHECK(JsDisposeRuntime(runtime));
|
||
|
return 0;
|
||
|
}
|