OpenTTD
Data Structures | Macros | Typedefs | Functions | Variables
fileio.cpp File Reference

Standard In/Out file operations. More...

#include "stdafx.h"
#include "fileio_func.h"
#include "debug.h"
#include "fios.h"
#include "string_func.h"
#include "tar_type.h"
#include <unistd.h>
#include <pwd.h>
#include <sys/stat.h>
#include <algorithm>
#include "safeguards.h"

Go to the source code of this file.

Data Structures

struct  Fio
 Structure for keeping several open files with just one data buffer. More...
 

Macros

#define FIO_BUFFER_SIZE   512
 Size of the Fio data buffer. More...
 

Typedefs

typedef std::map< std::string, std::string > TarLinkList
 

Functions

size_t FioGetPos ()
 Get position in the current file. More...
 
const char * FioGetFilename (uint8 slot)
 Get the filename associated with a slot. More...
 
void FioSeekTo (size_t pos, int mode)
 Seek in the current file. More...
 
void FioSeekToFile (uint8 slot, size_t pos)
 Switch to a different file and seek to a position. More...
 
byte FioReadByte ()
 Read a byte from the file. More...
 
void FioSkipBytes (int n)
 Skip n bytes ahead in the file. More...
 
uint16 FioReadWord ()
 Read a word (16 bits) from the file (in low endian format). More...
 
uint32 FioReadDword ()
 Read a double word (32 bits) from the file (in low endian format). More...
 
void FioReadBlock (void *ptr, size_t size)
 Read a block. More...
 
static void FioCloseFile (int slot)
 Close the file at the given slot number. More...
 
void FioCloseAll ()
 Close all slotted open files. More...
 
void FioOpenFile (int slot, const char *filename, Subdirectory subdir)
 Open a slotted file. More...
 
 assert_compile (lengthof(_subdirs)==NUM_SUBDIRS)
 
bool FioCheckFileExists (const char *filename, Subdirectory subdir)
 Check whether the given file exists. More...
 
bool FileExists (const char *filename)
 Test whether the given filename exists. More...
 
void FioFCloseFile (FILE *f)
 Close a file in a safe way.
 
char * FioGetFullPath (char *buf, const char *last, Searchpath sp, Subdirectory subdir, const char *filename)
 
char * FioFindFullPath (char *buf, const char *last, Subdirectory subdir, const char *filename)
 Find a path to the filename in one of the search directories. More...
 
char * FioAppendDirectory (char *buf, const char *last, Searchpath sp, Subdirectory subdir)
 
char * FioGetDirectory (char *buf, const char *last, Subdirectory subdir)
 
static FILE * FioFOpenFileSp (const char *filename, const char *mode, Searchpath sp, Subdirectory subdir, size_t *filesize)
 
FILE * FioFOpenFileTar (TarFileListEntry *entry, size_t *filesize)
 Opens a file from inside a tar archive. More...
 
FILE * FioFOpenFile (const char *filename, const char *mode, Subdirectory subdir, size_t *filesize)
 Opens a OpenTTD file somewhere in a personal or global directory. More...
 
static void FioCreateDirectory (const char *name)
 Create a directory with the given name. More...
 
bool AppendPathSeparator (char *buf, const char *last)
 Appends, if necessary, the path separator character to the end of the string. More...
 
const char * FioTarFirstDir (const char *tarname, Subdirectory subdir)
 Find the first directory in a tar archive. More...
 
static void TarAddLink (const std::string &srcParam, const std::string &destParam, Subdirectory subdir)
 
void FioTarAddLink (const char *src, const char *dest, Subdirectory subdir)
 
static void SimplifyFileName (char *name)
 Simplify filenames from tars. More...
 
bool ExtractTar (const char *tar_filename, Subdirectory subdir)
 Extract the tar with the given filename in the directory where the tar resides. More...
 
static bool ChangeWorkingDirectoryToExecutable (const char *exe)
 Changes the working directory to the path of the give executable. More...
 
bool DoScanWorkingDirectory ()
 Whether we should scan the working directory. More...
 
void DetermineBasePaths (const char *exe)
 Determine the base (personal dir and game data dir) paths. More...
 
void DeterminePaths (const char *exe)
 Acquire the base paths (personal dir and game data dir), fill all other paths (save dir, autosave dir etc) and make the save and scenario directories. More...
 
void SanitizeFilename (char *filename)
 Sanitizes a filename, i.e. More...
 
void * ReadFileToMem (const char *filename, size_t *lenp, size_t maxsize)
 Load a file into memory. More...
 
static bool MatchesExtension (const char *extension, const char *filename)
 Helper to see whether a given filename matches the extension. More...
 
static uint ScanPath (FileScanner *fs, const char *extension, const char *path, size_t basepath_length, bool recursive)
 Scan a single directory (and recursively its children) and add any graphics sets that are found. More...
 
static uint ScanTar (FileScanner *fs, const char *extension, TarFileList::iterator tar)
 Scan the given tar and add graphics sets when it finds one. More...
 

Variables

static Fio _fio
 Fio instance.
 
static bool _do_scan_working_directory = true
 Whether the working directory should be scanned. More...
 
char * _config_file
 Configuration file of OpenTTD.
 
char * _highscore_file
 The file to store the highscore data in.
 
static const char *const _subdirs []
 
const char * _searchpaths [NUM_SEARCHPATHS]
 The search paths OpenTTD could search through. More...
 
TarList _tar_list [NUM_SUBDIRS]
 
TarFileList _tar_filelist [NUM_SUBDIRS]
 
static TarLinkList _tar_linklist [NUM_SUBDIRS]
 List of directory links.
 
const char * _personal_dir
 custom directory for personal settings, saves, newgrf, etc.
 

Detailed Description

Standard In/Out file operations.

Definition in file fileio.cpp.

Macro Definition Documentation

◆ FIO_BUFFER_SIZE

#define FIO_BUFFER_SIZE   512

Size of the Fio data buffer.

Definition at line 38 of file fileio.cpp.

Referenced by FioReadByte(), and FioSeekTo().

Function Documentation

◆ AppendPathSeparator()

bool AppendPathSeparator ( char *  buf,
const char *  last 
)

Appends, if necessary, the path separator character to the end of the string.

It does not add the path separator to zero-sized strings.

Parameters
bufstring to append the separator to
lastthe last element of buf.
Returns
true iff the operation succeeded

Definition at line 573 of file fileio.cpp.

◆ ChangeWorkingDirectoryToExecutable()

static bool ChangeWorkingDirectoryToExecutable ( const char *  exe)
static

Changes the working directory to the path of the give executable.

For OSX application bundles '.app' is the required extension of the bundle, so when we crop the path to there, when can remove the name of the bundle in the same way we remove the name from the executable name.

Parameters
exethe path to the executable

Definition at line 1007 of file fileio.cpp.

◆ DetermineBasePaths()

void DetermineBasePaths ( const char *  exe)

Determine the base (personal dir and game data dir) paths.

Parameters
exethe path to the executable

Definition at line 1066 of file fileio.cpp.

Referenced by DeterminePaths().

◆ DeterminePaths()

void DeterminePaths ( const char *  exe)

Acquire the base paths (personal dir and game data dir), fill all other paths (save dir, autosave dir etc) and make the save and scenario directories.

Parameters
exethe path from the current path to the executable

Definition at line 1171 of file fileio.cpp.

References DetermineBasePaths().

◆ DoScanWorkingDirectory()

bool DoScanWorkingDirectory ( )

Whether we should scan the working directory.

It should not be scanned if it's the root or the home directory as in both cases a big data directory can cause huge amounts of unrelated files scanned. Furthermore there are nearly no use cases for the home/root directory to have OpenTTD directories.

Returns
true if it should be scanned.

Definition at line 1045 of file fileio.cpp.

References _searchpaths, and SP_WORKING_DIR.

◆ ExtractTar()

bool ExtractTar ( const char *  tar_filename,
Subdirectory  subdir 
)

Extract the tar with the given filename in the directory where the tar resides.

Parameters
tar_filenamethe name of the tar to extract.
subdirThe sub directory the tar is in.
Returns
false on failure.

Definition at line 924 of file fileio.cpp.

◆ FileExists()

bool FileExists ( const char *  filename)

Test whether the given filename exists.

Parameters
filenamethe file to test.
Returns
true if and only if the file exists.

Definition at line 326 of file fileio.cpp.

References OTTD2FS().

◆ FioCheckFileExists()

bool FioCheckFileExists ( const char *  filename,
Subdirectory  subdir 
)

Check whether the given file exists.

Parameters
filenamethe file to try for existence.
subdirthe subdirectory to look in
Returns
true if and only if the file can be opened

Definition at line 312 of file fileio.cpp.

References FioFCloseFile(), and FioFOpenFile().

Referenced by FillGRFDetails(), and GRFLoadConfig().

◆ FioCloseAll()

void FioCloseAll ( )

Close all slotted open files.

Definition at line 213 of file fileio.cpp.

References FioCloseFile(), Fio::handles, and lengthof.

◆ FioCloseFile()

static void FioCloseFile ( int  slot)
inlinestatic

Close the file at the given slot number.

Parameters
slotFile index to close.

Definition at line 197 of file fileio.cpp.

References free(), Fio::handles, and Fio::shortnames.

Referenced by FioCloseAll(), and FioOpenFile().

◆ FioCreateDirectory()

static void FioCreateDirectory ( const char *  name)
static

Create a directory with the given name.

Parameters
namethe new name of the directory

Definition at line 543 of file fileio.cpp.

References OTTD2FS().

◆ FioFindFullPath()

char* FioFindFullPath ( char *  buf,
const char *  last,
Subdirectory  subdir,
const char *  filename 
)

Find a path to the filename in one of the search directories.

Parameters
buf[out] Destination buffer for the path.
lastEnd of the destination buffer.
subdirSubdirectory to try.
filenameFilename to look for.
Returns
buf containing the path if the path was found, else NULL.

Definition at line 364 of file fileio.cpp.

◆ FioFOpenFile()

FILE* FioFOpenFile ( const char *  filename,
const char *  mode,
Subdirectory  subdir,
size_t *  filesize 
)

Opens a OpenTTD file somewhere in a personal or global directory.

Parameters
filenameName of the file to open.
subdirSubdirectory to open.
filenameName of the file to open.
Returns
File handle of the opened file, or NULL if the file is not available.

Definition at line 474 of file fileio.cpp.

Referenced by ScriptFileChecksumCreator::AddFile(), ScenarioScanner::AddFile(), CalcGRFMD5Sum(), MD5File::CheckMD5(), GraphicsSet::CheckMD5(), DisplaySplashImage(), FioCheckFileExists(), FioOpenFile(), Squirrel::LoadFile(), TextfileWindow::LoadTextfile(), IniFile::OpenFile(), ReadRawLanguageStrings(), and CrashLog::WriteCrashLog().

◆ FioFOpenFileTar()

FILE* FioFOpenFileTar ( TarFileListEntry entry,
size_t *  filesize 
)

Opens a file from inside a tar archive.

Parameters
entryThe entry to open.
filesize[out] If not NULL, size of the opened file.
Returns
File handle of the opened file, or NULL if the file is not available.
Note
The file is read from within the tar file, and may not return EOF after reading the whole file.

Definition at line 453 of file fileio.cpp.

◆ FioGetFilename()

const char* FioGetFilename ( uint8  slot)

Get the filename associated with a slot.

Parameters
slotIndex of queried file.
Returns
Name of the file.

Definition at line 78 of file fileio.cpp.

References Fio::shortnames.

Referenced by WarnCorruptSprite().

◆ FioGetPos()

size_t FioGetPos ( )

Get position in the current file.

Returns
Position in the file.

Definition at line 68 of file fileio.cpp.

References Fio::buffer_end, and Fio::pos.

Referenced by DefineGotoLabel(), FioReadBlock(), FioSeekTo(), GetGRFContainerVersion(), LoadNextSprite(), and ReadGRFSpriteOffsets().

◆ FioOpenFile()

void FioOpenFile ( int  slot,
const char *  filename,
Subdirectory  subdir 
)

Open a slotted file.

Parameters
slotIndex to assign.
filenameName of the file at the disk.
subdirThe sub directory to search this file in.

Definition at line 250 of file fileio.cpp.

References Fio::filename, Fio::filenames, FioCloseFile(), FioFOpenFile(), Fio::handles, Fio::pos, and usererror().

Referenced by FioSeekTo(), LoadGrfFile(), and LoadGrfFileIndexed().

◆ FioReadBlock()

void FioReadBlock ( void *  ptr,
size_t  size 
)

Read a block.

Parameters
ptrDestination buffer.
sizeNumber of bytes to read.

Definition at line 187 of file fileio.cpp.

References Fio::cur_fh, FioGetPos(), FioSeekTo(), and Fio::pos.

◆ FioReadByte()

byte FioReadByte ( )

◆ FioReadDword()

uint32 FioReadDword ( )

Read a double word (32 bits) from the file (in low endian format).

Returns
Read word.

Definition at line 176 of file fileio.cpp.

References FioReadWord().

Referenced by ImportGRFSound(), LoadNextSprite(), and ReadGRFSpriteOffsets().

◆ FioReadWord()

uint16 FioReadWord ( )

Read a word (16 bits) from the file (in low endian format).

Returns
Read word.

Definition at line 166 of file fileio.cpp.

References FioReadByte().

Referenced by FioReadDword(), GetGRFContainerVersion(), ImportGRFSound(), and LoadNextSprite().

◆ FioSeekTo()

void FioSeekTo ( size_t  pos,
int  mode 
)

Seek in the current file.

Parameters
posNew position.
modeType of seek (SEEK_CUR means pos is relative to current position, SEEK_SET means pos is absolute).

Definition at line 88 of file fileio.cpp.

References Fio::buffer_end, Fio::buffer_start, Fio::cur_fh, DEBUG, Fio::filename, Fio::filenames, FIO_BUFFER_SIZE, FioGetPos(), FioOpenFile(), Fio::handles, and Fio::pos.

Referenced by FioReadBlock(), GetGRFContainerVersion(), and ReadGRFSpriteOffsets().

◆ FioSeekToFile()

void FioSeekToFile ( uint8  slot,
size_t  pos 
)

Switch to a different file and seek to a position.

Parameters
slotSlot number of the new file.
posNew absolute position in the new file.

Definition at line 115 of file fileio.cpp.

References Fio::handles.

◆ FioSkipBytes()

void FioSkipBytes ( int  n)

Skip n bytes ahead in the file.

Parameters
nNumber of bytes to skip reading.

Definition at line 150 of file fileio.cpp.

References Fio::buffer_end, FioReadByte(), and min().

Referenced by LoadNextSprite(), ReadGRFSpriteOffsets(), and SkipSpriteData().

◆ FioTarFirstDir()

const char* FioTarFirstDir ( const char *  tarname,
Subdirectory  subdir 
)

Find the first directory in a tar archive.

Parameters
tarnamethe name of the tar archive to look in.
subdirthe subdirectory to look in.

Definition at line 592 of file fileio.cpp.

◆ MatchesExtension()

static bool MatchesExtension ( const char *  extension,
const char *  filename 
)
static

Helper to see whether a given filename matches the extension.

Parameters
extensionThe extension to look for.
filenameThe filename to look in for the extension.
Returns
True iff the extension is NULL, or the filename ends with it.

Definition at line 1350 of file fileio.cpp.

Referenced by ScanTar().

◆ ReadFileToMem()

void* ReadFileToMem ( const char *  filename,
size_t *  lenp,
size_t  maxsize 
)

Load a file into memory.

Parameters
filenameName of the file to load.
lenp[out] Length of loaded data.
maxsizeMaximum size to load.
Returns
Pointer to new memory containing the loaded data, or NULL if loading failed.
Note
If maxsize less than the length of the file, loading fails.

Definition at line 1319 of file fileio.cpp.

Referenced by ReadLanguagePack().

◆ SanitizeFilename()

void SanitizeFilename ( char *  filename)

Sanitizes a filename, i.e.

removes all illegal characters from it.

Parameters
filenamethe "\0" terminated filename

Definition at line 1297 of file fileio.cpp.

◆ ScanPath()

static uint ScanPath ( FileScanner fs,
const char *  extension,
const char *  path,
size_t  basepath_length,
bool  recursive 
)
static

Scan a single directory (and recursively its children) and add any graphics sets that are found.

Parameters
fsthe file scanner to add the files to
extensionthe extension of files to search for.
pathfull path we're currently at
basepath_lengthfrom where in the path are we 'based' on the search path
recursivewhether to recursively search the sub directories

Definition at line 1367 of file fileio.cpp.

◆ ScanTar()

static uint ScanTar ( FileScanner fs,
const char *  extension,
TarFileList::iterator  tar 
)
static

Scan the given tar and add graphics sets when it finds one.

Parameters
fsthe file scanner to scan for
extensionthe extension of files to search for.
tarthe tar to search in.

Definition at line 1409 of file fileio.cpp.

References FileScanner::AddFile(), Fio::filename, and MatchesExtension().

◆ SimplifyFileName()

static void SimplifyFileName ( char *  name)
static

Simplify filenames from tars.

Replace '/' by #PATHSEPCHAR, and force 'name' to lowercase.

Parameters
nameFilename to process.

Definition at line 630 of file fileio.cpp.

References strtolower().

Variable Documentation

◆ _do_scan_working_directory

bool _do_scan_working_directory = true
static

Whether the working directory should be scanned.

Definition at line 59 of file fileio.cpp.

◆ _searchpaths

const char* _searchpaths[NUM_SEARCHPATHS]

The search paths OpenTTD could search through.

At least one of the slots has to be filled with a path. NULL paths tell that there is no such path for the current operating system.

Definition at line 299 of file fileio.cpp.

Referenced by DoScanWorkingDirectory().

◆ _subdirs

const char* const _subdirs[]
static
Initial value:
= {
"",
"save" PATHSEP,
"save" PATHSEP "autosave" PATHSEP,
"scenario" PATHSEP,
"scenario" PATHSEP "heightmap" PATHSEP,
"gm" PATHSEP,
"data" PATHSEP,
"baseset" PATHSEP,
"newgrf" PATHSEP,
"lang" PATHSEP,
"ai" PATHSEP,
"ai" PATHSEP "library" PATHSEP,
"game" PATHSEP,
"game" PATHSEP "library" PATHSEP,
"screenshot" PATHSEP,
}

Definition at line 280 of file fileio.cpp.