summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGUI/TextEditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibGUI/TextEditor.cpp')
-rw-r--r--Userland/Libraries/LibGUI/TextEditor.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGUI/TextEditor.cpp b/Userland/Libraries/LibGUI/TextEditor.cpp
index b75d851b10..3236d3c5fc 100644
--- a/Userland/Libraries/LibGUI/TextEditor.cpp
+++ b/Userland/Libraries/LibGUI/TextEditor.cpp
@@ -1512,6 +1512,33 @@ bool TextEditor::write_to_file(Core::File& file)
return true;
}
+ErrorOr<void> TextEditor::write_to_file(Core::Stream::File& file)
+{
+ off_t file_size = 0;
+ if (line_count() == 1 && line(0).is_empty()) {
+ // Truncate to zero.
+ } else {
+ // Compute the final file size and ftruncate() to make writing fast.
+ // FIXME: Remove this once the kernel is smart enough to do this instead.
+ for (size_t i = 0; i < line_count(); ++i)
+ file_size += line(i).length();
+ file_size += line_count();
+ }
+
+ TRY(file.truncate(file_size));
+
+ if (file_size == 0) {
+ // A size 0 file doesn't need a data copy.
+ } else {
+ for (size_t i = 0; i < line_count(); ++i) {
+ TRY(file.write(line(i).to_utf8().bytes()));
+ TRY(file.write("\n"sv.bytes()));
+ }
+ }
+ document().set_unmodified();
+ return {};
+}
+
DeprecatedString TextEditor::text() const
{
return document().text();