Compare commits

...

3 Commits

Author SHA1 Message Date
48df90e636
libos+apps: Use os::*print* instead of (f)printf
All checks were successful
continuous-integration/drone/push Build is passing
2023-05-01 19:32:00 +02:00
a2303665fc
libos: Add os:: print(), println(), eprint(), and eprintln() 2023-05-01 19:31:15 +02:00
df590f4e26
libluna: Add String::join() 2023-05-01 19:29:17 +02:00
9 changed files with 104 additions and 29 deletions

View File

@ -18,16 +18,13 @@ Result<int> luna_main(int argc, char** argv)
auto file = TRY(os::File::open_input_file(path)); auto file = TRY(os::File::open_input_file(path));
auto output = os::File::standard_output();
if (!decode) if (!decode)
{ {
auto data = TRY(file->read_all()); auto data = TRY(file->read_all());
auto encoded = TRY(Base64::encode(data)); auto encoded = TRY(Base64::encode(data));
output->write(encoded.view()); os::println("%s", encoded.chars());
output->write("\n"_sv);
} }
else else
{ {
@ -35,7 +32,7 @@ Result<int> luna_main(int argc, char** argv)
auto decoded = TRY(Base64::decode(data.view(), allow_garbage)); auto decoded = TRY(Base64::decode(data.view(), allow_garbage));
output->write(decoded); os::File::standard_output()->write(decoded);
} }
return 0; return 0;

View File

@ -1,11 +1,11 @@
#include <os/ArgumentParser.h> #include <os/ArgumentParser.h>
#include <os/File.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
int main(int argc, char** argv) Result<int> luna_main(int argc, char** argv)
{ {
StringView date; StringView date;
@ -20,5 +20,7 @@ int main(int argc, char** argv)
if (date.is_empty()) { now = time(NULL); } if (date.is_empty()) { now = time(NULL); }
else { now = strtol(date.chars(), nullptr, 10); } else { now = strtol(date.chars(), nullptr, 10); }
fputs(ctime(&now), stdout); os::print("%s", ctime(&now));
return 0;
} }

View File

@ -1,8 +1,6 @@
#include <os/ArgumentParser.h> #include <os/ArgumentParser.h>
#include <os/Directory.h> #include <os/Directory.h>
#include <os/File.h>
#include <stdio.h>
#include <unistd.h>
Result<int> luna_main(int argc, char** argv) Result<int> luna_main(int argc, char** argv)
{ {
@ -27,14 +25,8 @@ Result<int> luna_main(int argc, char** argv)
auto files = TRY(dir->list(filter)); auto files = TRY(dir->list(filter));
int first_ent = 1; auto list = TRY(String::join(files, " "_sv));
for (const auto& file : files) os::println("%s", list.chars());
{
printf(first_ent ? "%s" : " %s", file.chars());
first_ent = 0;
}
putchar('\n');
return 0; return 0;
} }

View File

@ -80,7 +80,7 @@ Result<int> luna_main(int argc, char** argv)
if (interactive) if (interactive)
{ {
auto cwd = TRY(os::FileSystem::working_directory()); auto cwd = TRY(os::FileSystem::working_directory());
printf("%s@%s:%s%c ", username, hostname, cwd.chars(), prompt_end); os::print("%s@%s:%s%c ", username, hostname, cwd.chars(), prompt_end);
} }
auto cmd = TRY(input_file->read_line()); auto cmd = TRY(input_file->read_line());

View File

@ -32,10 +32,13 @@ class String
return view().split_once(delim); return view().split_once(delim);
} }
static Result<String> join(const Vector<String>& vec, StringView delim);
void trim(StringView delim); void trim(StringView delim);
static Result<String> format(const String& fmt, ...); static Result<String> format(const String& fmt, ...);
static Result<String> format(StringView fmt, ...); static Result<String> format(StringView fmt, ...);
static Result<String> vformat(StringView fmt, va_list ap);
static Result<String> from_cstring(const char* str); static Result<String> from_cstring(const char* str);
@ -92,6 +95,4 @@ class String
usize m_length { 0 }; usize m_length { 0 };
void empty(); void empty();
static Result<String> vformat(StringView fmt, va_list ap);
}; };

View File

@ -2,6 +2,7 @@
#include <luna/CString.h> #include <luna/CString.h>
#include <luna/Format.h> #include <luna/Format.h>
#include <luna/String.h> #include <luna/String.h>
#include <luna/StringBuilder.h>
#include <luna/Vector.h> #include <luna/Vector.h>
String::String() String::String()
@ -163,3 +164,20 @@ Result<String> String::from_cstring(const char* str)
if (!dup) return err(ENOMEM); if (!dup) return err(ENOMEM);
return String { dup }; return String { dup };
} }
Result<String> String::join(const Vector<String>& vec, StringView delim)
{
if (vec.size() == 0) return String {};
if (vec.size() == 1) return vec[0].clone();
StringBuilder sb;
TRY(sb.add(vec[0].view()));
for (usize i = 1; i < vec.size(); i++)
{
TRY(sb.add(delim));
TRY(sb.add(vec[i].view()));
}
return sb.string();
}

View File

@ -66,4 +66,9 @@ namespace os
int m_fd { -1 }; int m_fd { -1 };
}; };
Result<void> print(StringView fmt, ...);
Result<void> println(StringView fmt, ...);
Result<void> eprint(StringView fmt, ...);
Result<void> eprintln(StringView fmt, ...);
} }

View File

@ -1,5 +1,6 @@
#include <luna/StringBuilder.h> #include <luna/StringBuilder.h>
#include <os/ArgumentParser.h> #include <os/ArgumentParser.h>
#include <os/File.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/utsname.h> #include <sys/utsname.h>
@ -165,7 +166,7 @@ namespace os
if (found) continue; if (found) continue;
fprintf(stderr, "%s: unrecognized option '%s'\n", program_name.chars(), arg.chars()); os::eprintln("%s: unrecognized option '%s'", program_name.chars(), arg.chars());
short_usage(program_name); short_usage(program_name);
} }
else if (looks_like_short_flag(arg)) else if (looks_like_short_flag(arg))
@ -213,7 +214,7 @@ namespace os
if (found) continue; if (found) continue;
fprintf(stderr, "%s: invalid option -- '%c'\n", program_name.chars(), c); os::eprintln("%s: invalid option -- '%c'", program_name.chars(), c);
short_usage(program_name); short_usage(program_name);
} }
@ -235,8 +236,8 @@ namespace os
{ {
if (current_value_argument->required) if (current_value_argument->required)
{ {
fprintf(stderr, "%s: option '--%s' requires an argument\n", program_name.chars(), os::eprintln("%s: option '--%s' requires an argument", program_name.chars(),
current_value_argument->long_flag.chars()); current_value_argument->long_flag.chars());
short_usage(program_name); short_usage(program_name);
} }
else { *current_value_argument->out = current_value_argument->fallback; } else { *current_value_argument->out = current_value_argument->fallback; }
@ -247,7 +248,7 @@ namespace os
{ {
if (arg.required) if (arg.required)
{ {
fprintf(stderr, "%s: required argument '%s' not provided\n", program_name.chars(), arg.name.chars()); os::eprintln("%s: required argument '%s' not provided", program_name.chars(), arg.name.chars());
short_usage(program_name); short_usage(program_name);
} }
else { *arg.out = arg.fallback; } else { *arg.out = arg.fallback; }
@ -354,8 +355,8 @@ namespace os
void ArgumentParser::short_usage(StringView program_name) void ArgumentParser::short_usage(StringView program_name)
{ {
if (m_add_short_help_flag || m_add_long_help_flag) if (m_add_short_help_flag || m_add_long_help_flag)
fprintf(stderr, "Try running '%s %s' for more information.\n", program_name.chars(), os::eprintln("Try running '%s %s' for more information.", program_name.chars(),
m_add_long_help_flag ? "--help" : "-h"); m_add_long_help_flag ? "--help" : "-h");
exit(1); exit(1);
} }

View File

@ -193,4 +193,63 @@ namespace os
{ {
fcntl(m_fd, F_SETFD, FD_CLOEXEC); fcntl(m_fd, F_SETFD, FD_CLOEXEC);
} }
// FIXME: Do not allocate memory for printing.
Result<void> print_impl(SharedPtr<File> f, StringView fmt, va_list ap)
{
auto str = TRY(String::vformat(fmt, ap));
return f->write(str.view());
}
Result<void> print(StringView fmt, ...)
{
va_list ap;
va_start(ap, fmt);
auto rc = print_impl(File::standard_output(), fmt, ap);
va_end(ap);
return rc;
}
Result<void> println(StringView fmt, ...)
{
va_list ap;
va_start(ap, fmt);
auto rc = print_impl(File::standard_output(), fmt, ap);
va_end(ap);
TRY(rc);
return File::standard_output()->write("\n"_sv);
}
Result<void> eprint(StringView fmt, ...)
{
va_list ap;
va_start(ap, fmt);
auto rc = print_impl(File::standard_error(), fmt, ap);
va_end(ap);
return rc;
}
Result<void> eprintln(StringView fmt, ...)
{
va_list ap;
va_start(ap, fmt);
auto rc = print_impl(File::standard_error(), fmt, ap);
va_end(ap);
TRY(rc);
return File::standard_error()->write("\n"_sv);
}
} }