added string functions

This commit is contained in:
afonya 2025-06-16 14:30:40 +02:00
parent 37b6e8ecdb
commit d22014a1e0
Signed by: afonya
GPG key ID: EBB9C4CAFAAFB2DC
2 changed files with 179 additions and 12 deletions

View file

@ -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;
}

View file

@ -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))