forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			105 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								/* sheetjs-hermes.cpp Copyright (c) SheetJS LLC. */
							 | 
						||
| 
								 | 
							
								#include <iostream>
							 | 
						||
| 
								 | 
							
								#include "hermes/hermes.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;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Unfortunately the library provides no C-friendly Buffer classes */
							 | 
						||
| 
								 | 
							
								class CBuffer : public facebook::jsi::Buffer {
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								    CBuffer(const uint8_t *data, size_t size) : buf(data), sz(size) {}
							 | 
						||
| 
								 | 
							
								    size_t size() const override { return sz; }
							 | 
						||
| 
								 | 
							
								    const uint8_t *data() const override { return buf; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  private:
							 | 
						||
| 
								 | 
							
								    const uint8_t *buf;
							 | 
						||
| 
								 | 
							
								    size_t sz;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								/* ArrayBuffer constructor expects MutableBuffer*/
							 | 
						||
| 
								 | 
							
								class CMutableBuffer : public facebook::jsi::MutableBuffer {
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								    CMutableBuffer(uint8_t *data, size_t size) : buf(data), sz(size) {}
							 | 
						||
| 
								 | 
							
								    size_t size() const override { return sz; }
							 | 
						||
| 
								 | 
							
								    uint8_t *data() override { return buf; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  private:
							 | 
						||
| 
								 | 
							
								    uint8_t *buf;
							 | 
						||
| 
								 | 
							
								    size_t sz;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main(int argc, char **argv) {
							 | 
						||
| 
								 | 
							
								  std::unique_ptr<facebook::jsi::Runtime> rt(facebook::hermes::makeHermesRuntime());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* setup */
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    auto src = std::make_shared<facebook::jsi::StringBuffer>(
							 | 
						||
| 
								 | 
							
								      "var global = (function(){ return this; }).call(null);"
							 | 
						||
| 
								 | 
							
								      "var console = { log: function(x) { print(x); } };"
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    auto js = rt->prepareJavaScript(src, std::string("<eval>"));
							 | 
						||
| 
								 | 
							
								    rt->evaluatePreparedJavaScript(js);
							 | 
						||
| 
								 | 
							
								  } catch (const facebook::jsi::JSIException &e) {
							 | 
						||
| 
								 | 
							
								    std::cerr << "JavaScript terminated via uncaught exception: " << e.what() << '\n';
							 | 
						||
| 
								 | 
							
								    return 1;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* load SheetJS library */
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    size_t sz; char *xlsx_full_min_js = read_file("xlsx.full.min.js", &sz);
							 | 
						||
| 
								 | 
							
								    auto src = std::make_shared<CBuffer>(CBuffer((uint8_t *)xlsx_full_min_js, sz));
							 | 
						||
| 
								 | 
							
								    auto js = rt->prepareJavaScript(src, std::string("xlsx.full.min.js"));
							 | 
						||
| 
								 | 
							
								    rt->evaluatePreparedJavaScript(js);
							 | 
						||
| 
								 | 
							
								  } catch (const facebook::jsi::JSIException &e) {
							 | 
						||
| 
								 | 
							
								    std::cerr << "JavaScript terminated via uncaught exception: " << e.what() << '\n';
							 | 
						||
| 
								 | 
							
								    return 1;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* print library version */
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    auto src = std::make_shared<facebook::jsi::StringBuffer>(
							 | 
						||
| 
								 | 
							
								      "console.log('SheetJS Library Version: ' + XLSX.version)"
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    auto js = rt->prepareJavaScript(src, std::string("<eval>"));
							 | 
						||
| 
								 | 
							
								    rt->evaluatePreparedJavaScript(js);
							 | 
						||
| 
								 | 
							
								  } catch (const facebook::jsi::JSIException &e) {
							 | 
						||
| 
								 | 
							
								    std::cerr << "JavaScript terminated via uncaught exception: " << e.what() << '\n';
							 | 
						||
| 
								 | 
							
								    return 1;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    /* load payload as ArrayBuffer */
							 | 
						||
| 
								 | 
							
								    size_t sz; char *data = read_file(argv[1], &sz);
							 | 
						||
| 
								 | 
							
								    auto payload = std::make_shared<CMutableBuffer>(CMutableBuffer((uint8_t *)data, sz));
							 | 
						||
| 
								 | 
							
								    auto ab = facebook::jsi::ArrayBuffer(*rt, payload);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* define stub function to read and convert first sheet to CSV */
							 | 
						||
| 
								 | 
							
								    auto src = std::make_shared<facebook::jsi::StringBuffer>(
							 | 
						||
| 
								 | 
							
								      "(function(buf) {"
							 | 
						||
| 
								 | 
							
								        "var wb = XLSX.read(buf);"
							 | 
						||
| 
								 | 
							
								        "return XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]]);"
							 | 
						||
| 
								 | 
							
								      "})"
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    auto js = rt->prepareJavaScript(src, std::string("<eval>"));
							 | 
						||
| 
								 | 
							
								    auto func = rt->evaluatePreparedJavaScript(js);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* call stub function and capture result */
							 | 
						||
| 
								 | 
							
								    auto csv = func.asObject(*rt).asFunction(*rt).call(*rt, ab);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* interpret as utf8 and print to stdout */
							 | 
						||
| 
								 | 
							
								    std::string str = csv.getString(*rt).utf8(*rt);
							 | 
						||
| 
								 | 
							
								    std::cout << str << std::endl;
							 | 
						||
| 
								 | 
							
								  } catch (const facebook::jsi::JSIException &e) {
							 | 
						||
| 
								 | 
							
								    std::cerr << "JavaScript terminated via uncaught exception: " << e.what() << std::endl;
							 | 
						||
| 
								 | 
							
								    return 1;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								}
							 |