tron@2186: /* $Id$ */ tron@2186: belugas@6527: /** @file fileio.h Declarations for Standard In/Out file operations */ belugas@6505: truelight@0: #ifndef FILEIO_H truelight@0: #define FILEIO_H truelight@0: rubidium@8759: #include "core/enum_type.hpp" rubidium@7425: rubidium@10751: void FioSeekTo(size_t pos, int mode); rubidium@10751: void FioSeekToFile(uint8 slot, size_t pos); rubidium@10751: size_t FioGetPos(); peter1138@8870: const char *FioGetFilename(uint8 slot); rubidium@6573: byte FioReadByte(); rubidium@6573: uint16 FioReadWord(); rubidium@6573: uint32 FioReadDword(); rubidium@6573: void FioCloseAll(); truelight@0: void FioOpenFile(int slot, const char *filename); glx@10465: void FioReadBlock(void *ptr, size_t size); truelight@0: void FioSkipBytes(int n); rubidium@7425: void FioCreateDirectory(const char *filename); rubidium@6624: rubidium@7425: /** rubidium@7425: * The different kinds of subdirectories OpenTTD uses rubidium@7425: */ rubidium@7425: enum Subdirectory { rubidium@7425: BASE_DIR, ///< Base directory for all subdirectories rubidium@7425: SAVE_DIR, ///< Base directory for all savegames rubidium@7425: AUTOSAVE_DIR, ///< Subdirectory of save for autosaves rubidium@7425: SCENARIO_DIR, ///< Base directory for all scenarios rubidium@7425: HEIGHTMAP_DIR, ///< Subdirectory of scenario for heightmaps rubidium@7425: GM_DIR, ///< Subdirectory for all music rubidium@7425: DATA_DIR, ///< Subdirectory for all data (GRFs, sample.cat, intro game) rubidium@7425: LANG_DIR, ///< Subdirectory for all translation files rubidium@7425: NUM_SUBDIRS, ///< Number of subdirectories rubidium@7431: NO_DIRECTORY, ///< A path without any base directory rubidium@7425: }; rubidium@7425: rubidium@7425: /** rubidium@7425: * Types of searchpaths OpenTTD might use rubidium@7425: */ rubidium@7425: enum Searchpath { rubidium@7440: SP_FIRST_DIR, rubidium@7440: SP_WORKING_DIR = SP_FIRST_DIR, ///< Search in the working directory rubidium@7440: SP_PERSONAL_DIR, ///< Search in the personal directory rubidium@7440: SP_SHARED_DIR, ///< Search in the shared directory, like 'Shared Files' under Windows rubidium@7440: SP_BINARY_DIR, ///< Search in the directory where the binary resides rubidium@7440: SP_INSTALLATION_DIR, ///< Search in the installation directory rubidium@7440: SP_APPLICATION_BUNDLE_DIR, ///< Search within the application bundle rubidium@7425: NUM_SEARCHPATHS rubidium@7425: }; rubidium@7425: rubidium@7425: DECLARE_POSTFIX_INCREMENT(Searchpath); rubidium@7425: rubidium@7425: /** rubidium@7425: * The searchpaths OpenTTD could search through. rubidium@7425: * At least one of the slots has to be filled with a path. rubidium@7425: * NULL paths tell that there is no such path for the rubidium@7425: * current operating system. rubidium@7425: */ rubidium@7425: extern const char *_searchpaths[NUM_SEARCHPATHS]; rubidium@7425: rubidium@7425: /** rubidium@7425: * Checks whether the given search path is a valid search path rubidium@7425: * @param sp the search path to check rubidium@7425: * @return true if the search path is valid rubidium@7425: */ rubidium@7425: static inline bool IsValidSearchPath(Searchpath sp) rubidium@7425: { rubidium@7425: return sp < NUM_SEARCHPATHS && _searchpaths[sp] != NULL; rubidium@7425: } rubidium@7425: rubidium@7425: /** Iterator for all the search paths */ rubidium@7440: #define FOR_ALL_SEARCHPATHS(sp) for (sp = SP_FIRST_DIR; sp < NUM_SEARCHPATHS; sp++) if (IsValidSearchPath(sp)) rubidium@7425: truelight@8088: void FioFCloseFile(FILE *f); truelight@8070: FILE *FioFOpenFile(const char *filename, const char *mode = "rb", Subdirectory subdir = DATA_DIR, size_t *filesize = NULL); rubidium@7425: bool FioCheckFileExists(const char *filename, Subdirectory subdir = DATA_DIR); rubidium@7425: char *FioGetFullPath(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir, const char *filename); rubidium@7425: char *FioFindFullPath(char *buf, size_t buflen, Subdirectory subdir, const char *filename); rubidium@7425: char *FioAppendDirectory(char *buf, size_t buflen, Searchpath sp, Subdirectory subdir); rubidium@7425: char *FioGetDirectory(char *buf, size_t buflen, Subdirectory subdir); rubidium@7425: rubidium@7425: static inline const char *FioGetSubdirectory(Subdirectory subdir) rubidium@7425: { rubidium@7425: extern const char *_subdirs[NUM_SUBDIRS]; rubidium@7425: assert(subdir < NUM_SUBDIRS); rubidium@7425: return _subdirs[subdir]; rubidium@7425: } rubidium@6624: rubidium@7371: void SanitizeFilename(char *filename); rubidium@6624: void AppendPathSeparator(char *buf, size_t buflen); rubidium@6643: void DeterminePaths(const char *exe); rubidium@8627: void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize); rubidium@8627: bool FileExists(const char *filename); truelight@0: rubidium@7425: extern char *_personal_dir; ///< custom directory for personal settings, saves, newgrf, etc. rubidium@7425: truelight@0: #endif /* FILEIO_H */