From cd46ac257c623b4966ebf9f86523feff65746c38 Mon Sep 17 00:00:00 2001
From: Benoit Giannangeli <benoit.giannangeli@boursorama.fr>
Date: Thu, 23 Mar 2017 09:59:38 +0100
Subject: Handle binary in luaL_loadfilex

---
 src/lauxlib.js | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

(limited to 'src')

diff --git a/src/lauxlib.js b/src/lauxlib.js
index dbdb251..689abbb 100644
--- a/src/lauxlib.js
+++ b/src/lauxlib.js
@@ -410,9 +410,18 @@ if (typeof window === "undefined") {
             this.f = null;  /* file being read */
             this.buff = new Buffer(1024);  /* area for reading file */
             this.pos = 0;  /* current position in file */
+            this.binary = false;
         }
     }
 
+    const toDataView = function(buffer) {
+        let ab = new ArrayBuffer(buffer.length);
+        let au = new Uint8Array(ab);
+        for (let i = 0; i < buffer.length; i++)
+            au[i] = buffer[i];
+        return new DataView(ab);
+    };
+
     const getF = function(L, ud) {
         let lf = ud;
         let bytes = 0;
@@ -423,7 +432,9 @@ if (typeof window === "undefined") {
             bytes = fs.readSync(lf.f, lf.buff, 0, lf.buff.length, lf.pos); /* read block */
             lf.pos += bytes;
         }
-        return bytes > 0 ? new lobject.TValue(0, lf.buff).jsstring() : null; // TODO: Here reading utf8 only
+        if (bytes > 0)
+            return lf.binary ? toDataView(lf.buff) : new lobject.TValue(0, lf.buff).jsstring(); // TODO: Here reading utf8 only
+        else return null;
     };
 
     const errfile = function(L, what, fnameindex, error) {
@@ -468,10 +479,17 @@ if (typeof window === "undefined") {
             do {  /* skip first line */
                 c = getc(lf);
             } while (c && c !== '\n'.charCodeAt(0));
-            return getc(lf);  /* skip end-of-line, if present */
+
+            return {
+                skipped: true,
+                c: getc(lf)  /* skip end-of-line, if present */
+            };
         } else {
             lf.pos--;
-            return false;
+            return {
+                skipped: false,
+                c: c
+            };
         }
     };
 
@@ -491,12 +509,12 @@ if (typeof window === "undefined") {
         }
 
         try {
-            let c;
-            if ((c = skipcomment(lf)))  /* read initial portion */
+            let com;
+            if ((com = skipcomment(lf)).skipped)  /* read initial portion */
                 lf.buff[lf.n++] = '\n'.charCodeAt(0);  /* add line to correct line numbers */
 
-            if (c === lua.LUA_SIGNATURE.charCodeAt(0) && filename) {  /* binary file? */
-                // ...
+            if (com.c === lua.LUA_SIGNATURE.charCodeAt(0) && filename) {  /* binary file? */
+                lf.binary = true;
             }
 
             let status = lapi.lua_load(L, getF, lf, lapi.lua_tostring(L, -1), mode);
-- 
cgit v1.2.3-70-g09d2