1 #include <string.h> 2 #include <stdlib.h> 3 4 #include "region.h" 5 6 7 8 /* Initialise region state, indicating the size, file and position. */ 9 10 RegionState::RegionState(unsigned long size, fileid_t fileid, offset_t filepos) 11 : size(size), fileid(fileid), filepos(filepos) 12 { 13 } 14 15 void RegionState::fill(fileid_t fileid, offset_t filepos) 16 { 17 this->fileid = fileid; 18 this->filepos = filepos; 19 } 20 21 22 23 /* Initialise a region having the given 'start' and 'end' addresses, with the 24 'end' being one location beyond the last address in the region. */ 25 26 Region::Region(offset_t start, offset_t end) 27 : start(start), end(end), state(end - start) 28 { 29 /* Content state. */ 30 31 memset((void *) start, 0, end - start); 32 } 33 34 Region::~Region() 35 { 36 free((void *) start); 37 } 38 39 offset_t Region::size() 40 { 41 return end - start; 42 } 43 44 /* Debugging methods. */ 45 46 int Region::compare(Region *other) 47 { 48 if (start < other->start) 49 return -1; 50 else if (start > other->start) 51 return 1; 52 else 53 return 0; 54 } 55 56 void Region::fill(fileid_t fileid, offset_t filepos) 57 { 58 state.fill(fileid, filepos); 59 } 60 61 void Region::flush() 62 { 63 } 64 65 /* Simulation methods. */ 66 67 char *Region::read(offset_t offset) 68 { 69 if (offset < size()) 70 return (char *) start + offset; 71 else 72 return NULL; 73 } 74 75 void Region::write(const char *data, offset_t offset) 76 { 77 size_t length = strlen(data); 78 79 if (offset + length < size()) 80 memcpy((void *) (start + offset), data, length + 1); 81 } 82 83 // vim: tabstop=4 expandtab shiftwidth=4