From 0d41ca8d38ce6c604a2a7c9c763b9bf92dd5a9c9 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 21 Feb 2009 18:28:38 +0000 Subject: SCI: Moved scicore/tools.cpp to tools.cpp, and include/resource.h to tools.h svn-id: r38720 --- engines/sci/engine/grammar.cpp | 2 +- engines/sci/engine/heap.h | 2 +- engines/sci/include/console.h | 2 +- engines/sci/include/engine.h | 6 +- engines/sci/include/gfx_system.h | 2 +- engines/sci/include/heapmgr.h | 2 +- engines/sci/include/resource.h | 280 -------------------- engines/sci/include/sci_memory.h | 3 +- engines/sci/include/sciresource.h | 2 +- engines/sci/module.mk | 2 +- engines/sci/scicore/resource_map.cpp | 2 +- engines/sci/scicore/tools.cpp | 478 ----------------------------------- engines/sci/scicore/versions.cpp | 2 +- engines/sci/sfx/adlib.h | 2 +- engines/sci/sfx/device/devices.cpp | 2 +- engines/sci/sfx/iterator.cpp | 2 +- engines/sci/sfx/pcm-iterator.cpp | 2 +- engines/sci/sfx/seq/sequencers.cpp | 2 +- engines/sci/sfx/softseq.h | 2 +- engines/sci/sfx/softseq/amiga.cpp | 2 +- engines/sci/sfx/softseq/opl2.cpp | 2 +- engines/sci/sfx/time.cpp | 2 +- engines/sci/tools.cpp | 478 +++++++++++++++++++++++++++++++++++ engines/sci/tools.h | 280 ++++++++++++++++++++ 24 files changed, 782 insertions(+), 779 deletions(-) delete mode 100644 engines/sci/include/resource.h delete mode 100644 engines/sci/scicore/tools.cpp create mode 100644 engines/sci/tools.cpp create mode 100644 engines/sci/tools.h (limited to 'engines/sci') diff --git a/engines/sci/engine/grammar.cpp b/engines/sci/engine/grammar.cpp index c478d6c1c9..a06464a0b4 100644 --- a/engines/sci/engine/grammar.cpp +++ b/engines/sci/engine/grammar.cpp @@ -28,7 +28,7 @@ ** that grammar, writing an appropriate node tree if successful. */ -#include "sci/include/resource.h" +#include "sci/tools.h" #include "sci/include/vocabulary.h" #include "sci/include/console.h" diff --git a/engines/sci/engine/heap.h b/engines/sci/engine/heap.h index 5fd745d547..37a7134517 100644 --- a/engines/sci/engine/heap.h +++ b/engines/sci/engine/heap.h @@ -26,7 +26,7 @@ #ifndef _SCI_HEAP_H #define _SCI_HEAP_H -#include "sci/include/resource.h" +#include "sci/tools.h" namespace Sci { diff --git a/engines/sci/include/console.h b/engines/sci/include/console.h index a12cfcdf2a..7e0ad876c4 100644 --- a/engines/sci/include/console.h +++ b/engines/sci/include/console.h @@ -35,7 +35,7 @@ #include "common/scummsys.h" #include "sci/include/sci_memory.h" -#include "sci/include/resource.h" +#include "sci/tools.h" #include "sci/include/vm_types.h" #define SCI_CONSOLE diff --git a/engines/sci/include/engine.h b/engines/sci/include/engine.h index b4fbc62817..aed9040ac5 100644 --- a/engines/sci/include/engine.h +++ b/engines/sci/include/engine.h @@ -36,14 +36,16 @@ namespace Common { // FIXME. Remove after transiton to File class #include -#include "sci/include/resource.h" +// FIXME. Remove this eventually +#include + +#include "sci/tools.h" #include "sci/include/sciresource.h" #include "sci/include/script.h" #include "sci/include/vocabulary.h" #include "sci/include/console.h" #include "sci/include/vm.h" #include "sci/include/menubar.h" -#include #include "sci/include/versions.h" #include "sci/include/kernel.h" #include "sci/include/gfx_state_internal.h" diff --git a/engines/sci/include/gfx_system.h b/engines/sci/include/gfx_system.h index d3f7397043..93cf00d5d5 100644 --- a/engines/sci/include/gfx_system.h +++ b/engines/sci/include/gfx_system.h @@ -29,7 +29,7 @@ #include "common/scummsys.h" #include "common/rect.h" #include "sci/include/sci_memory.h" -#include "sci/include/resource.h" +#include "sci/tools.h" namespace Sci { diff --git a/engines/sci/include/heapmgr.h b/engines/sci/include/heapmgr.h index dff2e9fc12..918a6a07fa 100644 --- a/engines/sci/include/heapmgr.h +++ b/engines/sci/include/heapmgr.h @@ -28,7 +28,7 @@ #ifndef _FREESCI_HEAPMGR_H_ #define _FREESCI_HEAPMGR_H_ -#include "sci/include/resource.h" +#include "sci/tools.h" #include "sci/include/sci_memory.h" namespace Sci { diff --git a/engines/sci/include/resource.h b/engines/sci/include/resource.h deleted file mode 100644 index 5972cf2553..0000000000 --- a/engines/sci/include/resource.h +++ /dev/null @@ -1,280 +0,0 @@ -/* 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 FREESCI_PRIMARY_RESOURCE_H_ -#define FREESCI_PRIMARY_RESOURCE_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 -#endif - -// FIXME: Get rid of the following (needed for O_RDONLY etc.) -#ifdef HAVE_FCNTL_H -# include -#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 diff --git a/engines/sci/include/sci_memory.h b/engines/sci/include/sci_memory.h index ff09b4b1b6..c39b6c86fe 100644 --- a/engines/sci/include/sci_memory.h +++ b/engines/sci/include/sci_memory.h @@ -44,8 +44,9 @@ #define _SCI_MEMORY_H #include "common/scummsys.h" -#include "sci/include/resource.h" +#include "sci/tools.h" +// FIXME: Get rid of the following #include #ifdef _MSC_VER # include // for chdir, rmdir, _gecwd, getcwd, mkdir #endif diff --git a/engines/sci/include/sciresource.h b/engines/sci/include/sciresource.h index aa280657ca..67205665b5 100644 --- a/engines/sci/include/sciresource.h +++ b/engines/sci/include/sciresource.h @@ -32,7 +32,7 @@ #include "common/stream.h" #include "common/str.h" -#include "sci/include/resource.h" +#include "sci/tools.h" #include "sci/include/versions.h" namespace Sci { diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 2dccaad01d..75293d6d7d 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -5,6 +5,7 @@ MODULE_OBJS = \ detection.o \ exereader.o \ sci.o \ + tools.o \ engine/game.o \ engine/gc.o \ engine/grammar.o \ @@ -62,7 +63,6 @@ MODULE_OBJS = \ scicore/resource_patch.o \ scicore/sci_memory.o \ scicore/script.o \ - scicore/tools.o \ scicore/versions.o \ scicore/vocab.o \ scicore/vocab_debug.o \ diff --git a/engines/sci/scicore/resource_map.cpp b/engines/sci/scicore/resource_map.cpp index dd44dabfcb..c30525584a 100644 --- a/engines/sci/scicore/resource_map.cpp +++ b/engines/sci/scicore/resource_map.cpp @@ -25,7 +25,7 @@ #include "sci/include/sci_memory.h" #include "sci/include/sciresource.h" -#include "sci/include/resource.h" +#include "sci/tools.h" #include "common/file.h" diff --git a/engines/sci/scicore/tools.cpp b/engines/sci/scicore/tools.cpp deleted file mode 100644 index b1d0829bd6..0000000000 --- a/engines/sci/scicore/tools.cpp +++ /dev/null @@ -1,478 +0,0 @@ -/* 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$ - * - */ - -#include "common/scummsys.h" - -#ifdef WIN32 -# include -# include -# include -# include -# include -# include -# undef ARRAYSIZE -#endif - -#ifdef UNIX -#include -#endif - -#include "common/archive.h" -#include "common/file.h" -#include "common/util.h" -#include "common/str.h" - -#include "sci/include/engine.h" - -namespace Sci { - -// FIXME: Get rid of G_DIR_SEPARATOR / G_DIR_SEPARATOR_S -#if _MSC_VER -# define G_DIR_SEPARATOR_S "\\" -# define G_DIR_SEPARATOR '\\' -#else -# define G_DIR_SEPARATOR_S "/" -# define G_DIR_SEPARATOR '/' -#endif - - -#ifdef HAVE_SYS_TIME_H -# include -#endif - -int script_debug_flag = 0; // Defaulting to running mode -int sci_debug_flags = 0; // Special flags - -#ifndef con_file -# define con_file 0 -#endif - -int sci_ffs(int _mask) { - int retval = 0; - - if (!_mask) - return 0; - retval++; - while (!(_mask & 1)) { - retval++; - _mask >>= 1; - } - - return retval; -} - -//******************* Debug functions ******************* - -// Functions for internal macro use -void _SCIkvprintf(FILE *file, const char *format, va_list args); - -void _SCIkvprintf(FILE *file, const char *format, va_list args) { - vfprintf(file, format, args); - if (con_file) vfprintf(con_file, format, args); -} - - -void _SCIkwarn(EngineState *s, const char *file, int line, int area, const char *format, ...) { - va_list args; - - if (area == SCIkERROR_NR) - fprintf(stderr, "ERROR: "); - else - fprintf(stderr, "Warning: "); - - va_start(args, format); - _SCIkvprintf(stderr, format, args); - va_end(args); - fflush(NULL); - - if (sci_debug_flags & _DEBUG_FLAG_BREAK_ON_WARNINGS) script_debug_flag = 1; -} - -void _SCIkdebug(EngineState *s, const char *file, int line, int area, const char *format, ...) { - va_list args; - - if (s->debug_mode & (1 << area)) { - fprintf(stdout, " kernel: (%s L%d): ", file, line); - va_start(args, format); - _SCIkvprintf(stdout, format, args); - va_end(args); - fflush(NULL); - } -} - -void _SCIGNUkdebug(const char *funcname, EngineState *s, const char *file, int line, int area, const char *format, ...) { - va_list xargs; - int error = ((area == SCIkWARNING_NR) || (area == SCIkERROR_NR)); - - if (error || (s->debug_mode & (1 << area))) { // Is debugging enabled for this area? - - fprintf(stderr, "FSCI: "); - - if (area == SCIkERROR_NR) - fprintf(stderr, "ERROR in %s ", funcname); - else if (area == SCIkWARNING_NR) - fprintf(stderr, "%s: Warning ", funcname); - else - fprintf(stderr, funcname); - - fprintf(stderr, "(%s L%d): ", file, line); - - va_start(xargs, format); - _SCIkvprintf(stderr, format, xargs); - va_end(xargs); - - } -} - - -#if defined(HAVE_GETTIMEOFDAY) -void sci_gettime(long *seconds, long *useconds) { - struct timeval tv; - - assert(!gettimeofday(&tv, NULL)); - *seconds = tv.tv_sec; - *useconds = tv.tv_usec; -} -#elif defined (WIN32) - -/*WARNING(Incorrect)*/ -/* Warning: This function only retrieves the amount of mseconds since the start of -** the Win32 kernel; it does /not/ provide the number of seconds since the epoch! -** There are no known cases where this causes problems, though. */ -void sci_gettime(long *seconds, long *useconds) { - DWORD tm; - - if (TIMERR_NOERROR != timeBeginPeriod(1)) { - fprintf(stderr, "timeBeginPeriod(1) failed in sci_gettime\n"); - } - - tm = timeGetTime(); - - if (TIMERR_NOERROR != timeEndPeriod(1)) { - fprintf(stderr, "timeEndPeriod(1) failed in sci_gettime\n"); - } - - *seconds = tm / 1000; - *useconds = (tm % 1000) * 1000; -} -#else -# error "You need to provide a microsecond resolution sci_gettime implementation for your platform!" -#endif - - -void sci_get_current_time(GTimeVal *val) { - long foo, bar; - sci_gettime(&foo, &bar); - val->tv_sec = foo; - val->tv_usec = bar; -} - -#if defined(WIN32) -void sci_init_dir(sci_dir_t *dir) { - dir->search = -1; -} - -char *sci_find_first(sci_dir_t *dir, const char *mask) { - dir->search = _findfirst(mask, &(dir->fileinfo)); - - if (dir->search != -1) { - if (dir->fileinfo.name == NULL) { - return NULL; - } - - if (strcmp(dir->fileinfo.name, ".") == 0 || - strcmp(dir->fileinfo.name, "..") == 0) { - if (sci_find_next(dir) == NULL) { - return NULL; - } - } - - return dir->fileinfo.name; - } else { - switch (errno) { - case ENOENT: { -#ifdef _DEBUG - printf("_findfirst errno = ENOENT: no match\n"); - - if (mask) - printf(" in: %s\n", mask); - else - printf(" - searching in undefined directory\n"); -#endif - break; - } - case EINVAL: { - printf("_findfirst errno = EINVAL: invalid filename\n"); - break; - } - default: - printf("_findfirst errno = unknown (%d)", errno); - } - } - - return NULL; -} - -char *sci_find_next(sci_dir_t *dir) { - if (dir->search == -1) - return NULL; - - if (_findnext(dir->search, &(dir->fileinfo)) < 0) { - _findclose(dir->search); - dir->search = -1; - return NULL; - } - - if (strcmp(dir->fileinfo.name, ".") == 0 || - strcmp(dir->fileinfo.name, "..") == 0) { - if (sci_find_next(dir) == NULL) { - return NULL; - } - } - - return dir->fileinfo.name; -} - -void sci_finish_find(sci_dir_t *dir) { - if (dir->search != -1) { - _findclose(dir->search); - dir->search = -1; - } -} - -#else - -void sci_init_dir(sci_dir_t *dir) { - dir->dir = NULL; - dir->mask_copy = NULL; -} - -char *sci_find_first(sci_dir_t *dir, const char *mask) { - if (dir->dir) - closedir(dir->dir); - - if (!(dir->dir = opendir("."))) { - sciprintf("%s, L%d: opendir(\".\") failed!\n", __FILE__, __LINE__); - return NULL; - } - - dir->mask_copy = sci_strdup(mask); - - return sci_find_next(dir); -} - -#ifndef FNM_CASEFOLD -#define FNM_CASEFOLD 0 -#warning "File searches will not be case-insensitive!" -#endif - -char *sci_find_next(sci_dir_t *dir) { - struct dirent *match; - - while ((match = readdir(dir->dir))) { - if (match->d_name[0] == '.') - continue; - - if (!fnmatch(dir->mask_copy, match->d_name, FNM_CASEFOLD)) - return match->d_name; - } - - sci_finish_find(dir); - - return NULL; -} - -void sci_finish_find(sci_dir_t *dir) { - if (dir->dir) { - closedir(dir->dir); - dir->dir = NULL; - free(dir->mask_copy); - dir->mask_copy = NULL; - } -} - -#endif - -int sci_mkpath(const char *path) { - const char *path_position = path; - char *next_separator = NULL; - - if (chdir(G_DIR_SEPARATOR_S)) { // Go to root - sciprintf("Error: Could not change to root directory '%s'", G_DIR_SEPARATOR_S); - return -1; - } - - do { - if (next_separator) - *next_separator = G_DIR_SEPARATOR_S[0]; - next_separator = (char *)strchr(path_position, G_DIR_SEPARATOR_S[0]); - - if (next_separator) - *next_separator = 0; - - if (*path_position) { // Unless we're at the first slash... - if (chdir(path_position)) { - if (scimkdir(path_position, 0700) || chdir(path_position)) { - sciprintf("Error: Could not create subdirectory '%s' in", path_position); - if (next_separator) - *next_separator = G_DIR_SEPARATOR_S[0]; - sciprintf(" '%s'!\n", path); - return -2; - } - } - } - path_position = next_separator + 1; - - } while (next_separator); - - return 0; -} - - -/* Returns the case-sensitive filename of a file. -** Expects *dir to be uninitialized and the caller to free it afterwards. -** Parameters: (const char *) fname: Name of file to get case-sensitive. -** (sci_dir_t *) dir: Directory to find file within. -** Returns : (char *) Case-sensitive filename of the file. -*/ -Common::String _fcaseseek(const char *fname) { - // Expects *dir to be uninitialized and the caller to - // free it afterwards */ - - if (strchr(fname, G_DIR_SEPARATOR)) { - fprintf(stderr, "_fcaseseek() does not support subdirs\n"); - BREAKPOINT(); - } - - // Look up the file, ignoring case - Common::ArchiveMemberList files; - SearchMan.listMatchingMembers(files, fname); - - for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { - const Common::String name = (*x)->getName(); - if (name.equalsIgnoreCase(fname)) - return name; - } - - return Common::String(); -} - -FILE *sci_fopen(const char *fname, const char *mode) { - Common::String name = _fcaseseek(fname); - FILE *file = NULL; - - if (!name.empty()) - file = fopen(name.c_str(), mode); - else if (strchr(mode, 'w')) - file = fopen(fname, mode); - - return file; -} - -int sci_open(const char *fname, int flags) { - int file = SCI_INVALID_FD; - Common::String name = _fcaseseek(fname); - if (!name.empty()) - file = open(name.c_str(), flags); - - return file; -} - -char *sci_getcwd() { - int size = 0; - char *cwd = NULL; - - while (size < 8192) { - size += 256; - cwd = (char*)sci_malloc(size); - if (getcwd(cwd, size - 1)) - return cwd; - - free(cwd); - } - - fprintf(stderr, "Could not determine current working directory!\n"); - - return NULL; -} - -#ifdef __DC__ - -int sci_fd_size(int fd) { - return fs_total(fd); -} - -int sci_file_size(const char *fname) { - int fd = fs_open(fname, O_RDONLY); - int retval = -1; - - if (fd != 0) { - retval = sci_fd_size(fd); - fs_close(fd); - } - - return retval; -} - -#else - -int sci_fd_size(int fd) { - struct stat fd_stat; - - if (fstat(fd, &fd_stat)) - return -1; - - return fd_stat.st_size; -} - -int sci_file_size(const char *fname) { - struct stat fn_stat; - - if (stat(fname, &fn_stat)) - return -1; - - return fn_stat.st_size; -} - -#endif - -/* 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) { - int printable = 0; - int len = strlen(str); - - if (len == 0) return 1; - - while (*str) { - if (isprint(*str)) printable++; - str++; - } - - return ((float)printable / (float)len >= 0.5); -} - -} // End of namespace Sci diff --git a/engines/sci/scicore/versions.cpp b/engines/sci/scicore/versions.cpp index 8706a5d54b..54bcc5acff 100644 --- a/engines/sci/scicore/versions.cpp +++ b/engines/sci/scicore/versions.cpp @@ -30,7 +30,7 @@ #include "sci/include/versions.h" #include "sci/include/engine.h" -#include "sci/include/resource.h" +#include "sci/tools.h" namespace Sci { diff --git a/engines/sci/sfx/adlib.h b/engines/sci/sfx/adlib.h index 890f573cdf..01f6624cdf 100644 --- a/engines/sci/sfx/adlib.h +++ b/engines/sci/sfx/adlib.h @@ -27,7 +27,7 @@ #ifndef _SFX_ADLIB_H_ #define _SFX_ADLIB_H_ -#include "sci/include/resource.h" +#include "sci/tools.h" namespace Sci { diff --git a/engines/sci/sfx/device/devices.cpp b/engines/sci/sfx/device/devices.cpp index defa5bcef3..c15c6e03a2 100644 --- a/engines/sci/sfx/device/devices.cpp +++ b/engines/sci/sfx/device/devices.cpp @@ -29,7 +29,7 @@ #include "../device.h" #include -#include "sci/include/resource.h" +#include "sci/tools.h" namespace Sci { diff --git a/engines/sci/sfx/iterator.cpp b/engines/sci/sfx/iterator.cpp index 5c6c3cb474..7c98e6d691 100644 --- a/engines/sci/sfx/iterator.cpp +++ b/engines/sci/sfx/iterator.cpp @@ -29,7 +29,7 @@ #include "common/util.h" #include "sci/include/sfx_iterator_internal.h" #include "sci/include/sfx_player.h" -#include "sci/include/resource.h" +#include "sci/tools.h" #include "sci/include/sci_memory.h" namespace Sci { diff --git a/engines/sci/sfx/pcm-iterator.cpp b/engines/sci/sfx/pcm-iterator.cpp index abb42bc7a7..9c72edfa13 100644 --- a/engines/sci/sfx/pcm-iterator.cpp +++ b/engines/sci/sfx/pcm-iterator.cpp @@ -24,7 +24,7 @@ */ #include "sci/include/sfx_iterator.h" -#include "sci/include/resource.h" /* for BREAKPOINT */ +#include "sci/tools.h" /* for BREAKPOINT */ #include "sci/include/sci_memory.h" namespace Sci { diff --git a/engines/sci/sfx/seq/sequencers.cpp b/engines/sci/sfx/seq/sequencers.cpp index ce73beab0f..1a0cd68c2d 100644 --- a/engines/sci/sfx/seq/sequencers.cpp +++ b/engines/sci/sfx/seq/sequencers.cpp @@ -24,7 +24,7 @@ */ #include "../sequencer.h" -#include "sci/include/resource.h" +#include "sci/tools.h" namespace Sci { diff --git a/engines/sci/sfx/softseq.h b/engines/sci/sfx/softseq.h index 39cb73e4e7..71b296fda6 100644 --- a/engines/sci/sfx/softseq.h +++ b/engines/sci/sfx/softseq.h @@ -29,7 +29,7 @@ #include "sci/include/sfx_core.h" #include "sci/include/sfx_pcm.h" #include "sci/sfx/sequencer.h" -#include "sci/include/resource.h" +#include "sci/tools.h" namespace Sci { diff --git a/engines/sci/sfx/softseq/amiga.cpp b/engines/sci/sfx/softseq/amiga.cpp index 4ceb0d311e..643d3092bd 100644 --- a/engines/sci/sfx/softseq/amiga.cpp +++ b/engines/sci/sfx/softseq/amiga.cpp @@ -23,7 +23,7 @@ * */ -#include "sci/include/resource.h" +#include "sci/tools.h" #include "sci/include/sci_memory.h" #include "sci/sfx/softseq.h" diff --git a/engines/sci/sfx/softseq/opl2.cpp b/engines/sci/sfx/softseq/opl2.cpp index 2986917b7a..1de9bd4659 100644 --- a/engines/sci/sfx/softseq/opl2.cpp +++ b/engines/sci/sfx/softseq/opl2.cpp @@ -42,7 +42,7 @@ ***************************************************************************/ -#include "sci/include/resource.h" +#include "sci/tools.h" #include "sci/include/sfx_iterator.h" #include "../softseq.h" #include "../adlib.h" diff --git a/engines/sci/sfx/time.cpp b/engines/sci/sfx/time.cpp index 42af86dacf..418343584a 100644 --- a/engines/sci/sfx/time.cpp +++ b/engines/sci/sfx/time.cpp @@ -24,7 +24,7 @@ */ #include "sci/include/sfx_time.h" -#include "sci/include/resource.h" +#include "sci/tools.h" namespace Sci { diff --git a/engines/sci/tools.cpp b/engines/sci/tools.cpp new file mode 100644 index 0000000000..b1d0829bd6 --- /dev/null +++ b/engines/sci/tools.cpp @@ -0,0 +1,478 @@ +/* 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$ + * + */ + +#include "common/scummsys.h" + +#ifdef WIN32 +# include +# include +# include +# include +# include +# include +# undef ARRAYSIZE +#endif + +#ifdef UNIX +#include +#endif + +#include "common/archive.h" +#include "common/file.h" +#include "common/util.h" +#include "common/str.h" + +#include "sci/include/engine.h" + +namespace Sci { + +// FIXME: Get rid of G_DIR_SEPARATOR / G_DIR_SEPARATOR_S +#if _MSC_VER +# define G_DIR_SEPARATOR_S "\\" +# define G_DIR_SEPARATOR '\\' +#else +# define G_DIR_SEPARATOR_S "/" +# define G_DIR_SEPARATOR '/' +#endif + + +#ifdef HAVE_SYS_TIME_H +# include +#endif + +int script_debug_flag = 0; // Defaulting to running mode +int sci_debug_flags = 0; // Special flags + +#ifndef con_file +# define con_file 0 +#endif + +int sci_ffs(int _mask) { + int retval = 0; + + if (!_mask) + return 0; + retval++; + while (!(_mask & 1)) { + retval++; + _mask >>= 1; + } + + return retval; +} + +//******************* Debug functions ******************* + +// Functions for internal macro use +void _SCIkvprintf(FILE *file, const char *format, va_list args); + +void _SCIkvprintf(FILE *file, const char *format, va_list args) { + vfprintf(file, format, args); + if (con_file) vfprintf(con_file, format, args); +} + + +void _SCIkwarn(EngineState *s, const char *file, int line, int area, const char *format, ...) { + va_list args; + + if (area == SCIkERROR_NR) + fprintf(stderr, "ERROR: "); + else + fprintf(stderr, "Warning: "); + + va_start(args, format); + _SCIkvprintf(stderr, format, args); + va_end(args); + fflush(NULL); + + if (sci_debug_flags & _DEBUG_FLAG_BREAK_ON_WARNINGS) script_debug_flag = 1; +} + +void _SCIkdebug(EngineState *s, const char *file, int line, int area, const char *format, ...) { + va_list args; + + if (s->debug_mode & (1 << area)) { + fprintf(stdout, " kernel: (%s L%d): ", file, line); + va_start(args, format); + _SCIkvprintf(stdout, format, args); + va_end(args); + fflush(NULL); + } +} + +void _SCIGNUkdebug(const char *funcname, EngineState *s, const char *file, int line, int area, const char *format, ...) { + va_list xargs; + int error = ((area == SCIkWARNING_NR) || (area == SCIkERROR_NR)); + + if (error || (s->debug_mode & (1 << area))) { // Is debugging enabled for this area? + + fprintf(stderr, "FSCI: "); + + if (area == SCIkERROR_NR) + fprintf(stderr, "ERROR in %s ", funcname); + else if (area == SCIkWARNING_NR) + fprintf(stderr, "%s: Warning ", funcname); + else + fprintf(stderr, funcname); + + fprintf(stderr, "(%s L%d): ", file, line); + + va_start(xargs, format); + _SCIkvprintf(stderr, format, xargs); + va_end(xargs); + + } +} + + +#if defined(HAVE_GETTIMEOFDAY) +void sci_gettime(long *seconds, long *useconds) { + struct timeval tv; + + assert(!gettimeofday(&tv, NULL)); + *seconds = tv.tv_sec; + *useconds = tv.tv_usec; +} +#elif defined (WIN32) + +/*WARNING(Incorrect)*/ +/* Warning: This function only retrieves the amount of mseconds since the start of +** the Win32 kernel; it does /not/ provide the number of seconds since the epoch! +** There are no known cases where this causes problems, though. */ +void sci_gettime(long *seconds, long *useconds) { + DWORD tm; + + if (TIMERR_NOERROR != timeBeginPeriod(1)) { + fprintf(stderr, "timeBeginPeriod(1) failed in sci_gettime\n"); + } + + tm = timeGetTime(); + + if (TIMERR_NOERROR != timeEndPeriod(1)) { + fprintf(stderr, "timeEndPeriod(1) failed in sci_gettime\n"); + } + + *seconds = tm / 1000; + *useconds = (tm % 1000) * 1000; +} +#else +# error "You need to provide a microsecond resolution sci_gettime implementation for your platform!" +#endif + + +void sci_get_current_time(GTimeVal *val) { + long foo, bar; + sci_gettime(&foo, &bar); + val->tv_sec = foo; + val->tv_usec = bar; +} + +#if defined(WIN32) +void sci_init_dir(sci_dir_t *dir) { + dir->search = -1; +} + +char *sci_find_first(sci_dir_t *dir, const char *mask) { + dir->search = _findfirst(mask, &(dir->fileinfo)); + + if (dir->search != -1) { + if (dir->fileinfo.name == NULL) { + return NULL; + } + + if (strcmp(dir->fileinfo.name, ".") == 0 || + strcmp(dir->fileinfo.name, "..") == 0) { + if (sci_find_next(dir) == NULL) { + return NULL; + } + } + + return dir->fileinfo.name; + } else { + switch (errno) { + case ENOENT: { +#ifdef _DEBUG + printf("_findfirst errno = ENOENT: no match\n"); + + if (mask) + printf(" in: %s\n", mask); + else + printf(" - searching in undefined directory\n"); +#endif + break; + } + case EINVAL: { + printf("_findfirst errno = EINVAL: invalid filename\n"); + break; + } + default: + printf("_findfirst errno = unknown (%d)", errno); + } + } + + return NULL; +} + +char *sci_find_next(sci_dir_t *dir) { + if (dir->search == -1) + return NULL; + + if (_findnext(dir->search, &(dir->fileinfo)) < 0) { + _findclose(dir->search); + dir->search = -1; + return NULL; + } + + if (strcmp(dir->fileinfo.name, ".") == 0 || + strcmp(dir->fileinfo.name, "..") == 0) { + if (sci_find_next(dir) == NULL) { + return NULL; + } + } + + return dir->fileinfo.name; +} + +void sci_finish_find(sci_dir_t *dir) { + if (dir->search != -1) { + _findclose(dir->search); + dir->search = -1; + } +} + +#else + +void sci_init_dir(sci_dir_t *dir) { + dir->dir = NULL; + dir->mask_copy = NULL; +} + +char *sci_find_first(sci_dir_t *dir, const char *mask) { + if (dir->dir) + closedir(dir->dir); + + if (!(dir->dir = opendir("."))) { + sciprintf("%s, L%d: opendir(\".\") failed!\n", __FILE__, __LINE__); + return NULL; + } + + dir->mask_copy = sci_strdup(mask); + + return sci_find_next(dir); +} + +#ifndef FNM_CASEFOLD +#define FNM_CASEFOLD 0 +#warning "File searches will not be case-insensitive!" +#endif + +char *sci_find_next(sci_dir_t *dir) { + struct dirent *match; + + while ((match = readdir(dir->dir))) { + if (match->d_name[0] == '.') + continue; + + if (!fnmatch(dir->mask_copy, match->d_name, FNM_CASEFOLD)) + return match->d_name; + } + + sci_finish_find(dir); + + return NULL; +} + +void sci_finish_find(sci_dir_t *dir) { + if (dir->dir) { + closedir(dir->dir); + dir->dir = NULL; + free(dir->mask_copy); + dir->mask_copy = NULL; + } +} + +#endif + +int sci_mkpath(const char *path) { + const char *path_position = path; + char *next_separator = NULL; + + if (chdir(G_DIR_SEPARATOR_S)) { // Go to root + sciprintf("Error: Could not change to root directory '%s'", G_DIR_SEPARATOR_S); + return -1; + } + + do { + if (next_separator) + *next_separator = G_DIR_SEPARATOR_S[0]; + next_separator = (char *)strchr(path_position, G_DIR_SEPARATOR_S[0]); + + if (next_separator) + *next_separator = 0; + + if (*path_position) { // Unless we're at the first slash... + if (chdir(path_position)) { + if (scimkdir(path_position, 0700) || chdir(path_position)) { + sciprintf("Error: Could not create subdirectory '%s' in", path_position); + if (next_separator) + *next_separator = G_DIR_SEPARATOR_S[0]; + sciprintf(" '%s'!\n", path); + return -2; + } + } + } + path_position = next_separator + 1; + + } while (next_separator); + + return 0; +} + + +/* Returns the case-sensitive filename of a file. +** Expects *dir to be uninitialized and the caller to free it afterwards. +** Parameters: (const char *) fname: Name of file to get case-sensitive. +** (sci_dir_t *) dir: Directory to find file within. +** Returns : (char *) Case-sensitive filename of the file. +*/ +Common::String _fcaseseek(const char *fname) { + // Expects *dir to be uninitialized and the caller to + // free it afterwards */ + + if (strchr(fname, G_DIR_SEPARATOR)) { + fprintf(stderr, "_fcaseseek() does not support subdirs\n"); + BREAKPOINT(); + } + + // Look up the file, ignoring case + Common::ArchiveMemberList files; + SearchMan.listMatchingMembers(files, fname); + + for (Common::ArchiveMemberList::const_iterator x = files.begin(); x != files.end(); ++x) { + const Common::String name = (*x)->getName(); + if (name.equalsIgnoreCase(fname)) + return name; + } + + return Common::String(); +} + +FILE *sci_fopen(const char *fname, const char *mode) { + Common::String name = _fcaseseek(fname); + FILE *file = NULL; + + if (!name.empty()) + file = fopen(name.c_str(), mode); + else if (strchr(mode, 'w')) + file = fopen(fname, mode); + + return file; +} + +int sci_open(const char *fname, int flags) { + int file = SCI_INVALID_FD; + Common::String name = _fcaseseek(fname); + if (!name.empty()) + file = open(name.c_str(), flags); + + return file; +} + +char *sci_getcwd() { + int size = 0; + char *cwd = NULL; + + while (size < 8192) { + size += 256; + cwd = (char*)sci_malloc(size); + if (getcwd(cwd, size - 1)) + return cwd; + + free(cwd); + } + + fprintf(stderr, "Could not determine current working directory!\n"); + + return NULL; +} + +#ifdef __DC__ + +int sci_fd_size(int fd) { + return fs_total(fd); +} + +int sci_file_size(const char *fname) { + int fd = fs_open(fname, O_RDONLY); + int retval = -1; + + if (fd != 0) { + retval = sci_fd_size(fd); + fs_close(fd); + } + + return retval; +} + +#else + +int sci_fd_size(int fd) { + struct stat fd_stat; + + if (fstat(fd, &fd_stat)) + return -1; + + return fd_stat.st_size; +} + +int sci_file_size(const char *fname) { + struct stat fn_stat; + + if (stat(fname, &fn_stat)) + return -1; + + return fn_stat.st_size; +} + +#endif + +/* 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) { + int printable = 0; + int len = strlen(str); + + if (len == 0) return 1; + + while (*str) { + if (isprint(*str)) printable++; + str++; + } + + return ((float)printable / (float)len >= 0.5); +} + +} // End of namespace Sci 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 +#endif + +// FIXME: Get rid of the following (needed for O_RDONLY etc.) +#ifdef HAVE_FCNTL_H +# include +#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 -- cgit v1.2.3