latest pushes

This commit is contained in:
Ronaldson Bellande 2024-10-05 11:54:36 -04:00
parent 482ffe0604
commit b0a2610d70
8 changed files with 43 additions and 123 deletions

View File

@ -5,41 +5,41 @@
# Addition # Addition
result=$((5 + 3)) result=$((5 + 3))
echo Addition: 5 + 3 = $result echo Addition: "5 + 3 =" $result
# Subtraction # Subtraction
result=$((10 - 4)) result=$((10 - 4))
echo Subtraction: 10 - 4 = $result echo Subtraction: "10 - 4 =" $result
# Multiplication # Multiplication
result=$((6 * 7)) result=$((6 * 7))
echo Multiplication: 6 * 7 = $result echo Multiplication: "6 * 7 =" $result
# Division # Division
result=$((20 / 4)) result=$((20 / 4))
echo Division: 20 / 4 = $result echo Division: "20 / 4 =" $result
# Modulus # Modulus
result=$((17 % 5)) result=$((17 % 5))
echo Modulus: 17 % 5 = $result echo Modulus: "17 % 5 =" $result
# Compound operation # Compound operation
result=$(( (10 + 5) * 2 )) result=$(( (10 + 5) * 2 ))
echo Compound: (10 + 5) * 2 = $result echo Compound: "(10 + 5) * 2 =" $result
# Using variables # Using variables
a=7 a=7
b=3 b=3
result=$((a + b)) result=$((a + b))
echo Variables: $a + $b = $result echo Variables: "$a + $b =" $result
# Increment # Increment
count=0 count=0
count=$((count + 1)) count=$((count + 1))
echo Increment: count after increment = $count echo Increment: count after increment "=" $count
# Decrement # Decrement
count=$((count - 1)) count=$((count - 1))
echo Decrement: count after decrement = $count echo Decrement: count after decrement "=" $count
echo Basic math operations completed. echo Basic math operations completed.

View File

@ -5,27 +5,27 @@
# Create a test file # Create a test file
echo "Creating test file..." echo "Creating test file..."
echo "Hello, World!" > test.txt write test.txt "Hello, World!"
# Read the contents of the file # Read the contents of the file
echo "\nReading test file:" echo "\nReading test file:"
cat test.txt read test.txt
# Append to the file # Append to the file
echo "\nAppending to test file..." echo "\nAppending to test file..."
echo "This is a new line" >> test.txt append test.txt "This is a new line"
# Read the updated contents # Read the updated contents
echo "\nReading updated test file:" echo "\nReading updated test file:"
cat test.txt read test.txt
# Write to a new file # Write to a new file
echo "\nWriting to a new file..." echo "\nWriting to a new file..."
echo "This is a new file" > new_file.txt write new_file.txt "This is a new file"
# Read the new file # Read the new file
echo "\nReading new file:" echo "\nReading new file:"
cat new_file.txt read new_file.txt
# List files in the current directory # List files in the current directory
echo "\nListing files in the current directory:" echo "\nListing files in the current directory:"
@ -35,26 +35,6 @@ ls -l
echo "\nRenaming file..." echo "\nRenaming file..."
mv new_file.txt renamed_file.txt mv new_file.txt renamed_file.txt
# Check if file exists
echo "\nChecking if files exist:"
if [ -f "test.txt" ]; then
echo "test.txt exists"
else
echo "test.txt does not exist"
fi
if [ -f "new_file.txt" ]; then
echo "new_file.txt exists"
else
echo "new_file.txt does not exist"
fi
if [ -f "renamed_file.txt" ]; then
echo "renamed_file.txt exists"
else
echo "renamed_file.txt does not exist"
fi
# Delete files # Delete files
echo "\nDeleting files..." echo "\nDeleting files..."
rm test.txt renamed_file.txt rm test.txt renamed_file.txt

View File

@ -5,7 +5,7 @@
# Simple function # Simple function
function greet() { function greet() {
echo "Hello, $1!" echo Hello
} }
echo "Testing simple function:" echo "Testing simple function:"

View File

@ -6,31 +6,32 @@
# String concatenation # String concatenation
first_name=John first_name=John
last_name=Doe last_name=Doe
full_name=$first_name $last_name full_name="$first_name $last_name"
echo Full name: $full_name echo Full name: $full_name
# String length # String length
string="Hello, World!" string="Hello, World!"
echo "The string '$string' has ${#string} characters." echo The string '$string' has ${#string} characters.
# Substring extraction # Substring extraction
echo "The first 5 characters are: ${string:0:5}" echo The first 5 characters are: ${string:0:5}
# String replacement # String replacement
sentence="The quick brown fox jumps over the lazy dog" sentence="The quick brown fox jumps over the lazy dog"
echo "Original sentence: $sentence" echo Original sentence: $sentence
new_sentence=${sentence/fox/cat} new_sentence=${sentence/fox/cat}
echo "Modified sentence: $new_sentence" echo Modified sentence: $new_sentence
# Converting to uppercase and lowercase # Converting to uppercase and lowercase
echo "Uppercase: ${string^^}" echo Uppercase: ${string^^}
echo "Lowercase: ${string,,}" echo Lowercase: ${string,,}
# Trimming whitespace # Trimming whitespace
padded_string=" trim me " padded_string=" trim me "
echo "Original string: '$padded_string'" echo Original string: '$padded_string'
trimmed_string=${padded_string## } trimmed_string="${padded_string#"${padded_string%%[![:space:]]*}"}" # Trim leading whitespace
trimmed_string=${trimmed_string%% } trimmed_string="${trimmed_string%"${trimmed_string##*[![:space:]]}"}" # Trim trailing whitespace
echo "Trimmed string: '$trimmed_string'" echo Trimmed string: '$trimmed_string'
echo "String manipulation operations completed." # Completion message
echo String manipulation operations completed.

Binary file not shown.

View File

@ -38,10 +38,8 @@ impl Executor {
pub fn run(&mut self, args: Vec<String>) -> Result<(), String> { pub fn run(&mut self, args: Vec<String>) -> Result<(), String> {
if args.len() > 1 { if args.len() > 1 {
// Execute script file
self.execute_script(&args[1]) self.execute_script(&args[1])
} else { } else {
// Interactive mode
self.run_interactive_mode() self.run_interactive_mode()
} }
} }
@ -64,34 +62,13 @@ impl Executor {
let line = line.map_err(|e| format!("Error reading line {}: {}", index + 1, e))?; let line = line.map_err(|e| format!("Error reading line {}: {}", index + 1, e))?;
let trimmed_line = line.trim(); let trimmed_line = line.trim();
if trimmed_line.is_empty() || trimmed_line.starts_with('#') { if trimmed_line.is_empty() || trimmed_line.starts_with('#') {
continue; // Skip empty lines and comments
}
// Handle variable assignments and arithmetic operations
if trimmed_line.contains('=') {
let parts: Vec<&str> = trimmed_line.splitn(2, '=').collect();
if parts.len() == 2 {
let var_name = parts[0].trim().to_string();
let var_value = parts[1].trim().to_string();
if var_value.starts_with("$((") && var_value.ends_with("))") {
// Arithmetic expression
let result = self.interpreter.evaluate_arithmetic(&var_value)?;
self.interpreter
.variables
.insert(var_name, result.to_string());
} else {
// Regular variable assignment
let expanded_value = self.interpreter.expand_variables(&var_value);
self.interpreter.variables.insert(var_name, expanded_value);
}
continue; continue;
} }
}
if let Err(e) = self.process_content(trimmed_line) { if let Err(e) = self.process_content(trimmed_line) {
return Err(format!("Error on line {}: {}", index + 1, e)); eprintln!("Error on line {}: {}", index + 1, e);
} }
io::stdout().flush().unwrap();
} }
Ok(()) Ok(())
} }
@ -114,28 +91,6 @@ impl Executor {
} }
fn process_content(&mut self, content: &str) -> Result<(), String> { fn process_content(&mut self, content: &str) -> Result<(), String> {
// Handle variable assignments and arithmetic operations
if content.contains('=') {
let parts: Vec<&str> = content.splitn(2, '=').collect();
if parts.len() == 2 {
let var_name = parts[0].trim().to_string();
let var_value = parts[1].trim().to_string();
if var_value.starts_with("$((") && var_value.ends_with("))") {
// Arithmetic expression
let result = self.interpreter.evaluate_arithmetic(&var_value)?;
self.interpreter
.variables
.insert(var_name, result.to_string());
} else {
// Regular variable assignment
let expanded_value = self.interpreter.expand_variables(&var_value);
self.interpreter.variables.insert(var_name, expanded_value);
}
return Ok(());
}
}
let ast_nodes = self.parse_content(content)?; let ast_nodes = self.parse_content(content)?;
self.execute(ast_nodes) self.execute(ast_nodes)
} }
@ -159,6 +114,11 @@ impl Executor {
ASTNode::Command { name, args } => Arc::get_mut(&mut self.processes) ASTNode::Command { name, args } => Arc::get_mut(&mut self.processes)
.unwrap() .unwrap()
.execute_command(&mut self.interpreter, name, args), .execute_command(&mut self.interpreter, name, args),
ASTNode::Assignment { name, value } => {
let expanded_value = self.interpreter.expand_variables(&value);
self.interpreter.variables.insert(name, expanded_value);
Ok(None)
}
ASTNode::Pipeline(commands) => { ASTNode::Pipeline(commands) => {
self.processes.execute_pipeline(&self.interpreter, commands) self.processes.execute_pipeline(&self.interpreter, commands)
} }

View File

@ -45,30 +45,11 @@ impl Processes {
.map(|arg| interpreter.expand_variables(arg)) .map(|arg| interpreter.expand_variables(arg))
.collect(); .collect();
// Handle arithmetic assignments
if expanded_name.contains('=') {
let parts: Vec<&str> = expanded_name.splitn(2, '=').collect();
if parts.len() == 2 {
let var_name = parts[0].trim().to_string();
let var_value = parts[1].trim().to_string();
if var_value.starts_with("$((") && var_value.ends_with("))") {
// Arithmetic expression
let result = interpreter.evaluate_arithmetic(&var_value)?;
interpreter.variables.insert(var_name, result.to_string());
} else {
// Regular variable assignment
let expanded_value = interpreter.expand_variables(&var_value);
interpreter.variables.insert(var_name, expanded_value);
}
return Ok(Some(0));
}
}
match expanded_name.as_str() { match expanded_name.as_str() {
"echo" => { "echo" => {
let output = expanded_args.join(" "); let output = expanded_args.join(" ");
println!("{}", output); println!("{}", output);
io::stdout().flush().unwrap();
Ok(Some(0)) Ok(Some(0))
} }
"cd" => { "cd" => {
@ -149,11 +130,7 @@ impl Processes {
Ok(Some(0)) Ok(Some(0))
} }
_ => { _ => {
if let Some(func) = interpreter.functions.get(&expanded_name) { // If it's not a built-in command, try to execute as external command
return interpreter.interpret_node(Box::new(func.clone()));
}
// If it's not a built-in command or variable assignment, try to execute as external command
match Command::new(&expanded_name).args(&expanded_args).spawn() { match Command::new(&expanded_name).args(&expanded_args).spawn() {
Ok(mut child) => { Ok(mut child) => {
let status = child.wait().map_err(|e| e.to_string())?; let status = child.wait().map_err(|e| e.to_string())?;

View File

@ -222,7 +222,7 @@ impl Interpreter {
let a = self.get_var_value(tokens[0])?; let a = self.get_var_value(tokens[0])?;
let b = self.get_var_value(tokens[2])?; let b = self.get_var_value(tokens[2])?;
match tokens[1] { let result = match tokens[1] {
"+" => Ok(a + b), "+" => Ok(a + b),
"-" => Ok(a - b), "-" => Ok(a - b),
"*" => Ok(a * b), "*" => Ok(a * b),
@ -241,7 +241,9 @@ impl Interpreter {
} }
} }
_ => Err(format!("Unsupported operation: {}", tokens[1])), _ => Err(format!("Unsupported operation: {}", tokens[1])),
} };
result
} else { } else {
Err("Invalid arithmetic expression".to_string()) Err("Invalid arithmetic expression".to_string())
} }