core.c

来自「elinks下lynx是最重要的二个文本浏览器, 在linux下非常实用, el」· C语言 代码 · 共 158 行

C
158
字号
/* ECMAScript browser scripting module */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "elinks.h"#include "config/home.h"#include "ecmascript/spidermonkey/util.h"#include "main/module.h"#include "scripting/scripting.h"#include "scripting/smjs/core.h"#include "scripting/smjs/elinks_object.h"#include "scripting/smjs/global_object.h"#include "scripting/smjs/smjs.h"#include "util/file.h"#include "util/string.h"#define SMJS_HOOKS_FILENAME "hooks.js"JSContext *smjs_ctx;JSObject *smjs_elinks_object;struct session *smjs_ses;voidalert_smjs_error(unsigned char *msg){	report_scripting_error(&smjs_scripting_module,	                       smjs_ses, msg);}static voiderror_reporter(JSContext *ctx, const char *message, JSErrorReport *report){	unsigned char *strict, *exception, *warning, *error;	struct string msg;	if (!init_string(&msg)) goto reported;	strict	  = JSREPORT_IS_STRICT(report->flags) ? " strict" : "";	exception = JSREPORT_IS_EXCEPTION(report->flags) ? " exception" : "";	warning   = JSREPORT_IS_WARNING(report->flags) ? " warning" : "";	error	  = !report->flags ? " error" : "";	add_format_to_string(&msg, "A client script raised the following%s%s%s%s",			strict, exception, warning, error);	add_to_string(&msg, ":\n\n");	add_to_string(&msg, message);	if (report->linebuf && report->tokenptr) {		int pos = report->tokenptr - report->linebuf;		add_format_to_string(&msg, "\n\n%s\n.%*s^%*s.",			       report->linebuf,			       pos - 2, " ",			       strlen(report->linebuf) - pos - 1, " ");	}	alert_smjs_error(msg.source);	done_string(&msg);reported:	JS_ClearPendingException(ctx);}static JSRuntime *smjs_rt;static intsmjs_do_file(unsigned char *path){	int ret = 1;	jsval rval;	struct string script;	if (!init_string(&script)) return 0;	if (!add_file_to_string(&script, path)	     || JS_FALSE == JS_EvaluateScript(smjs_ctx,				JS_GetGlobalObject(smjs_ctx),				script.source, script.length, path, 1, &rval)) {		alert_smjs_error("error loading script file");		ret = 0;	}	done_string(&script);	return ret;}static JSBoolsmjs_do_file_wrapper(JSContext *ctx, JSObject *obj, uintN argc,                     jsval *argv, jsval *rval){	JSString *jsstr = JS_ValueToString(smjs_ctx, *argv);	unsigned char *path = JS_GetStringBytes(jsstr);	if (smjs_do_file(path))		return JS_TRUE;	return JS_FALSE;}static voidsmjs_load_hooks(void){	unsigned char *path;	assert(smjs_ctx);	if (elinks_home) {		path = straconcat(elinks_home, SMJS_HOOKS_FILENAME, NULL);	} else {		path = stracpy(CONFDIR "/" SMJS_HOOKS_FILENAME);	}	if (file_exists(path))		smjs_do_file(path);	mem_free(path);}voidinit_smjs(struct module *module){	smjs_rt = JS_NewRuntime(1L * 1024L * 1024L);	if (!smjs_rt) return;	smjs_ctx = JS_NewContext(smjs_rt, 8192);	if (!smjs_ctx) {		JS_DestroyRuntime(smjs_rt);		smjs_rt = NULL;		return;	}	JS_SetErrorReporter(smjs_ctx, error_reporter);	smjs_init_global_object();	smjs_init_elinks_object();	JS_DefineFunction(smjs_ctx, smjs_global_object, "do_file",	                  &smjs_do_file_wrapper, 1, 0);	smjs_load_hooks();}voidcleanup_smjs(struct module *module){	if (!smjs_ctx) return;	JS_DestroyContext(smjs_ctx);	JS_DestroyRuntime(smjs_rt);}

⌨️ 快捷键说明

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