forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			144 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #include <stdio.h>
 | ||
|  | #include <stdlib.h>
 | ||
|  | 
 | ||
|  | #include "jerryscript.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) - 1; | ||
|  |   fclose(f); | ||
|  |   return buf; | ||
|  | } | ||
|  | 
 | ||
|  | jerry_value_t eval_str(const char *code, size_t sz) { | ||
|  |   jerry_value_t parsed = jerry_parse(code, sz, NULL); | ||
|  |   if(jerry_value_is_error(parsed)) return parsed; | ||
|  | 
 | ||
|  |   jerry_value_t out = jerry_run(parsed); | ||
|  |   jerry_value_free(parsed); | ||
|  | 
 | ||
|  |   return out; | ||
|  | } | ||
|  | 
 | ||
|  | static jerry_value_t load_file(const char *filename) { | ||
|  |   size_t len; char *buf = read_file(filename, &len); | ||
|  |   if(!buf) return 0; | ||
|  | 
 | ||
|  |   jerry_value_t out = jerry_arraybuffer(len); | ||
|  |   jerry_arraybuffer_write(out, 0, (const uint8_t*)buf, len); | ||
|  |   return out; | ||
|  | } | ||
|  | 
 | ||
|  | char *pull_str(jerry_value_t str, size_t *sz) { | ||
|  |   jerry_size_t str_sz = jerry_string_size(str, JERRY_ENCODING_UTF8); | ||
|  |   jerry_char_t *buf = (jerry_char_t *)malloc(str_sz + 1); | ||
|  |   jerry_string_to_buffer(str, JERRY_ENCODING_UTF8, buf, str_sz + 1); | ||
|  |   *sz = str_sz; | ||
|  |   return (char *)buf; | ||
|  | } | ||
|  | 
 | ||
|  | int main (int argc, char **argv) { | ||
|  |   int res = 0; | ||
|  | 
 | ||
|  |   /* Initialize engine */ | ||
|  |   jerry_init(JERRY_INIT_EMPTY); | ||
|  | 
 | ||
|  |   /* evaluate shim.min.js */ | ||
|  |   { | ||
|  |     size_t sz; const jerry_char_t *script = (jerry_char_t *)read_file("shim.min.js", &sz); | ||
|  |     jerry_value_t result = eval_str(script, sz); | ||
|  |     if(jerry_value_is_error(result)) { | ||
|  |       fprintf(stderr, "Failed to evaluate shim.min.js"); | ||
|  |       res = 1; | ||
|  |       goto cleanup; | ||
|  |     } | ||
|  | 
 | ||
|  |     jerry_value_free(result); | ||
|  |   } | ||
|  | 
 | ||
|  |   /* evaluate xlsx.full.min.js */ | ||
|  |   { | ||
|  |     size_t sz; const jerry_char_t *script = read_file("xlsx.full.min.js", &sz); | ||
|  |     jerry_value_t result = eval_str(script, sz); | ||
|  |     if(jerry_value_is_error(result)) { | ||
|  |       fprintf(stderr, "Failed to evaluate xlsx.full.min.js"); | ||
|  |       res = 2; | ||
|  |       goto cleanup; | ||
|  |     } | ||
|  | 
 | ||
|  |     jerry_value_free(result); | ||
|  |   } | ||
|  | 
 | ||
|  |   /* load spreadsheet */ | ||
|  |   jerry_value_t ab = load_file(argv[1]); | ||
|  |   if(!ab || jerry_value_is_error(ab)) { | ||
|  |     fprintf(stderr, "Failed to read %s", argv[1]); | ||
|  |     res = 3; | ||
|  |     goto exeunt; | ||
|  |   } | ||
|  | 
 | ||
|  |   /* assign to `buf` in the global scope */ | ||
|  |   { | ||
|  |     /* get `this` */ | ||
|  |     jerry_value_t this = jerry_current_realm(); | ||
|  |     if(jerry_value_is_error(this)) { | ||
|  |       fprintf(stderr, "Failed to get global object"); | ||
|  |       res = 4; | ||
|  |       goto exeunt; | ||
|  |     } | ||
|  | 
 | ||
|  |     /* create "buf" str */ | ||
|  |     jerry_value_t prop = jerry_string_sz("buf"); | ||
|  |     if(jerry_value_is_error(this)) { | ||
|  |       fprintf(stderr, "Failed to create string"); | ||
|  |       res = 5; | ||
|  |       goto exeunt; | ||
|  |     } | ||
|  | 
 | ||
|  |     /* equivalent of `this["buf"] = buf` */ | ||
|  |     jerry_value_t set = jerry_object_set(this, prop, ab); | ||
|  |     if(jerry_value_is_error(set)) { | ||
|  |       fprintf(stderr, "Failed to assign ArrayBuffer"); | ||
|  |       res = 6; | ||
|  |       goto exeunt; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   /* run `var wb = XLSX.read(buf)` */ | ||
|  |   { | ||
|  |     const jerry_char_t code[] = "var wb = XLSX.read(buf);"; | ||
|  |     jerry_value_t result = eval_str(code, sizeof(code) - 1); | ||
|  |     if(jerry_value_is_error(result)) { | ||
|  |       fprintf(stderr, "Failed to parse file"); | ||
|  |       res = 7; | ||
|  |       goto exeunt; | ||
|  |     } | ||
|  |     jerry_value_free(result); | ||
|  |   } | ||
|  | 
 | ||
|  |   /* run `XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])` and print result */ | ||
|  |   { | ||
|  |     const jerry_char_t code[] = "XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])"; | ||
|  |     jerry_value_t result = eval_str(code, sizeof(code) - 1); | ||
|  |     if(jerry_value_is_error(result)) { | ||
|  |       fprintf(stderr, "Failed to generate csv"); | ||
|  |       res = 8; | ||
|  |     } else { | ||
|  |       size_t sz; char *buf = pull_str(result, &sz); | ||
|  |       printf("%s\n", buf); | ||
|  |     } | ||
|  |     jerry_value_free(result); | ||
|  |   } | ||
|  | 
 | ||
|  | exeunt: | ||
|  |   jerry_value_free(ab); | ||
|  | 
 | ||
|  | cleanup: | ||
|  |   /* Cleanup engine */ | ||
|  |   jerry_cleanup(); | ||
|  |   return res; | ||
|  | } |