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