From 082f12d68ec69cbdedb159493fa2f634412f5a39 Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Mon, 20 May 2013 20:45:52 +0100 Subject: [PATCH] New module range handles common operations on address ranges. Copied from Perforce Change: 182015 ServerID: perforce.ravenbrook.com --- mps/code/range.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++ mps/code/range.h | 85 +++++++++++++++++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 mps/code/range.c create mode 100644 mps/code/range.h diff --git a/mps/code/range.c b/mps/code/range.c new file mode 100644 index 00000000000..a714b515cd6 --- /dev/null +++ b/mps/code/range.c @@ -0,0 +1,112 @@ +/* range.c: ADDRESS RANGE IMPLEMENTATION + * + * $Id$ + * Copyright (c) 2013 Ravenbrook Limited. See end of file for license. + */ + +#include "range.h" + +SRCID(range, "$Id$"); + + +Bool RangeCheck(Range range) +{ + CHECKS(Range, range); + CHECKL(range != NULL); + CHECKL(RangeBase(range) != NULL); + CHECKL(RangeBase(range) <= RangeLimit(range)); + + return TRUE; +} + +Res RangeInit(Range range, Addr base, Addr limit) +{ + AVER(range != NULL); + AVER(base != NULL); + AVER(base <= limit); + + range->sig = RangeSig; + range->base = base; + range->limit = limit; + + AVERT(Range, range); + return ResOK; +} + +void RangeFinish(Range range) +{ + AVERT(Range, range); + + range->base = range->limit = NULL; + range->sig = SigInvalid; +} + +Res RangeDescribe(Range range, mps_lib_FILE *stream) +{ + Res res; + + AVERT(Range, range); + AVER(stream != NULL); + + res = WriteF(stream, + "Range $P\n{\n", (WriteFP)range, + " base: $P \n", (WriteFP)RangeBase(range), + " limit: $P \n", (WriteFP)RangeLimit(range), + "}\n", NULL); + if (res != ResOK) { + return res; + } + + return ResOK; +} + +Bool RangeOverlap(Range range1, Range range2) +{ + AVERT(Range, range1); + AVERT(Range, range2); + + return RangeBase(range1) < RangeLimit(range2) + && RangeBase(range2) < RangeLimit(range1); +} + + +/* C. COPYRIGHT AND LICENSE + * + * Copyright (C) 2013 Ravenbrook Limited . + * All rights reserved. This is an open source license. Contact + * Ravenbrook for commercial licensing options. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Redistributions in any form must be accompanied by information on how + * to obtain complete source code for this software and any accompanying + * software that uses this software. The source code must either be + * included in the distribution or be available for no more than the cost + * of distribution plus a nominal fee, and must be freely redistributable + * under reasonable conditions. For an executable file, complete source + * code means the source code for all modules it contains. It does not + * include source code for modules or files that typically accompany the + * major components of the operating system on which the executable file + * runs. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ diff --git a/mps/code/range.h b/mps/code/range.h new file mode 100644 index 00000000000..24c1ca39e2d --- /dev/null +++ b/mps/code/range.h @@ -0,0 +1,85 @@ +/* range.h: ADDRESS RANGE INTERFACE + * + * $Id$ + * Copyright (c) 2013 Ravenbrook Limited. See end of file for license. + * + * .purpose: Representation of address ranges. + */ + +#ifndef range_h +#define range_h + +#include "mpmtypes.h" + + +/* Signatures */ + +#define RangeSig ((Sig)0x5196A493) /* SIGnature RANGE */ + + +/* Prototypes */ + +typedef struct RangeStruct *Range; + +#define RangeBase(range) ((range)->base) +#define RangeLimit(range) ((range)->limit) +#define RangeSize(range) (AddrOffset(RangeBase(range), RangeLimit(range))) + +extern Res RangeInit(Range range, Addr base, Addr limit); +extern void RangeFinish(Range range); +extern Res RangeDescribe(Range range, mps_lib_FILE *stream); +extern Bool RangeCheck(Range range); +extern Bool RangeOverlap(Range range1, Range range2); + + +/* Types */ + +typedef struct RangeStruct { + Sig sig; + Addr base; + Addr limit; +} RangeStruct; + +#endif /* range_h */ + + +/* C. COPYRIGHT AND LICENSE + * + * Copyright (C) 2013 Ravenbrook Limited . + * All rights reserved. This is an open source license. Contact + * Ravenbrook for commercial licensing options. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Redistributions in any form must be accompanied by information on how + * to obtain complete source code for this software and any accompanying + * software that uses this software. The source code must either be + * included in the distribution or be available for no more than the cost + * of distribution plus a nominal fee, and must be freely redistributable + * under reasonable conditions. For an executable file, complete source + * code means the source code for all modules it contains. It does not + * include source code for modules or files that typically accompany the + * major components of the operating system on which the executable file + * runs. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */