This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-goldedplus/goldlib/gall/gfilutil.h

316 lines
10 KiB
C
Raw Normal View History

2000-02-25 10:15:17 +00:00
// This may look like C code, but it is really -*- C++ -*-
// ------------------------------------------------------------------
// The Goldware Library
// Copyright (C) 1990-1999 Odinn Sorensen
// Copyright (C) 1999-2000 Alexander S. Aganichev
// ------------------------------------------------------------------
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this program; if not, write to the Free
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
// MA 02111-1307, USA
// ------------------------------------------------------------------
// $Id$
// ------------------------------------------------------------------
// File/disk handling functions.
// ------------------------------------------------------------------
#ifndef __gfilutil_h
#define __gfilutil_h
// ------------------------------------------------------------------
2009-04-04 09:51:04 +00:00
#include <string.h>
#include <stdlib.h>
2000-02-25 10:15:17 +00:00
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
2002-09-23 09:23:45 +00:00
#ifndef _MSC_VER
2000-02-25 10:15:17 +00:00
#include <unistd.h>
2002-09-23 06:16:34 +00:00
#else
#include <cstdlib>
2002-09-24 10:16:04 +00:00
#include <direct.h>
2002-09-23 06:16:34 +00:00
#endif
2000-02-25 10:15:17 +00:00
#include <cerrno>
#include <cstdio>
#include <string>
#include <gshare.h>
2010-03-21 21:11:53 +00:00
#if !defined(__UNIX__) || defined(__DJGPP__)
2000-02-25 10:15:17 +00:00
#include <io.h>
#endif
2009-04-04 09:51:04 +00:00
#include <gdefs.h>
2000-02-25 10:15:17 +00:00
// ------------------------------------------------------------------M
#if defined(__UNIX__)
2010-03-21 21:11:53 +00:00
#ifndef O_TEXT
#define O_TEXT 0
#endif
#ifndef O_BINARY
#define O_BINARY 0
#endif
#endif
2000-02-25 10:15:17 +00:00
#ifndef S_IWUSR
#define S_IWUSR S_IWRITE
#define S_IRUSR S_IREAD
#endif
#if defined(__UNIX__)
#define S_STDRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
#define S_STDRD (S_IRUSR|S_IRGRP|S_IROTH)
#else
#define S_STDRW (S_IRUSR|S_IWUSR)
#define S_STDRD S_IRUSR
#endif
2002-09-24 10:16:04 +00:00
#ifndef S_ISDIR
2005-10-22 02:45:18 +00:00
#define S_ISDIR(st_mode) (make_bool((st_mode)&_S_IFDIR))
2002-09-24 10:16:04 +00:00
#endif
#ifndef S_ISREG
2005-10-22 02:45:18 +00:00
#define S_ISREG(st_mode) (make_bool((st_mode)&_S_IFREG))
2002-09-24 10:16:04 +00:00
#endif
#ifndef R_OK
#define R_OK 0
#endif
2000-02-25 10:15:17 +00:00
// ------------------------------------------------------------------
#define GMAXPATH (FILENAME_MAX+1) /* ANSI C */
2000-02-25 10:15:17 +00:00
// ------------------------------------------------------------------
// Standardized split/merge defines
#define GMAXDRIVE 265
#define GMAXDIR 256
#define GMAXFILE 256
#define GMAXEXT 256
#define GMAXFILEEXT 256
// ------------------------------------------------------------------
// Misc. defines
2001-04-15 19:24:44 +00:00
#if defined(__MSDOS__) || defined(__OS2__) || defined(__WIN32__)
2000-02-25 10:15:17 +00:00
#define GOLD_SLASH_CHR '\\' // Backslash
#define GOLD_SLASH_STR "\\"
#define GOLD_WRONG_SLASH_CHR '/' // Fwrdslash
#define GOLD_WRONG_SLASH_STR "/"
#define GOLD_SHELL_ENV "COMSPEC"
#else
#define GOLD_SLASH_CHR '/' // Fwrdslash
#define GOLD_SLASH_STR "/"
#define GOLD_WRONG_SLASH_CHR '\\' // Backslash
#define GOLD_WRONG_SLASH_STR "\\"
#define GOLD_SHELL_ENV "SHELL"
#endif
#define GOLD_ALL_SLASH_STR "/\\" // GOLD_SLASH_STR GOLD_WRONG_SLASH_STR
2007-01-02 12:21:13 +00:00
inline bool isslash(char c) { return (c == GOLD_SLASH_CHR) or (c == GOLD_WRONG_SLASH_CHR); }
2000-02-25 10:15:17 +00:00
// ------------------------------------------------------------------
// Path typedefs
typedef char Path[GMAXPATH];
// ------------------------------------------------------------------
// Structure for filetime stamp checking
struct Stamp {
dword ft; // Timestamp
Path fn; // Filename
byte fc; // Filecheck
};
// ------------------------------------------------------------------
// Prototypes
2001-04-15 19:24:44 +00:00
#if !defined(__GNUC__) || defined(__MINGW32__)
2000-02-25 10:15:17 +00:00
#define mkdir(path,unused) mkdir(path)
#endif
2001-04-15 19:24:44 +00:00
#ifdef __EMX__
#define getcwd _getcwd2
#define chdir _chdir2
#endif
2009-11-29 12:20:28 +00:00
// Shareable fopen() for compilers that need it
2000-02-25 10:15:17 +00:00
FILE* fsopen(const char* path, const char* type, int shflag);
inline FILE* fsopen(const std::string& path, const char* type, int shflag) { return fsopen(path.c_str(), type, shflag); }
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// ------------------------------------------------------------------
// Check if a pathname is a directory
bool is_dir(const TCHAR *path);
inline bool is_dir(const std::string &path) { return is_dir(path.c_str()); }
2000-02-25 10:15:17 +00:00
#if defined(_taccess_s)
inline bool fexist(const TCHAR *filename) { return *filename ? (0 == (_taccess_s(filename, R_OK)) && !is_dir(filename)) : false; }
#else
2006-05-14 18:37:26 +00:00
inline bool fexist(const TCHAR *filename) { return *filename ? (0 == (access(filename, R_OK)) && !is_dir(filename)) : false; }
#endif
inline bool fexist(const std::string& filename) { return fexist(filename.c_str()); }
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// Convert time returned with stat to FFTime
2006-04-24 16:38:44 +00:00
time32_t gfixstattime(time32_t st_time);
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// Get timestamp of file
2006-04-24 16:38:44 +00:00
time32_t GetFiletime(const char* file);
inline time32_t GetFiletime(const std::string& file) { return GetFiletime(file.c_str()); }
2000-02-25 10:15:17 +00:00
inline long FiletimeCmp(const char* file1, const char* file2) { return long(GetFiletime(file1) - GetFiletime(file2)); }
inline long FiletimeCmp(const std::string& file1, const std::string& file2) { return FiletimeCmp(file1.c_str(), file2.c_str()); }
2000-02-25 10:15:17 +00:00
// Get size of open file handle
2000-02-25 10:15:17 +00:00
long fsize(FILE* fp);
// Get size of disk file. Return values:
// positive number or zero - size of file,
// negative number - error (and error code is stored in errno)
2000-02-25 10:15:17 +00:00
long GetFilesize(const char* file);
long GetFilesize(const std::string& filename);
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// Add path to filename if no path is present. Uses static string and don't chech size of 'path', be careful!
2000-02-25 10:15:17 +00:00
const char* AddPath(const char* path, const char* file);
inline const char* AddPath(const std::string& path, const char* file) { return AddPath(path.c_str(), file); }
inline const char* AddPath(const std::string& path, const std::string& file) { return AddPath(path.c_str(), file.c_str()); }
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// Add path to filename, if no path is set. Don't chech size of 'path', be careful!
2000-02-25 10:15:17 +00:00
void MakePathname(char* pathname, const char* path, const char* name);
void MakePathname(std::string& pathname, const std::string& path, const std::string& name);
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// Adds the directory-delimiter character into end of string ('\\' in DOS-based, '/' in unix-based OS)
// Replace wrong directory-delimiter character with good.
2000-02-25 10:15:17 +00:00
char* AddBackslash(char* p);
std::string& AddBackslash(std::string& p);
2009-11-29 12:20:28 +00:00
// Remove one trailing directory-delimiter character ('\\' in DOS-based, '/' in unix-based OS)
2000-02-25 10:15:17 +00:00
char* StripBackslash(char* p);
std::string& StripBackslash(std::string& p);
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// Copy pathname with enviroment variables substitution and adds directory delimiter char.
// Copy not more sizeof(Path) characters (__dst should be type "Path" or equvalence, size is GMAXPATH)
2000-02-25 10:15:17 +00:00
char* PathCopy(char* dst, const char* src);
void PathCopy(std::string& dst, const char* src);
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// Update time of modification for the file 'filename'
2006-04-24 16:38:44 +00:00
void TouchFile(const TCHAR *filename);
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// Test filesystem for file locks feature
2000-02-25 10:15:17 +00:00
int TestLockPath(const char* __path);
2009-11-29 12:20:28 +00:00
// Fill file with garbage (random byte values).
2000-02-25 10:15:17 +00:00
void WipeFile(const char* file, int options);
2009-11-29 12:20:28 +00:00
// Return filename without path. (Return pointer to filename part of filepath.)
2000-02-25 10:15:17 +00:00
const char* CleanFilename(const char* __file);
2009-11-29 12:20:28 +00:00
// DOS-style enviroment variables substitution in string.
int strschg_environ(char* s); /* Possible buffer owerflow! Please use another variant. */
int strschg_environ(char* s, size_t s_size); /* With control buffer size */
int strschg_environ(std::string& s); /* Use dinamic allocated string. */
2000-02-25 10:15:17 +00:00
2005-09-15 19:59:44 +00:00
char* MapPath(char* map, bool reverse = false); // gcarea.cpp
inline char* ReMapPath(char* map) { return MapPath(map, true); }
2000-02-25 10:15:17 +00:00
2006-05-14 18:37:26 +00:00
inline long lseekset(int fh, long offset) { return lseek(fh, offset, SEEK_SET); }
inline long lseekset(int fh, long record, long recordsize) { return lseek(fh, record*recordsize, SEEK_SET); }
2000-02-25 10:15:17 +00:00
2009-11-29 12:20:28 +00:00
// OS-independent change directory
2000-02-25 10:15:17 +00:00
int gchdir(const char* dir);
// ------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif
// ------------------------------------------------------------------
2010-03-23 09:06:37 +00:00
#if !defined(__DJGPP__) && ((defined(__BORLANDC__) && defined(__OS2__)) || defined(__UNIX__) || defined(__EMX__))
off_t filelength(int fh);
2000-02-25 10:15:17 +00:00
#endif
// ------------------------------------------------------------------
2009-11-29 12:20:28 +00:00
// Replace file suffix with specified in 'ext'
2000-02-25 10:15:17 +00:00
void replaceextension(char *destpath, const char *srcpath, const char *ext);
2009-11-29 12:20:28 +00:00
// Write to 'dir' dirname of the 'path'
2000-02-25 10:15:17 +00:00
void extractdirname(char *dir, const char *path);
// ------------------------------------------------------------------
#if defined(_MSC_VER)
int lock(int handle, long offset, long length);
int unlock(int handle, long offset, long length);
#endif
// ------------------------------------------------------------------
#if defined(__DJGPP__)
#undef sopen
#endif
2001-04-15 19:24:44 +00:00
#if !defined(__DJGPP__) && defined(__GNUC__)
2000-02-25 10:15:17 +00:00
int lock(int handle, long offset, long length);
int unlock(int handle, long offset, long length);
#if !defined(__QNXNTO__) && !defined(__MINGW32__)
inline off_t tell(int fh) { return lseek(fh, 0, SEEK_CUR); }
2000-02-25 10:15:17 +00:00
#endif
#endif
2000-02-25 10:15:17 +00:00
#if !defined(sopen) && !defined(__MINGW32__) && !defined(__EMX__) && !defined(__QNXNTO__) && defined(__GNUC__)
2000-02-25 10:15:17 +00:00
inline int sopen(const char* path, int access, int shflag, int mode) {
2001-03-04 14:14:33 +00:00
#ifdef __UNIX__
shflag = 0;
#endif
2000-02-25 10:15:17 +00:00
return open(path, access|shflag, mode);
}
#endif
2001-04-15 19:24:44 +00:00
#if defined(__UNIX__) || defined(__CYGWIN__)
2000-02-25 10:15:17 +00:00
inline int chsize(int handle, long size) { return ftruncate(handle, size); }
#endif
// ------------------------------------------------------------------
2009-11-29 12:20:28 +00:00
// Change dirname to real full pathname
2000-02-25 10:15:17 +00:00
bool maketruepath(std::string &dirname);
2000-02-25 10:15:17 +00:00
// ------------------------------------------------------------------
#ifdef __cplusplus
}
#endif
// ------------------------------------------------------------------
#endif
// ------------------------------------------------------------------