Module: dood Synopsis: The Dylan object-oriented database Author: Jonathan Bachrach Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND // Define this so can play around with replacements to this file define constant = ; define inline function dood-position (dood :: ) => (res ::
) let position ::
= stream-position(dood-stream(dood)); truncate/(position, $bytes-per-word); end function; define inline function dood-position-setter (value ::
, dood :: ) audit(dood, "%dP%d\n", value); let new-position = value * $bytes-per-word; multi-buffered-stream-position(dood-stream(dood)) := new-position; end function; define inline function dood-force-output (dood :: ) force-output(dood-stream(dood)); end function; /// READING /* define inline function dood-byte-read (dood :: ) read-element(dood-stream(dood)); end function; define inline function dood-read-string (dood :: , n :: ) read(dood-stream(dood), n) end function; */ define inline function dood-read-string-into! (dood :: , n :: , object) audit(dood, "%dS%d\n", n); read-into!(dood-stream(dood), n, object) end function; define inline function encode-word-bytes (b1 :: , b2 :: , b3 :: , b4 :: ) => (res :: ) dood-word-logior (dood-word-logior (dood-word-shift-left(b1, 24), dood-word-shift-left(b2, 16)), dood-word-logior (dood-word-shift-left(b3, 8), b4)) end function; define inline function dood-read-word (dood :: ) => (res :: ) dood-format("READING @ %d", dood-position(dood)); let (b1, b2, b3, b4) = read-4-aligned-bytes(dood-stream(dood)); // let b1 :: = dood-read-element(dood); // let b2 :: = dood-read-element(dood); // let b3 :: = dood-read-element(dood); // let b4 :: = dood-read-element(dood); audit(dood, "%dW\n"); let value :: = encode-word-bytes (as(, b1), as(, b2), as(, b3), as(, b4)); dood-format(" %d\n", untag(as(
, value))); value /* let value = read-4-aligned-bytes-as-word(dood-stream(dood)); dood-format("READING %= @ %d\n", value, dood-position(dood)); value */ end function; define inline function dood-read-word-at (dood :: , address ::
) => (res :: ) dood-position(dood) := address; dood-read-word(dood); end function; define function dood-read (dood :: ) => (res ::
) as(
, dood-read-word(dood)) end function; define inline function dood-read-at (dood :: , address ::
) => (res ::
) as(
, dood-read-word-at(dood, address)) end function; /// WRITING /* define inline function dood-byte-write (dood :: , value :: ) write-element(dood-stream(dood), value); end function; */ define inline function dood-write-string (dood :: , value) write(dood-stream(dood), value) end function; /* define inline function dood-write-string-at (dood :: , value, address ::
) dood-position(dood) := address; dood-format("WRITING %= @ %d\n", value, dood-position(dood)); dood-write-string(dood, value) end function; */ define inline function decode-word-bytes (value :: ) => (b1 :: , b2 :: , b3 :: , b4 :: ) let b1 = dood-word-logand (dood-word-shift-right(value, 24), as(, 255)); let b2 = dood-word-logand (dood-word-shift-right(value, 16), as(, 255)); let b3 = dood-word-logand (dood-word-shift-right(value, 8), as(, 255)); let b4 = dood-word-logand(value, as(, 255)); values(b1, b2, b3, b4); end function; define inline function dood-write-word (dood :: , value :: ) let (b1, b2, b3, b4) = decode-word-bytes(value); dood-format("WRITING %d @ %d [%d, %d, %d, %d]\n", as(, value), dood-position(dood), as(, b1), as(, b2), as(, b3), as(, b4)); write-4-aligned-bytes (dood-stream(dood), as(, b1), as(, b2), as(, b3), as(, b4)); // dood-write-element(dood, as(, b1)); // dood-write-element(dood, as(, b2)); // dood-write-element(dood, as(, b3)); // dood-write-element(dood, as(, b4)); /* dood-format("WRITING %d @ %d\n", value, dood-position(dood)); write-4-aligned-bytes-from-word (dood-stream(dood), value) */ end function; define inline function dood-write-word-at (dood :: , value :: , address ::
) dood-position(dood) := address; dood-write-word(dood, value); end function; define function dood-write (dood :: , value :: ) dood-write-word(dood, as(, value)) end function; define inline function dood-write-at (dood :: , value :: , address ::
) dood-write-word-at(dood, as(, value), address) end function; // eof