#[cfg(test)]
mod tests;
use crate::engine::hash::hash_add_or_update;
use crate::engine::string::string_init;
use crate::engine::types::{PhpArray, PhpType, PhpValue, Val};
pub fn php_register_variable(
name: &str,
value: &str,
symbol_table: &mut PhpArray,
) -> Result<(), String> {
let normalized_name = normalize_variable_name(name);
let str_val = string_init(value, false);
let zval = Val::new(PhpValue::String(Box::new(str_val)), PhpType::String);
let key = string_init(&normalized_name, false);
let result = hash_add_or_update(
symbol_table,
Some(&key),
0,
zval,
0, );
match result {
crate::engine::types::PhpResult::Success => Ok(()),
crate::engine::types::PhpResult::Failure => Err("Failed to register variable".to_string()),
}
}
fn normalize_variable_name(name: &str) -> String {
let mut result = String::with_capacity(name.len());
let mut chars = name.chars().peekable();
while let Some(ch) = chars.next() {
match ch {
' ' | '.' => result.push('_'),
'[' => {
result.push('[');
break; }
_ => result.push(ch),
}
}
while let Some(ch) = chars.next() {
result.push(ch);
}
result
}
pub fn php_register_variable_safe(
name: &str,
value: &[u8],
symbol_table: &mut PhpArray,
) -> Result<(), String> {
let value_str = String::from_utf8_lossy(value);
php_register_variable(name, &value_str, symbol_table)
}