byte_source_read_marker() needs to refill.
authorSteinar H. Gunderson <sesse@debian.org>
Sat, 3 Jan 2009 10:34:50 +0000 (11:34 +0100)
committerSteinar H. Gunderson <sesse@debian.org>
Sat, 3 Jan 2009 10:34:50 +0000 (11:34 +0100)
bytesource.c
bytesource.h

index 65d5a44..9e46d20 100644 (file)
@@ -17,16 +17,33 @@ void init_byte_source(struct byte_source* source, raw_input_func_t* input_func,
        source->userdata = userdata;
 }
 
        source->userdata = userdata;
 }
 
-uint8_t byte_source_read_marker(struct byte_source* source)
+uint8_t byte_source_read_marker(struct byte_source* src)
 {
 {
-       assert(source->bytes_available >= 2);
-       assert(source->bytes[0] == MARKER_CHAR);
-       assert(source->bytes[1] != STUFF_MARKER);
+       // Refill until we have at least two bytes or EOF.
+       while (src->bytes_available < 2) {
+               const unsigned bytes_to_read = BYTESOURCE_CHUNK_SIZE - src->bytes_available;
+               const ssize_t bytes_read =
+                       (*src->input_func)(src->userdata,
+                                          src->bytes + src->bytes_available,
+                                          bytes_to_read);
+               assert(bytes_read >= -1);
+               assert(bytes_read <= (ssize_t)bytes_to_read);
+               
+               if (bytes_read == -1 || bytes_read == 0) {
+                       return 0x00;
+               }
 
 
-       uint8_t ret = source->bytes[1];
+               src->bytes_available += bytes_read;
+       }
+
+       assert(src->bytes_available >= 2);
+       if (src->bytes[0] != MARKER_CHAR || src->bytes[1] == STUFF_MARKER) {
+               return 0x00;
+       }
 
 
-       memmove(source->bytes, source->bytes + 2, source->bytes_available - 2);
-       source->bytes_available -= 2;
+       uint8_t ret = src->bytes[1];
+       memmove(src->bytes, src->bytes + 2, src->bytes_available - 2);
+       src->bytes_available -= 2;
 
        return ret;
 }
 
        return ret;
 }
index 4e9e307..bb934fb 100644 (file)
@@ -19,7 +19,10 @@ struct byte_source {
        void* userdata;
 };
 void init_byte_source(struct byte_source* source, raw_input_func_t* input_func, void* userdata);
        void* userdata;
 };
 void init_byte_source(struct byte_source* source, raw_input_func_t* input_func, void* userdata);
+
+// Returns 0x00 if no marker was available (ie. error).
 uint8_t byte_source_read_marker(struct byte_source* source);
 uint8_t byte_source_read_marker(struct byte_source* source);
+
 ssize_t byte_source_input_func(void* source, uint8_t* buf, size_t len);
 
 #endif /* !defined(_BYTESOURCE_H) */
 ssize_t byte_source_input_func(void* source, uint8_t* buf, size_t len);
 
 #endif /* !defined(_BYTESOURCE_H) */