add runtime.gc.extend

This commit is contained in:
ValKmjolnir 2022-12-04 20:28:51 +08:00
parent 9c6996b54e
commit de524938cf
10 changed files with 237 additions and 135 deletions

View File

@ -3,6 +3,8 @@
dynamic_libs_so=libfib.so libkey.so libnasock.so libmat.so
dynamic_libs_dll=libfib.dll libkey.dll libnasock.dll libmat.dll
used_header= ../nasal.h ../nasal_gc.h
STD=c++14
all: $(dynamic_libs_so)
@ -10,45 +12,45 @@ all: $(dynamic_libs_so)
winall: $(dynamic_libs_dll)
@ echo [Compiling] done
libfib.so: fib.cpp
libfib.so: fib.cpp $(used_header)
@ echo "[Compiling] libfib.so"
@ $(CXX) -std=$(STD) -c -O3 fib.cpp -fPIC -o fib.o
@ $(CXX) -shared -o libfib.so fib.o
@ rm fib.o
libfib.dll: fib.cpp
libfib.dll: fib.cpp $(used_header)
@ echo [Compiling] libfib.dll
@ $(CXX) -std=$(STD) -c -O3 fib.cpp -fPIC -o fib.o
@ $(CXX) -shared -o libfib.dll fib.o
@ del fib.o
libkey.so: keyboard.cpp
libkey.so: keyboard.cpp $(used_header)
@ echo "[Compiling] libkey.so"
@ $(CXX) -std=$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o
@ $(CXX) -shared -o libkey.so keyboard.o
@ rm keyboard.o
libkey.dll: keyboard.cpp
libkey.dll: keyboard.cpp $(used_header)
@ echo [Compiling] libkey.dll
@ $(CXX) -std=$(STD) -c -O3 keyboard.cpp -fPIC -o keyboard.o -static
@ $(CXX) -shared -o libkey.dll keyboard.o -static
@ del keyboard.o
libnasock.so: nasocket.cpp
libnasock.so: nasocket.cpp $(used_header)
@ echo "[Compiling] libnasock.so"
@ $(CXX) -std=$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o
@ $(CXX) -shared -o libnasock.so nasocket.o
@ rm nasocket.o
libnasock.dll: nasocket.cpp
libnasock.dll: nasocket.cpp $(used_header)
@ echo [Compiling] libnasock.dll
@ $(CXX) -std=$(STD) -c -O3 nasocket.cpp -fPIC -o nasocket.o -lwsock32 -static
@ $(CXX) -shared -o libnasock.dll nasocket.o -lwsock32 -static
@ del nasocket.o
libmat.so: matrix.cpp
libmat.so: matrix.cpp $(used_header)
@ echo "[Compiling] libmat.so"
@ $(CXX) -std=$(STD) -c -O3 matrix.cpp -fPIC -o matrix.o
@ $(CXX) -shared -o libmat.so matrix.o
@ rm matrix.o
libmat.dll: matrix.cpp
libmat.dll: matrix.cpp $(used_header)
@ echo [Compiling] libmat.dll
@ $(CXX) -std=$(STD) -c -O3 matrix.cpp -fPIC -o matrix.o -static
@ $(CXX) -shared -o libmat.dll matrix.o -static

View File

@ -1201,6 +1201,30 @@ var builtin_sysargv(var* local,gc& ngc) {
return res;
}
var builtin_gcextend(var* local,gc& ngc) {
var type=local[1];
if (type.type!=vm_str) {
return nil;
}
auto& s=type.str();
if (s=="str") {
ngc.extend(vm_str);
} else if (s=="vec") {
ngc.extend(vm_vec);
} else if (s=="hash") {
ngc.extend(vm_hash);
} else if (s=="func") {
ngc.extend(vm_func);
} else if (s=="upval") {
ngc.extend(vm_upval);
} else if (s=="obj") {
ngc.extend(vm_obj);
} else if (s=="co") {
ngc.extend(vm_co);
}
return nil;
}
var builtin_logtime(var* local,gc& ngc) {
time_t t=time(nullptr);
tm* tm_t=localtime(&t);
@ -1315,6 +1339,7 @@ struct {
{"__corun" ,builtin_corun },
{"__millisec",builtin_millisec},
{"__sysargv", builtin_sysargv },
{"__gcextd", builtin_gcextend},
{"__logtime", builtin_logtime },
{nullptr, nullptr }
};

View File

@ -94,8 +94,8 @@ struct var {
var(const u8 t,var* n):type(t) {val.addr=n;}
// copy
var(const var& nr):type(nr.type),val(nr.val) {}
bool operator==(const var& nr) {return type==nr.type && val.gcobj==nr.val.gcobj;}
bool operator!=(const var& nr) {return type!=nr.type || val.gcobj!=nr.val.gcobj;}
bool operator==(const var& nr) const {return type==nr.type && val.gcobj==nr.val.gcobj;}
bool operator!=(const var& nr) const {return type!=nr.type || val.gcobj!=nr.val.gcobj;}
// number and string can be translated to each other
f64 tonum();
string tostr();
@ -115,23 +115,21 @@ struct var {
};
struct nas_vec {
bool printed;
std::vector<var> elems;
bool printed;
nas_vec():printed(false) {}
friend std::ostream& operator<<(std::ostream&,nas_vec&);
usize size() {return elems.size();}
usize size() const {return elems.size();}
var get_val(const i32);
var* get_mem(const i32);
};
struct nas_hash {
bool printed;
std::unordered_map<string,var> elems;
bool printed;
nas_hash():printed(false) {}
friend std::ostream& operator<<(std::ostream&,nas_hash&);
usize size() {return elems.size();}
usize size() const {return elems.size();}
var get_val(const string&);
var* get_mem(const string&);
};
@ -236,12 +234,14 @@ struct nas_co {
funcr({vm_nil,(f64)0}),
upvalr({vm_nil,(f64)0}),
status(nas_co::suspended) {
for(u32 i=0;i<STACK_DEPTH;++i)
for(u32 i=0;i<STACK_DEPTH;++i) {
stack[i]={vm_nil,(f64)0};
}
}
void clear() {
for(u32 i=0;i<STACK_DEPTH;++i)
for(u32 i=0;i<STACK_DEPTH;++i) {
stack[i]={vm_nil,(f64)0};
}
pc=0;
localr=nullptr;
memr=nullptr;
@ -306,7 +306,7 @@ std::ostream& operator<<(std::ostream& out,nas_vec& vec) {
var nas_hash::get_val(const string& key) {
if (elems.count(key)) {
return elems[key];
return elems.at(key);
} else if (elems.count("parents")) {
var ret(vm_none);
var val=elems["parents"];
@ -326,7 +326,7 @@ var nas_hash::get_val(const string& key) {
var* nas_hash::get_mem(const string& key) {
if (elems.count(key)) {
return &elems[key];
return &elems.at(key);
} else if (elems.count("parents")) {
var* addr=nullptr;
var val=elems["parents"];
@ -503,6 +503,7 @@ struct gc {
worktime(0) {}
void mark();
void sweep();
void extend(u8);
void init(const std::vector<string>&,const std::vector<string>&);
void clear();
void info();
@ -577,8 +578,7 @@ void gc::mark() {
}
}
void gc::sweep()
{
void gc::sweep() {
for(auto i:memory) {
if (i->mark==GC_UNCOLLECTED) {
i->clear();
@ -590,6 +590,16 @@ void gc::sweep()
}
}
void gc::extend(u8 type) {
u8 index=type-vm_str;
++size[index];
for(u32 i=0;i<incr[index];++i) {
nas_val* tmp=new nas_val(type);
memory.push_back(tmp);
unused[index].push(tmp);
}
}
void gc::init(const std::vector<string>& s,const std::vector<string>& argv) {
// initiaize function register
funcr=nil;
@ -661,7 +671,7 @@ void gc::info() {
}
}
double t=worktime*1.0/1000000000; // seconds
std::cout<<" time | "<<(t<0.1? t*1000:t)<<(t<0.1? "ms\n":"s\n");
std::cout<<" time | "<<(t<0.1? t*1000:t)<<(t<0.1? " ms\n":" s\n");
if (total) {
std::cout<<" avg | "<<t/total*1000<<" ms\n";
}
@ -678,12 +688,7 @@ var gc::alloc(u8 type) {
worktime+=(std::chrono::high_resolution_clock::now()-begin).count();
}
if (unused[index].empty()) {
++size[index];
for(u32 i=0;i<incr[index];++i) {
nas_val* tmp=new nas_val(type);
memory.push_back(tmp);
unused[index].push(tmp);
}
extend(type);
}
var ret={type,unused[index].front()};
ret.val.gcobj->mark=GC_UNCOLLECTED;

View File

@ -828,7 +828,7 @@ inline void vm::o_slc() {
var val=(top--)[0];
var res=top[-1].vec().get_val(val.tonum());
if (res.type==vm_none) {
die("out of range:"+std::to_string(val.tonum()));
die("index "+std::to_string(val.tonum())+" out of range");
return;
}
top[0].vec().elems.push_back(res);
@ -854,7 +854,7 @@ inline void vm::o_slc2() {
}
if (num1<-size || num1>=size || num2<-size || num2>=size) {
die("index "+std::to_string(num1)+":"+std::to_string(num2)+" out of range.");
die("index "+std::to_string(num1)+":"+std::to_string(num2)+" out of range");
return;
} else if (num1<=num2) {
for(i32 i=num1;i<=num2;++i) {
@ -890,12 +890,12 @@ inline void vm::o_mcallv() {
if (vec.type==vm_vec) {
memr=vec.vec().get_mem(val.tonum());
if (!memr) {
die("out of range:"+std::to_string(val.tonum()));
die("index "+std::to_string(val.tonum())+" out of range");
return;
}
} else if (vec.type==vm_hash) { // do mcallh but use the mcallv way
if (val.type!=vm_str) {
die("must use string as the key");
die("key must be string");
return;
}
nas_hash& ref=vec.hash();
@ -958,8 +958,10 @@ inline void vm::o_ret() {
auto& upval=up.upval();
auto size=func.func().lsize;
upval.onstk=false;
for(u32 i=0;i<size;++i)
upval.elems.push_back(local[i]);
upval.elems.resize(size);
for(u32 i=0;i<size;++i) {
upval.elems[i]=local[i];
}
}
// cannot use gc.cort to judge,
// because there maybe another function call inside

View File

@ -479,7 +479,10 @@ var os={
# runtime gives us some functions that we could manage it manually.
var runtime={
# command line arguments
argv: func(){return __sysargv;}
argv: func(){return __sysargv;},
gc: {
extend: func(type){return __gcextd;}
}
};
# functions that not supported in this runtime:

View File

@ -1,6 +1,11 @@
import.stl.sort;
import.stl.process_bar;
for(var i=0;i<3910;i+=1){
runtime.gc.extend("str");
runtime.gc.extend("vec");
}
var test=func(n){
var ts=maketimestamp();
var bar=process_bar.high_resolution_bar(50);
@ -56,8 +61,8 @@ var test=func(n){
}
}
println(cnt," result(s) in ",ts.elapsedMSec()/1000," sec");
println(str(cnt)," result(s) in ",ts.elapsedMSec()/1000," sec");
}
for(var i=100;i<1e6;i*=10)
for(var i=100;i<1e7;i*=10)
test(i);

View File

@ -1,5 +1,9 @@
import.module.libsock;
for(var i=0;i<60;i+=1){
runtime.gc.extend("str");
}
var http=func(){
var sd=nil;
return {

View File

@ -5,25 +5,33 @@ for(;;){
}
for(var i=1;;)break;
for(var i=1;;i+=1)break;
for(var i=1;i<10;i+=1)print(i,'\n');
for(var i=1;i<10;i+=1)
print(i," ");
print("\n");
while(1)break;
var j=0;
while(j<10){
print(j,'\n');
print(j," ");
j+=1;
}
print("\n");
forindex(var j;[0,1,2,3])print(j,'\n');
forindex(var j;[0,1,2,3])
print(j," ");
print("\n");
forindex(var j;[0,1,2,3]){
var a=j;
print(a*a,'\n');
print(a*a," ");
}
foreach(var j;[0,1,2,3])print([0,1,2,3][j],'\n');
print("\n");
foreach(var j;[0,1,2,3])
print([0,1,2,3][j]," ");
print("\n");
foreach(var j;[0,1,2,3]){
var a=[0,1,2,3][j];
print(a*a-1,'\n');
print(a*a-1," ");
}
print("\n");
var f=func(){
var x=0;

View File

@ -64,47 +64,18 @@ var mem_occupation=func(){
return mem_res;
}
func(){
var limited_loop=(size(runtime.argv())!=0 and !math.isnan(num(runtime.argv()[0])));
if(limited_loop){
limited_loop=num(runtime.argv()[0]);
}else{
limited_loop=-1;
}
var random_generator=func(){
var rise=[" ","▁","▂","▃","▄","▅","▆","▇","█"];
var total=0;
var statistics=[];
setsize(statistics,70);
var co=coroutine.create(cpu_occupation);
var bar=process_bar.high_resolution_bar(48);
print("\ec");
while(limited_loop!=0){
limited_loop=limited_loop<0?limited_loop:limited_loop-1;
var mem=mem_occupation();
var mem_occ=(mem.MemTotal-mem.MemFree)/mem.MemTotal*100;
if(math.isnan(mem_occ) or mem_occ<0 or mem_occ>100){
mem_occ=0;
}
var cpu_occ=nil;
while((cpu_occ=coroutine.resume(co)[0])==nil){
var key=libkey.nonblock();
if(key!=nil and chr(key)=="q")
return;
}
println("\e[1;1H\e[1m Operating system : \e[0m",is_windows_platform?"\e[31m":"\e[36m",os.platform(),"\e[0m");
println("\e[2;1H\e[1m Current time : \e[0m\e[36m",os.time(),"\e[0m");
println("\e[3;1H\e[1m Memory total(GB) : \e[0m\e[36m",mem.MemTotal/1024/1024,"\e[0m");
println("\e[4;1H\e[1m Memory free(GB) : \e[0m\e[36m",mem.MemFree/1024/1024,"\e[0m");
println("\e[5;1H\e[1m Memory occupation(%): \e[0m",mem_occ>60?"\e[91m":"\e[32m",bar.bar(mem_occ/100)~" ",mem_occ,"\e[0m ");
println("\e[6;1H\e[1m CPU occupation(%) : \e[0m",cpu_occ>90?"\e[91m":"\e[32m",bar.bar(cpu_occ/100)~" ",cpu_occ,"\e[0m ");
for(var i=0;i<size(statistics);i+=1){
while(1){
for(var i=0;i<10;i+=1){
total+=1;
var u=rand()*rand()*(rand()>0.5?-1:1);
statistics[int(size(statistics)/2+u*size(statistics)/2)]+=1;
}
var s=["","","",""];
var s=["","",""];
foreach(var st;statistics){
var max_rate=100/size(statistics);
var rate=st/total*100;
@ -118,17 +89,117 @@ func(){
}
}
}
var tmp="";
var tmp="";
for(var i=0;i<size(statistics);i+=1){
tmp~="-";
}
println("\e[16;1H \e[32m|",s[0],"|\e[0m");
println("\e[17;1H \e[32m|",s[1],"|\e[0m");
println("\e[18;1H \e[32m|",s[2],"|\e[0m");
println("\e[19;1H \e[32m+"~tmp~"+\e[0m");
coroutine.yield();
}
}
func(){
var limited_loop=(size(runtime.argv())!=0 and !math.isnan(num(runtime.argv()[0])));
if(limited_loop){
limited_loop=num(runtime.argv()[0]);
}else{
limited_loop=-1;
}
var rise=[" ","▁","▂","▃","▄","▅","▆","▇","█"];
var cpu_occupation_log=[];
var mem_occupation_log=[];
setsize(cpu_occupation_log,70);
setsize(mem_occupation_log,70);
var co=coroutine.create(cpu_occupation);
var rd=coroutine.create(random_generator);
var bar=process_bar.high_resolution_bar(48);
print("\ec");
while(limited_loop!=0){
limited_loop=limited_loop<0?limited_loop:limited_loop-1;
var mem=mem_occupation();
var mem_occ=(mem.MemTotal-mem.MemFree)/mem.MemTotal*100;
if(math.isnan(mem_occ) or mem_occ<0 or mem_occ>100){
mem_occ=0;
}
var cpu_occ=nil;
while((cpu_occ=coroutine.resume(co)[0])==nil){
var key=libkey.nonblock();
coroutine.resume(rd);
if(key!=nil and chr(key)=="q")
return;
}
if(is_windows_platform or is_macos_platform){
# sorry this is not real data
cpu_occ=rand()*10;
mem_occ=rand()*10+40;
}
for(var i=0;i<size(cpu_occupation_log)-1;i+=1){
cpu_occupation_log[i]=cpu_occupation_log[i+1];
mem_occupation_log[i]=mem_occupation_log[i+1];
}
cpu_occupation_log[-1]=cpu_occ;
mem_occupation_log[-1]=mem_occ;
println("\e[1;1H\e[1m Operating system : \e[0m",is_windows_platform?"\e[31m":"\e[36m",os.platform(),"\e[0m");
println("\e[2;1H\e[1m Current time : \e[0m\e[36m",os.time(),"\e[0m");
println("\e[3;1H\e[1m Memory total(GB) : \e[0m\e[36m",mem.MemTotal/1024/1024,"\e[0m");
println("\e[4;1H\e[1m Memory free(GB) : \e[0m\e[36m",mem.MemFree/1024/1024,"\e[0m");
println("\e[5;1H\e[1m Memory occupation(%): \e[0m",mem_occ>60?"\e[91m":"\e[32m",bar.bar(mem_occ/100)~" ",mem_occ,"\e[0m ");
println("\e[6;1H\e[1m CPU occupation(%) : \e[0m",cpu_occ>90?"\e[91m":"\e[32m",bar.bar(cpu_occ/100)~" ",cpu_occ,"\e[0m ");
var tmp="";
for(var i=0;i<70;i+=1){
tmp~="-";
}
var s=["","",""];
foreach(var occ;cpu_occupation_log){
var max_rate=50/size(s);
var rate=occ;
for(var i=size(s)-1;i>=0;i-=1){
if(rate>=max_rate){
s[i]~="█";
rate-=max_rate;
}else{
s[i]~=rise[rate/max_rate*size(rise)];
rate=0;
}
}
}
println("\e[7;1H \e[32m+"~tmp~"+\e[0m");
println("\e[8;1H \e[32m|",s[0],"|\e[0m");
println("\e[9;1H \e[32m|",s[1],"|\e[0m");
println("\e[10;1H \e[32m|",s[2],"|\e[0m");
println("\e[11;1H \e[32m|",s[3],"|\e[0m");
println("\e[12;1H \e[32m+"~tmp~"+\e[0m");
println("\e[11;1H \e[32m+"~tmp~"+\e[0m");
println("\e[13;1H Press 'q' to quit.");
var s=["","",""];
foreach(var occ;mem_occupation_log){
var max_rate=100/size(s);
var rate=occ;
for(var i=size(s)-1;i>=0;i-=1){
if(rate>=max_rate){
s[i]~="█";
rate-=max_rate;
}else{
s[i]~=rise[rate/max_rate*size(rise)];
rate=0;
}
}
}
println("\e[12;1H \e[32m|",s[0],"|\e[0m");
println("\e[13;1H \e[32m|",s[1],"|\e[0m");
println("\e[14;1H \e[32m|",s[2],"|\e[0m");
println("\e[15;1H \e[32m+"~tmp~"+\e[0m");
println("\e[20;1H Press 'q' to quit.");
}
}();

View File

@ -1,25 +1,33 @@
var code=[
[1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1],
[1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1],
[1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1],
[1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1],
[1,0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1],
[1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1],
[1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0],
[1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,1,1,1,1,1,1,0,1,0,0,1,1,0,1,0,1,0,1,1,0,0,1,1,1,1,1,1,1],
[1,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,1,1,1,1,0,1,0,0,0,0,0,1],
[1,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,1,1,0,1],
[1,0,1,1,1,0,1,0,0,0,0,0,1,0,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1],
[1,0,1,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1],
[1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,1],
[1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1],
[0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0],
[1,1,0,1,1,0,1,0,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1],
[1,1,0,1,0,0,0,1,1,1,0,0,1,1,1,1,0,1,1,1,0,1,0,1,1,0,1,1,0],
[1,0,1,1,0,1,1,1,0,0,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,1,0,0],
[0,0,0,0,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,1],
[0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1],
[1,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1],
[1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,1,1,1,0,1,0,1,0,1],
[0,0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1],
[0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0],
[1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,1,0],
[1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,1,1,1,0,1,0,0,0,0,1,1,0,0,1],
[1,1,1,1,1,1,0,0,0,1,1,0,0,1,0,1,1,0,1,1,0,0,1,0,0,1,1,0,0],
[1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,1,1,1,1,1,0],
[0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,0],
[1,1,1,1,1,1,1,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,1,0,1,1,0,0,0],
[1,0,0,0,0,0,1,0,0,1,1,1,0,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1],
[1,0,1,1,1,0,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,1,1],
[1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1],
[1,0,1,1,1,0,1,0,0,0,0,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,1,1,1],
[1,0,0,0,0,0,1,0,1,0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,1],
[1,1,1,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,0,1,1,0,1,0,1,0,0,0,0],
];
# enable unicode
@ -30,35 +38,4 @@ for(var i=0;i<size(code);i+=1){
for(var j=0;j<size(code[i]);j+=1)
print(texture[code[i][j]]);
print('\n');
}
var transfer=func(s){
var mode=[0,1,0,0];
println(mode);
var len=size(s);
var vec=[0,0,0,0,0,0,0,0,0];
for(var i=8;i>=0;i-=1){
vec[i]=bits.u32_and(1,len);
len=int(len/2);
}
println(vec);
var bitstr=[];
for(var i=0;i<size(s);i+=1){
var tmp=[0,0,0,0,0,0,0,0];
var c=s[i];
for(var j=7;j>=0;j-=1){
tmp[j]=bits.u32_and(1,c);
c=int(c/2);
}
foreach(var j;tmp)
append(bitstr,j);
}
println(bitstr);
var end=[0,0,0,0];
println(end);
}
transfer("github.com/ValKmjolnir");
}