diff --git a/file.h b/file.h
index 3d492434a2..a2dc182ff3 100644
--- a/file.h
+++ b/file.h
@@ -13,7 +13,6 @@
* If not, see .
*/
-
#ifndef __RARCH_FILE_H
#define __RARCH_FILE_H
@@ -23,6 +22,7 @@
#include
#include
#include "general.h"
+#include "file_path.h"
#ifdef __cplusplus
extern "C" {
@@ -42,115 +42,6 @@ void save_ram_file(const char *path, int type);
bool init_rom_file(enum rarch_game_type type);
-// Yep, this is C alright ;)
-union string_list_elem_attr
-{
- bool b;
- int i;
- void *p;
-};
-
-struct string_list_elem
-{
- char *data;
- union string_list_elem_attr attr;
-};
-
-struct string_list
-{
- struct string_list_elem *elems;
- size_t size;
- size_t cap;
-};
-
-struct string_list *dir_list_new(const char *dir, const char *ext, bool include_dirs);
-void dir_list_sort(struct string_list *list, bool dir_first);
-void dir_list_free(struct string_list *list);
-bool string_list_find_elem(const struct string_list *list, const char *elem);
-bool string_list_find_elem_prefix(const struct string_list *list, const char *prefix, const char *elem);
-struct string_list *string_split(const char *str, const char *delim);
-struct string_list *string_list_new(void);
-bool string_list_append(struct string_list *list, const char *elem, union string_list_elem_attr attr);
-void string_list_free(struct string_list *list);
-
-bool path_is_directory(const char *path);
-bool path_file_exists(const char *path);
-
-// Gets extension of file. Only '.'s after the last slash are considered.
-const char *path_get_extension(const char *path);
-
-bool path_mkdir(const char *dir);
-
-// Removes all text after and including the last '.'.
-// Only '.'s after the last slash are considered.
-char *path_remove_extension(char *path);
-
-// Returns basename from path.
-const char *path_basename(const char *path);
-
-// Extracts base directory by mutating path. Keeps trailing '/'.
-void path_basedir(char *path);
-
-// Extracts parent directory by mutating path.
-// Assumes that path is a directory. Keeps trailing '/'.
-void path_parent_dir(char *path);
-
-// Turns relative paths into absolute path.
-// If relative, rebases on current working dir.
-void path_resolve_realpath(char *buf, size_t size);
-
-bool path_is_absolute(const char *path);
-
-// Path-name operations.
-// If any of these operation are detected to overflow, the application will be terminated.
-
-// Replaces filename extension with 'replace' and outputs result to out_path.
-// The extension here is considered to be the string from the last '.' to the end.
-// Only '.'s after the last slash are considered as extensions.
-// If no '.' is present, in_path and replace will simply be concatenated.
-// 'size' is buffer size of 'out_path'.
-// E.g.: in_path = "/foo/bar/baz/boo.c", replace = ".asm" => out_path = "/foo/bar/baz/boo.asm"
-// E.g.: in_path = "/foo/bar/baz/boo.c", replace = "" => out_path = "/foo/bar/baz/boo"
-void fill_pathname(char *out_path, const char *in_path, const char *replace, size_t size);
-
-void fill_dated_filename(char *out_filename, const char *ext, size_t size);
-
-// Appends a filename extension 'replace' to 'in_path', and outputs result in 'out_path'.
-// Assumes in_path has no extension. If an extension is still present in 'in_path', it will be ignored.
-// 'size' is buffer size of 'out_path'.
-void fill_pathname_noext(char *out_path, const char *in_path, const char *replace, size_t size);
-
-// Appends basename of 'in_basename', to 'in_dir', along with 'replace'.
-// Basename of in_basename is the string after the last '/' or '\\', i.e the filename without directories.
-// If in_basename has no '/' or '\\', the whole 'in_basename' will be used.
-// 'size' is buffer size of 'in_dir'.
-// E.g..: in_dir = "/tmp/some_dir", in_basename = "/some_roms/foo.c", replace = ".asm" =>
-// in_dir = "/tmp/some_dir/foo.c.asm"
-void fill_pathname_dir(char *in_dir, const char *in_basename, const char *replace, size_t size);
-
-// Copies basename of in_path into out_path.
-void fill_pathname_base(char *out_path, const char *in_path, size_t size);
-
-// Copies base directory of in_path into out_path.
-// If in_path is a path without any slashes (relative current directory), out_path will get path "./".
-void fill_pathname_basedir(char *out_path, const char *in_path, size_t size);
-
-// Copies parent directory of in_dir into out_dir.
-// Assumes in_dir is a directory. Keeps trailing '/'.
-void fill_pathname_parent_dir(char *out_dir, const char *in_dir, size_t size);
-
-// Joins basedir of in_refpath together with in_path.
-// If in_path is an absolute path, out_path = in_path.
-// E.g.: in_refpath = "/foo/bar/baz.a", in_path = "foobar.cg", out_path = "/foo/bar/foobar.cg".
-void fill_pathname_resolve_relative(char *out_path, const char *in_refpath, const char *in_path, size_t size);
-
-// Joins a directory and path together. Makes sure not to get two consecutive slashes between dir and path.
-void fill_pathname_join(char *out_path, const char *dir, const char *path, size_t size);
-
-#ifndef RARCH_CONSOLE
-void fill_pathname_application_path(char *buf, size_t size);
-#endif
-
#ifdef __cplusplus
}
#endif
diff --git a/file_path.c b/file_path.c
index c5cb746190..7b2c0b6bcf 100644
--- a/file_path.c
+++ b/file_path.c
@@ -13,8 +13,7 @@
* If not, see .
*/
-#include "file.h"
-#include "general.h"
+#include "file_path.h"
#include
#include "boolean.h"
#include
@@ -22,6 +21,7 @@
#include
#include "compat/strl.h"
#include "compat/posix_string.h"
+#include "miscellaneous.h"
#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__) || defined(__BLACKBERRY_QNX__)
#include //stat() is defined here
diff --git a/file_path.h b/file_path.h
new file mode 100644
index 0000000000..3f9b844eb2
--- /dev/null
+++ b/file_path.h
@@ -0,0 +1,127 @@
+#ifndef __RARCH_FILE_PATH_H
+#define __RARCH_FILE_PATH_H
+
+#include "boolean.h"
+#include
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Yep, this is C alright ;)
+union string_list_elem_attr
+{
+ bool b;
+ int i;
+ void *p;
+};
+
+struct string_list_elem
+{
+ char *data;
+ union string_list_elem_attr attr;
+};
+
+struct string_list
+{
+ struct string_list_elem *elems;
+ size_t size;
+ size_t cap;
+};
+
+struct string_list *dir_list_new(const char *dir, const char *ext, bool include_dirs);
+void dir_list_sort(struct string_list *list, bool dir_first);
+void dir_list_free(struct string_list *list);
+bool string_list_find_elem(const struct string_list *list, const char *elem);
+bool string_list_find_elem_prefix(const struct string_list *list, const char *prefix, const char *elem);
+struct string_list *string_split(const char *str, const char *delim);
+struct string_list *string_list_new(void);
+bool string_list_append(struct string_list *list, const char *elem, union string_list_elem_attr attr);
+void string_list_free(struct string_list *list);
+
+bool path_is_directory(const char *path);
+bool path_file_exists(const char *path);
+
+// Gets extension of file. Only '.'s after the last slash are considered.
+const char *path_get_extension(const char *path);
+
+bool path_mkdir(const char *dir);
+
+// Removes all text after and including the last '.'.
+// Only '.'s after the last slash are considered.
+char *path_remove_extension(char *path);
+
+// Returns basename from path.
+const char *path_basename(const char *path);
+
+// Extracts base directory by mutating path. Keeps trailing '/'.
+void path_basedir(char *path);
+
+// Extracts parent directory by mutating path.
+// Assumes that path is a directory. Keeps trailing '/'.
+void path_parent_dir(char *path);
+
+// Turns relative paths into absolute path.
+// If relative, rebases on current working dir.
+void path_resolve_realpath(char *buf, size_t size);
+
+bool path_is_absolute(const char *path);
+
+// Path-name operations.
+// If any of these operation are detected to overflow, the application will be terminated.
+
+// Replaces filename extension with 'replace' and outputs result to out_path.
+// The extension here is considered to be the string from the last '.' to the end.
+// Only '.'s after the last slash are considered as extensions.
+// If no '.' is present, in_path and replace will simply be concatenated.
+// 'size' is buffer size of 'out_path'.
+// E.g.: in_path = "/foo/bar/baz/boo.c", replace = ".asm" => out_path = "/foo/bar/baz/boo.asm"
+// E.g.: in_path = "/foo/bar/baz/boo.c", replace = "" => out_path = "/foo/bar/baz/boo"
+void fill_pathname(char *out_path, const char *in_path, const char *replace, size_t size);
+
+void fill_dated_filename(char *out_filename, const char *ext, size_t size);
+
+// Appends a filename extension 'replace' to 'in_path', and outputs result in 'out_path'.
+// Assumes in_path has no extension. If an extension is still present in 'in_path', it will be ignored.
+// 'size' is buffer size of 'out_path'.
+void fill_pathname_noext(char *out_path, const char *in_path, const char *replace, size_t size);
+
+// Appends basename of 'in_basename', to 'in_dir', along with 'replace'.
+// Basename of in_basename is the string after the last '/' or '\\', i.e the filename without directories.
+// If in_basename has no '/' or '\\', the whole 'in_basename' will be used.
+// 'size' is buffer size of 'in_dir'.
+// E.g..: in_dir = "/tmp/some_dir", in_basename = "/some_roms/foo.c", replace = ".asm" =>
+// in_dir = "/tmp/some_dir/foo.c.asm"
+void fill_pathname_dir(char *in_dir, const char *in_basename, const char *replace, size_t size);
+
+// Copies basename of in_path into out_path.
+void fill_pathname_base(char *out_path, const char *in_path, size_t size);
+
+// Copies base directory of in_path into out_path.
+// If in_path is a path without any slashes (relative current directory), out_path will get path "./".
+void fill_pathname_basedir(char *out_path, const char *in_path, size_t size);
+
+// Copies parent directory of in_dir into out_dir.
+// Assumes in_dir is a directory. Keeps trailing '/'.
+void fill_pathname_parent_dir(char *out_dir, const char *in_dir, size_t size);
+
+// Joins basedir of in_refpath together with in_path.
+// If in_path is an absolute path, out_path = in_path.
+// E.g.: in_refpath = "/foo/bar/baz.a", in_path = "foobar.cg", out_path = "/foo/bar/foobar.cg".
+void fill_pathname_resolve_relative(char *out_path, const char *in_refpath, const char *in_path, size_t size);
+
+// Joins a directory and path together. Makes sure not to get two consecutive slashes between dir and path.
+void fill_pathname_join(char *out_path, const char *dir, const char *path, size_t size);
+
+#ifndef RARCH_CONSOLE
+void fill_pathname_application_path(char *buf, size_t size);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/general.h b/general.h
index 83826e88e3..aec375252b 100644
--- a/general.h
+++ b/general.h
@@ -1,5 +1,6 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2013 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2013 - Daniel De Matteis
*
* RetroArch 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 Found-
@@ -33,6 +34,7 @@
#include "compat/strl.h"
#include "performance.h"
#include "core_options.h"
+#include "miscellaneous.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -732,114 +734,11 @@ extern struct global g_extern;
}
#endif
-#include "retroarch_logger.h"
-
-#ifndef max
-#define max(a, b) ((a) > (b) ? (a) : (b))
-#endif
-
-#ifndef min
-#define min(a, b) ((a) < (b) ? (a) : (b))
-#endif
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-#define RARCH_SCALE_BASE 256
-
-static inline uint32_t next_pow2(uint32_t v)
-{
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- v++;
- return v;
-}
-
-static inline uint32_t prev_pow2(uint32_t v)
-{
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- return v - (v >> 1);
-}
-
-static inline uint8_t is_little_endian(void)
-{
- union
- {
- uint16_t x;
- uint8_t y[2];
- } u;
-
- u.x = 1;
- return u.y[0];
-}
-
-static inline uint32_t swap_if_big32(uint32_t val)
-{
- if (is_little_endian()) // Little-endian
- return val;
- else
- return (val >> 24) | ((val >> 8) & 0xFF00) | ((val << 8) & 0xFF0000) | (val << 24);
-}
-
-static inline uint32_t swap_if_little32(uint32_t val)
-{
- if (is_little_endian())
- return (val >> 24) | ((val >> 8) & 0xFF00) | ((val << 8) & 0xFF0000) | (val << 24);
- else
- return val;
-}
-
-static inline uint16_t swap_if_big16(uint16_t val)
-{
- if (is_little_endian())
- return val;
- else
- return (val >> 8) | (val << 8);
-}
-
-static inline uint16_t swap_if_little16(uint16_t val)
-{
- if (is_little_endian())
- return (val >> 8) | (val << 8);
- else
- return val;
-}
-
static inline float db_to_gain(float db)
{
return powf(10.0f, db / 20.0f);
}
-static inline void rarch_sleep(unsigned msec)
-{
-#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)
- sys_timer_usleep(1000 * msec);
-#elif defined(PSP)
- sceKernelDelayThread(1000 * msec);
-#elif defined(_WIN32)
- Sleep(msec);
-#elif defined(XENON)
- udelay(1000 * msec);
-#elif defined(GEKKO) || defined(__PSL1GHT__) || defined(__QNX__)
- usleep(1000 * msec);
-#else
- struct timespec tv = {0};
- tv.tv_sec = msec / 1000;
- tv.tv_nsec = (msec % 1000) * 1000000;
- nanosleep(&tv, NULL);
-#endif
-}
-
-#define rarch_assert(cond) do { \
- if (!(cond)) { RARCH_ERR("Assertion failed at %s:%d.\n", __FILE__, __LINE__); exit(2); } \
-} while(0)
-
static inline void rarch_fail(int error_code, const char *error)
{
// We cannot longjmp unless we're in rarch_main_init().
@@ -850,18 +749,6 @@ static inline void rarch_fail(int error_code, const char *error)
longjmp(g_extern.error_sjlj_context, error_code);
}
-// Helper macros and struct to keep track of many booleans.
-// To check for multiple bits, use &&, not &.
-// For OR, | can be used.
-typedef struct
-{
- uint32_t data[8];
-} rarch_bits_t;
-#define BIT_SET(a, bit) ((a).data[(bit) >> 5] |= 1 << ((bit) & 31))
-#define BIT_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(1 << ((bit) & 31)))
-#define BIT_GET(a, bit) ((a).data[(bit) >> 5] & (1 << ((bit) & 31)))
-#define BIT_CLEAR_ALL(a) memset(&(a), 0, sizeof(a));
-
#endif
diff --git a/miscellaneous.h b/miscellaneous.h
new file mode 100644
index 0000000000..7fd0248ab9
--- /dev/null
+++ b/miscellaneous.h
@@ -0,0 +1,136 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2013 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2013 - Daniel De Matteis
+ *
+ * RetroArch 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 Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch 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 RetroArch.
+ * If not, see .
+ */
+
+#ifndef __RARCH_MISCELLANEOUS_H
+#define __RARCH_MISCELLANEOUS_H
+
+#include "retroarch_logger.h"
+
+#ifndef max
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#endif
+
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+#define rarch_assert(cond) do { \
+ if (!(cond)) { RARCH_ERR("Assertion failed at %s:%d.\n", __FILE__, __LINE__); exit(2); } \
+} while(0)
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+#define RARCH_SCALE_BASE 256
+
+static inline void rarch_sleep(unsigned msec)
+{
+#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)
+ sys_timer_usleep(1000 * msec);
+#elif defined(PSP)
+ sceKernelDelayThread(1000 * msec);
+#elif defined(_WIN32)
+ Sleep(msec);
+#elif defined(XENON)
+ udelay(1000 * msec);
+#elif defined(GEKKO) || defined(__PSL1GHT__) || defined(__QNX__)
+ usleep(1000 * msec);
+#else
+ struct timespec tv = {0};
+ tv.tv_sec = msec / 1000;
+ tv.tv_nsec = (msec % 1000) * 1000000;
+ nanosleep(&tv, NULL);
+#endif
+}
+
+static inline uint32_t next_pow2(uint32_t v)
+{
+ v--;
+ v |= v >> 1;
+ v |= v >> 2;
+ v |= v >> 4;
+ v |= v >> 8;
+ v |= v >> 16;
+ v++;
+ return v;
+}
+
+static inline uint32_t prev_pow2(uint32_t v)
+{
+ v |= v >> 1;
+ v |= v >> 2;
+ v |= v >> 4;
+ v |= v >> 8;
+ v |= v >> 16;
+ return v - (v >> 1);
+}
+
+static inline uint8_t is_little_endian(void)
+{
+ union
+ {
+ uint16_t x;
+ uint8_t y[2];
+ } u;
+
+ u.x = 1;
+ return u.y[0];
+}
+
+static inline uint32_t swap_if_big32(uint32_t val)
+{
+ if (is_little_endian()) // Little-endian
+ return val;
+ else
+ return (val >> 24) | ((val >> 8) & 0xFF00) | ((val << 8) & 0xFF0000) | (val << 24);
+}
+
+static inline uint32_t swap_if_little32(uint32_t val)
+{
+ if (is_little_endian())
+ return (val >> 24) | ((val >> 8) & 0xFF00) | ((val << 8) & 0xFF0000) | (val << 24);
+ else
+ return val;
+}
+
+static inline uint16_t swap_if_big16(uint16_t val)
+{
+ if (is_little_endian())
+ return val;
+ else
+ return (val >> 8) | (val << 8);
+}
+
+static inline uint16_t swap_if_little16(uint16_t val)
+{
+ if (is_little_endian())
+ return (val >> 8) | (val << 8);
+ else
+ return val;
+}
+
+// Helper macros and struct to keep track of many booleans.
+// To check for multiple bits, use &&, not &.
+// For OR, | can be used.
+typedef struct
+{
+ uint32_t data[8];
+} rarch_bits_t;
+
+#define BIT_SET(a, bit) ((a).data[(bit) >> 5] |= 1 << ((bit) & 31))
+#define BIT_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(1 << ((bit) & 31)))
+#define BIT_GET(a, bit) ((a).data[(bit) >> 5] & (1 << ((bit) & 31)))
+#define BIT_CLEAR_ALL(a) memset(&(a), 0, sizeof(a));
+
+#endif
diff --git a/retroarch_logger.h b/retroarch_logger.h
index b1e7309931..181475e2d9 100644
--- a/retroarch_logger.h
+++ b/retroarch_logger.h
@@ -23,8 +23,10 @@
#if defined(IS_SALAMANDER) || defined(RARCH_DUMMY_LOG)
#define LOG_FILE (stderr)
+#elif defined(HAVE_FILE_LOGGER)
+#define LOG_FILE (g_extern.log_file)
#else
-#define LOG_FILE (g_extern.log_file ? g_extern.log_file : stderr)
+#define LOG_FILE (stderr)
#endif
#if defined(RARCH_CONSOLE) && (defined(HAVE_LOGGER) || defined(_XBOX1))