From a6c4f2646fda50e5661acdb8739d1b54ddb38ede Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 10 Nov 2012 16:19:53 +0100 Subject: mp_common.h: split parts into mp_talloc.h and compiler.h Put MP_EXPAND_ARGS() in compiler.h, even though it's not compiler dependent. Both mp_talloc.h and mp_common.h need it, while mp_common.h includes mp_talloc.h. This is the least annoying solution. --- compat/compiler.h | 24 ++++++++++++++++++++++++ core/mp_common.h | 52 +++------------------------------------------------- core/mp_talloc.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ talloc.h | 2 +- 4 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 compat/compiler.h create mode 100644 core/mp_talloc.h diff --git a/compat/compiler.h b/compat/compiler.h new file mode 100644 index 0000000000..c929573dd1 --- /dev/null +++ b/compat/compiler.h @@ -0,0 +1,24 @@ +#ifndef MPV_COMPILER_H +#define MPV_COMPILER_H + +#define MP_EXPAND_ARGS(...) __VA_ARGS__ + +#ifdef __GNUC__ + +/** Use gcc attribute to check printf fns. a1 is the 1-based index of + * the parameter containing the format, and a2 the index of the first + * argument. **/ +#ifdef __MINGW32__ +// MinGW maps "printf" to the non-standard MSVCRT functions, even if +// __USE_MINGW_ANSI_STDIO is defined and set to 1. We need to use "gnu_printf", +// which isn't necessarily available on other GCC compatible compilers. +#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (gnu_printf, a1, a2))) +#else +#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (printf, a1, a2))) +#endif + +#else +#define PRINTF_ATTRIBUTE(a1, a2) +#endif + +#endif diff --git a/core/mp_common.h b/core/mp_common.h index 119f11fb3b..4abbe70caf 100644 --- a/core/mp_common.h +++ b/core/mp_common.h @@ -22,60 +22,14 @@ #include #include +#include "compat/compiler.h" +#include "core/mp_talloc.h" + // both int64_t and double should be able to represent this exactly #define MP_NOPTS_VALUE (-1LL<<63) #define ROUND(x) ((int)((x) < 0 ? (x) - 0.5 : (x) + 0.5)) -#define MP_EXPAND_ARGS(...) __VA_ARGS__ - -#define MP_TALLOC_ELEMS(p) (talloc_get_size(p) / sizeof((p)[0])) -#define MP_GROW_ARRAY(p, nextidx) do { \ - if ((nextidx) == MP_TALLOC_ELEMS(p)) \ - p = talloc_realloc_size(NULL, p, talloc_get_size(p) * 2); } while (0) -#define MP_RESIZE_ARRAY(ctx, p, count) do { \ - p = talloc_realloc_size((ctx), p, (count) * sizeof(p[0])); } while (0) - - -#define MP_TARRAY_GROW(ctx, p, nextidx) \ - do { \ - size_t nextidx_ = (nextidx); \ - size_t nelems_ = MP_TALLOC_ELEMS(p); \ - if (nextidx_ >= nelems_) \ - p = talloc_realloc_size((ctx), p, \ - (nextidx_ + 1) * sizeof((p)[0]) * 2);\ - } while (0) - -#define MP_TARRAY_APPEND(ctx, p, idxvar, ...) \ - do { \ - MP_TARRAY_GROW(ctx, p, idxvar); \ - p[idxvar] = (MP_EXPAND_ARGS(__VA_ARGS__)); \ - idxvar++; \ - } while (0) - -#define talloc_struct(ctx, type, ...) \ - talloc_memdup(ctx, &(type) MP_EXPAND_ARGS(__VA_ARGS__), sizeof(type)) - -#ifdef __GNUC__ - -/** Use gcc attribute to check printf fns. a1 is the 1-based index of - * the parameter containing the format, and a2 the index of the first - * argument. **/ -#ifdef __MINGW32__ -// MinGW maps "printf" to the non-standard MSVCRT functions, even if -// __USE_MINGW_ANSI_STDIO is defined and set to 1. We need to use "gnu_printf", -// which isn't necessarily available on other GCC compatible compilers. -#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (gnu_printf, a1, a2))) -#else -#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (printf, a1, a2))) -#endif - -#else - -#define PRINTF_ATTRIBUTE(a1, a2) - -#endif - extern const char *mplayer_version; char *mp_format_time(double time, bool fractions); diff --git a/core/mp_talloc.h b/core/mp_talloc.h new file mode 100644 index 0000000000..ff2b808125 --- /dev/null +++ b/core/mp_talloc.h @@ -0,0 +1,51 @@ +/* + * This file is part of mpv. + * + * mpv 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. + * + * mpv 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 mpv; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPV_TALLOC_H +#define MPV_TALLOC_H + +#include "talloc.h" +#include "compat/compiler.h" + +#define MP_TALLOC_ELEMS(p) (talloc_get_size(p) / sizeof((p)[0])) +#define MP_GROW_ARRAY(p, nextidx) do { \ + if ((nextidx) == MP_TALLOC_ELEMS(p)) \ + p = talloc_realloc_size(NULL, p, talloc_get_size(p) * 2); } while (0) +#define MP_RESIZE_ARRAY(ctx, p, count) do { \ + p = talloc_realloc_size((ctx), p, (count) * sizeof(p[0])); } while (0) + +#define MP_TARRAY_GROW(ctx, p, nextidx) \ + do { \ + size_t nextidx_ = (nextidx); \ + size_t nelems_ = MP_TALLOC_ELEMS(p); \ + if (nextidx_ >= nelems_) \ + p = talloc_realloc_size((ctx), p, \ + (nextidx_ + 1) * sizeof((p)[0]) * 2);\ + } while (0) + +#define MP_TARRAY_APPEND(ctx, p, idxvar, ...) \ + do { \ + MP_TARRAY_GROW(ctx, p, idxvar); \ + p[idxvar] = (MP_EXPAND_ARGS(__VA_ARGS__)); \ + idxvar++; \ + } while (0) + +#define talloc_struct(ctx, type, ...) \ + talloc_memdup(ctx, &(type) MP_EXPAND_ARGS(__VA_ARGS__), sizeof(type)) + +#endif diff --git a/talloc.h b/talloc.h index bb6bd43287..0581bd09c5 100644 --- a/talloc.h +++ b/talloc.h @@ -29,7 +29,7 @@ #include #include -#include "core/mp_common.h" +#include "compat/compiler.h" /* HACK: libsmbclient uses dynamically linked libtalloc.so which has * identically named symbols. This name collision caused a crash under -- cgit v1.2.3