277 lines
13 KiB
C++
277 lines
13 KiB
C++
/*
|
|
** Command & Conquer Red Alert(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** This program is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/***************************************************************************
|
|
** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S **
|
|
***************************************************************************
|
|
* *
|
|
* Project Name : Library - Fileio information functions. *
|
|
* *
|
|
* File Name : FILE.CPP *
|
|
* *
|
|
* Programmer : Scott K. Bowen *
|
|
* *
|
|
* Start Date : September 13, 1993 *
|
|
* *
|
|
* Last Update : April 19, 1994 [SKB] *
|
|
* *
|
|
*-------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* Get_DOS_Handle -- Fetches system specific DOS file handle. *
|
|
* Find_Disk_Number -- Determine disk a file resides upon. *
|
|
* Set_File_Flags -- Sets flags for file if FileData table. *
|
|
* Get_File_Flags -- Gets the flags on a file in the FileData table. *
|
|
* Free_Handles -- Returns number of free file handles in WW system. *
|
|
* Multi_Drive_Search -- Turns Multi search drive on and off. *
|
|
* Clear_File_Flags -- Clears flags specified for file. *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
#ifndef WWSTD_H
|
|
#include "wwstd.h"
|
|
#endif
|
|
|
|
#ifndef _FILE_H
|
|
#include "_file.h"
|
|
#endif
|
|
|
|
/*=========================================================================*/
|
|
/* The following PRIVATE functions are in this file: */
|
|
/*=========================================================================*/
|
|
|
|
|
|
/*= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
|
|
|
|
|
|
/***************************************************************************
|
|
* GET_DOS_HANDLE -- Fetches system specific DOS file handle. *
|
|
* *
|
|
* This routine will return with the system specific DOS file handle. *
|
|
* On the IBM, this is a WORD, on the Amiga, it is a LONG (BPTR). Use *
|
|
* this routine with caution, because the value returned is NOT *
|
|
* portable. *
|
|
* *
|
|
* INPUT: fh -- Westwood file system handle. *
|
|
* *
|
|
* OUTPUT: Returns with the system DOS file handle (WORD or LONG). *
|
|
* *
|
|
* WARNINGS: If you pass in an invalid file handle, or a file handle *
|
|
* that references a resident file, then the ERROR code is *
|
|
* returned. Be SURE to check for this. *
|
|
* *
|
|
* HISTORY: *
|
|
* 08/21/1991 JLB : Created. *
|
|
* 11/09/1991 JLB : Checks for illegal file handle passed in. *
|
|
*=========================================================================*/
|
|
WORD cdecl Get_DOS_Handle(WORD fh)
|
|
{
|
|
/*
|
|
** If an illegal file handle is passed in then always abort.
|
|
*/
|
|
if (fh >= 0 && fh < TABLE_MAX) {
|
|
if (!FileHandleTable[fh].Empty || FileHandleTable[fh].Handle) {
|
|
return(FileHandleTable[fh].Handle);
|
|
}
|
|
|
|
/*
|
|
** If it falls through here, then the file must be resident. It is
|
|
** illegal to get a DOS handle to a resident file.
|
|
*/
|
|
}
|
|
return(FILEOPENERROR);
|
|
}
|
|
|
|
/***************************************************************************
|
|
* FREE_HANDLES -- Returns number of free file handles in WW system. *
|
|
* *
|
|
* INPUT: NONE. *
|
|
* *
|
|
* OUTPUT: NONE. *
|
|
* *
|
|
* WARNINGS: *
|
|
* *
|
|
* HISTORY: *
|
|
* 09/13/1993 SKB : Created. *
|
|
*=========================================================================*/
|
|
WORD cdecl Free_Handles(VOID)
|
|
{
|
|
WORD count; // Count of the number of free file handles.
|
|
WORD index; // Working file handle index var.
|
|
|
|
count = 0;
|
|
for (index = 0; index < TABLE_MAX; index++) {
|
|
if (FileHandleTable[index].Empty) count++;
|
|
}
|
|
return(count);
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
* FIND_DISK_NUMBER -- Determine disk a file resides upon. *
|
|
* *
|
|
* This routine will determine the disk number that the specified *
|
|
* file resides upon. It determines this by scanning through the *
|
|
* FileData table. If the specified file is a packed file, then it *
|
|
* will reference the parent packed file to determine the disk number. *
|
|
* *
|
|
* INPUT: file_name -- Pointer to the file name to check. *
|
|
* *
|
|
* OUTPUT: Returns with the disk number that the file resides upon. If *
|
|
* ERROR is returned, then the file does not exist in the *
|
|
* FileTable. The number returned is 0=A, 1=B, etc. *
|
|
* *
|
|
* WARNINGS: none *
|
|
* *
|
|
* HISTORY: *
|
|
* 11/22/1991 JLB : Created. *
|
|
*=========================================================================*/
|
|
WORD cdecl Find_Disk_Number(BYTE const *file_name)
|
|
{
|
|
FileDataType *filedata; // Pointer to the current FileData.
|
|
WORD index; // FileTable index.
|
|
|
|
index = Find_File_Index(file_name);
|
|
|
|
if (index != ERROR) {
|
|
|
|
filedata = &FileDataPtr[index];
|
|
|
|
if (filedata->Flag & FILEF_PACKED) {
|
|
return (Find_Disk_Number(FileDataPtr[filedata->Disk].Name));
|
|
}
|
|
return(filedata->Disk);
|
|
}
|
|
return (index);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
* SET_FILE_FLAGS -- Sets flags for file if FileData table. *
|
|
* *
|
|
* INPUT: BYTE *filename - file to modify. *
|
|
* WORD flags - flags to set in file. *
|
|
* *
|
|
* OUTPUT: WORD - if file found in FileData table. *
|
|
* *
|
|
* WARNINGS: *
|
|
* *
|
|
* HISTORY: *
|
|
* 10/04/1993 SKB : Created. *
|
|
*=========================================================================*/
|
|
WORD cdecl Set_File_Flags(BYTE const *filename, WORD flags)
|
|
{
|
|
FileDataType *filedata; // Pointer to the current FileData.
|
|
WORD index; // FileTable index.
|
|
|
|
index = Find_File_Index(filename);
|
|
|
|
if (index != ERROR) {
|
|
filedata = &FileDataPtr[index];
|
|
filedata->Flag |= flags;
|
|
return (TRUE);
|
|
}
|
|
|
|
return (FALSE);
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
* CLEAR_FILE_FLAGS -- Clears flags specified for file. *
|
|
* *
|
|
* INPUT: BYTE *filename - file to modify. *
|
|
* WORD flags - flags to set in file. *
|
|
* *
|
|
* OUTPUT: WORD - if file found in FileData table. *
|
|
* *
|
|
* WARNINGS: *
|
|
* *
|
|
* HISTORY: *
|
|
* 04/19/1994 SKB : Created. *
|
|
*=========================================================================*/
|
|
WORD cdecl Clear_File_Flags(BYTE const *filename, WORD flags)
|
|
{
|
|
FileDataType *filedata; // Pointer to the current FileData.
|
|
WORD index; // FileTable index.
|
|
|
|
index = Find_File_Index(filename);
|
|
|
|
if (index != ERROR) {
|
|
filedata = &FileDataPtr[index];
|
|
filedata->Flag &= ~flags;
|
|
return (TRUE);
|
|
}
|
|
|
|
return (FALSE);
|
|
}
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
* GET_FILE_FLAGS -- Gets the flags on a file in the FileData table. *
|
|
* *
|
|
* *
|
|
* INPUT: BYTE *filename - file to modify. *
|
|
* *
|
|
* OUTPUT: *
|
|
* *
|
|
* OUTPUT: WORD - if file found in FileData table. *
|
|
* *
|
|
* HISTORY: *
|
|
* 10/04/1993 SKB : Created. *
|
|
*=========================================================================*/
|
|
WORD cdecl Get_File_Flags(BYTE const *filename)
|
|
{
|
|
FileDataType *filedata; // Pointer to the current FileData.
|
|
WORD index; // FileTable index.
|
|
|
|
index = Find_File_Index(filename);
|
|
|
|
if (index != ERROR) {
|
|
filedata = &FileDataPtr[index];
|
|
return (filedata->Flag);
|
|
}
|
|
return (FALSE);
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
* MULTI_DRIVE_SEARCH -- Turns Multi search drive on and off. *
|
|
* *
|
|
* *
|
|
* *
|
|
* INPUT: *
|
|
* *
|
|
* OUTPUT: *
|
|
* *
|
|
* WARNINGS: *
|
|
* *
|
|
* HISTORY: *
|
|
* 09/13/1993 SKB : Created. *
|
|
*=========================================================================*/
|
|
BOOL cdecl Multi_Drive_Search(BOOL on)
|
|
{
|
|
BOOL old;
|
|
|
|
Hard_Error_Occured = 0;
|
|
old = MultiDriveSearch;
|
|
MultiDriveSearch = on;
|
|
return(old);
|
|
}
|