1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/region.cc Tue Jan 19 23:26:49 2021 +0100
1.3 @@ -0,0 +1,90 @@
1.4 +#include <stdio.h>
1.5 +#include <string.h>
1.6 +#include <stdlib.h>
1.7 +
1.8 +#include "region.h"
1.9 +
1.10 +
1.11 +
1.12 +/* Initialise region state, indicating the size, file and position. */
1.13 +
1.14 +RegionState::RegionState(unsigned long size, fileid_t fileid, offset_t filepos)
1.15 +: size(size), fileid(fileid), filepos(filepos)
1.16 +{
1.17 +}
1.18 +
1.19 +void RegionState::fill(fileid_t fileid, offset_t filepos)
1.20 +{
1.21 + this->fileid = fileid;
1.22 + this->filepos = filepos;
1.23 +}
1.24 +
1.25 +void RegionState::show(std::ostringstream &buffer)
1.26 +{
1.27 + char buf[64];
1.28 +
1.29 + snprintf(buf, 64, "{%3ld:%6ld}", fileid, filepos);
1.30 +
1.31 + buffer << buf;
1.32 +}
1.33 +
1.34 +
1.35 +
1.36 +/* Initialise a region having the given 'start' and 'end' addresses, with the
1.37 + 'end' being one location beyond the last address in the region. */
1.38 +
1.39 +Region::Region(offset_t start, offset_t end)
1.40 +: start(start), end(end), state(end - start)
1.41 +{
1.42 + /* Content state. */
1.43 +
1.44 + memset((void *) start, 0, end - start);
1.45 +}
1.46 +
1.47 +Region::~Region()
1.48 +{
1.49 + free((void *) start);
1.50 +}
1.51 +
1.52 +offset_t Region::size()
1.53 +{
1.54 + return end - start;
1.55 +}
1.56 +
1.57 +/* Debugging methods. */
1.58 +
1.59 +int Region::compare(Region *other)
1.60 +{
1.61 + if (start < other->start)
1.62 + return -1;
1.63 + else if (start > other->start)
1.64 + return 1;
1.65 + else
1.66 + return 0;
1.67 +}
1.68 +
1.69 +void Region::fill(fileid_t fileid, offset_t filepos)
1.70 +{
1.71 + state.fill(fileid, filepos);
1.72 +}
1.73 +
1.74 +void Region::flush()
1.75 +{
1.76 +}
1.77 +
1.78 +/* Simulation methods. */
1.79 +
1.80 +char *Region::read(offset_t offset)
1.81 +{
1.82 + return (char *) start + offset;
1.83 +}
1.84 +
1.85 +void Region::write(const char *data, offset_t offset)
1.86 +{
1.87 + size_t length = strlen(data);
1.88 +
1.89 + if (offset + length < size())
1.90 + memcpy((void *) (start + offset), data, length + 1);
1.91 +}
1.92 +
1.93 +// vim: tabstop=4 expandtab shiftwidth=4