far內置函數源代碼,java寫的
package com.faros.core.kls;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.*;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.cn.fyt.far.common.conf.CommonConf;
import com.faros.core.kls.oop.TypeObject;
import com.faros.core.interf.IFarObject;
import com.faros.core.interf.Iklass;
import com.faros.core.kls.oop.*;
import com.faros.core.vm.FrameObject;
import com.faros.core.vm.Vm;
import com.faros.exceptions.FarVmExcept;
import com.faros.exceptions.FarVmUserExcept;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import java.io.*;
import java.net.http.WebSocket;
import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* @Description: Long類型
* @Author: Fang.j
**/
public class EfuncKlass extends KlassBase implements Iklass {
//創建自己的實例
public static EfuncKlass createMetaKlass() {
EfuncKlass klass = new EfuncKlass();
klass.setKlassName("EfuncKlass");
klass.addMethod("input", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("input", EfuncKlass::input));
klass.addMethod("println", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("len", EfuncKlass::println));
klass.addMethod("newObj", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("newObj", EfuncKlass::newObj));
klass.addMethod("sscanf", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("sscanf", EfuncKlass::sscanf));
klass.addMethod("time", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("time", EfuncKlass::time));
klass.addMethod("getDeepDir", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("getDeepDir", EfuncKlass::getDeepDir));
klass.addMethod("toJsonStr", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("toJsonStr", EfuncKlass::toJsonStr));
klass.addMethod("createThread", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("createThread", EfuncKlass::createThread));
klass.addMethod("addSimEfun", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("addSimEfun", EfuncKlass::addSimEfun));
klass.addMethod("strlen", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("strlen", EfuncKlass::strlen));
klass.addMethod("undefinedp", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("undefinedp", EfuncKlass::undefinedp));
klass.addMethod("subcut", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("subcut", EfuncKlass::subcut));
klass.addMethod("toStr", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("toStr", EfuncKlass::toStr));
klass.addMethod("funcExists", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("funcExists", EfuncKlass::funcExists));
klass.addMethod("random", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("random", EfuncKlass::random));
klass.addMethod("toJsonStr", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("toJsonStr", EfuncKlass::toJsonStr));
klass.addMethod("jsonStrToMap", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("jsonStrToMap", EfuncKlass::jsonStrToMap));
klass.addMethod("keys", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("keys", EfuncKlass::keys));
klass.addMethod("fmt", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("fmt", EfuncKlass::fmt));
klass.addMethod("createNet", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("createNet", EfuncKlass::createNet));
klass.addMethod("baseName", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("baseName", EfuncKlass::baseName));
klass.addMethod("strsrch", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("strsrch", EfuncKlass::strsrch));
klass.addMethod("varDump", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("varDump", EfuncKlass::varDump));
klass.addMethod("values", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("values", EfuncKlass::values));
klass.addMethod("intp", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("intp", EfuncKlass::intp));
klass.addMethod("mapp", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("mapp", EfuncKlass::mapp));
klass.addMethod("stringp", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("stringp", EfuncKlass::stringp));
klass.addMethod("nonep", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("nonep", EfuncKlass::nonep));
klass.addMethod("arrayp", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("arrayp", EfuncKlass::arrayp));
klass.addMethod("range", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("range", EfuncKlass::range));
klass.addMethod("test_throw", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("test_throw", EfuncKlass::vm_throw));
klass.addMethod("test_throw", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("test_throw", EfuncKlass::vm_throw));
klass.addMethod("hashCode", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("hashCode", EfuncKlass::hashCode));
klass.addMethod("dirName", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("dirName", EfuncKlass::dirName));
klass.addMethod("fAddr", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("fAddr", EfuncKlass::fAddr));
klass.addMethod("objectp", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("objectp", EfuncKlass::objectp));
klass.addMethod("testObj", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("testObj", EfuncKlass::testObj));
klass.addMethod("mapDelete", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("mapDelete", EfuncKlass::mapDelete));
klass.addMethod("readExcel", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("readExcel", EfuncKlass::readExcel));
klass.addMethod("hasKey", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("hasKey", EfuncKlass::hasKey));
klass.addMethod("toDouble", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("toDouble", EfuncKlass::toDouble));
klass.addMethod("toInt", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("toInt", EfuncKlass::toInt));
klass.addMethod("sizeof", NativeMethodKlass.getMetaKlass().getNativeMethodKlass().createObj("sizeof", EfuncKlass::sizeof));
return klass;
}
public static Iklass getMetaKlass() {
return Vm.iklassMaps.get("EfuncKlass");
}
public IFarObject createObj(String val) {
IFarObject typeObject = new TypeObject();
EfuncKlass klass = new EfuncKlass();
klass.setKlassName(this.getKlassName());
typeObject.setIklass(klass);
return typeObject;
}
public Iklass createKlassObj() {
Iklass klass = EfuncKlass.getMetaKlass();
return klass;
}
/**
* 創建網絡 支持http https websocket
* @param callFrame
* @param args
* @return
*/
public static IFarObject createNet(FrameObject callFrame, List<IFarObject> args) {
IFarObject type = args.get(1);
//端口號
IFarObject port = args.get(0);
FWebSocket fWebSocket = new FWebSocket();
fWebSocket.getIklass().getWebSocketKlass().setPort(port.fString().val());
callFrame.getStack().push(fWebSocket);
return null;
}
public static IFarObject vm_throw(FrameObject callFrame, List<IFarObject> args) {
throw new FarVmUserExcept("什么奧!");
}
/**
* 檢查對象的字段、數組的下標、Map的屬性是否存在
* hasKey( var src,string prop )
* @param callFrame
* @param args
* @return
*/
public static IFarObject hasKey(FrameObject callFrame, List<IFarObject> args) {
IFarObject key = args.get(0);
IFarObject src = args.get(1);
if( src.klsType()==KlassBase.ARRAY ){
//key只能是int
if( key.fInt().val() > -1 && key.fInt().val() < src.getIklass().getArrayKlass().getDatas().size() ){
callFrame.getStack().push(new FBool(1));
}else{
//越界
callFrame.getStack().push(new FBool(0));
}
}
return null;
}
/**
* 獲取Map或者數組的key
*
* string *keys(map m|object ob);
* 返回 m 的keys列表 或 對象的所有字段
*
* @param callFrame
* @param args
* @return
*/
public static IFarObject keys(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
FArray fArray = new FArray();
if(e==null){
throw new FarVmUserExcept("expect map, got 'null'");
}
if( e.klsType()!=KlassBase.MAP ){
throw new FarVmUserExcept("expect map, got "+e);
}
e.getIklass().getMapKlass().getDatas().keySet().forEach(e2e->{
fArray.add(callFrame,e2e);
});
callFrame.getStack().push(fArray);
return null;
}
/**
* 多個OBJ進行對比,主要是解決咩有調試器時,多個對象的屬性,字段等查看
* @param callFrame
* @param args
* @return
*/
public static IFarObject testObj(FrameObject callFrame, List<IFarObject> args) {
//默認是獲取調用funcAddress("")的對象
// 第一種,Map
return null;
}
/**
*
* arg1 excel地址
* arg2 從第幾行開始讀
* arg3 讀到第幾行 0 表示讀所有
* arg3 map<string,var> string 列明 var 值類型
*
* @param callFrame
* @param args
* @return
*/
public static IFarObject readExcel(FrameObject callFrame, List<IFarObject> args){
IFarObject endIdx = args.get(0);
IFarObject startIDx = args.get(1);
//讀第幾頁
IFarObject pageIdx = args.get(2);
IFarObject xlsFile = args.get(3);
// ExcelReader reader = ExcelUtil.getReader("E:\\AAAA_CODE\\new-eclipse-workspace\\farcs\\ngame\\test\\doc\\J技能.xls");
var wkdir = System.getProperty("user.dir");
ExcelReader reader = ExcelUtil.getReader(wkdir+"/doc/J技能.xls");
//讀那個表 0是第一個頁
reader.setSheet(pageIdx.fString().val());
List<List<Object>> rows = null;
if( endIdx.fInt().val()<=0 ){
rows = reader.read(startIDx.fInt().val());
}else{
rows = reader.read(startIDx.fInt().val(),endIdx.fInt().val());
}
FArray fArray = new FArray();
for (int i = 0; i < rows.size() ; i++) {
FArray fArray1 = new FArray();
for (int j = 0; j < rows.get(i).size(); j++) {
IFarObject e = new FNone();
if( rows.get(i).get(j) instanceof String ){
e = new FString((String) rows.get(i).get(j));
}else if(rows.get(i).get(j) instanceof Integer ){
e = new FInt((Integer) rows.get(i).get(j));
}else if(rows.get(i).get(j) instanceof Double){
e = new FDouble((Double) rows.get(i).get(j));
}else if(rows.get(i).get(j) instanceof Long){
e = new FInt(((Long) rows.get(i).get(j)).intValue());
}
else{
int x=1;
}
fArray1.add(callFrame,e);
}
fArray.add(fArray1);
}
callFrame.getStack().push(fArray);
return null;
}
public static IFarObject sizeof(FrameObject callFrame, List<IFarObject> args) {
//默認是獲取調用funcAddress("")的對象
IFarObject e = args.get(0);
if( e.klsType()==KlassBase.ARRAY ){
callFrame.getStack().push(new FInt(e.getIklass().getArrayKlass().getDatas().size()));
return null;
}
return null;
}
/**
* 獲取方法的地址
* @param callFrame
* @param args
* @return
*/
public static IFarObject fAddr(FrameObject callFrame, List<IFarObject> args) {
//默認是獲取調用funcAddress("")的對象
IFarObject e = args.get(0);
IFarObject owner = callFrame.getOwner();
String fName = e.fString().val();
IFarObject method = owner.getIklass().findMethod(fName);
callFrame.getStack().push(method);
return null;
}
/**
*
* 名稱
* map_delete() - 通過 key 從一個映射移除一組值(key:value)
* 語法
* void map_delete( mapping m, mixed element| mixed *element );
* 描述
* map_delete 從映射 `m` 中移除 key 為 `element` 的鍵值對(key:value)。
*
* 示例,給定:
*
* mapping names;
*
* names = ([]);
* names["truilkan"] = "john";
* names["wayfarer"] = "erik";
* names["jacques"] = "dwayne";
*
* 那么:
*
* map_delete(names,"truilkan");
*
* 導致映射 `names` 的結果為:
*
* (["wayfarer" : "erik", "jacques" : "dwayne"])
*
* 在 map_delete(names, "truilkan") 后映射 `names` 中不再包括 `truilkan`,除非再被加回去。
*
*
* @param callFrame
* @param args
* @return
*/
public static IFarObject mapDelete(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
IFarObject src = args.get(1);
src.fMap().remove(callFrame,e);
return null;
}
public static IFarObject hashCode(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
callFrame.getStack().push( new FString( String.valueOf(e.hashCode())));
return null;
}
/**
* 獲取調用這個方法的對象的相對路徑
* @param callFrame
* @param args
* @return
*/
public static IFarObject dirName(FrameObject callFrame, List<IFarObject> args) {
String klassName = callFrame.getOwner().getIklass().getKlassName();
String s[] = klassName.split("/");
List<String> list = Arrays.asList(s);
list = CollectionUtil.sub(list,0,s.length-1);
String ss = list.stream().collect(Collectors.joining("/"));
callFrame.getStack().push(new FString(ss));
return null;
}
/**
* values() 返回一個映射 `m` 所有 value 組成的數組
*
* 示例,如:
*
* mapping m;
*
* m = (["hp" : 35, "sp" : 42, "mass" : 100]);
*
* 那么
*
* values(m) == ({35, 42, 100})
*
* 注意:返回的 value 的順序和 keys() 外部函數返回的所有 key 的順序一致。
* @param callFrame
* @param args
* @return
*/
public static IFarObject values(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
FArray fArray = new FArray();
e.fMap().getDatas().values().forEach(v->{
fArray.add(callFrame,v);
});
callFrame.getStack().push(fArray);
return null;
}
/**
* 特殊用途的內置函數,主要用于生成int 數組
* 該函數,編譯器會調用,勿刪
* @param callFrame
* @param args
* @return
*/
public static IFarObject range(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
IFarObject s = args.get(1);
int ss = s.fInt().val();
int ee = e.fInt().val();
FArray fArray = new FArray();
for (int i = ss; i <=ee ; i++) {
fArray.add(new FInt(i));
}
callFrame.getStack().push(fArray);
return null;
}
public static IFarObject intp(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
if( e.klsType()==KlassBase.INT) {
callFrame.getStack().push(new FBool(1));
}else{
callFrame.getStack().push(new FBool(0));
}
return null;
}
public static IFarObject stringp(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
if( e.klsType()==KlassBase.STR) {
callFrame.getStack().push(new FBool(1));
}else{
callFrame.getStack().push(new FBool(0));
}
return null;
}
public static IFarObject ftpClient(FrameObject callFrame, List<IFarObject> args){
FTPClient client = new FTPClient();
try {
client.connect("192.168.31.10", 21);
client.login("plm", "plm369");
System.out.println(client.getControlEncoding());
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
client.disconnect();
System.out.println("Login error");
return new FNone();
}
client.setControlEncoding("GBK");
System.out.println(client.getCharsetName());
client.enterLocalPassiveMode();
client.changeWorkingDirectory("\\preview\\1735111079512\\");
client.setBufferSize(1024);
client.setFileType(FTP.BINARY_FILE_TYPE);
client.enterLocalPassiveMode();
FTPFile[] fs = client.listFiles();
FileOutputStream out = null;
InputStream in = null;
String fileName = "24CI98-A1-04加兩個中文.pdf";
// System.out.println("Default Charset=" + java.nio.charset.Charset.defaultCharset());
for (int i = 0; i < fs.length; i++) {
FTPFile ff = fs[i];
String outFileName = ff.getName();
System.out.println(outFileName);
//本地目錄文件不需要編碼
File localFile = new File("D:\\ftp\\" + fileName);
OutputStream fos = new FileOutputStream(localFile);
// ftp需使用ISO-8859-1編碼格式
String path11= CharsetUtil.convert(fileName,CharsetUtil.GBK,CharsetUtil.ISO_8859_1);
client.retrieveFile(path11, fos);
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
client.disconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return new FNone();
}
public static IFarObject nonep(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
if( e.klsType()!=KlassBase.NONE) {
callFrame.getStack().push(new FBool(0));
}else{
callFrame.getStack().push(new FBool(1));
}
return null;
}
public static IFarObject arrayp(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
if( e.klsType()!=KlassBase.ARRAY) {
callFrame.getStack().push(new FBool(0));
}else{
callFrame.getStack().push(new FBool(1));
}
return null;
}
public static IFarObject objectp(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
if( e==null ){
callFrame.getStack().push(new FBool(0));
return null;
}
if( e.klsType()!=KlassBase.UOBJ) {
callFrame.getStack().push(new FBool(0));
return null;
}
callFrame.getStack().push(new FBool(1));
return null;
}
public static IFarObject mapp(FrameObject callFrame, List<IFarObject> args) {
IFarObject e = args.get(0);
if( e==null ){//肯定不應該有這種情況存在!
callFrame.getStack().push(new FBool(0));
return null;
}
if( e.klsType()==KlassBase.MAP) {
callFrame.getStack().push(new FBool(1));
}else{
callFrame.getStack().push(new FBool(0));
}
return null;
}
/**
* object newObj( string str);
* 根據str創建對象,不支持fileName的文件地址
* @param callFrame
* @param args
* @return
*/
public static IFarObject newObj(FrameObject callFrame, List<IFarObject> args) {
try{
String clsName = args.get(0).getIklass().getStringKlass().getVal();
callFrame.getStack().push(new FObject(callFrame,clsName));
return null;
}catch (Exception e){
throw new FarVmUserExcept(e.getMessage());
}
}
/**
* int strsrch( string str, string substr | int char, int flag | void);
* strsrch() 在字符串 `str` 中尋找第一個子字符串 `substr` 出現的的位置,如果第三個參數(可選參數,默認值為0) `flag` 是 -1 代表最后一次出現的位置。
* 如果第二個參數是整數,會尋找 ascii 字符(類似C語言中的 strchr() 和 strrchr())。
* 無法從空字符串或 null 值中尋找。
*
* @param callFrame
* @param args
* @return 返回第一個(或最后一個)匹配的字符串的位置,起始位置從 0 開始,如果返回 -1 代表沒有匹配。
*/
public static IFarObject strsrch(FrameObject callFrame, List<IFarObject> args) {
IFarObject e1,e2,e3;
if( args.size()==2 ){
//子串
e1 = args.get(0);
//源字符串
e2 =args.get(1);
int idx = StrUtil.indexOf(e2.fString().val(),e1.fString().val(),0,false);
callFrame.getStack().push(new FInt(idx));
}
//
return null;
}
/**
* 在對象中查找方法是否存在
* 可以查找父類,但不能查找efunc
*
* int funcExists( object ob, string func);
* 查找ob是否有func方法
* @param callFrame
* @param args
* @return
*/
public static IFarObject funcExists(FrameObject callFrame, List<IFarObject> args) {
IFarObject funName = args.get(0);
IFarObject obj = args.get(1);
IFarObject callable = obj.getIklass().findMethod( funName.fString().val() );
if(callable==null || callable.klsType()==KlassBase.NONE ){
callFrame.getStack().push(new FBool(0));
}else {
callFrame.getStack().push(new FBool(1));
}
return null;
}
//創建隨機數
public static IFarObject random(FrameObject callFrame, List<IFarObject> args) {
if (args.size() <= 0) {
callFrame.getStack().push(new FInt(RandomUtil.randomInt()));
} else if (args.size() == 2) {
IFarObject s = args.get(1);
IFarObject e = args.get(0);
int ss = s.fInt().val();//.val().intValue();
int ee = e.fInt().val();
callFrame.getStack().push( new FInt(RandomUtil.randomInt(ss, ee)) );
}
return null;
}
/**
* 創建線程對象
*
* @param callFrame
* @param args
* @return
*/
public static IFarObject createThread(FrameObject callFrame, List<IFarObject> args) {
if( args.get(0).klsType()==KlassBase.METHOD ){//匿名函數
String mtName = args.get(0).getIklass().getMethodKlass().getMethodName();
FThread fThread = new FThread(mtName);
fThread.getIklass().getThreadKlass().setTaskerIsMethod(true);
fThread.getIklass().getThreadKlass().setTasker(args.get(0));
fThread.getIklass().getThreadKlass().setMethodName(mtName);
fThread.getIklass().getThreadKlass().setThread(Thread.ofVirtual().name("Far-thread-" + mtName));
callFrame.getStack().push(fThread);
}else{
String mtName = args.get(0).getIklass().getStringKlass().getVal();
IFarObject tasker = args.get(1);
FThread fThread = new FThread(mtName);
fThread.getIklass().getThreadKlass().setTasker(tasker);
fThread.getIklass().getThreadKlass().setMethodName(mtName);
fThread.getIklass().getThreadKlass().setThread(Thread.ofVirtual().name("Far-thread-" + mtName));
callFrame.getStack().push(fThread);
}
return null;
}
public static List<String> sscanfHelper(String input, String format) {
List<String> results = new ArrayList<>();
// Replace all "%s" in the format string with a regex pattern that matches non-whitespace sequences
String regex = format.replaceAll("%s", "([^\\s]+)");
// Compile the regex pattern
Pattern pattern = Pattern.compile(regex);
// Match the input string against the pattern
Matcher matcher = pattern.matcher(input);
// Check if there is a match (we don't need a full match here, just check for groups)
if (matcher.find()) {
// Find all capture groups and add them to the results list
for (int i = 1; i <= matcher.groupCount(); i++) {
results.add(matcher.group(i));
}
}
// If there were fewer matches than groups in the format string, the results list will have fewer elements
// than expected. This is acceptable because it indicates that the input did not provide enough values.
// Optionally, you can pad the results list with empty strings to match the number of %s in the format.
// Return the results list
return results;
}
/**
* 添加用戶仿真內置函數
* 讓用戶代碼中可以全局使用的函數
* @param callFrame
* @param args
* @return
*/
@Deprecated
public static IFarObject addSimEfun(FrameObject callFrame, List<IFarObject> args) {
IFarObject obj = args.get(0);
EfuncKlass.getMetaKlass().getEfuncKlass().userSimulationFuns.add(obj);
return null;
}
//特殊用
public static IFarObject addSimEfun( IFarObject obj ) {
EfuncKlass.getMetaKlass().getEfuncKlass().userSimulationFuns.add(obj);
return null;
}
public static void println(FrameObject callFrame, String s) {
List<IFarObject> args = Arrays.asList(new FString(s));
println(callFrame, args);
}
public static IFarObject input(FrameObject callFrame, List<IFarObject> args) {
String outStr = args.get(0).getIklass().getStringKlass().getVal();
println(callFrame, outStr);
Scanner scanner = new Scanner(System.in);
String inputString = scanner.nextLine(); // 讀取一整行輸入
callFrame.getStack().push(new FString(inputString));
return null;
}
/***
* 字符串格式化
* @param callFrame
* @param args
* @return
*/
public static IFarObject fmt(FrameObject callFrame, List<IFarObject> args) {
IFarObject str = args.get(0);//數據包
Object[] vars = new Object[args.size()-1];
for (int i = 0,j=args.size()-2; i < vars.length; i++,j--) {
if( args.get(j).klsType()==KlassBase.STR ){
vars[i] = args.get(j).getIklass().getStringKlass().getVal();
} else if (args.get(j).klsType()==KlassBase.INT ) {
vars[i] = args.get(j).getIklass().getIntKlass().getVal();
} else if (args.get(j).klsType()==KlassBase.LONG) {
vars[i] = args.get(j).getIklass().getLongKlass().getVal();
}else if (args.get(j).klsType()==KlassBase.DOUBLE) {
vars[i] = args.get(j).getIklass().getDoubleKlass().getVal();
}
}
String fmtStr = args.get(args.size()-1).getIklass().getStringKlass().getVal();
String s = String.format( fmtStr,vars );
callFrame.getStack().push(new FString(s));
return null;
}
/**
* int strlen(string str)
* 獲取str的長度
* @param callFrame
* @param args
* @return
*/
public static IFarObject strlen(FrameObject callFrame, List<IFarObject> args) {
IFarObject str = args.get(0);
int len = str.fString().val().length();
callFrame.getStack().push(new FInt(len));
return null;
}
/**
*
* 數組轉字符串,數組內部能轉的只能是數字和字符串
* @param callFrame
* @param args
* @return
*/
public static IFarObject toStr(FrameObject callFrame, List<IFarObject> args) {
IFarObject vals = args.get(0);//取幾個
if( vals.klsType()==KlassBase.ARRAY ){
StringBuilder stringBuilder = new StringBuilder();
vals.getIklass().getArrayKlass().getDatas().forEach(e->{
stringBuilder.append( e.fString().val() );
});
callFrame.getStack().push( new FString(stringBuilder.toString()) );
}else if(vals.klsType()==KlassBase.DOUBLE){
callFrame.getStack().push( new FString(vals.fDouble().val().toString()) );
}else if(vals.klsType()==KlassBase.INT){
callFrame.getStack().push( new FString(String.valueOf(vals.fInt().val())) );
}
return null;
}
public static IFarObject toDouble(FrameObject callFrame, List<IFarObject> args) {
IFarObject val = args.get(0);//取幾個
Double nv=0d;
if(val.klsType()==KlassBase.INT ) {
nv = Double.valueOf(val.fInt().val());
}
callFrame.getStack().push( new FDouble(nv));
return null;
}
public static IFarObject toInt(FrameObject callFrame, List<IFarObject> args) {
IFarObject val = args.get(0);//取幾個
int nv=0;
if(val.klsType()==KlassBase.DOUBLE ) {
nv = val.fDouble().val().intValue();
} else if (val.klsType()==KlassBase.INT) {
nv = val.fInt().val();
}
callFrame.getStack().push( new FInt(nv));
return null;
}
//截取,支持數組和字符串
//跳過第幾位 取到第幾位
public static IFarObject subcut(FrameObject callFrame, List<IFarObject> args) {
IFarObject start = args.get(0);//第幾個開始取
IFarObject end = args.get(1);//取幾個
IFarObject src = args.get(2);//原數據
int s = start.fInt().val();
int e = end.fInt().val();
if(src.klsType()==KlassBase.ARRAY){
FArray fArray = new FArray();
List<IFarObject> result = src.getIklass().getArrayKlass().getDatas().subList(e,s);
result.forEach(e1->{
fArray.add(callFrame, e1);
});
callFrame.getStack().push(fArray);
}
return null;
}
public static IFarObject undefinedp(FrameObject callFrame, List<IFarObject> args) {
IFarObject checkVal = args.get(0);
if( checkVal.klsType()==KlassBase.NONE ){
callFrame.getStack().push(new FBool(1));
}else{
callFrame.getStack().push(new FBool(0));
}
return null;
}
public static List<IFarObject> ssca11nf1(String str, String format) {
List<IFarObject> resultList = new ArrayList<>();
Scanner scanner = new Scanner(str);
// 將格式字符串拆分成多個部分
String[] formatParts = format.split("(?=%)|(?<=%)", -1);
for (String part : formatParts) {
if (part.startsWith("%") && part.length() > 1) {
// 處理格式化指令
char specifier = part.charAt(1);
switch (specifier) {
case 'd': // 整數
if (scanner.hasNextInt()) {
// resultList.add(scanner.nextInt() + "");
} else {
throw new IllegalArgumentException("Expected an integer but found none");
}
break;
case 'f': // 浮點數
if (scanner.hasNextFloat()) {
// resultList.add(scanner.nextFloat() + "");
} else {
throw new IllegalArgumentException("Expected a float but found none");
}
break;
case 's': // 字符串
if (scanner.hasNext()) {
resultList.add(new FString(scanner.next()));
} else {
throw new IllegalArgumentException("Expected a string but found none");
}
break;
default:
throw new IllegalArgumentException("Unsupported format: " + part);
}
} else {
// 處理非格式化部分
if (part.length() > 0) {
String nextToken = scanner.findWithinHorizon(Pattern.quote(part), 0);
if (nextToken == null || !nextToken.equals(part)) {
throw new IllegalArgumentException("Expected '" + part + "' but found none");
}
}
}
}
scanner.close();
return resultList;
}
public static List<IFarObject> sscanf1(String str, String format) {
List<IFarObject> resultList = new ArrayList<>();
Scanner scanner = new Scanner(str);
scanner.useDelimiter("\\s+"); // 使用一個或多個空白字符作為分隔符
// 創建一個匹配給定格式的模式
Scanner formatScanner = new Scanner(format);
while (formatScanner.hasNext()) {
String token = formatScanner.next();
if (token.startsWith("%")) {
// 處理格式化指令
switch (token.charAt(1)) {
case 'd': // 整數
if (scanner.hasNextInt()) {
resultList.add(new FString(Integer.toString(scanner.nextInt())));
} else {
throw new IllegalArgumentException("Expected an integer but found none");
}
break;
case 'f': // 浮點數
if (scanner.hasNextFloat()) {
resultList.add(new FString(Float.toString(scanner.nextFloat())));
} else {
throw new IllegalArgumentException("Expected a float but found none");
}
break;
case 's': // 字符串
if (scanner.hasNext()) {
resultList.add(new FString(scanner.next()));
} else {
throw new IllegalArgumentException("Expected a string but found none");
}
break;
default:
throw new IllegalArgumentException("Unsupported format: " + token);
}
} else {
// 如果不是格式化指令,則檢查是否與下一個輸入匹配
if (!scanner.hasNext(token)) {
throw new IllegalArgumentException("Expected '" + token + "' but found none");
}
scanner.next(token); // 消耗掉匹配的部分
}
}
scanner.close();
formatScanner.close();
return resultList;
}
public static IFarObject sscanf(FrameObject callFrame, List<IFarObject> args) {
if( args.size()<2 ){
throw new FarVmExcept(callFrame,"'sscanf' expect 2 parameters, got "+args.size());
}
String oldStr = args.get(1).getIklass().getStringKlass().getVal();
String fmtStr = args.get(0).getIklass().getStringKlass().getVal();
List<IFarObject> result = sscanf1(oldStr,fmtStr );
FArray fArray = new FArray();
for (int i = 0; i < result.size(); i++) {
fArray.add(callFrame, result.get(i));
}
callFrame.getStack().push(fArray);
return null;
}
public static IFarObject time(FrameObject callFrame, List<IFarObject> args) {
FLong time = new FLong(System.currentTimeMillis());
callFrame.getStack().push(time);
return null;
}
/**
* 深度讀取指定文件夾下的所有文件
*
* @param callFrame
* @param args
* @return
*/
public static IFarObject getDeepDir(FrameObject callFrame, List<IFarObject> args) {
String path = args.get(0).getIklass().getStringKlass().getVal();
FArray fArray = new FArray();
if (!FileUtil.isAbsolutePath(path)) {
path = CommonConf.farProjDir + File.separator + path;
}
List<File> files = FileUtil.loopFiles(path);
files.forEach(e -> {
String fileName = e.getName();
FMap fMap = new FMap();
fMap.put(callFrame, new FString("name"), new FString(fileName));
//是否是文件
fMap.put(callFrame, new FString("isFile"), e.isFile() ? new FBool(1) : new FBool(0));
//文件大小 單位 字節
fMap.put(callFrame, new FString("size"), new FLong(e.length()));
//絕對路徑
fMap.put(callFrame, new FString("absPath"), new FString(e.getAbsolutePath()));
String s = StrUtil.replace(e.getAbsolutePath(),CommonConf.farProjDir+File.separator,"");
s = StrUtil.replace(s,"\\","/");
fMap.put(callFrame, new FString("path"), new FString(s));
//是否隱藏
fMap.put(callFrame, new FString("isHidden"), e.isHidden() ? new FBool(1) : new FBool(0));
//最后修改時間
fMap.put(callFrame, new FString("lastModified"), new FLong(e.lastModified()));
fArray.add(callFrame, fMap);
});
callFrame.getStack().push(fArray);
return null;
}
public static IFarObject toJsonStr(FrameObject callFrame, List<IFarObject> args) {
Stack<IFarObject> refObjStack = new Stack<>();
callFrame.getStack().push(new FString(args.get(0).getIklass().toJsonValue(callFrame,refObjStack).toString()));
return null;
}
public static IFarObject toType(Object e){
if(e instanceof String){
return new FString(e.toString());
} else if (e instanceof Integer) {
return new FInt(String.valueOf(e));
} else if (e instanceof JSONObject val) {
return toMapVal(val);
}else if (e instanceof JSONArray arrayVal) {
FArray fArray= new FArray();
arrayVal.forEach(e2e->{
fArray.add(toType(e2e));
});
return fArray;
}
return null;
}
public static IFarObject toMapVal(JSONObject e){
FMap fMap = new FMap();
e.forEach((k,v)->{
fMap.put(new FString(k),toType(v));
});
return fMap;
}
public static void toMap(FrameObject callFrame,FMap fMap,JSONObject jObj){
jObj.forEach((k,v)->{
fMap.put(callFrame,new FString(k),toType(v));
});
}
public static IFarObject jsonStrToMap(FrameObject callFrame, List<IFarObject> args) {
String jstr = args.get(0).fString().val();
JSONObject jObj = JSONUtil.parseObj( jstr );
FMap fMap = new FMap();
jObj.forEach((k,v)->{
fMap.put(callFrame,new FString(k),toType(v));
});
callFrame.getStack().push(fMap);
return null;
}
/**
* 獲取類名
* @param callFrame
* @param args
* @return
*/
public static IFarObject baseName(FrameObject callFrame, List<IFarObject> args) {
IFarObject obj = args.get(0);
callFrame.getStack().push(new FString(obj.getIklass().getKlassName()));
return null;
}
public static IFarObject varDump(FrameObject frameObject, List<IFarObject> args){
String retVal = "";
String hashCode = String.valueOf(args.get(0).hashCode());
if (args.get(0).getIklass().klsType() == KlassBase.LONG) {
retVal = String.format("long(%s)#%d",hashCode,args.get(0).getIklass().getLongKlass().getVal());
} else if (args.get(0).getIklass().klsType() == KlassBase.STR) {
retVal = String.format("string(%s)#%s",hashCode,args.get(0).getIklass().getStringKlass().getVal());
} else if (args.get(0).getIklass().klsType() == KlassBase.DOUBLE) {
} else if (args.get(0).getIklass().klsType() == KlassBase.ARRAY) {
}
else if (args.get(0).getIklass().klsType() == KlassBase.MAP) {
retVal = String.format("map(%s)#%s",hashCode,args.get(0).toString());
}
else if (args.get(0).getIklass().klsType() == KlassBase.INT) {
retVal = String.format("int(%s)#%d",hashCode,args.get(0).fInt().val());
}
else if (args.get(0).getIklass().klsType() == KlassBase.BOOL) {
String s = args.get(0).getIklass().getBoolKlass().getVal()==1?"true":"false";
retVal = String.format("bool(%s)#%s",hashCode,s);
}
else if (args.get(0).getIklass().klsType() == KlassBase.UOBJ) {
retVal = String.format("object(%s)#%s",args.get(0).hashCode(), args.get(0).getIklass().getKlassName());
}
else {
retVal = String.format("not processing(%s)#%s",hashCode,args.get(0).getIklass().getKlassName());
}
frameObject.getStack().push(new FString(retVal));
return null;
}
public static IFarObject println(FrameObject callFrame, List<IFarObject> args) {
if (args.get(0).getIklass().klsType() == KlassBase.LONG) {
System.out.println(args.get(0).getIklass().getLongKlass().getVal());
} else if (args.get(0).getIklass().klsType() == KlassBase.STR) {
System.out.println(args.get(0).getIklass().getStringKlass().getVal());
} else if (args.get(0).getIklass().klsType() == KlassBase.DOUBLE) {
System.out.println(args.get(0).getIklass().getDoubleKlass().getVal());
} else if (args.get(0).getIklass().klsType() == KlassBase.ARRAY) {
String hasCode = String.valueOf(args.get(0).getClass().hashCode());
String s = "array#"+hasCode+" size "+args.get(0).getIklass().getArrayKlass().getDatas().size();
System.out.println(s);
}
else if (args.get(0).getIklass().klsType() == KlassBase.MAP) {
System.out.println(args.get(0).getIklass().toString());
}
else if (args.get(0).getIklass().klsType() == KlassBase.INT) {
System.out.println(args.get(0).getIklass().toString());
}
else if (args.get(0).getIklass().klsType() == KlassBase.BOOL) {
String s = args.get(0).getIklass().getBoolKlass().getVal()==1?"true":"false";
s= "bool#"+args.get(0).hashCode()+" ("+s+")";
System.out.println( s );
}
else {
;
System.out.println(JSONUtil.toJsonStr(args.get(0).getIklass().getKlassName()));
}
callFrame.getStack().push( new FInt(0) );
return null;
}
public Long getVal() {
return val;
}
public void setVal(Long val) {
this.val = val;
}
@Override
public EfuncKlass getEfuncKlass() {
return this;
}
@Override
public int klsType() {
return KlassBase.EFUNC;
}
private Long val;
//用戶模擬的內置函數列表,可在用戶代碼中添加
private List<IFarObject> userSimulationFuns = new ArrayList<>();
public List<IFarObject> getUserSimulationFuns() {
return userSimulationFuns;
}
public void setUserSimulationFuns(List<IFarObject> userSimulationFuns) {
this.userSimulationFuns = userSimulationFuns;
}
}
Rust編程語言群 1036955113
java新手自學群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/開發/運維)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
單片機嵌入式/電子電路入門群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系統研發群:15375777
匯編/輔助/破解新手群:755783453
大數據 elasticsearch 群 481975850
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
java新手自學群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/開發/運維)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
單片機嵌入式/電子電路入門群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系統研發群:15375777
匯編/輔助/破解新手群:755783453
大數據 elasticsearch 群 481975850
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

浙公網安備 33010602011771號