From cf20416aab78419f7e77891b7fc05cd91a955e7c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 6 Nov 2013 14:21:12 +0100 Subject: [PATCH] Make file_path.c more self-contained.h --- file.h | 111 +----------------------------------- file_path.c | 4 +- file_path.h | 127 ++++++++++++++++++++++++++++++++++++++++++ general.h | 117 +------------------------------------- miscellaneous.h | 136 +++++++++++++++++++++++++++++++++++++++++++++ retroarch_logger.h | 4 +- 6 files changed, 271 insertions(+), 228 deletions(-) create mode 100644 file_path.h create mode 100644 miscellaneous.h 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))