Преглед изворни кода

LibCore+cat: Switch Core::System::read/write to take a Span of bytes

In the spirit of the Core::System name space having "modern" facades
for classically C functions / Kernel interfaces, it seems appropriate
that we should take Span's of data instead of raw pointer + length
arguments.
Brian Gianforcaro пре 3 година
родитељ
комит
fcc00c9a27

+ 4 - 4
Userland/Libraries/LibCore/System.cpp

@@ -157,17 +157,17 @@ ErrorOr<struct stat> stat(StringView path)
 #endif
 }
 
-ErrorOr<ssize_t> read(int fd, void* buffer, size_t buffer_size)
+ErrorOr<ssize_t> read(int fd, Bytes buffer)
 {
-    ssize_t rc = ::read(fd, buffer, buffer_size);
+    ssize_t rc = ::read(fd, buffer.data(), buffer.size());
     if (rc < 0)
         return Error::from_syscall("read"sv, -errno);
     return rc;
 }
 
-ErrorOr<ssize_t> write(int fd, void const* data, size_t data_size)
+ErrorOr<ssize_t> write(int fd, ReadonlyBytes buffer)
 {
-    ssize_t rc = ::write(fd, data, data_size);
+    ssize_t rc = ::write(fd, buffer.data(), buffer.size());
     if (rc < 0)
         return Error::from_syscall("write"sv, -errno);
     return rc;

+ 2 - 2
Userland/Libraries/LibCore/System.h

@@ -27,8 +27,8 @@ ErrorOr<int> open(StringView path, int options, ...);
 ErrorOr<void> close(int fd);
 ErrorOr<void> ftruncate(int fd, off_t length);
 ErrorOr<struct stat> stat(StringView path);
-ErrorOr<ssize_t> read(int fd, void* buffer, size_t buffer_size);
-ErrorOr<ssize_t> write(int fd, void const* data, size_t data_size);
+ErrorOr<ssize_t> read(int fd, Bytes buffer);
+ErrorOr<ssize_t> write(int fd, ReadonlyBytes buffer);
 ErrorOr<void> kill(pid_t, int signal);
 ErrorOr<int> dup2(int source_fd, int destination_fd);
 ErrorOr<String> ptsname(int fd);

+ 8 - 5
Userland/Utilities/cat.cpp

@@ -45,15 +45,18 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
 
     TRY(Core::System::pledge("stdio", nullptr));
 
+    Array<u8, 32768> buffer;
     for (auto& fd : fds) {
         for (;;) {
-            char buffer[32768];
-            auto nread = TRY(Core::System::read(fd, buffer, sizeof(buffer)));
+            auto buffer_span = buffer.span();
+            auto nread = TRY(Core::System::read(fd, buffer_span));
             if (nread == 0)
                 break;
-            ssize_t already_written = 0;
-            while (already_written < nread)
-                already_written += TRY(Core::System::write(STDOUT_FILENO, buffer + already_written, nread - already_written));
+            buffer_span = buffer_span.trim(nread);
+            while (!buffer_span.is_empty()) {
+                auto already_written = TRY(Core::System::write(STDOUT_FILENO, buffer_span));
+                buffer_span = buffer_span.slice(already_written);
+            }
         }
         TRY(Core::System::close(fd));
     }