source410: link campaign - entire engine compiles (152/152), first true link,

52-symbol unresolved ledger

build410.sh: merged-engine mass compile + BT TUs + tlib + authentic tlink32.
Engine closure fixes: boxtree/set/l4gauge/filestrm back-dates, lamp<->gaugrend
cycle broken (1995 form), APP.HPP Shutdown default, NetNub include path, DPL
vpx shim, SOS 32-bit lib arbitration (SOSDBXC/SOSMBXC; SOSMW*=16-bit), WATTCP
excluded (16-bit NetNub TSR side). UNRESOLVED-LEDGER.txt = the measured gap to
a linking BTL4OPT.EXE.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-19 08:46:05 -05:00
co-authored by Claude Fable 5
parent 1e6b5258b3
commit 6b216d0643
10 changed files with 1934 additions and 7 deletions
+1 -1
View File
@@ -143,7 +143,7 @@ public:
Stop();
virtual Logical
Shutdown(int remainingApps);
Shutdown(int remainingApps = 0);
virtual void
Terminate();
+218
View File
@@ -0,0 +1,218 @@
#if !defined(BOXTREE_HPP)
# define BOXTREE_HPP
# if !defined(BNDGBOX_HPP)
# include <bndgbox.hpp>
# endif
# if !defined(MEMBLOCK_HPP)
# include <memblock.hpp>
# endif
//##########################################################################
//####################### BoundingBoxTreeNode ########################
//##########################################################################
class BoundingBoxTree;
class BoundingBoxTreeNode SIGNATURED
{
public:
static MemoryBlock
AllocatedMemory;
friend class BoundingBoxTree;
//##########################################################################
// Memory Allocation
//
private:
static MemoryBlock* GetAllocatedMemory();
void* operator new(size_t) { return GetAllocatedMemory()->New(); }
void operator delete(void *where) { GetAllocatedMemory()->Delete(where); }
//##########################################################################
// Construction and Destruction
//
protected:
ExtentBox
nodeExtents;
BoundingBox
*staticContents;
BoundingBoxTreeNode
*nodeBranches[6],
*innerNode;
BoundingBoxTreeNode(
BoundingBox *volume,
const ExtentBox &extents
);
~BoundingBoxTreeNode();
void
Add(
BoundingBox *BoundingBox,
const ExtentBox &extents
);
void
Remove(
BoundingBox *BoundingBox,
const ExtentBox &extents
);
//##########################################################################
// Tree Traversal Functions
//
protected:
static int
TraversalOrder[6];
static void
SetTraversalOrder(
int first,
int second,
int third
);
public:
BoundingBoxTreeNode*
FindSmallestNodeContaining(
const ExtentBox &extents,
BoundingBoxTreeNode *parent
);
BoundingBoxTreeNode*
FindSmallestNodeContainingColumn(const ExtentBox &extents);
BoundingBox*
FindBoundingBoxContaining(
const Point3D &point,
BoundingBox *parent
);
void
FindBoundingBoxesContaining(
BoundingBox *volume,
const ExtentBox &slice,
BoundingBoxCollisionList &list
);
BoundingBox*
FindBoundingBoxUnder(
const Point3D &point,
Scalar *height
);
BoundingBox*
FindBoundingBoxHitBy(Line *line);
//##########################################################################
// Test Support
//
public:
Logical
TestInstance() const;
};
//##########################################################################
//######################## BoundingBoxTree ###########################
//##########################################################################
class BoundingBoxTree SIGNATURED
{
//##########################################################################
// Construction and Destruction
//
protected:
BoundingBoxTreeNode *root;
public:
BoundingBoxTree()
{Check_Pointer(this); root = NULL;}
~BoundingBoxTree()
{Check(this); EraseTree();}
static void
SetTraversalOrder(
int first,
int second,
int third
)
{BoundingBoxTreeNode::SetTraversalOrder(first, second, third);}
void
Add(
BoundingBox* volume,
const ExtentBox &extents
);
void
Remove(BoundingBox* volume)
{
Check(this); Check(volume); Check(root);
root->Remove(volume, *volume);
}
void
EraseTree();
//##########################################################################
// Tree Traversal Functions
//
public:
BoundingBox*
FindBoundingBoxContaining(const Point3D &point)
{
Check(this); Check(&point); Check(root);
return root->FindBoundingBoxContaining(point, NULL);
}
BoundingBoxTreeNode*
FindSmallestNodeContaining(const ExtentBox &extents)
{
Check(this); Check(&extents); Check(root);
return root->FindSmallestNodeContaining(extents, NULL);
}
void
FindBoundingBoxesContaining(
BoundingBox *volume,
BoundingBoxCollisionList &list
)
{
Check(this); Check(volume); Check(&list); Check(root);
root->FindBoundingBoxesContaining(
volume,
*volume,
list
);
}
BoundingBoxTreeNode*
FindSmallestNodeContainingColumn(const ExtentBox &extents)
{
Check(this); Check(&extents); Check(root);
Verify((BoundingBoxTreeNode::TraversalOrder[4]>>1) == Y_Axis);
return root->FindSmallestNodeContainingColumn(extents);
}
BoundingBox*
FindBoundingBoxUnder(
const Point3D &point,
Scalar *height
)
{
Check(this); Check(&point); Check(root); Check_Pointer(height);
Verify((BoundingBoxTreeNode::TraversalOrder[4]>>1) == Y_Axis);
return root->FindBoundingBoxUnder(point, height);
}
BoundingBox*
FindBoundingBoxHitBy(Line *line);
//##########################################################################
// Test Support
//
public:
Logical
TestInstance() const;
};
#endif
+1 -6
View File
@@ -1,12 +1,7 @@
#if !defined(LAMP_HPP)
# define LAMP_HPP
# if !defined(GAUGREND_HPP)
# include <gaugrend.hpp>
# endif
# if !defined(STYLE_HPP)
# include <style.hpp>
# endif
class GaugeRenderer;
# if !defined(GRAPH2D_HPP)
# include <graph2d.hpp>
# endif
+266
View File
@@ -0,0 +1,266 @@
#if !defined(SET_HPP)
# define SET_HPP
# if !defined(CHAIN_HPP)
# include <chain.hpp>
# endif
// Classes Defined in this file
class Set;
class SetIterator;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Set ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class Set : public Socket
{
friend class SetIterator;
public:
Logical
TestInstance() const;
// Constructor
Set(Node *node);
~Set();
protected:
Set& operator=(const Set &rhs);
//STUBBED: UNKNOWN RB 1/15/07
//void
// AddImplementation(Plug *plug);
// Useful Set Operations
Logical operator==(const Set &rhs);
Set operator-(const Set &rhs) const;
Set Union(const Set &rhs) const;
Set Intersection(const Set &rhs) const;
// Set membership
Logical
Exists(const Plug &element) const;
private:
Chain *contents;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SetOf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template <class T> class SetOf:
public Set
{
public:
SetOf(Node *node);
~SetOf();
protected:
SetOf(Set set):
Set(set)
{
}
public:
// Public interface
void
Add(T *plug)
{AddImplementation(plug);}
// Useful Set Operations
SetOf<T>&
operator=(const SetOf<T> &rhs)
{
if (this==&rhs) return *this;
Set::operator=(rhs);
return *this;
}
Logical
operator==(const SetOf<T> &rhs)
{return Set::operator==(rhs);}
SetOf<T>
operator-(const SetOf<T> rhs) const
{return (SetOf<T>) Set::operator-(rhs);}
SetOf<T>
Union(const SetOf<T> &rhs) const
{return (SetOf<T>) Set::Union(rhs);}
SetOf<T>
Intersection(const SetOf<T> &rhs) const
{return (SetOf<T>) Set::Intersection(rhs);}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~ SetOf templates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template <class T>
SetOf<T>::SetOf(Node *node):
Set(node)
{
}
template <class T>
SetOf<T>::~SetOf()
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~ SetIterator ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class SetIterator:
public ChainIterator
{
public:
friend class Set;
//
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Public interface
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//
//
//--------------------------------------------------------------------
// Constructors, Destructor and testing
//--------------------------------------------------------------------
//
SetIterator(Set *set);
SetIterator(const SetIterator &iterator);
~SetIterator();
protected:
SetIterator(Chain *chain); // Used fot Set implementation to iterate on own contents
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~ SetIteratorOf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template <class T> class SetIteratorOf:
public SetIterator
{
public:
//
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// Public interface
//--------------------------------------------------------------------
//--------------------------------------------------------------------
//
//
//--------------------------------------------------------------------
// Constructors and Destructor
//--------------------------------------------------------------------
//
SetIteratorOf(SetOf<T> *chain);
SetIteratorOf(SetOf<T> &chain);
SetIteratorOf(const SetIteratorOf<T> &iterator);
~SetIteratorOf();
//
//--------------------------------------------------------------------
// Iterator methods (see Iterator for full listing)
//--------------------------------------------------------------------
//
T*
ReadAndNext()
{return (T*)ReadAndNextImplementation();}
T*
ReadAndPrevious()
{return (T*)ReadAndPreviousImplementation();}
T*
GetCurrent()
{return (T*)GetCurrentImplementation();}
T*
GetNth(CollectionSize index)
{return (T*)GetNthImplementation(index);}
void
Insert(T *plug)
{InsertImplementation(plug);}
SetIteratorOf<T>&
Begin()
{return (SetIteratorOf<T>&)BeginImplementation();}
SetIteratorOf<T>&
End()
{return (SetIteratorOf<T>&)EndImplementation();}
SetIteratorOf<T>&
Forward()
{return (SetIteratorOf<T>&)ForwardImplementation();}
SetIteratorOf<T>&
Backward()
{return (SetIteratorOf<T>&)BackwardImplementation();}
//
//---------------------------------------------------
// Operators useful when it is know that the iterator
// is a SetOf<> Iterator
//---------------------------------------------------
//
#if 0
Logical
operator!()
{return currentLink == NULL;}
operator T*()
{return GetCurrent();}
T*
operator->()
{return GetCurrent();}
T&
operator*()
{return *GetCurrent();}
SetIteratorOf<T>&
operator++()
{Next(); return *this;}
SetIteratorOf<T>&
operator--()
{Previous(); return *this;}
T*
operator++(int)
{return ReadAndNext();}
T*
operator--(int)
{return ReadAndPrevious();}
#endif
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~ SetIteratorOf templates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template <class T>
SetIteratorOf<T>::SetIteratorOf(SetOf<T> *set):
SetIterator(chain)
{
}
template <class T>
SetIteratorOf<T>::SetIteratorOf(SetOf<T> &set):
SetIterator(&chain)
{
}
template <class T>
SetIteratorOf<T>::SetIteratorOf(const SetIteratorOf<T> &iterator):
SetIterator(iterator)
{
}
template <class T>
SetIteratorOf<T>::~SetIteratorOf()
{
}
#endif
File diff suppressed because it is too large Load Diff
+14
View File
@@ -71,3 +71,17 @@ file-by-file; the current blocker for full closure is the 1995 engine header gap
first — only the drifted WinTesla `VDATA.h` survives, in BT412/engine). Include order for
builds: `CODE/BT/*` over `CODE/RP/*`, `-DNO_PRECOMPILED_HEADERS` until the mech-family headers
are reconstructed. Remaining gap: TASM32 (JOYSTICK.ASM only).
## Link campaign (build410, 2026-07-19)
`source410/build410.sh` assembles BTL4OPT.EXE: merged-engine mass compile (**152/152 green**
— the ENTIRE surviving engine compiles), BT TUs (11/11), tlib libs (munga 1.25MB / mungal4
with the prebuilt-1995 objs / bt / btl4), then the authentic tlink32 link rooted by a probe
main (build scaffold). First true link run: **52 unresolved externals**
(`UNRESOLVED-LEDGER.txt`) = the measured remaining gap. Kill-lists: l4gauge.cpp back-date
(14 widget statics), the missing-engine-body back-date wave (~24: rotation, player, team,
l4app, explode, dropzone, terrain, cultural, subsystm-statics, netclient...), the prebuilt
RANDOM.obj fold, and the staged game-TU statics blocks (MECH.CPP et al. — each TU file opens
with its binary-evidenced Derivation/SharedData statics and grows into the full body).
Link-lib arbitration: SOS = SOSDBXC+SOSMBXC (the 32-bit Borland-flat variants; SOSMW*=16-bit),
WATTCP excluded (it belongs to the 16-bit NetNub TSR — the game talks to it via shared
memory), filestrm = the RP-era pair (BT-tree pair is post-4.10 drift; override layer).
@@ -0,0 +1,52 @@
BTCameraDirector::DefaultData
BTPlayer::DefaultData
BackgroundBitmap::methodDescription
BackgroundFilledRect::methodDescription
BackgroundLine::methodDescription
BackgroundPixelmap::methodDescription
BackgroundReconfig::methodDescription
BackgroundRect::methodDescription
BarGraphPixelMapScalar::methodDescription
BarGraphSolidScalar::methodDescription
ColorState::methodDescription
CulturalIcon::DefaultData
DigitalClock::methodDescription
DropZone::DefaultData
EulerAngles::Identity
Explosion::DefaultData
L4Application::ClassDerivations
L4Application::MessageHandlers
L4Application::missionReviewMode
L4Application::rioPlaybackFileName
L4Application::rioRecordingFileName
Landmark::DefaultData
Mech::DefaultData
MechRIOMapper::DefaultData
MechThrustmasterMapper::DefaultData
Missile::DefaultData
NetworkClient::ClassDerivations
NumericDisplayInteger::methodDescription
NumericDisplayScalar::methodDescription
NumericDisplaySpeed::methodDescription
Player::AttributeIndex
Player::ClassDerivations
Player::DefaultData
Player::MessageHandlers
Projectile::DefaultData
Quaternion::Identity
RandomGenerator::Index
RankAndScore::methodDescription
Receiver::ClassDerivations
Receiver::DefaultData
Receiver::MessageHandlers
SegmentArcNormalized::methodDescription
Subsystem::ClassDerivations
Team::AttributeIndex
Team::ClassDerivations
Team::DefaultData
Team::MessageHandlers
Terrain::DefaultData
TwoState::methodDescription
UnscalableTerrain::ClassDerivations
UnscalableTerrain::DefaultData
YawPitchRoll::Identity
+159
View File
@@ -0,0 +1,159 @@
#!/bin/bash
# build410.sh -- assemble BTL4OPT.EXE from the reconstructed 4.10 tree.
#
# Stages:
# 1. mass-compile the merged engine source (CODE/BT over CODE/RP over
# source410 backfills) into build410/obj/{munga,mungal4}/
# 2. compile the BT game TUs (CODE originals + source410) into
# build410/obj/{bt,btl4}/
# 3. tlib the four libs; prebuilt-1995 .obj fallbacks fill source gaps
# 4. tlink32 with the authentic OPT.MAK order; unresolved externals ->
# build410/UNRESOLVED.txt (the canonical remaining-work ledger)
#
# Usage: ./build410.sh [engine|bt|libs|link|all|status]
T=/c/VWE/TeslaRel410
TW=c:/VWE/TeslaRel410
export PATH="$T/BORLAND/BC45/BIN:$PATH"
C=$TW/CODE/BT
R=$TW/CODE/RP
S=$TW/restoration/source410
B=$T/restoration/build410
Bw=$TW/restoration/build410
INC="$S/override;$C/BT_L4;$C/BT;$C/MUNGA;$C/MUNGA_L4;$C/MUNGA_L4/SOS/BC4;$S/MUNGA;$S/MUNGA_L4;$R/MUNGA;$R/MUNGA_L4;$R/MUNGA_L4/NetNub;$R/MUNGA_L4/sos/bc4;$C/MUNGA_L4/LIBDPL;$C/MUNGA_L4/NETNUB;$C/MUNGA_L4/NETNUB/INCLUDE;$S/MUNGA_L4;$R/MUNGA_L4/libDPL;$R/MUNGA_L4/libDPL/dpl;$S/shim;$S/BT;$S/BT_L4;$TW/BORLAND/BC45/INCLUDE"
FLAGS="-c -DLBE4 -DDEBUG_LEVEL=0 -DDEBUG_STREAM=cout \
-b -r -ff -AT -k- -N- -v- -5 -a4 -V -Jg -x- -RT- -O2 -w-"
mkdir -p "$B"/obj/{munga,mungal4,bt,btl4} "$B"/lib
# compile one TU into a bucket; skip if the obj is newer than the source
cc() { # cc <bucket> <src>
local out="$B/obj/$1/$(basename "${2%.*}" | tr 'A-Z' 'a-z').obj"
[ -f "$out" ] && [ "$out" -nt "$2" ] && return 0
if bcc32 $FLAGS -I"$INC" -o"$(cygpath -w "$out" 2>/dev/null || echo $out)" "$2" \
> "$B/obj/$1/$(basename "${2%.*}").log" 2>&1; then
return 0
else
rm -f "$out"; return 1
fi
}
# merged engine source view: BT tree wins, RP fills, source410 backfills last
merged() { # merged <BTdir> <RPdir> [S410dir]
{ ls "$1"/*.CPP "$1"/*.cpp 2>/dev/null | sed 's/.*[\\/]//'
ls "$2"/*.CPP "$2"/*.cpp 2>/dev/null | sed 's/.*[\\/]//'
[ -n "$3" ] && ls "$3"/*.CPP 2>/dev/null | sed 's/.*[\\/]//'
} | tr 'A-Z' 'a-z' | sort -u
}
srcfor() { # srcfor <name.cpp> <BTdir> <RPdir> [S410dir]
case "$1" in
filestrm.cpp) echo "$3/FILESTRM.CPP"; return;; # BT pair = post-4.10 drift
l4vidper.cpp|l4tsdpl.cpp) return;; # not in mungal4.lib
esac
for d in "$2" "$4" "$3"; do # BT first, then source410, then RP
[ -z "$d" ] && continue
for f in "$d"/*.CPP "$d"/*.cpp; do
[ -f "$f" ] || continue
[ "$(basename "$f" | tr 'A-Z' 'a-z')" = "$1" ] && { echo "$f"; return; }
done
done
}
stage_engine() {
local ok=0 fail=0 failed=""
for lib in munga mungal4; do
local bd rd sd
if [ $lib = munga ]; then bd=$C/MUNGA; rd=$R/MUNGA; sd=$S/MUNGA; else bd=$C/MUNGA_L4; rd=$R/MUNGA_L4; sd=$S/MUNGA_L4; fi
for n in $(merged "$bd" "$rd" "$sd"); do
src=$(srcfor "$n" "$bd" "$rd" "$sd")
[ -z "$src" ] && continue
if cc $lib "$src"; then ok=$((ok+1)); else fail=$((fail+1)); failed="$failed $lib/$n"; fi
done
done
echo "ENGINE: $ok ok, $fail fail"
for f in $failed; do echo " FAIL $f"; done | head -60
for f in $failed; do echo "$f"; done > "$B/ENGINE-FAILURES.txt"
}
stage_bt() {
local ok=0 fail=0
for n in $(merged "$C/BT" /dev/null "$S/BT"); do
src=$(srcfor "$n" "$C/BT" /dev/null "$S/BT")
[ -z "$src" ] && continue
if cc bt "$src"; then ok=$((ok+1)); else fail=$((fail+1)); echo " FAIL bt/$n"; fi
done
for n in $(merged "$C/BT_L4" /dev/null "$S/BT_L4"); do
src=$(srcfor "$n" "$C/BT_L4" /dev/null "$S/BT_L4")
[ -z "$src" ] && continue
if cc btl4 "$src"; then ok=$((ok+1)); else fail=$((fail+1)); echo " FAIL btl4/$n"; fi
done
echo "BT: $ok ok, $fail fail"
}
stage_libs() {
cd "$B/lib"
for lib in munga mungal4 bt btl4; do
rm -f $lib.lib
ls "$B/obj/$lib"/*.obj >/dev/null 2>&1 || continue
: > $lib.rsp
for o in "$B/obj/$lib"/*.obj; do
printf '+..\obj\%s\%s &
' "$lib" "$(basename "$o")" >> $lib.rsp
done
# prebuilt-1995 fallbacks for TUs with no compiled obj
if [ $lib = munga ] || [ $lib = mungal4 ]; then
for o in $(find $R/MUNGA/opt $R/MUNGA_L4 -iname "*.obj" 2>/dev/null); do
n=$(basename "${o%.*}" | tr 'A-Z' 'a-z')
if [ ! -f "$B/obj/munga/$n.obj" ] && [ ! -f "$B/obj/mungal4/$n.obj" ]; then
case "$lib/$o" in
munga/*/MUNGA/*) printf '+%s &
' "$(cygpath -w "$o" | sed 's|\|\\|g')" >> $lib.rsp;;
mungal4/*/MUNGA_L4/*) printf '+%s &
' "$(cygpath -w "$o" | sed 's|\|\\|g')" >> $lib.rsp;;
esac
fi
done
fi
sed -i '$ s/ &$//' $lib.rsp
MSYS2_ARG_CONV_EXCL='*' tlib $lib.lib /P32 @$lib.rsp > $lib.tlib.log 2>&1
echo "$lib.lib: $(grep -c '^+' $lib.rsp) members ($(ls -la $lib.lib 2>/dev/null | awk '{print $5}') bytes)"
done
}
stage_link() {
cd "$B"
if [ ! -f obj/btl4/btl4.obj ] && [ -f probe_main.cpp ]; then
bcc32 $FLAGS -I"$INC" -oprobe_main.obj probe_main.cpp > probe_main.log 2>&1 || { echo "probe main FAILED (probe_main.log)"; return 1; }
MAIN=probe_main.obj
else
MAIN=obj/btl4/btl4.obj
fi
cat > link.rsp <<EOF2
$(cygpath -w $C/C0X32.OBJ)+
$MAIN,
btl4opt.exe,
btl4opt.map,
lib/munga.lib+
lib/mungal4.lib+
$(cygpath -w $R/MUNGA_L4/libDPL/LIBDPL.LIB)+
$(cygpath -w $R/MUNGA_L4/sos/SOSMWXCR.LIB)+
$(cygpath -w $R/MUNGA_L4/NetNub/lib/WATTCPLG.LIB)+
lib/bt.lib+
lib/btl4.lib+
$(cygpath -w $R/DPMI32.LIB)+
$(cygpath -w $R/CW32.LIB)
EOF2
tlink32 -Tpe -ax -m -L"$(cygpath -w $TW/BORLAND/BC45/LIB)" @link.rsp > link.log 2>&1
grep -i "undefined" link.log | sed "s/^.*Error: //" | sort -u > UNRESOLVED.txt
echo "link exit: $? ; unresolved: $(wc -l < UNRESOLVED.txt) (build410/UNRESOLVED.txt)"
}
case "${1:-all}" in
engine) stage_engine;;
bt) stage_bt;;
libs) stage_libs;;
link) stage_link;;
status) for d in munga mungal4 bt btl4; do echo "$d: $(ls "$B/obj/$d"/*.obj 2>/dev/null | wc -l) objs"; done;;
all) stage_engine; stage_bt; stage_libs; stage_link;;
esac
@@ -0,0 +1,49 @@
#if !defined(FILESTRM_HPP)
# define FILESTRM_HPP
# if !defined(MEMSTRM_HPP)
# include <memstrm.hpp>
# endif
class FileStream : public MemoryStream
{
public:
FileStream(const char* file_name = NULL, Logical writable = False);
~FileStream() { Close(); }
public:
void* GetPointer() const
{
Fail("No implementation possible for FileStream::GetPointer()");
return NULL;
}
void SetPointer(void *new_pointer) { Fail("No implementation possible for FileStream::SetPointer(void*)"); }
void SetPointer(size_t index);
MemoryStream& AdvancePointer(size_t count);
MemoryStream& RewindPointer(size_t count);
MemoryStream& ReadBytes(void *ptr, size_t number_of_bytes);
MemoryStream& WriteBytes(const void *ptr, size_t number_of_bytes);
void Open(const char* file_name = NULL, Logical writable = False);
void Close();
Logical IsFileOpened() { return fileHandle != -1; }
Logical TestInstance() const;
protected:
int fileHandle;
Logical readOnly;
static int OpenImplementation(const char* file_name, Logical read_only);
static void FlushImplementation(int file_handle);
static void CloseImplementation(int file_handle);
static size_t SeekImplementation(int file_handle, size_t where, Logical from_end = False);
static size_t ReadImplementation(int file_handle, void *buffer, size_t length);
static size_t WriteImplementation(int file_handle, const void* buffer, size_t length);
};
#endif
@@ -0,0 +1 @@
#include <dpl_priv.h>