Compare commits
No commits in common. "43f90c4f88003706b4a0913ca104f9c75005794b" and "75c48e996a4d217809f075d650bae84998a93b47" have entirely different histories.
43f90c4f88
...
75c48e996a
@ -7,10 +7,8 @@ function(luna_app SOURCE_FILE APP_NAME)
|
|||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
luna_app(init.cpp init)
|
luna_app(init.cpp init)
|
||||||
luna_app(sh.cpp sh)
|
|
||||||
|
|
||||||
luna_app(cat.cpp cat)
|
luna_app(cat.cpp cat)
|
||||||
target_link_libraries(cat PRIVATE os)
|
luna_app(sh.cpp sh)
|
||||||
|
|
||||||
luna_app(date.cpp date)
|
luna_app(date.cpp date)
|
||||||
target_link_libraries(date PRIVATE os)
|
target_link_libraries(date PRIVATE os)
|
||||||
|
48
apps/cat.cpp
48
apps/cat.cpp
@ -1,24 +1,9 @@
|
|||||||
#include <os/ArgumentParser.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static void do_cat(StringView path)
|
static void do_cat(FILE* f)
|
||||||
{
|
{
|
||||||
FILE* f;
|
|
||||||
|
|
||||||
if (path == "-") f = stdin;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
f = fopen(path.chars(), "r");
|
|
||||||
if (!f)
|
|
||||||
{
|
|
||||||
perror(path.chars());
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char buffer[4096];
|
char buffer[4096];
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
@ -27,19 +12,30 @@ static void do_cat(StringView path)
|
|||||||
if (nread == 0) return;
|
if (nread == 0) return;
|
||||||
fwrite(buffer, 1, nread, stdout);
|
fwrite(buffer, 1, nread, stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f != stdin) fclose(f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
StringView filename;
|
FILE* f;
|
||||||
|
|
||||||
ArgumentParser parser;
|
if (argc < 2) { do_cat(stdin); }
|
||||||
parser.add_positional_argument(filename, "file"_sv, "-"_sv);
|
else
|
||||||
Vector<StringView> extra_files = parser.parse(argc, argv).value();
|
{
|
||||||
|
for (int i = 1; i < argc; i++)
|
||||||
do_cat(filename);
|
{
|
||||||
|
if (!strcmp(argv[i], "-")) f = stdin;
|
||||||
for (auto file : extra_files) { do_cat(file); }
|
else
|
||||||
|
{
|
||||||
|
f = fopen(argv[i], "r");
|
||||||
|
if (!f)
|
||||||
|
{
|
||||||
|
perror(argv[i]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_cat(f);
|
||||||
|
if (f != stdin) fclose(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ int main(int argc, char** argv)
|
|||||||
StringView date;
|
StringView date;
|
||||||
|
|
||||||
ArgumentParser parser;
|
ArgumentParser parser;
|
||||||
parser.add_value_argument(date, 'd', "date"_sv, false);
|
parser.add_value_argument(date, 'd', "date", false);
|
||||||
parser.parse(argc, argv);
|
parser.parse(argc, argv);
|
||||||
|
|
||||||
time_t now;
|
time_t now;
|
||||||
|
@ -10,7 +10,7 @@ int main(int argc, char** argv)
|
|||||||
StringView pathname;
|
StringView pathname;
|
||||||
|
|
||||||
ArgumentParser parser;
|
ArgumentParser parser;
|
||||||
parser.add_positional_argument(pathname, "file"_sv, true);
|
parser.add_positional_argument(pathname, "file", true);
|
||||||
parser.parse(argc, argv);
|
parser.parse(argc, argv);
|
||||||
|
|
||||||
f = fopen(pathname.chars(), "w");
|
f = fopen(pathname.chars(), "w");
|
||||||
|
@ -12,9 +12,9 @@ int main(int argc, char** argv)
|
|||||||
bool show_almost_all;
|
bool show_almost_all;
|
||||||
|
|
||||||
ArgumentParser parser;
|
ArgumentParser parser;
|
||||||
parser.add_positional_argument(pathname, "directory"_sv, "/"_sv);
|
parser.add_positional_argument(pathname, "directory", "/");
|
||||||
parser.add_switch_argument(show_all, 'a', "all"_sv);
|
parser.add_switch_argument(show_all, 'a', "all");
|
||||||
parser.add_switch_argument(show_almost_all, 'A', "almost-all"_sv);
|
parser.add_switch_argument(show_almost_all, 'A', "almost-all");
|
||||||
parser.parse(argc, argv);
|
parser.parse(argc, argv);
|
||||||
|
|
||||||
DIR* dp = opendir(pathname.chars());
|
DIR* dp = opendir(pathname.chars());
|
||||||
|
@ -52,13 +52,3 @@ class StringView
|
|||||||
|
|
||||||
usize m_length { 0 };
|
usize m_length { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
inline StringView operator""_sv(const char* cstring)
|
|
||||||
{
|
|
||||||
return StringView { cstring };
|
|
||||||
}
|
|
||||||
|
|
||||||
inline StringView operator""_sv(const char* cstring, usize length)
|
|
||||||
{
|
|
||||||
return StringView { cstring, length };
|
|
||||||
}
|
|
||||||
|
@ -15,7 +15,7 @@ class ArgumentParser
|
|||||||
Result<void> add_value_argument(StringView& out, char short_flag, StringView long_flag, bool value_required);
|
Result<void> add_value_argument(StringView& out, char short_flag, StringView long_flag, bool value_required);
|
||||||
Result<void> add_value_argument(StringView& out, char short_flag, StringView long_flag, StringView fallback);
|
Result<void> add_value_argument(StringView& out, char short_flag, StringView long_flag, StringView fallback);
|
||||||
|
|
||||||
Result<Vector<StringView>> parse(int argc, char* const* argv);
|
void parse(int argc, char* const* argv);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct PositionalArgument
|
struct PositionalArgument
|
||||||
|
@ -49,12 +49,10 @@ static bool looks_like_long_flag(StringView arg)
|
|||||||
return arg.length() > 2 && arg[0] == '-' && arg[1] == '-';
|
return arg.length() > 2 && arg[0] == '-' && arg[1] == '-';
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<Vector<StringView>> ArgumentParser::parse(int argc, char* const* argv)
|
void ArgumentParser::parse(int argc, char* const* argv)
|
||||||
{
|
{
|
||||||
StringView program_name = argv[0];
|
StringView program_name = argv[0];
|
||||||
|
|
||||||
Vector<StringView> leftovers;
|
|
||||||
|
|
||||||
Option<ValueArgument> current_value_argument = {};
|
Option<ValueArgument> current_value_argument = {};
|
||||||
bool is_parsing_value_argument = false;
|
bool is_parsing_value_argument = false;
|
||||||
|
|
||||||
@ -146,7 +144,7 @@ Result<Vector<StringView>> ArgumentParser::parse(int argc, char* const* argv)
|
|||||||
Option<PositionalArgument> current = m_positional_args.try_dequeue();
|
Option<PositionalArgument> current = m_positional_args.try_dequeue();
|
||||||
if (!current.has_value())
|
if (!current.has_value())
|
||||||
{
|
{
|
||||||
TRY(leftovers.try_append(arg));
|
fprintf(stderr, "%s: unused argument '%s'\n", program_name.chars(), arg.chars());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,6 +172,4 @@ Result<Vector<StringView>> ArgumentParser::parse(int argc, char* const* argv)
|
|||||||
}
|
}
|
||||||
else { *arg.out = arg.fallback; }
|
else { *arg.out = arg.fallback; }
|
||||||
}
|
}
|
||||||
|
|
||||||
return leftovers;
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user