CnC_Red_Alert/WIN32LIB/SRCDEBUG/FILEINFO.CPP

277 lines
13 KiB
C++
Raw Normal View History

/*
** 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);
}