Newer
Older
{"iniRemoveSection",js_iniRemoveSection,1, JSTYPE_BOOLEAN, JSDOCSTR("section")
,JSDOCSTR("remove specified <i>section</i> from <tt>.ini</tt> file.")
{"iniReadAll", js_iniReadAll, 0, JSTYPE_ARRAY, JSDOCSTR("")
,JSDOCSTR("read entire <tt>.ini</tt> file into an array of string (with <tt>!include</tt>ed files).")
,31802
},
/* File Destructor */
static void js_finalize_file(JSContext *cx, JSObject *obj)
{
private_t* p;
if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
return;
if(p->fp!=NULL)
fclose(p->fp);
dbprintf(FALSE, p, "finalized: %s",p->name);
FREE_AND_NULL(p->ini_style.key_prefix);
FREE_AND_NULL(p->ini_style.section_separator);
FREE_AND_NULL(p->ini_style.value_separator);
FREE_AND_NULL(p->ini_style.bit_separator);
FREE_AND_NULL(p->ini_style.literal_separator);
free(p);
JS_SetPrivate(cx, obj, NULL);
}
static JSBool js_file_resolve(JSContext *cx, JSObject *obj, jsid id)
if(id != JSID_VOID && id != JSID_EMPTY) {
jsval idval;
if(JSVAL_IS_STRING(idval))
JSSTRING_TO_MSTRING(cx, JSVAL_TO_STRING(idval), name, NULL);
ret=js_SyncResolve(cx, obj, name, js_file_properties, js_file_functions, NULL, 0);
if(name)
free(name);
return ret;
}
static JSBool js_file_enumerate(JSContext *cx, JSObject *obj)
{
JSClass js_file_class = {
"File" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_file_get /* getProperty */
,js_file_set /* setProperty */
,js_file_enumerate /* enumerate */
,js_file_resolve /* resolve */
,JS_ConvertStub /* convert */
,js_finalize_file /* finalize */
};
/* File Constructor (creates file descriptor) */
static JSBool
js_file_constructor(JSContext *cx, uintN argc, jsval *arglist)
{
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
JSString* str;
private_t* p;
obj=JS_NewObject(cx, &js_file_class, NULL, NULL);
JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(obj));
if(argc < 1 || (str = JS_ValueToString(cx, argv[0]))==NULL) {
JS_ReportError(cx,"No filename specified");
return(JS_FALSE);
}
if((p=(private_t*)calloc(1,sizeof(private_t)))==NULL) {
JS_ReportError(cx,"calloc failed");
return(JS_FALSE);
}
JSSTRING_TO_STRBUF(cx, str, p->name, sizeof(p->name), NULL);
if(!JS_SetPrivate(cx, obj, p)) {
dbprintf(TRUE, p, "JS_SetPrivate failed");
return(JS_FALSE);
}
#ifdef BUILD_JSDOCS
js_DescribeSyncObject(cx,obj,"Class used for opening, creating, reading, or writing files on the local file system<p>"
"Special features include:</h2><ol type=disc>"
"<li>Exclusive-access files (default) or shared files<ol type=circle>"
"<li>optional record-locking"
"<li>buffered or non-buffered I/O"
"</ol>"
"<li>Support for binary files<ol type=circle>"
"<li>native or network byte order (endian)"
"<li>automatic Unix-to-Unix (<i>UUE</i>), yEncode (<i>yEnc</i>) or Base64 encoding/decoding"
"</ol>"
"<li>Support for ASCII text files<ol type=circle>"
"<li>supports line-based I/O<ol type=square>"
"<li>entire file may be read or written as an array of strings"
"<li>individual lines may be read or written one line at a time"
"</ol>"
"<li>supports fixed-length records<ol type=square>"
"<li>optional end-of-text (<i>etx</i>) character for automatic record padding/termination"
"<li>Synchronet <tt>.dat</tt> files use an <i>etx</i> value of 3 (Ctrl-C)"
"</ol>"
"<li>supports <tt>.ini</tt> formated configuration files<ol type=square>"
"<li>concept and support of <i>root</i> ini sections added in v3.12"
"</ol>"
"<li>optional ROT13 encoding/translation"
"</ol>"
"<li>Dynamically-calculated industry standard checksums (e.g. CRC-16, CRC-32, MD5)"
"</ol>"
,310
js_DescribeSyncConstructor(cx,obj,"To create a new File object: <tt>var f = new File(<i>filename</i>)</tt>");
js_CreateArrayOfStrings(cx, obj, "_property_desc_list", file_prop_desc, JSPROP_READONLY);
#endif
dbprintf(FALSE, p, "object constructed");
return(JS_TRUE);
}
JSObject* js_CreateFileClass(JSContext* cx, JSObject* parent)
obj = JS_InitClass(cx, parent, NULL
,&js_file_class
,js_file_constructor
,1 /* number of constructor args */
,NULL /* props, set in constructor */
,NULL /* funcs, set in constructor */
JSObject* js_CreateFileObject(JSContext* cx, JSObject* parent, char *name, int fd, const char* mode)
{
JSObject* obj;
private_t* p;
return NULL;
fp = fdopen(newfd, mode);
if(fp == NULL) {
close(newfd);
return NULL;
}
obj = JS_DefineObject(cx, parent, name, &js_file_class, NULL
,JSPROP_ENUMERATE|JSPROP_READONLY);
if(obj==NULL) {
fclose(fp);
}
if((p=(private_t*)calloc(1,sizeof(private_t)))==NULL) {
fclose(fp);
p->fp=fp;
p->debug=JS_FALSE;
if(!JS_SetPrivate(cx, obj, p)) {
fclose(fp);
dbprintf(TRUE, p, "JS_SetPrivate failed");
return(NULL);
}
dbprintf(FALSE, p, "object created");
return(obj);
}