LogInline.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Useful procs for manipulating RecordIDs.
Last edited by
MBrown on January 30, 1984 10:14:00 am PST
Hauser, March 8, 1985 10:52:24 am PST
Carl Hauser, October 4, 1985 1:35:42 pm PDT
DIRECTORY
AlpineEnvironment,
Basics,
AlpineLog,
RuntimeError;
LogInline:
DEFINITIONS
IMPORTS
Basics,
RuntimeError
= BEGIN
Comparison: TYPE = Basics.Comparison;
RecordID: TYPE = AlpineLog.RecordID;
PageNumber: TYPE = AlpineEnvironment.PageNumber;
WordNumber: TYPE = INT;
wordsPerPage: CARDINAL = AlpineEnvironment.wordsPerPage;
logWordsPerPage: CARDINAL = AlpineEnvironment.logWordsPerPage;
RecordID1:
TYPE =
MACHINE
DEPENDENT
RECORD [
page0 (0: 0..7): [0..256),
offsetInPage (0: 8..15): [0..AlpineEnvironment.wordsPerPage),
page1 (1: 0..31): LONG CARDINAL];
This is one way to decompose a AlpineLog.RecordID.
Notice that like all long numbers, the least-significant bits come in the first word.
RecordID2:
TYPE =
MACHINE
DEPENDENT
RECORD [
lowbits: CARDINAL, highbits: LONG CARDINAL ];
Operations on RecordIDs
Compare:
PROC [a, b: RecordID]
RETURNS [Comparison] =
INLINE {
IF a.highBits = b.highBits THEN RETURN [Basics.CompareCard[a.lowBits, b.lowBits]]
ELSE RETURN [Basics.CompareCard[a.highBits, b.highBits]];
};
Min:
PROC [a, b: RecordID]
RETURNS [RecordID] =
INLINE {
RETURN [IF Compare[a, b] = greater THEN b ELSE a];
};
Max:
PROC [a, b: RecordID]
RETURNS [RecordID] =
INLINE {
RETURN [IF Compare[a, b] = less THEN b ELSE a];
};
WordsFromSubtract:
PROC [larger, smaller: RecordID]
RETURNS [result:
INT] =
INLINE {
result ← LOOPHOLE[larger.lowBits-smaller.lowBits, INT];
SELECT
TRUE
FROM
result < 0 =>
GO TO boundsFault;
larger.lowBits < smaller.lowBits =>
borrow from high bits
IF larger.highBits # smaller.highBits+1 THEN GO TO boundsFault;
larger.highBits # smaller.highBits =>
GO TO boundsFault;
ENDCASE;
RETURN [result];
EXITS boundsFault => ERROR RuntimeError.BoundsFault;
};
AddC:
PROC [r: RecordID, words:
CARDINAL]
RETURNS [RecordID] =
INLINE {
Returns r+c.
low: Basics.LongNumber[num] =
LOOPHOLE[LONG[words] + LONG[LOOPHOLE[r, RecordID2].lowbits]];
high: LONG CARDINAL = LONG[low.highbits] + LOOPHOLE[r, RecordID2].highbits;
RETURN [LOOPHOLE[RecordID2[highbits: high, lowbits: low.lowbits]]];
};
AddLC:
PROC [r: RecordID, words:
LONG
CARDINAL]
RETURNS [RecordID] =
INLINE {
Returns r+words.
low: Basics.LongNumber[num] =
LOOPHOLE[
LONG[LOOPHOLE[words, Basics.LongNumber[num]].lowbits] +
LONG[LOOPHOLE[r, RecordID2].lowbits] ];
high:
LONG
CARDINAL =
LONG[low.highbits] +
LONG[LOOPHOLE[words, Basics.LongNumber[num]].highbits] +
LOOPHOLE[r, RecordID2].highbits;
RETURN [LOOPHOLE[RecordID2[highbits: high, lowbits: low.lowbits]]];
};
RecordIDFromWordNumber:
PROC [w: WordNumber]
RETURNS [RecordID] =
INLINE {
RETURN [[lowBits: LOOPHOLE[w], highBits: 0]] };
WordInPageFromRecordID:
PROC [r: RecordID]
RETURNS [
CARDINAL] =
INLINE {
RETURN [LOOPHOLE[r, RecordID1].offsetInPage] };
END.
CHANGE LOG
Created by MBrown on September 21, 1982 2:45 pm
Changed by MBrown on September 25, 1982 3:50 pm
Moved stuff here from LogCoreImpl: Compare, DecomposeWordNumber, etc.
Changed by MBrown on October 4, 1982 10:19 pm
Cedar 3.4: use Environment.Comparison, Inline.CompareCard.
Changed by MBrown on October 25, 1982 10:45 pm
Eliminate dependency on LogBasic so that this interface can be made public.
Changed by MBrown on November 9, 1982 3:01 pm
Moved page <-> word stuff to AlpineInline.
Changed by MBrown on January 30, 1984 10:11:20 am PST
Cedar 5.0: use Basics, RuntimeError.
Hauser, March 8, 1985 10:51:50 am PST
Nodified, added copyright.
Carl Hauser, October 4, 1985 1:35:26 pm PDT
Change "Log" to "AlpineLog"