]> Kevux Git Server - fll/commitdiff
Update: add support for reading from fifos
authorKevin Day <kevin@kevux.org>
Sat, 10 Mar 2012 23:44:58 +0000 (17:44 -0600)
committerKevin Day <kevin@kevux.org>
Sat, 10 Mar 2012 23:44:58 +0000 (17:44 -0600)
In particular, this is used for reading from piped files, namely stdin.

level_0/f_file/c/file.c
level_0/f_file/c/file.h
level_1/fl_file/c/file.c
level_1/fl_file/c/file.h

index b2bc8060b3530b61e72612b4f8938298b60119e6..2e58db26b5a8e6e2660148bd8f15853ae487f113 100644 (file)
@@ -131,6 +131,33 @@ extern "C"{
   }
 #endif // _di_f_file_read_
 
+#ifndef _di_f_file_read_fifo_
+  f_return_status f_file_read_fifo(f_file *file_information, f_dynamic_string *buffer){
+    #ifndef _di_level_0_parameter_checking_
+      if (file_information == f_null) return f_invalid_parameter;
+    #endif // _di_level_0_parameter_checking_
+
+    if (file_information->file == 0) return f_file_not_open;
+
+    f_s_int result = 0;
+
+    // now do the actual read
+    result = fread(buffer->string + buffer->used, file_information->byte_size, buffer->size - 1, file_information->file);
+
+    if (file_information->file == 0)         return f_file_read_error;
+    if (ferror(file_information->file) != 0) return f_file_read_error;
+
+    buffer->used += result;
+
+    // make sure to communicate that we are done without a problem and the eof was reached
+    if (feof(file_information->file)){
+      return f_none_on_eof;
+    }
+
+    return f_none;
+  }
+#endif // _di_f_file_read_fifo_
+
 #ifdef __cplusplus
 } // extern "C"
 #endif
index bfcb2d0c6e073d5d9d47f1a0badd3e7b1533d284..62d3db0dd267af7e638fd99751fc363a8292f547 100644 (file)
@@ -206,6 +206,11 @@ extern "C"{
   extern f_return_status f_file_read(f_file *file_information, f_dynamic_string *buffer, const f_file_position location);
 #endif // _di_f_file_read_
 
+#ifndef _di_f_file_read_fifo_
+  // read a given amount of data from the buffer, will not auto seek
+  extern f_return_status f_file_read_fifo(f_file *file_information, f_dynamic_string *buffer);
+#endif // _di_f_file_read_fifo_
+
 #ifdef __cplusplus
 } // extern "C"
 #endif
index d18cc0fa01c4a9e319e3b37453b59332a0b999c7..1e69f747205fcdd9c01ab7085dcf4e597ccb00da 100644 (file)
@@ -36,10 +36,12 @@ extern "C"{
 
     // populate the buffer
     do{
-      f_resize_dynamic_string(status, (*buffer), size);
+      if (buffer->size < size){
+        f_resize_dynamic_string(status, (*buffer), size);
 
-      if (f_macro_test_for_allocation_errors(status)){
-        return status;
+        if (f_macro_test_for_allocation_errors(status)){
+          return status;
+        }
       }
 
       status = f_file_read(&file, buffer, position);
@@ -63,6 +65,48 @@ extern "C"{
   }
 #endif // _di_fl_file_read_
 
+#ifndef _di_fl_file_read_fifo_
+  f_return_status fl_file_read_fifo(f_file file, f_dynamic_string *buffer){
+    #ifndef _di_level_1_parameter_checking_
+      if (buffer == f_null) return f_invalid_parameter;
+    #endif // _di_level_1_parameter_checking_
+
+    if (file.file == 0) return f_file_not_open;
+
+    f_status        status = f_status_initialize;
+    f_string_length size   = f_string_length_initialize;
+
+    size = f_file_default_read_size;
+
+    // populate the buffer
+    do {
+      if (buffer->size < size){
+        f_resize_dynamic_string(status, (*buffer), size);
+
+        if (f_macro_test_for_allocation_errors(status)){
+          return status;
+        }
+      }
+
+      status = f_file_read_fifo(&file, buffer);
+
+      if (status == f_none_on_eof){
+        break;
+      } else if (status != f_none){
+        return status;
+      }
+
+      if (size + f_file_default_read_size > f_string_max_size){
+        return f_overflow;
+      }
+
+      size += f_file_default_read_size;
+    } while (f_true);
+
+    return f_none;
+  }
+#endif // _di_fl_file_read_fifo_
+
 #ifdef __cplusplus
 } // extern "C"
 #endif
index e3bf01caf4484ab0f0f3126d5fa3f48891b29753..c06e0b9eeb30d7342571feeff6c9f96549550305 100644 (file)
@@ -22,6 +22,10 @@ extern "C"{
   extern f_return_status fl_file_read(f_file file, const f_file_position position, f_dynamic_string *buffer);
 #endif // _di_fl_file_read_
 
+#ifndef _di_fl_file_read_fifo_
+  extern f_return_status fl_file_read_fifo(f_file file, f_dynamic_string *buffer);
+#endif // _di_fl_file_read_fifo_
+
 #ifdef __cplusplus
 } // extern "C"
 #endif