Skip to content
Snippets Groups Projects
Commit c19623ed authored by mcmlxxix's avatar mcmlxxix
Browse files

make system.matchuserdata return only the next match (instead of all matches)...

make system.matchuserdata return only the next match (instead of all matches) from specified starting user if match_next==true. add system.matchallusers(field,data); to return an array containing all matches.
parent 44f0d9bc
No related branches found
No related tags found
No related merge requests found
...@@ -813,7 +813,8 @@ js_matchuserdata(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r ...@@ -813,7 +813,8 @@ js_matchuserdata(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
int len; int len;
scfg_t* cfg; scfg_t* cfg;
jsrefcount rc; jsrefcount rc;
BOOL match_all=FALSE; BOOL match_next=FALSE;
int argnum=2;
if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL) if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
return(JS_FALSE); return(JS_FALSE);
...@@ -832,45 +833,82 @@ js_matchuserdata(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r ...@@ -832,45 +833,82 @@ js_matchuserdata(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
return(JS_TRUE); return(JS_TRUE);
} }
if(argc>2) if(JSVAL_IS_NUMBER(argv[argnum]))
JS_ValueToInt32(cx,argv[2],&usernumber); JS_ValueToInt32(cx, argv[argnum++], &usernumber);
if(JSVAL_IS_BOOLEAN(argv[argnum]))
JS_ValueToBoolean(cx, argv[argnum], &match_next);
if((p=JS_GetStringBytes(js_str))==NULL) { if((p=JS_GetStringBytes(js_str))==NULL) {
*rval = INT_TO_JSVAL(0); *rval = INT_TO_JSVAL(0);
return(JS_TRUE); return(JS_TRUE);
} }
if(argc > 3)
JS_ValueToBoolean(cx,argv[3],&match_all);
if(match_all == FALSE) {
rc=JS_SUSPENDREQUEST(cx); rc=JS_SUSPENDREQUEST(cx);
*rval = INT_TO_JSVAL(userdatdupe(cfg,usernumber,offset,len,p,FALSE,FALSE)); *rval = INT_TO_JSVAL(userdatdupe(cfg,usernumber,offset,len,p,FALSE,match_next));
JS_RESUMEREQUEST(cx, rc); JS_RESUMEREQUEST(cx, rc);
} else { return(JS_TRUE);
}
static JSBool
js_matchallusers(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char* p;
JSString* js_str;
int32 offset=0;
int32 usernumber=0;
int len;
scfg_t* cfg;
jsrefcount rc;
JSObject* array; JSObject* array;
jsval val; jsval val;
int retval; int result;
jsint line=0; jsint line=0;
if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
return(JS_FALSE);
JS_ValueToInt32(cx,argv[0],&offset);
rc=JS_SUSPENDREQUEST(cx);
len=user_rec_len(offset);
JS_RESUMEREQUEST(cx, rc);
if(len<0) {
JS_ReportError(cx,"Invalid user data offset: %d", offset);
return(JS_FALSE);
}
if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
*rval = INT_TO_JSVAL(0);
return(JS_TRUE);
}
if((p=JS_GetStringBytes(js_str))==NULL) {
*rval = INT_TO_JSVAL(0);
return(JS_TRUE);
}
if((array=JS_NewArrayObject(cx,0,NULL))==NULL) if((array=JS_NewArrayObject(cx,0,NULL))==NULL)
return(JS_FALSE); return(JS_FALSE);
while(1) { while(1) {
rc=JS_SUSPENDREQUEST(cx); rc=JS_SUSPENDREQUEST(cx);
retval=userdatdupe(cfg,usernumber++,offset,len,p,FALSE,TRUE); result=userdatdupe(cfg,usernumber,offset,len,p,FALSE,TRUE);
if(retval > 0) { if(result > 0) {
val = INT_TO_JSVAL(retval); val = INT_TO_JSVAL(result);
if(!JS_SetElement(cx, array, line++, &val)) { if(!JS_SetElement(cx, array, line++, &val)) {
JS_RESUMEREQUEST(cx, rc); JS_RESUMEREQUEST(cx, rc);
break; break;
} }
usernumber=retval; usernumber=result;
retval=0; result=0;
} else } else {
JS_RESUMEREQUEST(cx, rc);
break; break;
}
JS_RESUMEREQUEST(cx, rc); JS_RESUMEREQUEST(cx, rc);
} }
*rval = OBJECT_TO_JSVAL(array); *rval = OBJECT_TO_JSVAL(array);
}
return(JS_TRUE); return(JS_TRUE);
} }
...@@ -1559,12 +1597,17 @@ static jsSyncMethodSpec js_system_functions[] = { ...@@ -1559,12 +1597,17 @@ static jsSyncMethodSpec js_system_functions[] = {
" or 0 if not found, matches well-known sysop aliases by default") " or 0 if not found, matches well-known sysop aliases by default")
,310 ,310
}, },
{"matchuserdata", js_matchuserdata, 2, JSTYPE_ARRAY, JSDOCSTR("field, data [,usernumber, match_all=<tt>false</tt>]") {"matchuserdata", js_matchuserdata, 2, JSTYPE_NUMBER, JSDOCSTR("field, data [,usernumber, match_next=<tt>false</tt>]")
,JSDOCSTR("search user database for data in a specific field (specified by offset), " ,JSDOCSTR("search user database for data in a specific field (see <tt>U_*</tt> in <tt>sbbsdefs.js</tt>), "
"returns first matching user record number, optional <i>usernumber</i> specifies user record to skip, " "returns first matching user record number, optional <i>usernumber</i> specifies user record to skip, "
"or record at which to begin searching if optional match_all is <i>true</i>") "or record at which to begin searching if optional <i>match_next</i> is <tt>true</tt>")
,310 ,310
}, },
{"matchallusers", js_matchallusers, 2, JSTYPE_ARRAY, JSDOCSTR("field, data")
,JSDOCSTR("search user database for data in a specific field (see <tt>U_*</tt> in <tt>sbbsdefs.js</tt>), "
"returns an array of matching user record numbers")
,315
},
{"trashcan", js_trashcan, 2, JSTYPE_BOOLEAN, JSDOCSTR("path/filename, find_string") {"trashcan", js_trashcan, 2, JSTYPE_BOOLEAN, JSDOCSTR("path/filename, find_string")
,JSDOCSTR("search text/filename.can for pseudo-regexp") ,JSDOCSTR("search text/filename.can for pseudo-regexp")
,310 ,310
...@@ -1636,7 +1679,7 @@ static jsSyncMethodSpec js_system_functions[] = { ...@@ -1636,7 +1679,7 @@ static jsSyncMethodSpec js_system_functions[] = {
,311 ,311
}, },
{"check_syspass", js_chksyspass, 1, JSTYPE_BOOLEAN, JSDOCSTR("password") {"check_syspass", js_chksyspass, 1, JSTYPE_BOOLEAN, JSDOCSTR("password")
,JSDOCSTR("compares the supplied <i>password</i> against the system password and return's <i>true</i> if it matches") ,JSDOCSTR("compares the supplied <i>password</i> against the system password and returns <i>true</i> if it matches")
,311 ,311
}, },
{"check_name", js_chkname, 1, JSTYPE_BOOLEAN, JSDOCSTR("name/alias") {"check_name", js_chkname, 1, JSTYPE_BOOLEAN, JSDOCSTR("name/alias")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment