From 08a7b338fcd1fed0a75cefbf8feeb7ad9ff0e8c5 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Tue, 28 Aug 2018 22:47:26 +0000 Subject: [PATCH] Fix a number of problems in the previous commit (ini styles). Also, the File() constructor will now properly complain if no filename is passed. --- src/sbbs3/js_file.c | 80 ++++++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 27 deletions(-) diff --git a/src/sbbs3/js_file.c b/src/sbbs3/js_file.c index c82ac967f9..07c48aaf18 100644 --- a/src/sbbs3/js_file.c +++ b/src/sbbs3/js_file.c @@ -1,4 +1,5 @@ /* Synchronet JavaScript "File" Object */ +// vi: tabstop=4 /* $Id$ */ @@ -916,14 +917,14 @@ js_iniSetValue_internal(JSContext *cx, JSObject *obj, uintN argc, jsval* argv, s if(value==JSVAL_VOID) { /* unspecified value */ rc=JS_SUSPENDREQUEST(cx); - result = iniSetString(list,section,key,"",NULL); + result = iniSetString(list,section,key,"",&p->ini_style); JS_RESUMEREQUEST(cx, rc); } else if(JSVAL_IS_BOOLEAN(value)) { - result = iniSetBool(list,section,key,JSVAL_TO_BOOLEAN(value),NULL); + result = iniSetBool(list,section,key,JSVAL_TO_BOOLEAN(value),&p->ini_style); } else if(JSVAL_IS_DOUBLE(value)) { - result = iniSetFloat(list,section,key,JSVAL_TO_DOUBLE(value),NULL); + result = iniSetFloat(list,section,key,JSVAL_TO_DOUBLE(value),&p->ini_style); } else if(JSVAL_IS_NUMBER(value)) { if(!JS_ValueToInt32(cx,value,&i)) { @@ -932,14 +933,14 @@ js_iniSetValue_internal(JSContext *cx, JSObject *obj, uintN argc, jsval* argv, s return JS_FALSE; } rc=JS_SUSPENDREQUEST(cx); - result = iniSetInteger(list,section,key,i,NULL); + result = iniSetInteger(list,section,key,i,&p->ini_style); JS_RESUMEREQUEST(cx, rc); } else if(JSVAL_IS_OBJECT(value) && (value_obj = JSVAL_TO_OBJECT(value))!=NULL && (strcmp("Date",JS_GetClass(cx, value_obj)->name)==0)) { tt=(time_t)(js_DateGetMsecSinceEpoch(cx,value_obj)/1000.0); rc=JS_SUSPENDREQUEST(cx); - result = iniSetDateTime(list,section,key,/* include_time */TRUE, tt,NULL); + result = iniSetDateTime(list,section,key,/* include_time */TRUE, tt, &p->ini_style); JS_RESUMEREQUEST(cx, rc); } else { cstr=NULL; @@ -951,7 +952,7 @@ js_iniSetValue_internal(JSContext *cx, JSObject *obj, uintN argc, jsval* argv, s return JS_FALSE; } rc=JS_SUSPENDREQUEST(cx); - result = iniSetString(list,section,key, cstr,NULL); + result = iniSetString(list,section,key, cstr, &p->ini_style); FREE_AND_NULL(cstr); JS_RESUMEREQUEST(cx, rc); } @@ -2312,29 +2313,44 @@ static JSBool js_file_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, p->ini_style.key_len = i; break; case FILE_INI_KEY_PREFIX: - JSVALUE_TO_MSTRING(cx, *vp, str, NULL); - HANDLE_PENDING(cx, str); - p->ini_style.key_prefix = str; + FREE_AND_NULL(p->ini_style.key_prefix); + if(!JSVAL_NULL_OR_VOID(*vp)) { + JSVALUE_TO_MSTRING(cx, *vp, str, NULL); + HANDLE_PENDING(cx, str); + p->ini_style.key_prefix = str; + } break; case FILE_INI_SECTION_SEPARATOR: - JSVALUE_TO_MSTRING(cx, *vp, str, NULL); - HANDLE_PENDING(cx, str); - p->ini_style.section_separator = str; + FREE_AND_NULL(p->ini_style.section_separator); + if(!JSVAL_NULL_OR_VOID(*vp)) { + JSVALUE_TO_MSTRING(cx, *vp, str, NULL); + HANDLE_PENDING(cx, str); + p->ini_style.section_separator = str; + } break; case FILE_INI_VALUE_SEPARATOR: - JSVALUE_TO_MSTRING(cx, *vp, str, NULL); - HANDLE_PENDING(cx, str); - p->ini_style.value_separator = str; + FREE_AND_NULL(p->ini_style.value_separator); + if(!JSVAL_NULL_OR_VOID(*vp)) { + JSVALUE_TO_MSTRING(cx, *vp, str, NULL); + HANDLE_PENDING(cx, str); + p->ini_style.value_separator = str; + } break; case FILE_INI_BIT_SEPARATOR: - JSVALUE_TO_MSTRING(cx, *vp, str, NULL); - HANDLE_PENDING(cx, str); - p->ini_style.bit_separator = str; + FREE_AND_NULL(p->ini_style.bit_separator); + if(!JSVAL_NULL_OR_VOID(*vp)) { + JSVALUE_TO_MSTRING(cx, *vp, str, NULL); + HANDLE_PENDING(cx, str); + p->ini_style.bit_separator = str; + } break; case FILE_INI_LITERAL_SEPARATOR: - JSVALUE_TO_MSTRING(cx, *vp, str, NULL); - HANDLE_PENDING(cx, str); - p->ini_style.literal_separator = str; + FREE_AND_NULL(p->ini_style.literal_separator); + if(!JSVAL_NULL_OR_VOID(*vp)) { + JSVALUE_TO_MSTRING(cx, *vp, str, NULL); + HANDLE_PENDING(cx, str); + p->ini_style.literal_separator = str; + } break; } @@ -2545,18 +2561,28 @@ static JSBool js_file_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) break; case FILE_INI_KEY_PREFIX: s = p->ini_style.key_prefix; + if(s == NULL) + *vp = JSVAL_NULL; break; case FILE_INI_SECTION_SEPARATOR: s = p->ini_style.section_separator; + if(s == NULL) + *vp = JSVAL_NULL; break; case FILE_INI_VALUE_SEPARATOR: s = p->ini_style.value_separator; + if(s == NULL) + *vp = JSVAL_NULL; break; case FILE_INI_BIT_SEPARATOR: s = p->ini_style.bit_separator; + if(s == NULL) + *vp = JSVAL_NULL; break; case FILE_INI_LITERAL_SEPARATOR: s = p->ini_style.literal_separator; + if(s == NULL) + *vp = JSVAL_NULL; break; } @@ -2634,11 +2660,11 @@ static char* file_prop_desc[] = { ,"calculated 128-bit MD5 digest of file contents as hexadecimal string - <small>READ ONLY</small>" ,"calculated 128-bit MD5 digest of file contents as base64-encoded string - <small>READ ONLY</small>" ,"ini style: minimum key length (for left-justified white-space padded keys)" - ,"ini style: key prefix (e.g. ' ', or '\t')" - ,"ini style: section separator (e.g. '\n')" - ,"ini style: value separator (e.g. '=' or ' = ')" - ,"ini style: bit separator (e.g. '|' or ' | ')" - ,"ini style: literal separator (e.g. ':' or ' : ')" + ,"ini style: key prefix (e.g. '\t', null = default prefix)" + ,"ini style: section separator (e.g. '\n', null = default separator)" + ,"ini style: value separator (e.g. ' = ', null = default separator)" + ,"ini style: bit separator (e.g. ' | ', null = default separator)" + ,"ini style: literal separator (null = default separator)" ,NULL }; #endif @@ -2916,7 +2942,7 @@ js_file_constructor(JSContext *cx, uintN argc, jsval *arglist) obj=JS_NewObject(cx, &js_file_class, NULL, NULL); JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(obj)); - if((str = JS_ValueToString(cx, argv[0]))==NULL) { + if(argc < 1 || (str = JS_ValueToString(cx, argv[0]))==NULL) { JS_ReportError(cx,"No filename specified"); return(JS_FALSE); } -- GitLab