diff options
Diffstat (limited to 'engines/sci/tools.h')
-rw-r--r-- | engines/sci/tools.h | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/engines/sci/tools.h b/engines/sci/tools.h new file mode 100644 index 0000000000..9f84ee8cd1 --- /dev/null +++ b/engines/sci/tools.h @@ -0,0 +1,280 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef SCI_TOOLS_H +#define SCI_TOOLS_H + +#include "common/scummsys.h" + +/** This header file defines (mostly) generic tools and utility functions. + ** It also handles portability stuff, in cooperation with scitypes.h + ** (which specializes in primitive data types). + ** Most implementations of the functions found here are in + ** $(SRCDIR)/src/scicore/tools.c + ** + ** -- Christoph Reichenbach + **/ + +#define SCI_INVALID_FD -1 +#define IS_VALID_FD(a) ((a) != SCI_INVALID_FD) /* Tests validity of a file descriptor */ + +#ifdef WIN32 +# ifndef _Win32 +# define _Win32 +/* Work around problem with some versions of flex */ +# endif +#endif + +/*#define _SCI_RESOURCE_DEBUG */ +/*#define _SCI_DECOMPRESS_DEBUG*/ + +//TODO: Remove these defines by replacing their functionality by their ScummVM counterparts +#define HAVE_MEMCHR +#define HAVE_FCNTL_H +#ifndef _MSC_VER +#define HAVE_UNISTD_H +#define HAVE_SYS_TIME_H +#define HAVE_GETTIMEOFDAY +#endif +#define VERSION "0.6.4" + +#include "sci/include/scitypes.h" + +// FIXME: Mostly for close() in lots of places. Get rid of this! +#ifndef _MSC_VER +#include <unistd.h> +#endif + +// FIXME: Get rid of the following (needed for O_RDONLY etc.) +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif + +#define GUINT16_SWAP_LE_BE_CONSTANT(val) ((((val) & 0x00ff) << 8) | (((val) & 0xff00) >> 8)) + +#define GUINT32_SWAP_LE_BE_CONSTANT(val) ( \ + (((val) & 0xff000000) >> 24) \ + | (((val) & 0x00ff0000) >> 8) \ + | (((val) & 0x0000ff00) << 8) \ + | (((val) & 0x000000ff) << 24)) + +#define SCI_MAX_RESOURCE_SIZE 0x0400000 +/* The maximum allowed size for a compressed or decompressed resource */ + + + +#define MAX_HOMEDIR_SIZE 255 + +#ifdef WIN32 +# define FO_BINARY "b" +#else +# define FO_BINARY "" +#endif + +#ifdef WIN32 +# define FO_TEXT "t" +#else +# define FO_TEXT "" +#endif + +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +namespace Sci { + +/**** FUNCTION DECLARATIONS ****/ + +#ifdef WIN32 +# define scimkdir(arg1,arg2) mkdir(arg1) +#else +# define scimkdir(arg1,arg2) mkdir(arg1,arg2) +#endif + +static inline gint16 getInt16(byte *d) { + return (gint16)(*d | (d[1] << 8)); +} + +#define getUInt16(d) (guint16)(getInt16(d)) + +/* Turns a little endian 16 bit value into a machine-dependant 16 bit value +** Parameters: d: Pointer to the memory position from which to read +** Returns : (gint16) The (possibly converted) 16 bit value +** getUInt16 returns the int unsigned. +*/ + +static inline void putInt16(byte* dest, int src) { + dest[0] = (byte)src & 0xff; + dest[1] = (byte)(src >> 8) & 0xff; +} +/* Converse of getInt16() +** Parameters: (byte *) dest: The position to write to +** (int) src: value to write +*/ + +/* --- */ + +void sci_gettime(long *seconds, long *useconds); +/* Calculates the current time in seconds and microseconds +** Parameters: (long *) seconds: Pointer to the variable the seconds part of the +** current time will be stored in +** (long *) useconds: Pointer to the variable the microseconds part +** of the current time will be stored in +** Returns : (void) +** The resulting values must be relative to an arbitrary fixed point in time +** (typically 01/01/1970 on *NIX systems). +*/ + +void sci_get_current_time(GTimeVal *val); +/* GTimeVal version of sci_gettime() +** Parameters: (GTimeVal *) val: Pointer to the structure the values will be stored in +** Returns : (void) +*/ + +void sci_init_dir(sci_dir_t *dirent); +/* Initializes an sci directory search structure +** Parameters: (sci_dir_t *) dirent: The entity to initialize +** Returns : (void) +** The entity is initialized to "empty" values, meaning that it can be +** used in subsequent sci_find_first/sci_find_next constructs. In no +** event should this function be used upon a structure which has been +** subjected to any of the other dirent calls. +*/ + +char *sci_find_first(sci_dir_t *dirent, const char *mask); +/* Finds the first file matching the specified file mask +** Parameters: (sci_dir_t *) dirent: Pointer to an unused dirent structure +** (const char *) mask: File mask to apply +** Returns : (char *) Name of the first matching file found, or NULL +*/ + +char *sci_find_next(sci_dir_t *dirent); +/* Finds the next file specified by an sci_dir initialized by sci_find_first() +** Parameters: (sci_dir_t *) dirent: Pointer to SCI dir entity +** Returns : (char *) Name of the next matching file, or NULL +*/ + +void sci_finish_find(sci_dir_t *dirent); +/* Completes an 'sci_find_first/next' procedure +** Parameters: (sci_dir_t *) dirent: Pointer to the dirent used +** Returns : (void) +** In the operation sequences +** sci_init_dir(x); sci_finish_find(x); +** and +** sci_finish_find(x); sci_finish_find(x); +** the second operation is guaranteed to be a no-op. +*/ + +FILE *sci_fopen(const char *fname, const char *mode); +/* Opens a FILE* case-insensitively +** Parameters: (const char *) fname: Name of the file to open +** (const char *) mode: Mode to open it with +** Returns : (FILE *) A valid file handle, or NULL on failure +** Always refers to the cwd, cannot address subdirectories +*/ + +int sci_open(const char *fname, int flags); +/* Opens a file descriptor case-insensitively +** Parameters: (const char *) fname: Name of the file to open +** (int) flags: open(2) flags for the file +** Returns : (int) a file descriptor of the open file, +** or SCI_INVALID_FD on failure +** Always refers to the cwd, cannot address subdirectories +*/ + + +int sciprintf(const char *fmt, ...) GCC_PRINTF(1, 2); +#define gfxprintf sciprintf +/* Prints a string to the console stack +** Parameters: fmt: a printf-style format string +** ...: Additional parameters as defined in fmt +** Returns : (int) 1 +** Implementation is in src/scicore/console.c +*/ + +char *sci_getcwd(); +/* Returns the current working directory, malloc'd. +** Parameters: (void) +** Returns : (char *) a malloc'd cwd, or NULL if it couldn't be determined. +*/ + +int sci_mkpath(const char *path); +/* Asserts that the specified path is available +** Parameters: (const char *) path: Path to verify/create +** Returns : (int) 0 on success, <0 on error +** This function will create any directories that couldn't be found +*/ + +int sci_fd_size(int fd); +/* Returns the filesize of an open file +** Parameters: (int) fd: File descriptor of open file +** Returns : (int) filesize of file pointed to by fd, -1 on error +*/ + +int sci_file_size(const char *fname); +/* Returns the filesize of a file +** Parameters: (const char *) fname: Name of file to get filesize of +** Returns : (int) filesize of the file, -1 on error +*/ + +/* Simple heuristic to work around array handling peculiarity in SQ4: +It uses StrAt() to read the individual elements, so we must determine +whether a string is really a string or an array. */ +int is_print_str(char *str); + +# define sci_unlink unlink +# define sci_rmdir rmdir + +/** Find first set bit in bits and return its index. Returns 0 if bits is 0. */ +int sci_ffs(int bits); + + +/* The following was originally based on glib.h code, which was + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + */ +#if defined (__GNUC__) && __GNUC__ >= 2 +# if defined (__i386__) +# define BREAKPOINT() {__asm__ __volatile__ ("int $03"); } +# elif defined(__alpha__) +# define BREAKPOINT() {__asm__ __volatile__ ("call_pal 0x80"); } +# endif /* !__i386__ && !__alpha__ */ +#elif defined (_MSC_VER) +# if defined (_M_IX86) +# define BREAKPOINT() { __asm { int 03 } } +# elif defined(_M_ALPHA) +# define BREAKPOINT() { __asm { bpt } } +# endif /* !_M_IX86 && !_M_ALPHA */ +#elif defined (__DECC) +# if defined(__alpha__) +# define BREAKPOINT() {asm ("call_pal 0x80"); } +# endif /* !__i386__ && !__alpha__ */ +#endif +#ifndef BREAKPOINT +# define BREAKPOINT() { fprintf(stderr, "Missed breakpoint in %s, line %d\n", __FILE__, __LINE__); *((int *) NULL) = 42; } +#endif /* !BREAKPOINT() */ + +} // End of namespace Sci + +#endif |