From d22014a1e0d651f31d99e10faef5e84c7a01a2f3 Mon Sep 17 00:00:00 2001 From: afonya Date: Mon, 16 Jun 2025 14:30:40 +0200 Subject: [PATCH] added string functions --- src/enviroment.rs | 169 +++++++++++++++++++++++++++++++++++++++++++++- test.asl | 22 +++--- 2 files changed, 179 insertions(+), 12 deletions(-) diff --git a/src/enviroment.rs b/src/enviroment.rs index c30ef47..f154b8f 100644 --- a/src/enviroment.rs +++ b/src/enviroment.rs @@ -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) -> 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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 { let mut mem: HashMap = HashMap::new(); @@ -378,5 +501,49 @@ pub fn generate() -> HashMap { ]; mem.insert(String::from("kábel"), VMMemory::Table(VMMemoryTable { values: kabel, variable_id: 0 })); + let szaft: Vec = 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; } \ No newline at end of file diff --git a/test.asl b/test.asl index d9debb8..9715387 100644 --- a/test.asl +++ b/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) -} \ No newline at end of file +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)) \ No newline at end of file