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;
							 | 
						||
| 
								 | 
							
								}
							 |