- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
(extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
BT game source (never mixed into CODE/). Round 1-3 state:
* 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
(BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
since 1996.
* BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
its binary-recorded line 400 exactly.
* BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
(Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
TeamScore=12 flagged [T4]).
* MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
(VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
the period compiler is the drift detector).
* Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
(per-TU verification sweep under authentic OPT.MAK flags).
* README: corrected roadmap - MECH.HPP is the capstone grown with the mech
TU reconstructions; BTREG.CPP green = the header-family milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
266 lines
7.5 KiB
C++
266 lines
7.5 KiB
C++
/*------------------------------------------------------------------------*/
|
|
/* */
|
|
/* FILE.CPP */
|
|
/* */
|
|
/* Copyright (c) 1993, 1994 Borland International */
|
|
/* All Rights Reserved */
|
|
/* */
|
|
/*------------------------------------------------------------------------*/
|
|
|
|
#if !defined( __LIMITS_H )
|
|
#include <limits.h>
|
|
#endif
|
|
|
|
#if !defined( __DIR_H )
|
|
#include <dir.h>
|
|
#endif
|
|
|
|
#if !defined( __DOS_H )
|
|
#include <dos.h>
|
|
#endif
|
|
|
|
#if !defined( __IOSTREAM_H )
|
|
#include <iostream.h>
|
|
#endif
|
|
|
|
#if !defined( CLASSLIB_DEFS_H )
|
|
#include <classlib/defs.h>
|
|
#endif
|
|
|
|
#if defined( BI_PLAT_OS2 ) && !defined( __OS2_H )
|
|
#define INCL_BASE
|
|
#include <os2.h>
|
|
#endif
|
|
|
|
#if defined( BI_PLAT_WIN32 ) && !defined( __WINDOWS_H )
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#if !defined( CLASSLIB_FILE_H )
|
|
#include <classlib/file.h>
|
|
#endif
|
|
|
|
int TFile::Open( const char _BIDSFAR *name, uint16 access, uint16 permission )
|
|
{
|
|
const unsigned shareFlags =
|
|
Compat | DenyNone | DenyRead | DenyWrite | DenyRdWr | NoInherit;
|
|
if( IsOpen() )
|
|
return 0;
|
|
Handle = ::sopen( name,
|
|
access & ~shareFlags,
|
|
access & shareFlags,
|
|
permission );
|
|
return IsOpen();
|
|
}
|
|
|
|
int TFile::Close()
|
|
{
|
|
if( IsOpen() && ::close(Handle) == 0)
|
|
{
|
|
Handle = FileNull;
|
|
return 1;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
long TFile::Length() const
|
|
{
|
|
return ::filelength( Handle );
|
|
}
|
|
|
|
#if !defined( __OS2__ )
|
|
int TFile::GetStatus( TFileStatus _BIDSFAR & status ) const
|
|
{
|
|
struct ftime ftime;
|
|
if( ::getftime(Handle, &ftime) != 0 )
|
|
return 0;
|
|
TDate fileDate( ftime.ft_day, ftime.ft_month, ftime.ft_year+80 );
|
|
status.createTime = TTime( fileDate,
|
|
ftime.ft_hour,
|
|
ftime.ft_min,
|
|
ftime.ft_tsec*2 );
|
|
status.modifyTime = status.createTime;
|
|
status.accessTime = status.createTime;
|
|
status.size = Length();
|
|
status.attribute = 0;
|
|
status.fullName[0] = '\0';
|
|
return 1;
|
|
}
|
|
#else
|
|
|
|
TTime MakeTTime( FDATE fdate, FTIME ftime )
|
|
{
|
|
TDate fileDate( fdate.day, fdate.month, fdate.year );
|
|
return TTime( fileDate, ftime.hours, ftime.minutes, ftime.twosecs*2 );
|
|
}
|
|
|
|
int TFile::GetStatus( TFileStatus _BIDSFAR& status ) const
|
|
{
|
|
FILESTATUS stat;
|
|
if( ::DosQueryFileInfo( Handle, FIL_STANDARD, &stat, sizeof(stat) ) != 0 )
|
|
return 0;
|
|
status.createTime = MakeTTime( stat.fdateCreation, stat.ftimeCreation );
|
|
status.modifyTime = MakeTTime( stat.fdateLastWrite, stat.ftimeLastWrite );
|
|
status.accessTime = MakeTTime( stat.fdateLastAccess, stat.ftimeLastAccess );
|
|
status.size = stat.cbFile;
|
|
status.attribute = stat.attrFile;
|
|
status.fullName[0] = '\0';
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
struct dos_ftime
|
|
{
|
|
unsigned tsec : 5;
|
|
unsigned min : 6;
|
|
unsigned hour : 5;
|
|
};
|
|
|
|
struct dos_fdate
|
|
{
|
|
unsigned day : 5;
|
|
unsigned mon : 4;
|
|
unsigned year : 7;
|
|
};
|
|
|
|
#if !defined( __OS2__ )
|
|
int TFile::GetStatus( const char _BIDSFAR *name,
|
|
TFileStatus _BIDSFAR & status )
|
|
{
|
|
if( ::_fullpath( status.fullName, name, sizeof(status.fullName) ) == 0 )
|
|
{
|
|
status.fullName[0] = '\0';
|
|
return 0;
|
|
}
|
|
ffblk blk;
|
|
const uint16 FA_ALL = FA_RDONLY | FA_HIDDEN | FA_SYSTEM |
|
|
FA_LABEL | FA_DIREC | FA_ARCH;
|
|
if( findfirst( status.fullName, &blk, FA_ALL ) != 0 )
|
|
return 0;
|
|
|
|
union
|
|
{
|
|
dos_ftime time;
|
|
dos_fdate date;
|
|
unsigned value;
|
|
};
|
|
|
|
value = blk.ff_fdate;
|
|
TDate fileDate( date.day, date.mon, date.year+80 );
|
|
value = blk.ff_ftime;
|
|
status.createTime = TTime( fileDate,
|
|
time.hour,
|
|
time.min,
|
|
time.tsec*2 );
|
|
|
|
status.modifyTime = status.createTime;
|
|
status.accessTime = status.createTime;
|
|
status.size = blk.ff_fsize;
|
|
status.attribute = blk.ff_attrib;
|
|
return 1;
|
|
}
|
|
#else
|
|
int TFile::GetStatus( const char _BIDSFAR *name,
|
|
TFileStatus _BIDSFAR & status )
|
|
{
|
|
if( ::_fullpath( status.fullName, name, sizeof(status.fullName) ) == 0 )
|
|
{
|
|
status.fullName[0] = '\0';
|
|
return 0;
|
|
}
|
|
const uint16 FA_ALL = FA_RDONLY | FA_HIDDEN | FA_SYSTEM |
|
|
FA_LABEL | FA_DIREC | FA_ARCH;
|
|
HDIR Handle;
|
|
FILEFINDBUF stat;
|
|
ULONG count;
|
|
if( ::DosFindFirst( status.fullName,
|
|
&Handle,
|
|
FA_ALL,
|
|
&stat,
|
|
sizeof(stat),
|
|
&count,
|
|
0 ) != 0 )
|
|
{
|
|
status.fullName[0] = '\0';
|
|
return 0;
|
|
}
|
|
|
|
status.createTime = MakeTTime( stat.fdateCreation, stat.ftimeCreation );
|
|
status.modifyTime = MakeTTime( stat.fdateLastWrite, stat.ftimeLastWrite );
|
|
status.accessTime = MakeTTime( stat.fdateLastAccess, stat.ftimeLastAccess );
|
|
status.size = stat.cbFile;
|
|
status.attribute = stat.attrFile;
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
#if !defined( __OS2__ )
|
|
int TFile::SetStatus( const char _BIDSFAR *name,
|
|
const TFileStatus _BIDSFAR & status )
|
|
{
|
|
int attr = ::_rtl_chmod( name, 0 );
|
|
if( attr & TFile::RdOnly )
|
|
return 0;
|
|
|
|
ftime fileTime;
|
|
fileTime.ft_tsec = status.createTime.Second()/2;
|
|
fileTime.ft_min = status.createTime.Minute();
|
|
fileTime.ft_hour = status.createTime.Hour();
|
|
TDate date( status.createTime );
|
|
fileTime.ft_day = date.DayOfMonth();
|
|
fileTime.ft_month = date.Month();
|
|
fileTime.ft_year = date.Year()-80;
|
|
|
|
TFile file( name, ReadWrite | DenyWrite );
|
|
if( ::setftime( file.GetHandle(), &fileTime ) != 0 )
|
|
return 0;
|
|
if( ::chsize( file.GetHandle(), status.size ) != 0 )
|
|
return 0;
|
|
if( ::_rtl_chmod( name, 1, status.attribute ) == -1 )
|
|
return 0;
|
|
return 1;
|
|
}
|
|
#else
|
|
|
|
FDATE MakeFDATE( TTime time )
|
|
{
|
|
FDATE fdate;
|
|
fdate.day = TDate(time).Day();
|
|
fdate.month = TDate(time).Month();
|
|
fdate.year = TDate(time).Year();
|
|
return fdate;
|
|
}
|
|
|
|
FTIME MakeFTIME( TTime time )
|
|
{
|
|
FTIME ftime;
|
|
ftime.hours = time.Hour();
|
|
ftime.minutes = time.Minute();
|
|
ftime.twosecs = time.Second()/2;
|
|
return ftime;
|
|
}
|
|
|
|
int TFile::SetStatus( const char _BIDSFAR *name,
|
|
const TFileStatus _BIDSFAR & status )
|
|
{
|
|
FILESTATUS stat;
|
|
stat.fdateCreation = MakeFDATE( status.createTime );
|
|
stat.ftimeCreation = MakeFTIME( status.createTime );
|
|
stat.fdateLastAccess = MakeFDATE( status.accessTime );
|
|
stat.ftimeLastAccess = MakeFTIME( status.accessTime );
|
|
stat.fdateLastWrite = MakeFDATE( status.modifyTime );
|
|
stat.ftimeLastWrite = MakeFTIME( status.modifyTime );
|
|
stat.cbFile = status.size;
|
|
stat.cbFileAlloc = status.size;
|
|
stat.attrFile = status.attribute;
|
|
TFile file( name, ReadWrite | DenyWrite );
|
|
return ::DosSetFileInfo( file.GetHandle(),
|
|
FIL_STANDARD,
|
|
&stat,
|
|
sizeof(stat) );
|
|
}
|
|
#endif
|
|
|
|
|