⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsbind.c

📁 网络爬虫程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  url_priv_t *up;  dllist *ptr;  JSObject *robj;  if(argc != 1 || !JSVAL_IS_INT(argv[0]))  {    JS_ReportError(cx, "PavukUrl.get_parent: %s\n",      gettext("bad parent index"));    return JS_FALSE;  }  n = JSVAL_TO_INT(argv[0]);  up = JS_GetPrivate(cx, obj);  ptr = dllist_nth(up->urlp->parent_url, n);  if(ptr)  {    rurl = (url *) ptr->data;    robj = pjs_url_to_jsobj(cx, rurl, NULL);    *rv = OBJECT_TO_JSVAL(robj);  }  else    *rv = JSVAL_NULL;  return JS_TRUE;}static JSBool pjs_url_check_cond(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv){  url_priv_t *up;  char *name;  JSString *s;  int r, i;  cond_info_t condp;  condp.level = 0;  condp.urlnr = 0;  condp.size = 0;  condp.time = 0L;  condp.mimet = NULL;  condp.params = NULL;  up = JS_GetPrivate(cx, obj);  if(up->condp)  {    condp.level = up->condp->level;    condp.urlnr = up->condp->urlnr;    condp.size = up->condp->size;    condp.time = up->condp->time;    condp.mimet = up->condp->mimet;    condp.params = up->condp->params;  }  if(argc < 1)  {    JS_ReportError(cx, "PavukUrl.check_cond: %s\n",      gettext("not enough parameters"));    return JS_FALSE;  }  s = JS_ValueToString(cx, argv[0]);  name = JS_GetStringBytes(s);  for(i = 1; i < argc; i++)  {    char *p;    s = JS_ValueToString(cx, argv[i]);    p = JS_GetStringBytes(s);    if(p)      condp.params = dllist_append(condp.params, p);  }  r = url_append_one_condition(name, up->urlp, &condp);  dllist_free_all(condp.params);  if(r < 0)  {    JS_ReportError(cx, "pjs: PavukUrl.check_cond: %s - \"%s\"",      gettext("unknown limiting condition"), name);    return JS_FALSE;  }  *rv = r ? JSVAL_TRUE : JSVAL_FALSE;  return JS_TRUE;}static JSObject *pjs_url_class_init(JSContext *cx, JSObject *obj){  JSObject *prot;  prot = JS_InitClass(cx, obj, NULL, &urlClass, pjs_url_new, 0,    urlProperties, urlMethods, NULL, NULL);  return prot;}/* PavukFnrules class implementation */static JSBool pjs_fnrules_get_macro(JSContext *, JSObject *, uintN, jsval *,  jsval *);static JSBool pjs_fnrules_get_sub(JSContext *, JSObject *, uintN, jsval *,  jsval *);static JSBool pjs_fnrules_get_property(JSContext *, JSObject *, jsval,  jsval *);static JSClass fnrulesClass = {  "PavukFnrules", JSCLASS_HAS_PRIVATE,  JS_PropertyStub, JS_PropertyStub,  pjs_fnrules_get_property, JS_PropertyStub,  JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub};static JSFunctionSpec fnrulesMethods[] = {  {"get_macro", pjs_fnrules_get_macro, 1, JSPROP_ENUMERATE},  {"get_sub", pjs_fnrules_get_sub, 1, JSPROP_ENUMERATE},  {NULL, NULL, 0, 0}};enum _fnrules_prop{  PJSFNRULES_URL,  PJSFNRULES_PATTERN,  PJSFNRULES_PATTERN_TYPE,  PJSFNRULES_NULL};static JSPropertySpec fnrulesProperties[] = {  {"url", PJSFNRULES_URL, JSPROP_ENUMERATE | JSPROP_READONLY},  {"pattern", PJSFNRULES_PATTERN, JSPROP_ENUMERATE | JSPROP_READONLY},  {"pattern_type", PJSFNRULES_PATTERN_TYPE,      JSPROP_ENUMERATE | JSPROP_READONLY},  {NULL, 0, 0},};static JSObject *pjs_fnrules_to_jsobj(JSContext *cx, struct lfname_lsp_interp *interp){  JSObject *obj;  obj = JS_NewObject(cx, &fnrulesClass, NULL, NULL);  JS_SetPrivate(cx, obj, interp);  return obj;}/* constructor */static JSBool pjs_fnrules_new(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv){  JS_ReportError(cx,    gettext("PavukFnrules constructor call prohibited from script\n"));  return JS_TRUE;}static JSBool pjs_fnrules_get_property(JSContext *cx, JSObject *obj, jsval id, jsval *val){  if(JSVAL_IS_INT(id))  {    struct lfname_lsp_interp *interp;    JSObject *uobj;    interp = JS_GetPrivate(cx, obj);    switch (JSVAL_TO_INT(id))    {    case PJSFNRULES_URL:      uobj = pjs_url_to_jsobj(cx, interp->urlp, NULL);      *val = OBJECT_TO_JSVAL(uobj);      break;    case PJSFNRULES_PATTERN:      SET_STR(interp->orig->matchstr);      break;    case PJSFNRULES_PATTERN_TYPE:      *val = INT_TO_JSVAL(interp->orig->type);      break;    }  }  return JS_TRUE;}static JSBool pjs_fnrules_get_macro(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *val){  struct lfname_lsp_interp *interp;  const char *v;  JSString *s;  if(argc != 1 || !(s = JS_ValueToString(cx, argv[0])))  {    JS_ReportError(cx, "PavukFnrules.get_macro: %s\n",      gettext("bad parameters"));    return JS_FALSE;  }  interp = JS_GetPrivate(cx, obj);  v = JS_GetStringBytes(s);  if(v && v[0] == '%' && lfname_check_macro(v[1]) && !v[2])    v = lfname_interp_get_macro(interp, v[1]);  SET_STR(v);  return JS_TRUE;}static JSBool pjs_fnrules_get_sub(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *val){  struct lfname_lsp_interp *interp;  char *v;  int32 n;  if(argc != 1 || !JSVAL_IS_INT(argv[0]))  {    JS_ReportError(cx, "PavukFnrules.get_sub: %s\n",      gettext("bad parameters"));    return JS_FALSE;  }  interp = JS_GetPrivate(cx, obj);  JS_ValueToInt32(cx, argv[0], &n);  v = lfname_re_sub(interp->orig, interp->urlstr, n);  SET_STR(v);  return JS_TRUE;}static JSObject *pjs_fnrules_class_init(JSContext *cx, JSObject *obj){  JSObject *prot;  prot = JS_InitClass(cx, obj, NULL, &fnrulesClass, pjs_fnrules_new, 0,    fnrulesProperties, fnrulesMethods, NULL, NULL);  return prot;}static int pjs_func_exist(JSContext *cx, JSObject *obj, char *name){  jsval rv;  if(!JS_GetProperty(cx, obj, name, &rv) || rv == JSVAL_VOID)    return FALSE;  else    return TRUE;}int pjs_init(void){  LOCK_MOZJS;  if(!rt)  {    rt = JS_Init(1000000L);    cx = JS_NewContext(rt, STACK_CHUNK_SIZE);    JS_SetErrorReporter(cx, pjs_error);    go = JS_NewObject(cx, &globalClass, NULL, NULL);    JS_InitStandardClasses(cx, go);    JS_DefineFunctions(cx, go, globalMethods);    pjs_url_class_init(cx, go);    pjs_fnrules_class_init(cx, go);    pjs_load_script(priv_cfg.js_script_file);    pjs_have_pavuk_url_cond_check =      pjs_func_exist(cx, go, "pavuk_url_cond_check");  }  UNLOCK_MOZJS;  return 0;}int pjs_destroy(void){  LOCK_MOZJS;  if(rt)  {    if(script)    {      JS_RemoveRoot(cx, &scriptobj);      JS_DestroyScript(cx, script);    }    JS_GC(cx);    JS_DestroyContext(cx);    JS_Finish(rt);    cx = NULL;    rt = NULL;    go = NULL;    script = NULL;    scriptobj = NULL;    pjs_have_pavuk_url_cond_check = FALSE;  }  UNLOCK_MOZJS;  return 0;}int pjs_load_script(char *name){  jsval rv;  JS_ClearPendingException(cx);  if(script)  {    JS_RemoveRoot(cx, &scriptobj);    JS_DestroyScript(cx, script);    script = NULL;    scriptobj = NULL;  }  if(name)  {    script = JS_CompileFile(cx, go, name);    if(!script)      return -1;    scriptobj = JS_NewScriptObject(cx, script);    JS_AddNamedRoot(cx, &scriptobj, "pjs_script");    JS_ExecuteScript(cx, go, script, &rv);  }  return 0;}int pjs_load_script_string(char *str){  jsval rv;  LOCK_MOZJS;  JS_ClearPendingException(cx);  if(script)  {    JS_RemoveRoot(cx, &scriptobj);    JS_DestroyScript(cx, script);    script = NULL;    scriptobj = NULL;  }  script = JS_CompileScript(cx, go, str, strlen(str), "intbuffer", 0);  if(!script)  {    UNLOCK_MOZJS;    return -1;  }  scriptobj = JS_NewScriptObject(cx, script);  JS_AddNamedRoot(cx, &scriptobj, "pjs_script");  JS_ExecuteScript(cx, go, script, &rv);  UNLOCK_MOZJS;  return 0;}int pjs_execute(char *scr){  jsval rval;  int rv;  LOCK_MOZJS;  rv = JS_EvaluateScript(cx, go, scr, strlen(scr), "pjs", 0, &rval);  UNLOCK_MOZJS;  return rv;}int pjs_run_cond_check_func(url *urlp, cond_info_t *condp){  jsval param[2];  jsval rv;  JSObject *ourl;  int ret;  if(!pjs_have_pavuk_url_cond_check || !script)    return -1;  LOCK_MOZJS;  ourl = pjs_url_to_jsobj(cx, urlp, condp);  param[0] = OBJECT_TO_JSVAL(ourl);  param[1] = INT_TO_JSVAL(condp->level);  rv = JSVAL_FALSE;  if(!JS_CallFunctionName(cx, go, "pavuk_url_cond_check", 2, param, &rv))    ret = -1;  else  {    if(JSVAL_IS_BOOLEAN(rv))      ret = (rv == JSVAL_TRUE);    else      ret = -1;  }  JS_GC(cx);  UNLOCK_MOZJS;  return ret;}char *pjs_run_fnrules_func(char *name, struct lfname_lsp_interp *interp){  char *ret = NULL;  JSObject *rl;  jsval param[1];  JSString *s;  jsval rv;  LOCK_MOZJS;  if(pjs_func_exist(cx, go, name))  {    rl = pjs_fnrules_to_jsobj(cx, interp);    param[0] = OBJECT_TO_JSVAL(rl);    rv = JSVAL_FALSE;    if(JS_CallFunctionName(cx, go, name, 1, param, &rv))    {      s = JS_ValueToString(cx, rv);      if(s)        ret = tl_strdup(JS_GetStringBytes(s));    }    JS_GC(cx);  }  else  {    xprintf(1, gettext("pjs: There is no \"%s\" JavaScript function!\n"),      name);  }  UNLOCK_MOZJS;  return ret;}#endif /* HAVE_MOZJS */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -