[Scummvm-cvs-logs] SF.net SVN: scummvm:[38720] scummvm/trunk/engines/sci

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sat Feb 21 19:28:39 CET 2009


Revision: 38720
          http://scummvm.svn.sourceforge.net/scummvm/?rev=38720&view=rev
Author:   fingolfin
Date:     2009-02-21 18:28:38 +0000 (Sat, 21 Feb 2009)

Log Message:
-----------
SCI: Moved scicore/tools.cpp to tools.cpp, and include/resource.h to tools.h

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/grammar.cpp
    scummvm/trunk/engines/sci/engine/heap.h
    scummvm/trunk/engines/sci/include/console.h
    scummvm/trunk/engines/sci/include/engine.h
    scummvm/trunk/engines/sci/include/gfx_system.h
    scummvm/trunk/engines/sci/include/heapmgr.h
    scummvm/trunk/engines/sci/include/sci_memory.h
    scummvm/trunk/engines/sci/include/sciresource.h
    scummvm/trunk/engines/sci/module.mk
    scummvm/trunk/engines/sci/scicore/resource_map.cpp
    scummvm/trunk/engines/sci/scicore/versions.cpp
    scummvm/trunk/engines/sci/sfx/adlib.h
    scummvm/trunk/engines/sci/sfx/device/devices.cpp
    scummvm/trunk/engines/sci/sfx/iterator.cpp
    scummvm/trunk/engines/sci/sfx/pcm-iterator.cpp
    scummvm/trunk/engines/sci/sfx/seq/sequencers.cpp
    scummvm/trunk/engines/sci/sfx/softseq/amiga.cpp
    scummvm/trunk/engines/sci/sfx/softseq/opl2.cpp
    scummvm/trunk/engines/sci/sfx/softseq.h
    scummvm/trunk/engines/sci/sfx/time.cpp

Added Paths:
-----------
    scummvm/trunk/engines/sci/tools.cpp
    scummvm/trunk/engines/sci/tools.h

Removed Paths:
-------------
    scummvm/trunk/engines/sci/include/resource.h
    scummvm/trunk/engines/sci/scicore/tools.cpp

Modified: scummvm/trunk/engines/sci/engine/grammar.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/grammar.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/engine/grammar.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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"
 

Modified: scummvm/trunk/engines/sci/engine/heap.h
===================================================================
--- scummvm/trunk/engines/sci/engine/heap.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/engine/heap.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -26,7 +26,7 @@
 #ifndef _SCI_HEAP_H
 #define _SCI_HEAP_H
 
-#include "sci/include/resource.h"
+#include "sci/tools.h"
 
 namespace Sci {
 

Modified: scummvm/trunk/engines/sci/include/console.h
===================================================================
--- scummvm/trunk/engines/sci/include/console.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/include/console.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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

Modified: scummvm/trunk/engines/sci/include/engine.h
===================================================================
--- scummvm/trunk/engines/sci/include/engine.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/include/engine.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -36,14 +36,16 @@
 // FIXME. Remove after transiton to File class
 #include <sys/stat.h>
 
-#include "sci/include/resource.h"
+// FIXME. Remove this eventually
+#include <time.h>
+
+#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 <time.h>
 #include "sci/include/versions.h"
 #include "sci/include/kernel.h"
 #include "sci/include/gfx_state_internal.h"

Modified: scummvm/trunk/engines/sci/include/gfx_system.h
===================================================================
--- scummvm/trunk/engines/sci/include/gfx_system.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/include/gfx_system.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 {
 

Modified: scummvm/trunk/engines/sci/include/heapmgr.h
===================================================================
--- scummvm/trunk/engines/sci/include/heapmgr.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/include/heapmgr.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 {

Deleted: scummvm/trunk/engines/sci/include/resource.h
===================================================================
--- scummvm/trunk/engines/sci/include/resource.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/include/resource.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 <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

Modified: scummvm/trunk/engines/sci/include/sci_memory.h
===================================================================
--- scummvm/trunk/engines/sci/include/sci_memory.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/include/sci_memory.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 <direct.h> // for chdir, rmdir, _gecwd, getcwd, mkdir
 #endif

Modified: scummvm/trunk/engines/sci/include/sciresource.h
===================================================================
--- scummvm/trunk/engines/sci/include/sciresource.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/include/sciresource.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 {

Modified: scummvm/trunk/engines/sci/module.mk
===================================================================
--- scummvm/trunk/engines/sci/module.mk	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/module.mk	2009-02-21 18:28:38 UTC (rev 38720)
@@ -5,6 +5,7 @@
 	detection.o \
 	exereader.o \
 	sci.o \
+	tools.o \
 	engine/game.o \
 	engine/gc.o \
 	engine/grammar.o \
@@ -62,7 +63,6 @@
 	scicore/resource_patch.o \
 	scicore/sci_memory.o \
 	scicore/script.o \
-	scicore/tools.o \
 	scicore/versions.o \
 	scicore/vocab.o \
 	scicore/vocab_debug.o \

Modified: scummvm/trunk/engines/sci/scicore/resource_map.cpp
===================================================================
--- scummvm/trunk/engines/sci/scicore/resource_map.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/scicore/resource_map.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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"
 

Deleted: scummvm/trunk/engines/sci/scicore/tools.cpp
===================================================================
--- scummvm/trunk/engines/sci/scicore/tools.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/scicore/tools.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 <windows.h>
-#  include <errno.h>
-#  include <mmsystem.h>
-#  include <sys/timeb.h>
-#  include <sys/types.h>
-#  include <sys/stat.h>
-#  undef ARRAYSIZE
-#endif
-
-#ifdef UNIX
-#include <fnmatch.h>
-#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 <sys/time.h>
-#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

Modified: scummvm/trunk/engines/sci/scicore/versions.cpp
===================================================================
--- scummvm/trunk/engines/sci/scicore/versions.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/scicore/versions.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 {
 

Modified: scummvm/trunk/engines/sci/sfx/adlib.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/adlib.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/adlib.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -27,7 +27,7 @@
 #ifndef _SFX_ADLIB_H_
 #define _SFX_ADLIB_H_
 
-#include "sci/include/resource.h"
+#include "sci/tools.h"
 
 namespace Sci {
 

Modified: scummvm/trunk/engines/sci/sfx/device/devices.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/device/devices.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/device/devices.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -29,7 +29,7 @@
 #include "../device.h"
 #include <stdio.h>
 
-#include "sci/include/resource.h"
+#include "sci/tools.h"
 
 namespace Sci {
 

Modified: scummvm/trunk/engines/sci/sfx/iterator.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/iterator.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/iterator.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 {

Modified: scummvm/trunk/engines/sci/sfx/pcm-iterator.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/pcm-iterator.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/pcm-iterator.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 {

Modified: scummvm/trunk/engines/sci/sfx/seq/sequencers.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/seq/sequencers.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/seq/sequencers.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -24,7 +24,7 @@
  */
 
 #include "../sequencer.h"
-#include "sci/include/resource.h"
+#include "sci/tools.h"
 
 namespace Sci {
 

Modified: scummvm/trunk/engines/sci/sfx/softseq/amiga.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/softseq/amiga.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/softseq/amiga.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -23,7 +23,7 @@
  *
  */
 
-#include "sci/include/resource.h"
+#include "sci/tools.h"
 #include "sci/include/sci_memory.h"
 #include "sci/sfx/softseq.h"
 

Modified: scummvm/trunk/engines/sci/sfx/softseq/opl2.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/softseq/opl2.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/softseq/opl2.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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"

Modified: scummvm/trunk/engines/sci/sfx/softseq.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/softseq.h	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/softseq.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 {
 

Modified: scummvm/trunk/engines/sci/sfx/time.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/time.cpp	2009-02-21 18:21:00 UTC (rev 38719)
+++ scummvm/trunk/engines/sci/sfx/time.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -24,7 +24,7 @@
  */
 
 #include "sci/include/sfx_time.h"
-#include "sci/include/resource.h"
+#include "sci/tools.h"
 
 namespace Sci {
 

Copied: scummvm/trunk/engines/sci/tools.cpp (from rev 38719, scummvm/trunk/engines/sci/scicore/tools.cpp)
===================================================================
--- scummvm/trunk/engines/sci/tools.cpp	                        (rev 0)
+++ scummvm/trunk/engines/sci/tools.cpp	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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 <windows.h>
+#  include <errno.h>
+#  include <mmsystem.h>
+#  include <sys/timeb.h>
+#  include <sys/types.h>
+#  include <sys/stat.h>
+#  undef ARRAYSIZE
+#endif
+
+#ifdef UNIX
+#include <fnmatch.h>
+#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 <sys/time.h>
+#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

Copied: scummvm/trunk/engines/sci/tools.h (from rev 38719, scummvm/trunk/engines/sci/include/resource.h)
===================================================================
--- scummvm/trunk/engines/sci/tools.h	                        (rev 0)
+++ scummvm/trunk/engines/sci/tools.h	2009-02-21 18:28:38 UTC (rev 38720)
@@ -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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list