Add PCRE object to javascript
var re = new PCRE(); if (re.compile("the answer is 42", '(\\d+)')) { answer = re.substitute("$1"); console_log("err", "result [" + answer + "]\n"); } git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5695 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
9ce2aba87a
commit
3bcbb71a21
|
@ -327,7 +327,145 @@ static JSObject *new_request(JSContext *cx, JSObject *obj, struct request_obj *r
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct pcre_obj {
|
||||||
|
switch_regex_t *re;
|
||||||
|
char *string;
|
||||||
|
int proceed;
|
||||||
|
int ovector[30];
|
||||||
|
int freed;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Pcre Object */
|
||||||
|
/*********************************************************************************/
|
||||||
|
static JSBool pcre_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
|
||||||
|
{
|
||||||
|
struct pcre_obj *pcre_obj;
|
||||||
|
|
||||||
|
if ((pcre_obj = malloc(sizeof(*pcre_obj)))) {
|
||||||
|
memset(pcre_obj, 0, sizeof(*pcre_obj));
|
||||||
|
JS_SetPrivate(cx, obj, pcre_obj);
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
abort();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pcre_destroy(JSContext * cx, JSObject * obj)
|
||||||
|
{
|
||||||
|
struct pcre_obj *pcre_obj = JS_GetPrivate(cx, obj);
|
||||||
|
|
||||||
|
if (pcre_obj) {
|
||||||
|
if (!pcre_obj->freed && pcre_obj->re) {
|
||||||
|
switch_regex_safe_free(pcre_obj->re);
|
||||||
|
switch_safe_free(pcre_obj->string);
|
||||||
|
}
|
||||||
|
switch_safe_free(pcre_obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static JSBool pcre_compile(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
|
||||||
|
{
|
||||||
|
struct pcre_obj *pcre_obj = JS_GetPrivate(cx, obj);
|
||||||
|
char *string, *regex_string;
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
string = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
|
||||||
|
regex_string = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
|
||||||
|
switch_regex_safe_free(pcre_obj->re);
|
||||||
|
switch_safe_free(pcre_obj->string);
|
||||||
|
pcre_obj->string = strdup(string);
|
||||||
|
pcre_obj->proceed = switch_regex_perform(pcre_obj->string, regex_string, &pcre_obj->re, pcre_obj->ovector,
|
||||||
|
sizeof(pcre_obj->ovector) / sizeof(pcre_obj->ovector[0]));
|
||||||
|
*rval = BOOLEAN_TO_JSVAL(pcre_obj->proceed ? JS_TRUE : JS_FALSE);
|
||||||
|
} else {
|
||||||
|
eval_some_js("~throw new Error(\"Invalid Args\");", cx, obj, rval);
|
||||||
|
return JS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static JSBool pcre_substitute(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
|
||||||
|
{
|
||||||
|
struct pcre_obj *pcre_obj = JS_GetPrivate(cx, obj);
|
||||||
|
char *subst_string;
|
||||||
|
char *substituted;
|
||||||
|
|
||||||
|
if (!pcre_obj->proceed) {
|
||||||
|
eval_some_js("~throw new Error(\"REGEX is not compiled or has no matches\");", cx, obj, rval);
|
||||||
|
return JS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 0) {
|
||||||
|
uint32_t len;
|
||||||
|
subst_string = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
|
||||||
|
len = (uint32_t) (strlen(pcre_obj->string) + strlen(subst_string) + 10);
|
||||||
|
substituted = malloc(len);
|
||||||
|
assert(substituted != NULL);
|
||||||
|
switch_perform_substitution(pcre_obj->re, pcre_obj->proceed, subst_string, pcre_obj->string, substituted, len, pcre_obj->ovector);
|
||||||
|
*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, substituted));
|
||||||
|
free(substituted);
|
||||||
|
} else {
|
||||||
|
eval_some_js("~throw new Error(\"Invalid Args\");", cx, obj, rval);
|
||||||
|
return JS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum pcre_tinyid {
|
||||||
|
PCRE_READY
|
||||||
|
};
|
||||||
|
|
||||||
|
static JSFunctionSpec pcre_methods[] = {
|
||||||
|
{"compile", pcre_compile, 2},
|
||||||
|
{"substitute", pcre_substitute, 2},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static JSPropertySpec pcre_props[] = {
|
||||||
|
{"ready", PCRE_READY, JSPROP_READONLY | JSPROP_PERMANENT},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static JSBool pcre_getProperty(JSContext * cx, JSObject * obj, jsval id, jsval * vp)
|
||||||
|
{
|
||||||
|
JSBool res = JS_TRUE;
|
||||||
|
struct pcre_obj *pcre_obj = JS_GetPrivate(cx, obj);
|
||||||
|
char *name;
|
||||||
|
int param = 0;
|
||||||
|
|
||||||
|
if (!pcre_obj) {
|
||||||
|
*vp = BOOLEAN_TO_JSVAL(JS_FALSE);
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
name = JS_GetStringBytes(JS_ValueToString(cx, id));
|
||||||
|
/* numbers are our props anything else is a method */
|
||||||
|
if (name[0] >= 48 && name[0] <= 57) {
|
||||||
|
param = atoi(name);
|
||||||
|
} else {
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (param) {
|
||||||
|
case PCRE_READY:
|
||||||
|
*vp = BOOLEAN_TO_JSVAL(JS_TRUE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSClass pcre_class = {
|
||||||
|
"PCRE", JSCLASS_HAS_PRIVATE,
|
||||||
|
JS_PropertyStub, JS_PropertyStub, pcre_getProperty, DEFAULT_SET_PROPERTY,
|
||||||
|
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, pcre_destroy, NULL, NULL, NULL,
|
||||||
|
pcre_construct
|
||||||
|
};
|
||||||
|
|
||||||
struct event_obj {
|
struct event_obj {
|
||||||
switch_event_t *event;
|
switch_event_t *event;
|
||||||
|
@ -2947,6 +3085,8 @@ static int env_init(JSContext * cx, JSObject * javascript_object)
|
||||||
|
|
||||||
JS_InitClass(cx, javascript_object, NULL, &event_class, event_construct, 3, event_props, event_methods, event_props, event_methods);
|
JS_InitClass(cx, javascript_object, NULL, &event_class, event_construct, 3, event_props, event_methods, event_props, event_methods);
|
||||||
|
|
||||||
|
JS_InitClass(cx, javascript_object, NULL, &pcre_class, pcre_construct, 3, pcre_props, pcre_methods, pcre_props, pcre_methods);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue