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