Skip to content
Snippets Groups Projects
Commit 134bba9f authored by rswindell's avatar rswindell
Browse files

Calculate checksum properties (chksum, crc16, crc32, md5, etc.) a 4K block at

a time rather than the entire file. This is required to support large files.
parent 8aad78c4
No related branches found
No related tags found
No related merge requests found
...@@ -1308,11 +1308,14 @@ static JSBool js_file_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp) ...@@ -1308,11 +1308,14 @@ static JSBool js_file_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
static JSBool js_file_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) static JSBool js_file_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{ {
char str[128]; char str[128];
BYTE* buf; size_t i;
long l; size_t rd;
long len;
long offset; long offset;
ulong sum; ulong sum=0;
ushort c16=0;
ulong c32=~0;
MD5 md5_ctx;
BYTE block[4096];
BYTE digest[MD5_DIGEST_SIZE]; BYTE digest[MD5_DIGEST_SIZE];
jsint tiny; jsint tiny;
JSString* js_str=NULL; JSString* js_str=NULL;
...@@ -1420,40 +1423,62 @@ static JSBool js_file_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) ...@@ -1420,40 +1423,62 @@ static JSBool js_file_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
break; break;
offset=ftell(p->fp); /* save current file position */ offset=ftell(p->fp); /* save current file position */
fseek(p->fp,0,SEEK_SET); fseek(p->fp,0,SEEK_SET);
len=filelength(fileno(p->fp));
if(len<1) /* Initialization */
break; switch(tiny) {
if((buf=malloc(len*2))==NULL) case FILE_PROP_MD5_HEX:
break; case FILE_PROP_MD5_B64:
len=fread(buf,sizeof(BYTE),len,p->fp); MD5_open(&md5_ctx);
if(len>0) break;
}
/* calculate */
while(!feof(p->fp)) {
if((rd=fread(block,1,sizeof(block),p->fp))<1)
break;
switch(tiny) { switch(tiny) {
case FILE_PROP_CHKSUM: case FILE_PROP_CHKSUM:
for(sum=l=0;l<len;l++) for(i=0;i<rd;i++)
sum+=buf[l]; sum+=block[i];
JS_NewNumberValue(cx,sum,vp);
break; break;
case FILE_PROP_CRC16: case FILE_PROP_CRC16:
if(!JS_NewNumberValue(cx,crc16(buf,len),vp)) for(i=0;i<rd;i++)
*vp=JSVAL_ZERO; c16=ucrc16(block[i],c16);
break; break;
case FILE_PROP_CRC32: case FILE_PROP_CRC32:
sum=crc32(buf,len); for(i=0;i<rd;i++)
if(!JS_NewNumberValue(cx,sum,vp)) c32=ucrc32(block[i],c32);
*vp=JSVAL_ZERO;
break; break;
case FILE_PROP_MD5_HEX: case FILE_PROP_MD5_HEX:
MD5_calc(digest,buf,len);
MD5_hex(str,digest);
js_str=JS_NewStringCopyZ(cx, str);
break;
case FILE_PROP_MD5_B64: case FILE_PROP_MD5_B64:
MD5_calc(digest,buf,len); MD5_digest(&md5_ctx,block,rd);
b64_encode(str,sizeof(str)-1,digest,sizeof(digest));
js_str=JS_NewStringCopyZ(cx, str);
break; break;
} }
free(buf); }
/* finalize */
switch(tiny) {
case FILE_PROP_CHKSUM:
JS_NewNumberValue(cx,sum,vp);
break;
case FILE_PROP_CRC16:
if(!JS_NewNumberValue(cx,c16,vp))
*vp=JSVAL_ZERO;
break;
case FILE_PROP_CRC32:
if(!JS_NewNumberValue(cx,~c32,vp))
*vp=JSVAL_ZERO;
break;
case FILE_PROP_MD5_HEX:
case FILE_PROP_MD5_B64:
MD5_close(&md5_ctx,digest);
if(tiny==FILE_PROP_MD5_HEX)
MD5_hex(str,digest);
else
b64_encode(str,sizeof(str)-1,digest,sizeof(digest));
js_str=JS_NewStringCopyZ(cx, str);
break;
}
fseek(p->fp,offset,SEEK_SET); /* restore saved file position */ fseek(p->fp,offset,SEEK_SET); /* restore saved file position */
if(js_str!=NULL) if(js_str!=NULL)
*vp = STRING_TO_JSVAL(js_str); *vp = STRING_TO_JSVAL(js_str);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment