Compare commits

..

No commits in common. "7a4d3ba4955d242ca982a27af4c89d93ed59efab" and "4439ef8ec693d8c589e86ab04bdd266e7e1de7d0" have entirely different histories.

6 changed files with 15 additions and 97 deletions

View File

@ -48,13 +48,12 @@ template <typename T> class HashTable
usize i = index;
do {
auto& bucket = m_buckets[i];
auto& bucket = m_buckets[index];
if (bucket.has_value())
{
if (*bucket == value) return bucket.value_ptr();
i++;
}
else
return nullptr;
} while (i != index);
@ -71,7 +70,7 @@ template <typename T> class HashTable
usize i = index;
do {
auto& bucket = m_buckets[i];
auto& bucket = m_buckets[index];
if (bucket.has_value())
{
if (*bucket == value)
@ -83,7 +82,6 @@ template <typename T> class HashTable
}
i++;
}
else
return false;
} while (i != index);

View File

@ -2,9 +2,6 @@ set(SOURCES
main.cpp
sh.h
builtin/cd.cpp
builtin/exit.cpp
builtin/set.cpp
builtin/unset.cpp
)
add_executable(sh ${SOURCES})

View File

@ -1,20 +0,0 @@
#include "sh.h"
#include <os/ArgumentParser.h>
#include <stdlib.h>
shell_builtin_t builtin_exit = [](int argc, char** argv) -> Result<void> {
StringView exit_status;
os::ArgumentParser parser;
parser.set_should_exit_on_bad_usage(false);
parser.add_description("Exit the shell (shell builtin)"_sv);
parser.add_system_program_info("exit"_sv);
parser.add_positional_argument(exit_status, "status"_sv, false);
if (!TRY(parser.parse(argc, argv))) return {};
int status = 0;
if (!exit_status.is_empty()) { status = (int)strtoul(exit_status.chars(), nullptr, 10); }
exit(status);
};

View File

@ -1,24 +0,0 @@
#include "sh.h"
#include <errno.h>
#include <os/ArgumentParser.h>
#include <stdlib.h>
shell_builtin_t builtin_set = [](int argc, char** argv) -> Result<void> {
StringView name;
StringView value;
bool preserve { false };
os::ArgumentParser parser;
parser.set_should_exit_on_bad_usage(false);
parser.add_description("Set an environment variable (shell builtin)"_sv);
parser.add_system_program_info("set"_sv);
parser.add_positional_argument(name, "name"_sv, true);
parser.add_positional_argument(value, "value"_sv, true);
parser.add_switch_argument(preserve, 'p', "preserve"_sv,
"preserve the environment variable if it already exists"_sv);
if (!TRY(parser.parse(argc, argv))) return {};
if (setenv(name.chars(), value.chars(), !preserve) < 0) return err(errno);
return {};
};

View File

@ -1,19 +0,0 @@
#include "sh.h"
#include <errno.h>
#include <os/ArgumentParser.h>
#include <stdlib.h>
shell_builtin_t builtin_unset = [](int argc, char** argv) -> Result<void> {
StringView name;
os::ArgumentParser parser;
parser.set_should_exit_on_bad_usage(false);
parser.add_description("Remove an environment variable (shell builtin)"_sv);
parser.add_system_program_info("unset"_sv);
parser.add_positional_argument(name, "name"_sv, true);
if (!TRY(parser.parse(argc, argv))) return {};
if (unsetenv(name.chars()) < 0) return err(errno);
return {};
};

View File

@ -19,9 +19,6 @@
#include <luna/HashMap.h>
extern shell_builtin_t builtin_cd;
extern shell_builtin_t builtin_exit;
extern shell_builtin_t builtin_set;
extern shell_builtin_t builtin_unset;
static HashMap<StringView, shell_builtin_t> s_builtins;
@ -47,25 +44,6 @@ static Result<void> init_builtins()
s_builtins = {};
TRY(s_builtins.try_set("cd"_sv, builtin_cd));
TRY(s_builtins.try_set("exit"_sv, builtin_exit));
TRY(s_builtins.try_set("set"_sv, builtin_set));
TRY(s_builtins.try_set("unset"_sv, builtin_unset));
return {};
}
static Result<void> builtin_wrapper(const Vector<String>& args, shell_builtin_t builtin)
{
Vector<const char*> argv;
for (const auto& arg : args) { TRY(argv.try_append(arg.chars())); }
TRY(argv.try_append(nullptr));
auto rc = builtin((int)args.size(), const_cast<char**>(argv.data()));
if (rc.has_error())
{
errno = rc.error();
perror(argv[0]);
}
return {};
}
@ -95,7 +73,6 @@ Result<int> luna_main(int argc, char** argv)
parser.add_value_argument(command, 'c', "command"_sv, "execute a single command and then exit"_sv);
parser.parse(argc, argv);
// TODO: This does not properly handle builtins.
if (!command.is_empty()) TRY(execute_command(command));
if (path == "-") { input_file = File::standard_input(); }
@ -126,7 +103,7 @@ Result<int> luna_main(int argc, char** argv)
tcsetpgrp(STDIN_FILENO, getpgid(0));
}
TRY(init_builtins());
init_builtins();
while (1)
{
@ -169,7 +146,16 @@ Result<int> luna_main(int argc, char** argv)
{
auto builtin = maybe_builtin.value();
TRY(builtin_wrapper(args, builtin));
Vector<const char*> argv;
for (const auto& arg : args) { TRY(argv.try_append(arg.chars())); }
TRY(argv.try_append(nullptr));
auto rc = builtin((int)args.size(), const_cast<char**>(argv.data()));
if (rc.has_error())
{
errno = rc.error();
perror(argv[0]);
}
continue;
}