Branch data Line data Source code
1 : : #include "buffer_entry.h" 2 : : #include <stdio.h> 3 : : #include <assert.h> 4 : : #include <stdlib.h> 5 : : #include <string.h> 6 : : 7 : : struct __buffer_entry_t 8 : : { 9 : : FILE *fd; 10 : : cmph_uint8 * buff; 11 : : cmph_uint32 capacity, // buffer entry capacity 12 : : nbytes, // buffer entry used bytes 13 : : pos; // current read position in buffer entry 14 : : cmph_uint8 eof; // flag to indicate end of file 15 : : }; 16 : : 17 : 0 : buffer_entry_t * buffer_entry_new(cmph_uint32 capacity) 18 : : { 19 : 0 : buffer_entry_t *buff_entry = (buffer_entry_t *)malloc(sizeof(buffer_entry_t)); 20 [ # # ]: 0 : assert(buff_entry); 21 : 0 : buff_entry->fd = NULL; 22 : 0 : buff_entry->buff = NULL; 23 : 0 : buff_entry->capacity = capacity; 24 : 0 : buff_entry->nbytes = capacity; 25 : 0 : buff_entry->pos = capacity; 26 : 0 : buff_entry->eof = 0; 27 : 0 : return buff_entry; 28 : : } 29 : : 30 : 0 : void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename) 31 : : { 32 : 0 : buffer_entry->fd = fopen(filename, "rb"); 33 : 0 : } 34 : : 35 : 0 : void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity) 36 : : { 37 : 0 : buffer_entry->capacity = capacity; 38 : 0 : } 39 : : 40 : : 41 : 0 : cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry) 42 : : { 43 : 0 : return buffer_entry->capacity; 44 : : } 45 : : 46 : 0 : static void buffer_entry_load(buffer_entry_t * buffer_entry) 47 : : { 48 : 0 : free(buffer_entry->buff); 49 : 0 : buffer_entry->buff = (cmph_uint8 *)calloc((size_t)buffer_entry->capacity, sizeof(cmph_uint8)); 50 : 0 : buffer_entry->nbytes = (cmph_uint32)fread(buffer_entry->buff, (size_t)1, (size_t)buffer_entry->capacity, buffer_entry->fd); 51 [ # # ]: 0 : if (buffer_entry->nbytes != buffer_entry->capacity) buffer_entry->eof = 1; 52 : 0 : buffer_entry->pos = 0; 53 : 0 : } 54 : : 55 : 0 : cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen) 56 : : { 57 : 0 : cmph_uint8 * buf = NULL; 58 : 0 : cmph_uint32 lacked_bytes = sizeof(*keylen); 59 : 0 : cmph_uint32 copied_bytes = 0; 60 [ # # # # ]: 0 : if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end 61 : : { 62 : 0 : free(buf); 63 : 0 : return NULL; 64 : : } 65 [ # # ]: 0 : if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) 66 : : { 67 : 0 : copied_bytes = buffer_entry->nbytes - buffer_entry->pos; 68 : 0 : lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; 69 [ # # ]: 0 : if (copied_bytes != 0) memcpy(keylen, buffer_entry->buff + buffer_entry->pos, (size_t)copied_bytes); 70 : 0 : buffer_entry_load(buffer_entry); 71 : : } 72 : 0 : memcpy(keylen + copied_bytes, buffer_entry->buff + buffer_entry->pos, (size_t)lacked_bytes); 73 : 0 : buffer_entry->pos += lacked_bytes; 74 : : 75 : 0 : lacked_bytes = *keylen; 76 : 0 : copied_bytes = 0; 77 : 0 : buf = (cmph_uint8 *)malloc(*keylen + sizeof(*keylen)); 78 : 0 : memcpy(buf, keylen, sizeof(*keylen)); 79 [ # # ]: 0 : if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) { 80 : 0 : copied_bytes = buffer_entry->nbytes - buffer_entry->pos; 81 : 0 : lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; 82 [ # # ]: 0 : if (copied_bytes != 0) { 83 : 0 : memcpy(buf + sizeof(*keylen), buffer_entry->buff + buffer_entry->pos, (size_t)copied_bytes); 84 : : } 85 : 0 : buffer_entry_load(buffer_entry); 86 : : } 87 : 0 : memcpy(buf+sizeof(*keylen)+copied_bytes, buffer_entry->buff + buffer_entry->pos, (size_t)lacked_bytes); 88 : 0 : buffer_entry->pos += lacked_bytes; 89 : 0 : return buf; 90 : : } 91 : : 92 : 0 : void buffer_entry_destroy(buffer_entry_t * buffer_entry) 93 : : { 94 : 0 : fclose(buffer_entry->fd); 95 : 0 : buffer_entry->fd = NULL; 96 : 0 : free(buffer_entry->buff); 97 : 0 : buffer_entry->buff = NULL; 98 : 0 : buffer_entry->capacity = 0; 99 : 0 : buffer_entry->nbytes = 0; 100 : 0 : buffer_entry->pos = 0; 101 : 0 : buffer_entry->eof = 0; 102 : 0 : free(buffer_entry); 103 : 0 : }