diff --git a/bytemaster/Windows/makefile b/bytemaster/Windows/makefile new file mode 100644 index 0000000000000000000000000000000000000000..4ee859aa8bc295b02acc550b21efb649ef26542e --- /dev/null +++ b/bytemaster/Windows/makefile @@ -0,0 +1,11 @@ +T = ElsLib_bytemaster.lsd +CFLAGS = -O2 -std=c99 -DELS_CONF_OS_WINDOWS -I ../buildenv -L ../buildenv -fPIC -s -l:libeasylosu.dll +CPPFLAGS = -O3 -std=c++11 -DELS_CONF_OS_WINDOWS -I ./include -I ../buildenv + +all: $T + +$T: + gcc bytemaster.c -o $(T) -shared $(CFLAGS) + +clean: + rm *.o diff --git a/bytemaster/bytemaster.c b/bytemaster/bytemaster.c new file mode 100644 index 0000000000000000000000000000000000000000..2e6b6454c102403a951ad3c834f1dfd06ca21a01 --- /dev/null +++ b/bytemaster/bytemaster.c @@ -0,0 +1,63 @@ +#include "bytemaster.h" + +#include +#include + +#define unit_arg(x) x+1 +#define unit_atype(vm, x) arg_gettype(vm, x+1) + +int ELSAPI_bytemaster_bytemaster_alloc(els_VmObj* vm) // mem_alloc(length:int) +{ + int type = arg_gettype(vm, unit_arg(1)); + + if (type == ELS_API_TYPE_NUMBER) + { + size_t l = arg_getnum(vm, unit_arg(1)); + void *m = calloc(l, sizeof(char)); + arg_returnbyte(vm, m, l); + free(m); + } + else + arg_returnnull(vm); + return 1; +} + +int ELSAPI_bytemaster_bytemaster_write(els_VmObj* vm) // mem_write(m:byte, index:int, data:[int/byte/str]) +{ + if (unit_atype(vm, 1) == ELS_API_TYPE_BYTE && unit_atype(vm, 2) == ELS_API_TYPE_NUMBER && unit_atype(vm, 3) != ELS_API_TYPE_NULL) + { + char *m = (char*)arg_getbyte(vm, unit_arg(1)); + size_t index = arg_getnum(vm, unit_arg(2)); + + if (unit_atype(vm, 3) == ELS_API_TYPE_NUMBER) + { + char ch = arg_getnum(vm, unit_arg(3)); + m[index] = ch; + } + else if (unit_atype(vm, 3) == ELS_API_TYPE_STRING) + { + const char *s = arg_getstr(vm, unit_arg(3)); + sprintf(m + index, "%s", s); + } + + arg_return(vm, *arg_get(vm, unit_arg(1))); + } + else + arg_returnnull(vm); + return 1; +} + +int ELSAPI_bytemaster_bytemaster_read(els_VmObj* vm) // bytemaster_read(m:byte, index:int, size:int) +{ + if (unit_atype(vm, 1) == ELS_API_TYPE_BYTE && unit_atype(vm, 2) == ELS_API_TYPE_NUMBER && unit_atype(vm, 3) == ELS_API_TYPE_NUMBER) + { + char *m = (char*)arg_getbyte(vm, unit_arg(1)); + size_t index = arg_getnum(vm, unit_arg(2)); + size_t msize = arg_getnum(vm, unit_arg(3)); + + arg_returnbyte(vm, m + index, msize); + } + else + arg_returnnull(vm); + return 1; +} diff --git a/bytemaster/bytemaster.els b/bytemaster/bytemaster.els new file mode 100644 index 0000000000000000000000000000000000000000..97ad388956eb5a1ae94e56418e492721e1025cc0 --- /dev/null +++ b/bytemaster/bytemaster.els @@ -0,0 +1,17 @@ +#!declare + +bytemaster_alloc(length:int) +bytemaster_write(m:byte, index:int, data:[int/byte/str]) +bytemaster_read(m:byte, index:int, size:int) + +#!end + +#!script + +var bytemaster = { + alloc = bytemaster_alloc, + write = bytemaster_write, + read = bytemaster_read +} + +#!end diff --git a/bytemaster/bytemaster.h b/bytemaster/bytemaster.h new file mode 100644 index 0000000000000000000000000000000000000000..ca99167c155e1e5b3e429fcd934e06436f6df5df --- /dev/null +++ b/bytemaster/bytemaster.h @@ -0,0 +1,23 @@ +#include "els.h" +int ELSAPI_bytemaster_bytemaster_alloc(els_VmObj* vm); // bytemaster_alloc(length:int) +int ELSAPI_bytemaster_bytemaster_write(els_VmObj* vm); // bytemaster_write(m:byte, index:int, data:[int/byte/str]) +int ELSAPI_bytemaster_bytemaster_read(els_VmObj* vm); // bytemaster_read(m:byte, index:int, size:int) +#ifdef ELS_CONF_TOKEN_EN +static const char LibScript[]={ +10, +118,97,114,32,98,121,116,101,109,97,115,116,101,114,32,61,32,123,10, +32,32,32,32,97,108,108,111,99,32,61,32,98,121,116,101,109,97,115,116,101,114,95,97,108,108,111,99,44,10, +32,32,32,32,119,114,105,116,101,32,61,32,98,121,116,101,109,97,115,116,101,114,95,119,114,105,116,101,44,10, +32,32,32,32,114,101,97,100,32,61,32,98,121,116,101,109,97,115,116,101,114,95,114,101,97,100,10, +125,10, +10, +0}; +#endif +void ElsLib_bytemaster_libinit(els_VmObj *vm){ + vm_register(vm,"bytemaster_read",ELSAPI_bytemaster_bytemaster_read); + vm_register(vm,"bytemaster_write",ELSAPI_bytemaster_bytemaster_write); + vm_register(vm,"bytemaster_alloc",ELSAPI_bytemaster_bytemaster_alloc); + #ifdef ELS_CONF_TOKEN_EN + vm_dostring(vm,LibScript); + #endif +}; diff --git a/bytemaster/demo.els b/bytemaster/demo.els new file mode 100644 index 0000000000000000000000000000000000000000..a90118786f71181800acf4cf4c96a9ce3837e575 --- /dev/null +++ b/bytemaster/demo.els @@ -0,0 +1,6 @@ +import "bytemaster" +var a = bytemaster.alloc(32) +bytemaster.write(a, 3, "Hello world!") +var s = byte.tostr(bytemaster.read(null, a, 3, length("Hello world!"))) +print(s) + diff --git a/bytemaster/info b/bytemaster/info new file mode 100644 index 0000000000000000000000000000000000000000..b9733d891de776141a098f125bf3acdad07bfe5c --- /dev/null +++ b/bytemaster/info @@ -0,0 +1,24 @@ +{ + type = "normal", + info = { + name = "bytemaster", + text = "洛书的byte操作库", + version = "24.4.4" + }, + source = { + all = { + "info", + "bytemaster.c", + "bytemaster.h", + "bytemaster.els", + "demo.els", + "readme.md", + }, + Windows ={ + "makefile", + }, + }, + target={ + Windows = "make ; cp ElsLib_bytemaster.lsd target/ElsLib_bytemaster.lsd_Windows ; make clean", + } +} diff --git a/bytemaster/readme.md b/bytemaster/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..836c69c09fc53c3bb1be8ebeb248df5b17f622ac --- /dev/null +++ b/bytemaster/readme.md @@ -0,0 +1,30 @@ +# bytemaster模块文档 + +bytemaster是一个byte操作库,用于在脚本层面对byte进行类似c的操作。 + +## 函数列表 + +### bytemaster.alloc + +bytemaster.alloc(length:int) + +分配一块长为length的内存,以byte形式返回。 + +### bytemaster.write + +bytemaster.write(m:byte, index:int, data:[int/byte/str]) + +对byte类型数据m,从第index号偏移起,写入data。 + +当data类型为int时,被转换为char。当data类型为byte时,当前版本不做处理。当data类型为str时,将字符串整个写入。 + +### bytemaster.read + +bytemaster.read(m:byte, index:int, size:int) + +对byte类型数据m,从第index号偏移起,读取size个字节,以byte形式返回。 + +## 贡献者名单 + +2024-4-4 成天宇 创始模块 +2024-4-4 张耀源 优化代码逻辑 \ No newline at end of file