use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeArray in project jMiniLang by bajdcc.
the class ModuleList method getCodePage.
@Override
public RuntimeCodePage getCodePage() throws Exception {
if (runtimeCodePage != null)
return runtimeCodePage;
String base = ResourceLoader.load(getClass());
Grammar grammar = new Grammar(base);
RuntimeCodePage page = grammar.getCodePage();
IRuntimeDebugInfo info = page.getInfo();
info.addExternalValue("g_new_array", () -> new RuntimeObject(new RuntimeArray()));
info.addExternalValue("g_new_map", () -> new RuntimeObject(new RuntimeMap()));
buildMethod(info);
return runtimeCodePage = page;
}
use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeArray in project jMiniLang by bajdcc.
the class ModuleNet method buildRemoteMethods.
private void buildRemoteMethods(IRuntimeDebugInfo info) {
info.addExternalFunc("g_net_get", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "HTTP GET";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
String text = "";
String txt = String.valueOf(args.get(0).getObj());
logger.debug("Request url: " + txt);
try {
URL url = new URL(txt);
// 打开连接
URLConnection urlConnection = url.openConnection();
// 获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
text = sb.toString();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return new RuntimeObject(text);
}
});
info.addExternalFunc("g_net_get_json", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "HTTP GET - json";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
String text = "";
String txt = String.valueOf(args.get(0).getObj());
logger.debug("Request url(json): " + txt);
try {
URL url = new URL(txt);
// 打开连接
URLConnection urlConnection = url.openConnection();
// 获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
text = sb.toString();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return parseJson(text);
}
});
// -----------------------------------
// server
info.addExternalFunc("g_net_msg_create_server_internal", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG SERVER";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getServer() != null || getClient() != null)
return new RuntimeObject(false);
int port = ((BigInteger) args.get(0).getObj()).intValue();
setServer(new ModuleNetServer(port));
getServer().start();
return new RuntimeObject(true);
}
});
info.addExternalFunc("g_net_msg_shutdown_server", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG SERVER SHUTDOWN";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getServer() == null)
return new RuntimeObject(false);
getServer().exit();
return new RuntimeObject(true);
}
});
info.addExternalFunc("g_net_msg_get_server_status", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG SERVER GET STATUS";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getServer() != null) {
ModuleNetServer.Status s = getServer().getStatus();
if (s == ModuleNetServer.Status.ERROR) {
lastError = getServer().getError();
setServer(null);
}
status.getService().getProcessService().sleep(status.getPid(), MSG_QUERY_TIME);
return new RuntimeObject(BigInteger.valueOf(s.ordinal()));
}
return new RuntimeObject(BigInteger.valueOf(ModuleNetServer.Status.NULL.ordinal()));
}
});
// server
// -----------------------------------
// client
info.addExternalFunc("g_net_msg_create_client_internal", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG CLIENT";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getServer() != null || getClient() != null)
return new RuntimeObject(false);
String addr = String.valueOf(args.get(0).getObj());
setClient(new ModuleNetClient(addr));
getClient().start();
return new RuntimeObject(true);
}
});
info.addExternalFunc("g_net_msg_shutdown_client", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG CLIENT SHUTDOWN";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getClient() == null)
return new RuntimeObject(false);
getClient().exit();
return new RuntimeObject(true);
}
});
info.addExternalFunc("g_net_msg_get_client_status", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG CLIENT GET STATUS";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getClient() != null) {
ModuleNetClient.Status s = getClient().getStatus();
if (s == ModuleNetClient.Status.ERROR) {
lastError = getClient().getError();
setClient(null);
}
status.getService().getProcessService().sleep(status.getPid(), MSG_QUERY_TIME);
return new RuntimeObject(BigInteger.valueOf(s.ordinal()));
}
return new RuntimeObject(BigInteger.valueOf(ModuleNetClient.Status.NULL.ordinal()));
}
});
info.addExternalFunc("g_net_msg_client_send", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG CLIENT SEND";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getClient() != null) {
ModuleNetClient.Status s = getClient().getStatus();
if (s == ModuleNetClient.Status.RUNNING) {
status.getService().getProcessService().sleep(status.getPid(), MSG_SEND_TIME);
getClient().send(String.valueOf(args.get(0).getObj()));
return new RuntimeObject(true);
}
}
return new RuntimeObject(false);
}
});
info.addExternalFunc("g_net_msg_client_send_with_origin", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG CLIENT SEND(ORIGIN)";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getClient() != null) {
ModuleNetClient.Status s = getClient().getStatus();
if (s == ModuleNetClient.Status.RUNNING) {
status.getService().getProcessService().sleep(status.getPid(), MSG_SEND_TIME);
getClient().send(String.valueOf(args.get(0).getObj()), String.valueOf(args.get(1).getObj()));
return new RuntimeObject(true);
}
}
return new RuntimeObject(false);
}
});
info.addExternalFunc("g_net_msg_server_send", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG SERVER SEND";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getServer() != null) {
ModuleNetServer.Status s = getServer().getStatus();
if (s == ModuleNetServer.Status.RUNNING) {
status.getService().getProcessService().sleep(status.getPid(), MSG_SEND_TIME);
getServer().send(String.valueOf(args.get(0).getObj()));
return new RuntimeObject(true);
}
}
return new RuntimeObject(false);
}
});
info.addExternalFunc("g_net_msg_server_send_error", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG SERVER SEND ERROR";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getServer() != null) {
ModuleNetServer.Status s = getServer().getStatus();
if (s == ModuleNetServer.Status.RUNNING) {
status.getService().getProcessService().sleep(status.getPid(), MSG_SEND_TIME);
getServer().send_error(String.valueOf(args.get(0).getObj()));
return new RuntimeObject(true);
}
}
return new RuntimeObject(false);
}
});
info.addExternalFunc("g_net_msg_server_send_with_origin", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG SERVER SEND(ORIGIN)";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
if (getServer() != null) {
ModuleNetServer.Status s = getServer().getStatus();
if (s == ModuleNetServer.Status.RUNNING) {
status.getService().getProcessService().sleep(status.getPid(), MSG_SEND_TIME);
getServer().send(String.valueOf(args.get(0).getObj()), String.valueOf(args.get(1).getObj()));
return new RuntimeObject(true);
}
}
return new RuntimeObject(false);
}
});
// client
// -----------------------------------
info.addExternalFunc("g_net_msg_get_error", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG SERVER GET ERROR";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
return new RuntimeObject(lastError);
}
});
info.addExternalFunc("g_net_msg_get_server_msg", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG SERVER GET MESSAGE";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
return new RuntimeObject(getServer() == null ? null : getServer().getMessage());
}
});
info.addExternalFunc("g_net_msg_get_client_msg", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG CLIENT GET MESSAGE";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
return new RuntimeObject(getClient() == null ? null : getClient().getMessage());
}
});
info.addExternalFunc("g_net_msg_get_client_addr", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "MSG CLIENT GET ADDRESS";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
return new RuntimeObject(getClient() == null ? null : getClient().getAddr());
}
});
info.addExternalFunc("g_net_parse_json", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "Parse json";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
return parseJsonSafe(String.valueOf(args.get(0).getObj()));
}
});
info.addExternalFunc("g_net_get_rss", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "RSS GET(BAIDU)";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@SuppressWarnings("unchecked")
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
String text = "";
String txt = String.valueOf(args.get(0).getObj());
logger.debug("Request url(rss): " + txt);
RuntimeArray array = new RuntimeArray();
final Pattern pattern = Pattern.compile("<br>(.*)<br />");
try {
SAXReader reader = new SAXReader();
Document document = reader.read(txt);
Node title = document.selectSingleNode("//title");
array.add(new RuntimeObject(title.getText()));
List<Node> list = document.selectNodes("//item");
for (Node item : list) {
String itemTitle = item.valueOf("title");
array.add(new RuntimeObject(itemTitle));
String itemDescription = item.valueOf("description");
Matcher matcher = pattern.matcher(itemDescription);
if (matcher.find()) {
array.add(new RuntimeObject(matcher.group(1)));
} else {
array.add(new RuntimeObject(itemDescription.replace("<br />", "")));
}
}
return new RuntimeObject(array);
} catch (Exception e) {
e.printStackTrace();
}
return new RuntimeObject(array);
}
});
}
use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeArray in project jMiniLang by bajdcc.
the class ModuleNet method parseInternal.
private static RuntimeObject parseInternal(Object o) {
if (o instanceof JSONObject) {
JSONObject obj = (JSONObject) o;
RuntimeMap map = new RuntimeMap();
obj.forEach((key, value) -> {
map.put(key, parseInternal(value));
});
return new RuntimeObject(map);
} else if (o instanceof JSONArray) {
JSONArray obj = (JSONArray) o;
RuntimeArray arr = new RuntimeArray();
obj.forEach((key) -> {
arr.add(parseInternal(key));
});
return new RuntimeObject(arr);
} else {
return new RuntimeObject(o);
}
}
use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeArray in project jMiniLang by bajdcc.
the class ModuleProc method buildMethod.
private void buildMethod(IRuntimeDebugInfo info) {
info.addExternalFunc("g_create_process", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "创建进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kFunc };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeFuncObject func = (RuntimeFuncObject) args.get(0).getObj();
return new RuntimeObject(BigInteger.valueOf(status.createProcess(func)));
}
});
info.addExternalFunc("g_create_process_args", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "创建进程带参数";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kFunc, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeFuncObject func = (RuntimeFuncObject) args.get(0).getObj();
RuntimeObject obj = args.get(1);
return new RuntimeObject(BigInteger.valueOf(status.createProcess(func, obj)));
}
});
info.addExternalFunc("g_create_user_process", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "创建用户态进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kFunc };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeFuncObject func = (RuntimeFuncObject) args.get(0).getObj();
return new RuntimeObject(BigInteger.valueOf(status.createUsrProcess(func)));
}
});
info.addExternalFunc("g_create_user_process_args", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "创建用户态进程带参数";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kFunc, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeFuncObject func = (RuntimeFuncObject) args.get(0).getObj();
RuntimeObject obj = args.get(1);
return new RuntimeObject(BigInteger.valueOf(status.createUsrProcess(func, obj)));
}
});
info.addExternalFunc("g_get_user_procs", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取用户态进程ID列表";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray arr = new RuntimeArray();
List<Integer> list = status.getUsrProcs();
for (Integer pid : list) {
arr.add(new RuntimeObject(pid));
}
return new RuntimeObject(arr);
}
});
info.addExternalFunc("g_get_pid", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取进程ID";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.getPid()));
}
});
info.addExternalFunc("g_get_parent_pid", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取父进程ID";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.getParentPid()));
}
});
info.addExternalFunc("g_get_process_priority", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取进程优先级";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.getPriority()));
}
});
info.addExternalFunc("g_set_process_priority", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "设置进程优先级";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger priority = (BigInteger) args.get(0).getObj();
return new RuntimeObject(status.setPriority(priority.intValue()));
}
});
info.addExternalFunc("g_join_process_once", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "进程等待";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger pid = (BigInteger) args.get(0).getObj();
return new RuntimeObject(status.getService().getProcessService().join(pid.intValue(), status.getPid()));
}
});
info.addExternalFunc("g_live_process", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "进程存活";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger pid = (BigInteger) args.get(0).getObj();
return new RuntimeObject(status.getService().getProcessService().live(pid.intValue()));
}
});
info.addExternalFunc("g_sleep", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "进程睡眠";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger turn = (BigInteger) args.get(0).getObj();
int time = turn.intValue();
return new RuntimeObject(BigInteger.valueOf(status.getService().getProcessService().sleep(status.getPid(), time > 0 ? time : 0)));
}
});
info.addExternalFunc("g_query_usr_proc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "枚举用户态进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(ProcInfoHelper.getProcInfo(status, status.getUsrProcs()));
}
});
info.addExternalFunc("g_query_sys_proc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "枚举内核态进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(ProcInfoHelper.getProcInfo(status, status.getSysProcs()));
}
});
info.addExternalFunc("g_query_all_proc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "枚举进程";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(ProcInfoHelper.getProcInfoAll(status));
}
});
info.addExternalFunc("g_set_process_desc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "设置进程说明";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
status.setProcDesc(String.valueOf(args.get(0).getObj()));
return null;
}
});
}
use of priv.bajdcc.LALR1.grammar.runtime.data.RuntimeArray in project jMiniLang by bajdcc.
the class ModuleString method buildStringUtils.
private void buildStringUtils(IRuntimeDebugInfo info) {
info.addExternalFunc("g_string_replace", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串替换";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kString, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
String pat = (String) args.get(1).getObj();
String sub = (String) args.get(2).getObj();
RuntimeArray arr = new RuntimeArray();
return new RuntimeObject(str.replaceAll(pat, sub));
}
});
info.addExternalFunc("g_string_split", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串分割";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
String split = (String) args.get(1).getObj();
RuntimeArray arr = new RuntimeArray();
for (String item : str.split(split, Integer.MAX_VALUE)) {
arr.add(new RuntimeObject(item));
}
return new RuntimeObject(arr);
}
});
info.addExternalFunc("g_string_splitn", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串分割";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kString, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
String split = (String) args.get(1).getObj();
int n = (int) args.get(1).getObj();
RuntimeArray arr = new RuntimeArray();
for (String item : str.split(split, n)) {
arr.add(new RuntimeObject(item));
}
return new RuntimeObject(arr);
}
});
info.addExternalFunc("g_string_trim", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串去除头尾空白";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
return new RuntimeObject(str.trim());
}
});
info.addExternalFunc("g_string_length", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串长度";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
return new RuntimeObject(BigInteger.valueOf(str.length()));
}
});
info.addExternalFunc("g_string_empty", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串是否为空";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(args.get(0).getObj().toString().isEmpty());
}
});
info.addExternalFunc("g_string_get", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串查询";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
BigInteger index = (BigInteger) args.get(1).getObj();
return new RuntimeObject(str.charAt(index.intValue()));
}
});
info.addExternalFunc("g_string_regex", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串正则匹配";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
String regex = (String) args.get(1).getObj();
Matcher m = Pattern.compile(regex).matcher(str);
RuntimeArray arr = new RuntimeArray();
while (m.find()) {
arr.add(new RuntimeObject(m.group()));
}
return new RuntimeObject(arr);
}
});
info.addExternalFunc("g_string_build", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "从字节数组构造字符串";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
StringBuilder sb = new StringBuilder();
for (Object obj : array.toList()) {
sb.append(obj);
}
return new RuntimeObject(sb.toString());
}
});
info.addExternalFunc("g_string_atoi", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串转换成数字";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
try {
BigInteger bi = new BigInteger(str);
return new RuntimeObject(new BigInteger(str));
} catch (NumberFormatException e) {
return new RuntimeObject(BigInteger.valueOf(-1));
}
}
});
info.addExternalFunc("g_string_atoi_s", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串转换成数字(安全版本)";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
try {
BigInteger bi = new BigInteger(str);
return new RuntimeObject(new BigInteger(str));
} catch (NumberFormatException e) {
return null;
}
}
});
info.addExternalFunc("g_string_join_array", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串数组连接";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray arr = (RuntimeArray) args.get(0).getObj();
String delim = (String) args.get(1).getObj();
return new RuntimeObject(String.join(delim, arr.toStringList()));
}
});
info.addExternalFunc("g_string_toupper", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串大写";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String delim = (String) args.get(0).getObj();
return new RuntimeObject(delim.toUpperCase());
}
});
info.addExternalFunc("g_string_tolower", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串小写";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String delim = (String) args.get(0).getObj();
return new RuntimeObject(delim.toLowerCase());
}
});
info.addExternalFunc("g_string_rep", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串重复构造";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
BigInteger dup = (BigInteger) args.get(1).getObj();
int n = dup.intValue();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append(str);
}
return new RuntimeObject(sb.toString());
}
});
info.addExternalFunc("g_string_to_number", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串转换数字";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
try {
return new RuntimeObject(new BigInteger(str));
} catch (Exception e1) {
try {
return new RuntimeObject(new BigDecimal(str));
} catch (Exception e2) {
return null;
}
}
}
});
info.addExternalFunc("g_string_equal", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串相等比较";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
if (args.get(0).getType() == RuntimeObjectType.kString) {
String str = (String) args.get(0).getObj();
String cmp = (String) args.get(1).getObj();
return new RuntimeObject(str.compareTo(cmp) == 0);
}
return new RuntimeObject(false);
}
});
info.addExternalFunc("g_string_not_equal", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串不等比较";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
if (args.get(0).getType() == RuntimeObjectType.kString) {
String str = (String) args.get(0).getObj();
String cmp = (String) args.get(1).getObj();
return new RuntimeObject(str.compareTo(cmp) != 0);
}
return new RuntimeObject(true);
}
});
info.addExternalFunc("g_string_start_with", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串开头比较";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
String cmp = (String) args.get(1).getObj();
return new RuntimeObject(str.startsWith(cmp));
}
});
info.addExternalFunc("g_string_end_with", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串结尾比较";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
String cmp = (String) args.get(1).getObj();
return new RuntimeObject(str.endsWith(cmp));
}
});
info.addExternalFunc("g_string_substr", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串子串";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kInt, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
BigInteger a = (BigInteger) args.get(1).getObj();
BigInteger b = (BigInteger) args.get(2).getObj();
return new RuntimeObject(str.substring(a.intValue(), b.intValue()));
}
});
info.addExternalFunc("g_string_left", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串左子串";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
BigInteger a = (BigInteger) args.get(1).getObj();
return new RuntimeObject(str.substring(0, a.intValue()));
}
});
info.addExternalFunc("g_string_right", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "字符串右子串";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
String str = (String) args.get(0).getObj();
BigInteger a = (BigInteger) args.get(1).getObj();
return new RuntimeObject(str.substring(a.intValue()));
}
});
}
Aggregations