Skip to content
Snippets Groups Projects
Commit c5ad7fc5 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Add support for reading/writing 8-byte (64-bit) integers in binary files

parent cdc37b1d
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #3137 passed
...@@ -583,6 +583,7 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -583,6 +583,7 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist)
BYTE *b; BYTE *b;
WORD *w; WORD *w;
DWORD *l; DWORD *l;
uint64_t *q;
int32 size=sizeof(DWORD); int32 size=sizeof(DWORD);
private_t* p; private_t* p;
int32 count=1; int32 count=1;
...@@ -612,7 +613,7 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -612,7 +613,7 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist)
} }
rc=JS_SUSPENDREQUEST(cx); rc=JS_SUSPENDREQUEST(cx);
if(size != sizeof(BYTE) && size != sizeof(WORD) && size != sizeof(DWORD)) { if(size != sizeof(BYTE) && size != sizeof(WORD) && size != sizeof(DWORD) && size != sizeof(uint64_t)) {
/* unknown size */ /* unknown size */
dbprintf(TRUE, p, "unsupported binary read size: %d",size); dbprintf(TRUE, p, "unsupported binary read size: %d",size);
JS_RESUMEREQUEST(cx, rc); JS_RESUMEREQUEST(cx, rc);
...@@ -628,6 +629,7 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -628,6 +629,7 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist)
b=buffer; b=buffer;
w=buffer; w=buffer;
l=buffer; l=buffer;
q=buffer;
retlen=fread(buffer, size, count, p->fp); retlen=fread(buffer, size, count, p->fp);
if(count==1) { if(count==1) {
if(retlen==1) { if(retlen==1) {
...@@ -649,6 +651,9 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -649,6 +651,9 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist)
*l = LE_LONG(*l); *l = LE_LONG(*l);
JS_SET_RVAL(cx, arglist, UINT_TO_JSVAL(*l)); JS_SET_RVAL(cx, arglist, UINT_TO_JSVAL(*l));
break; break;
case sizeof(uint64_t):
JS_SET_RVAL(cx, arglist, DOUBLE_TO_JSVAL(*q));
break;
} }
} }
} }
...@@ -675,6 +680,9 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -675,6 +680,9 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist)
*l = LE_LONG(*l); *l = LE_LONG(*l);
v=UINT_TO_JSVAL(*(l++)); v=UINT_TO_JSVAL(*(l++));
break; break;
case sizeof(uint64_t):
v = DOUBLE_TO_JSVAL(*(q++));
break;
} }
if(!JS_SetElement(cx, array, i, &v)) { if(!JS_SetElement(cx, array, i, &v)) {
rc=JS_SUSPENDREQUEST(cx); rc=JS_SUSPENDREQUEST(cx);
...@@ -1839,9 +1847,11 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -1839,9 +1847,11 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist)
uint8_t *b; uint8_t *b;
uint16_t *w; uint16_t *w;
uint32_t *l; uint32_t *l;
uint64_t *q;
int8_t *sb; int8_t *sb;
int16_t *sw; int16_t *sw;
int32_t *sl; int32_t *sl;
int64_t *sq;
} o; } o;
size_t wr=0; size_t wr=0;
int32 size=sizeof(int32_t); int32 size=sizeof(int32_t);
...@@ -1879,7 +1889,7 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -1879,7 +1889,7 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist)
if(!JS_ValueToInt32(cx,argv[1],&size)) if(!JS_ValueToInt32(cx,argv[1],&size))
return(JS_FALSE); return(JS_FALSE);
} }
if(size != sizeof(BYTE) && size != sizeof(WORD) && size != sizeof(DWORD)) { if(size != sizeof(BYTE) && size != sizeof(WORD) && size != sizeof(DWORD) && size != sizeof(uint64_t)) {
rc=JS_SUSPENDREQUEST(cx); rc=JS_SUSPENDREQUEST(cx);
dbprintf(TRUE, p, "unsupported binary write size: %d",size); dbprintf(TRUE, p, "unsupported binary write size: %d",size);
JS_RESUMEREQUEST(cx, rc); JS_RESUMEREQUEST(cx, rc);
...@@ -1921,6 +1931,12 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -1921,6 +1931,12 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist)
else else
*o.l = LE_LONG(*o.l); *o.l = LE_LONG(*o.l);
break; break;
case sizeof(int64_t):
if(val < 0)
*o.sq = (int64_t)val;
else
*o.q = (uint64_t)val;
break;
} }
} }
else { else {
...@@ -1959,6 +1975,13 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist) ...@@ -1959,6 +1975,13 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist)
*o.l = LE_LONG(*o.l); *o.l = LE_LONG(*o.l);
o.l++; o.l++;
break; break;
case sizeof(int64_t):
if(val < 0)
*o.sq = (int64_t)val;
else
*o.q = (uint64_t)val;
o.q++;
break;
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment