]> Kevux Git Server - fll/commitdiff
Progress: UTF-8 file write should handle case where expanded character is larger...
authorKevin Day <thekevinday@gmail.com>
Fri, 12 Jun 2020 02:49:46 +0000 (21:49 -0500)
committerKevin Day <thekevinday@gmail.com>
Fri, 12 Jun 2020 02:49:46 +0000 (21:49 -0500)
When the 4-byte wide UTF-8 character is expanded into potentally 4 1-byte wide UTF-8 characters, the available bytes being expanded need to fit in the output buffer.

level_1/fl_utf_file/c/private-utf_file.c
level_1/fl_utf_file/c/private-utf_file.h
level_1/fl_utf_file/c/utf_file.h

index fb914626d31b55f092f743278556a7f1024d7b9c..fa8688bd94fc7cd7b9fa3e40dee99a9aabddc94e 100644 (file)
@@ -121,6 +121,10 @@ extern "C" {
           width = f_macro_utf_character_width(string[*written + i]);
           width_written = width;
 
+          if (*written + width > write_max) {
+            return F_incomplete_utf_stop;
+          }
+
           buffer_write[used] = f_macro_utf_character_to_char_1(string[*written + i]);
 
           if (width > 1) {
index 2894de38d031ef61b6fb17d373545aa8a98fa1b2..40ed82a0a205b3acd02cd5e7cc6bfc90136bc186 100644 (file)
@@ -62,6 +62,7 @@ extern "C" {
  *   F_none on success.
  *   F_none_eos on success but range.stop exceeded buffer.used (only wrote up to buffer.used).
  *   F_none_stop on success but no data was written (written == 0) (not an error and often happens if file type is not a regular file).
+ *   F_incomplete_utf_stop if max write was reached but was unable to completely write a given UTF-8 block (incomplete UTF-8 is not written, not even partially).
  *   F_block (with error bit) if file descriptor is set to non-block and the write would result in a blocking operation.
  *   F_buffer (with error bit) if the buffer is invalid.
  *   F_file_closed (with error bit) if file is not open.
index 6501ab10da7cbd5843b8bc7030587beffed9ee15..91ff1da6c57ec7e0d11becc38d61a92d88b8bc64 100644 (file)
@@ -139,6 +139,7 @@ extern "C" {
  *   F_none on success.
  *   F_none_eos on success but range.stop exceeded buffer.used (only wrote up to buffer.used).
  *   F_none_stop on success but no data was written (written == 0) (not an error and often happens if file type is not a regular file).
+ *   F_incomplete_utf_stop if max write was reached but was unable to completely write a given UTF-8 block (incomplete UTF-8 is not written, not even partially).
  *   F_block (with error bit) if file descriptor is set to non-block and the write would result in a blocking operation.
  *   F_buffer (with error bit) if the buffer is invalid.
  *   F_file (with error bit) if file descriptor is in an error state.
@@ -172,6 +173,7 @@ extern "C" {
  *   F_none on success.
  *   F_none_eos on success but range.stop exceeded buffer.used (only wrote up to buffer.used).
  *   F_none_stop on success but no data was written (written == 0) (not an error and often happens if file type is not a regular file).
+ *   F_incomplete_utf_stop if max write was reached but was unable to completely write a given UTF-8 block (incomplete UTF-8 is not written, not even partially).
  *   F_block (with error bit) if file descriptor is set to non-block and the write would result in a blocking operation.
  *   F_buffer (with error bit) if the buffer is invalid.
  *   F_file (with error bit) if file descriptor is in an error state.
@@ -205,6 +207,7 @@ extern "C" {
  *   F_none on success.
  *   F_none_eos on success but range.stop exceeded buffer.used (only wrote up to buffer.used).
  *   F_none_stop on success but no data was written (written == 0) (not an error and often happens if file type is not a regular file).
+ *   F_incomplete_utf_stop if max write was reached but was unable to completely write a given UTF-8 block (incomplete UTF-8 is not written, not even partially).
  *   F_block (with error bit) if file descriptor is set to non-block and the write would result in a blocking operation.
  *   F_buffer (with error bit) if the buffer is invalid.
  *   F_file (with error bit) if file descriptor is in an error state.
@@ -238,6 +241,7 @@ extern "C" {
  *   F_none on success.
  *   F_none_eos on success but range.stop exceeded buffer.used (only wrote up to buffer.used).
  *   F_none_stop on success but no data was written (written == 0) (not an error and often happens if file type is not a regular file).
+ *   F_incomplete_utf_stop if max write was reached but was unable to completely write a given UTF-8 block (incomplete UTF-8 is not written, not even partially).
  *   F_block (with error bit) if file descriptor is set to non-block and the write would result in a blocking operation.
  *   F_buffer (with error bit) if the buffer is invalid.
  *   F_file (with error bit) if file descriptor is in an error state.