diff options
| author | 2024-09-26 23:08:46 -0400 | |
|---|---|---|
| committer | 2024-09-26 23:08:46 -0400 | |
| commit | cd554877c5f57cdebc919cd889c1812773446a1e (patch) | |
| tree | 6e4f4ca5a55a7faf859cd9cc6cbb897d75d0fa7e | |
| parent | v0.2.1 (diff) | |
fixed crash in redirect operator
| -rw-r--r-- | src/lush.c | 19 | ||||
| -rw-r--r-- | test/chaining_test.lua (renamed from test/pipes_test.lua) | 37 | ||||
| -rw-r--r-- | test/run_tests.lua | 4 |
3 files changed, 48 insertions, 12 deletions
@@ -1126,13 +1126,8 @@ int lush_execute_chain(lua_State *L, char ***commands, int num_commands) { int last_result = 0; for (int i = 0; i < num_actions; i++) { - // Handle ; operator - if (is_operator(commands[0][0]) == OP_SEMICOLON) { - commands++; - } - - // Handle && and || operators - if (i > 0) { + // Handle &&, ||, and ; operators + if (i > 0 && commands[0] != NULL) { commands--; if (last_result != 0) { if (is_operator(commands[0][0]) == OP_AND) { @@ -1146,6 +1141,10 @@ int lush_execute_chain(lua_State *L, char ***commands, int num_commands) { } } commands++; + + if (is_operator(commands[0][0]) == OP_SEMICOLON) { + commands++; + } } // Handle other operations @@ -1174,15 +1173,15 @@ int lush_execute_chain(lua_State *L, char ***commands, int num_commands) { commands += 2; continue; } else if (op_type == OP_BACKGROUND) { - run_command_background(L, commands); + last_result = run_command_background(L, commands); commands += 2; continue; } else if (op_type == OP_REDIRECT_OUT) { - run_command_redirect(L, commands, O_TRUNC); + last_result = run_command_redirect(L, commands, O_TRUNC); commands += 3; // to go past fd given continue; } else if (op_type == OP_APPEND_OUT) { - run_command_redirect(L, commands, O_APPEND); + last_result = run_command_redirect(L, commands, O_APPEND); commands += 3; continue; } diff --git a/test/pipes_test.lua b/test/chaining_test.lua index 46000e3..83f3e76 100644 --- a/test/pipes_test.lua +++ b/test/chaining_test.lua @@ -22,4 +22,41 @@ if lush.exec('cat "example.lua" | grep "hello" | sort | uniq') then else print("piping test failed ❌\n") end + +if lush.exec("echo hi && echo bye") then + print("and test passed ✅\n") +else + print("and test failed ❌\n") +end + +if lush.exec("cd lol || echo lol does not exist") then + print("or test passed ✅\n") +else + print("or test failed ❌\n") +end + +if lush.exec("sleep 2 &") then + print("background test passed ✅\n") +else + print("background test failed ❌\n") +end + +if lush.exec("echo hi; echo bye") then + print("semicolon test passed ✅\n") +else + print("semicolon test failed ❌\n") +end + +if lush.exec("echo hi > test.txt") then + print("redirect test passed ✅\n") +else + print("redirect test failed ❌\n") +end + +if lush.exec("echo hi >> test.txt") then + print("append test passed ✅\n") +else + print("append test failed ❌\n") +end + lush.cd(cwd) diff --git a/test/run_tests.lua b/test/run_tests.lua index e861326..6c54157 100644 --- a/test/run_tests.lua +++ b/test/run_tests.lua @@ -22,8 +22,8 @@ lush.debug(true) print("Testing Args...") lush.exec("args_test.lua testarg1 testarg2 testarg3") -print("\nTesting Piping...") -lush.exec("pipes_test.lua") +print("\nTesting Chaining...") +lush.exec("chaining_test.lua") print("\nTesting File Checks...") lush.exec("filecheck_test.lua") |
