added string functions
This commit is contained in:
parent
37b6e8ecdb
commit
d22014a1e0
2 changed files with 179 additions and 12 deletions
|
@ -1,6 +1,6 @@
|
|||
use std::{collections::HashMap, io::{BufReader, Read, Write}, net::{self, TcpListener, TcpStream}, process, thread::sleep, time::Duration};
|
||||
|
||||
use crate::{errors::{create_error, print_error, ErrorSubType, ErrorType}, virtualmachine::{DecompiledOperation, Machine, TableValue, VMMemory, VMMemoryNativeFunction, VMMemoryNull, VMMemoryNumber, VMMemoryString, VMMemoryTable}};
|
||||
use crate::{errors::{create_error, print_error, ErrorSubType, ErrorType}, virtualmachine::{DecompiledOperation, Machine, TableValue, VMMemory, VMMemoryBoolean, VMMemoryNativeFunction, VMMemoryNull, VMMemoryNumber, VMMemoryString, VMMemoryTable}};
|
||||
|
||||
fn get_string_from_vmmem(mem: &VMMemory) -> String {
|
||||
let mut out = String::new();
|
||||
|
@ -354,6 +354,129 @@ fn kabel_halgass(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMe
|
|||
return VMMemory::Table(VMMemoryTable { values: ret_table, variable_id: 0 });
|
||||
}
|
||||
|
||||
fn szaft_csemerdfel(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
return VMMemory::String(VMMemoryString { value: str.to_uppercase(), variable_id: 0 });
|
||||
}
|
||||
fn szaft_csemerdle(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
return VMMemory::String(VMMemoryString { value: str.to_lowercase(), variable_id: 0 });
|
||||
}
|
||||
fn szaft_hossz(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
return VMMemory::Number(VMMemoryNumber { value: str.len() as i64, variable_id: 0 });
|
||||
}
|
||||
fn szaft_ismeteld(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
arg_expect(&args, 1, "number", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
let times = match &args[1] {
|
||||
VMMemory::Number(n) => n.value as usize,
|
||||
_ => 1
|
||||
};
|
||||
return VMMemory::String(VMMemoryString { value: str.repeat(times), variable_id: 0 });
|
||||
}
|
||||
fn szaft_unoreverse(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
return VMMemory::String(VMMemoryString { value: str.chars().rev().collect(), variable_id: 0 });
|
||||
}
|
||||
fn szaft_darabos(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
arg_expect(&args, 1, "number", machine, op);
|
||||
arg_expect(&args, 2, "number", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
let num1 = match &args[1] {
|
||||
VMMemory::Number(n) => n.value as usize,
|
||||
_ => 0
|
||||
};
|
||||
let num2 = match &args[2] {
|
||||
VMMemory::Number(n) => n.value as usize,
|
||||
_ => 0
|
||||
};
|
||||
return VMMemory::String(VMMemoryString { value: str[num1..num2].to_string(), variable_id: 0 });
|
||||
}
|
||||
fn szaft_keres(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
arg_expect(&args, 1, "string", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
let str2 = match &args[1] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
return VMMemory::Boolean(VMMemoryBoolean { value: str.contains(&str2), variable_id: 0 });
|
||||
}
|
||||
fn szaft_atrak(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
arg_expect(&args, 1, "string", machine, op);
|
||||
arg_expect(&args, 2, "string", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
let str2 = match &args[1] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
let str3 = match &args[2] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
return VMMemory::String(VMMemoryString { value: str.replace(&str2, &str3), variable_id: 0 });
|
||||
}
|
||||
fn szaft_szamma(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "string", machine, op);
|
||||
arg_expect(&args, 1, "number", machine, op);
|
||||
let str = match &args[0] {
|
||||
VMMemory::String(s) => s.value.clone(),
|
||||
_ => String::new()
|
||||
};
|
||||
let num = match &args[1] {
|
||||
VMMemory::Number(n) => n.value as usize,
|
||||
_ => 0
|
||||
};
|
||||
return VMMemory::Number(VMMemoryNumber { value: str.as_bytes()[num] as i64, variable_id: 0 });
|
||||
}
|
||||
fn szaft_betuve(machine: &mut Machine, op: &DecompiledOperation, args: Vec<VMMemory>) -> VMMemory {
|
||||
arg_expect(&args, 0, "number", machine, op);
|
||||
let num = match &args[0] {
|
||||
VMMemory::Number(n) => n.value as usize,
|
||||
_ => 0
|
||||
};
|
||||
let str = match String::from_utf8(vec![num.try_into().unwrap()]) {
|
||||
Ok(s) => s,
|
||||
Err(_) => {
|
||||
error(String::from("Invalid UTF-8 sequence"), machine, op);
|
||||
return VMMemory::Null(VMMemoryNull { variable_id: 0 });
|
||||
}
|
||||
};
|
||||
return VMMemory::String(VMMemoryString { value: str, variable_id: 0 })
|
||||
}
|
||||
|
||||
pub fn generate() -> HashMap<String, VMMemory> {
|
||||
let mut mem: HashMap<String, VMMemory> = HashMap::new();
|
||||
|
||||
|
@ -378,5 +501,49 @@ pub fn generate() -> HashMap<String, VMMemory> {
|
|||
];
|
||||
mem.insert(String::from("kábel"), VMMemory::Table(VMMemoryTable { values: kabel, variable_id: 0 }));
|
||||
|
||||
let szaft: Vec<TableValue> = vec![
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("csemerd fel"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_csemerdfel, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("csemerd le"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_csemerdle, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("hossz"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_hossz, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("ismételd"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_ismeteld, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("uno reverse"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_unoreverse, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("darabos"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_darabos, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("keres"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_keres, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("átrak"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_atrak, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("számmá"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_szamma, variable_id: 0 }),
|
||||
},
|
||||
TableValue {
|
||||
key: VMMemory::String(VMMemoryString { value: String::from("betűvé"), variable_id: 0 }),
|
||||
value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: szaft_betuve, variable_id: 0 }),
|
||||
}
|
||||
];
|
||||
mem.insert(String::from("szaft"), VMMemory::Table(VMMemoryTable { values: szaft, variable_id: 0 }));
|
||||
|
||||
return mem;
|
||||
}
|
22
test.asl
22
test.asl
|
@ -1,11 +1,11 @@
|
|||
gethelj listener = kábel.halgass(szaft"0.0.0.0"szaft, 1010)
|
||||
|
||||
amíg geny (piszv) {
|
||||
gethelj stream = listener.kérés(listener)
|
||||
ugass(stream.olvass(stream, 1024))
|
||||
stream.írj(stream, szaft"HTTP/1.1 200 OK
|
||||
Content-type: text/html; charset=utf-8
|
||||
|
||||
szafal a pofád!"szaft)
|
||||
stream.zár(stream)
|
||||
}
|
||||
ugass(szaft.csemerd fel(szaft"test"szaft))
|
||||
ugass(szaft.csemerd le(szaft"TesT"szaft))
|
||||
gethelj str = szaft"test"szaft
|
||||
ugass(szaft.hossz(str))
|
||||
ugass(szaft.ismételd(str, 3))
|
||||
ugass(szaft.uno reverse(str))
|
||||
ugass(szaft.darabos(str, 0, 1))
|
||||
ugass(szaft.keres(str, szaft"st"szaft))
|
||||
ugass(szaft.átrak(str, szaft"st"szaft, szaft"bemb"szaft))
|
||||
ugass(szaft.számmá(str, 0))
|
||||
ugass(szaft.betűvé(116))
|
Loading…
Add table
Add a link
Reference in a new issue