X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_fixups.h;h=46da6ae1267cc3a2b73a2b6fbdc75612c4d7e849;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=6088eb5a9fdf750ea9e1917032bceeeb2e5edd47;hpb=ff3ff3ee0f36513d18ac102f5359ac607771d791;p=vlc diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index 6088eb5a9f..46da6ae126 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -26,393 +26,147 @@ #ifndef LIBVLC_FIXUPS_H # define LIBVLC_FIXUPS_H 1 -#ifndef HAVE_STRDUP -# include -# include -static inline char *strdup (const char *str) -{ - size_t len = strlen (str) + 1; - char *res = (char *)malloc (len); - if (res) memcpy (res, str, len); - return res; -} +#if !defined (HAVE_GMTIME_R) || !defined (HAVE_LOCALTIME_R) +# include /* time_t */ #endif -#ifdef WIN32 -# include -# include -/** - * vlc_fix_format_string: - * @format: address of format string to fix (format string is not modified) - * - * Windows' printf doesn't support %z size modifiers. - * Fix a *printf format string to make it safe for mingw/MSVCRT run times: - * %z* (not supported in MSVCRT) -> either %I64* or %I32. - * - * Returns: 1 if *format must be free()d; 0 otherwise - */ -static inline int vlc_fix_format_string (const char **format) -{ - int n = 0; - const char *tmp = *format; - while ((tmp = strstr (tmp, "%z")) != NULL) - { - n++; - tmp += 2; - } - if (!n) - return 0; - - char *dst = (char*)malloc (strlen (*format) + 2*n + 1); - if (!dst) - { - *format = "vlc_fix_format_string: due to malloc failure, unable to fix unsafe string"; - return 0; - } - - const char *src = *format; - *format = dst; - while ((tmp = strstr (src, "%z")) != NULL) - { - /* NB, don't use %l*, as this is buggy in mingw*/ - size_t d = tmp - src; - memcpy (dst, src, d); - dst += d; - *dst++ = '%'; -# ifdef WIN64 - *dst++ = 'I'; - *dst++ = '6'; - *dst++ = '4'; -# else /* ie: WIN32 */ - /* on win32, since the default size is 32bit, dont specify - * a modifer. (I32 isn't on wince, l doesn't work on mingw) */ -# endif - src = tmp + 2; - } - strcpy (dst, src); - return 1; -} - -# include -# include - -static inline int vlc_vprintf (const char *format, va_list ap) -{ - int must_free = vlc_fix_format_string (&format); - int ret = vprintf (format, ap); - if (must_free) free ((char *)format); - return ret; -} -# define vprintf vlc_vprintf - -static inline int vlc_vfprintf (FILE *stream, const char *format, va_list ap) +#ifndef HAVE_LLDIV +typedef struct { - int must_free = vlc_fix_format_string (&format); - int ret = vfprintf (stream, format, ap); - if (must_free) free ((char *)format); - return ret; -} -# define vfprintf vlc_vfprintf + long long quot; /* Quotient. */ + long long rem; /* Remainder. */ +} lldiv_t; +#endif -static inline int vlc_vsprintf (char *str, const char *format, va_list ap) -{ - int must_free = vlc_fix_format_string (&format); - int ret = vsprintf (str, format, ap); - if (must_free) free ((char *)format); - return ret; -} -# define vsprintf vlc_vsprintf +#if !defined(HAVE_GETENV) || \ + !defined(HAVE_USELOCALE) +# include /* NULL */ +#endif -static inline int vlc_vsnprintf (char *str, size_t size, const char *format, va_list ap) -{ - int must_free = vlc_fix_format_string (&format); - /* traditionally, MSVCRT has provided vsnprintf as _vsnprintf; - * to 'aid' portability/standards compliance, mingw provides a - * static version of vsnprintf that is buggy. Be sure to use - * MSVCRT version, at least it behaves as expected */ - int ret = _vsnprintf (str, size, format, ap); - if (must_free) free ((char *)format); - return ret; -} -# define vsnprintf vlc_vsnprintf +#if !defined (HAVE_REWIND) || \ + !defined (HAVE_GETDELIM) +# include /* FILE */ +#endif -static inline int vlc_printf (const char *format, ...) -{ - va_list ap; - int ret; - va_start (ap, format); - ret = vlc_vprintf (format, ap); - va_end (ap); - return ret; -} -# define printf(...) vlc_printf(__VA_ARGS__) +#if !defined (HAVE_STRLCPY) || \ + !defined (HAVE_STRNDUP) || \ + !defined (HAVE_STRNLEN) || \ + !defined (HAVE_GETCWD) +# include /* size_t */ +#endif -static inline int vlc_fprintf (FILE *stream, const char *format, ...) -{ - va_list ap; - int ret; - va_start (ap, format); - ret = vlc_vfprintf (stream, format, ap); - va_end (ap); - return ret; -} -# define fprintf vlc_fprintf +#ifndef HAVE_VASPRINTF +# include /* va_list */ +#endif -#if 0 -static inline int vlc_sprintf (char *str, const char *format, ...) -{ - va_list ap; - int ret; - va_start (ap, format); - ret = vlc_vsprintf (str, format, ap); - va_end (ap); - return ret; -} -# define sprintf vlc_sprintf +#if !defined (HAVE_GETDELIM) || \ + !defined (HAVE_GETPID) || \ + !defined (HAVE_SWAB) +# include /* ssize_t, pid_t */ #endif -static inline int vlc_snprintf (char *str, size_t size, const char *format, ...) -{ - va_list ap; - int ret; - va_start (ap, format); - ret = vlc_vsnprintf (str, size, format, ap); - va_end (ap); - return ret; -} -/* win32: snprintf must always be vlc_snprintf or _snprintf, - * see comment in vlc_vsnprintf */ -# define snprintf vlc_snprintf +#ifdef __cplusplus +extern "C" { +#endif -/* Make sure we don't use flawed vasprintf or asprintf either */ -# undef HAVE_VASPRINTF -# undef HAVE_ASPRINTF +#ifndef HAVE_STRDUP +char *strdup (const char *); #endif #ifndef HAVE_VASPRINTF -# include -# include -# include -static inline int vasprintf (char **strp, const char *fmt, va_list ap) -{ -#ifndef UNDER_CE - int len = vsnprintf (NULL, 0, fmt, ap) + 1; - char *res = (char *)malloc (len); - if (res == NULL) - return -1; - *strp = res; - return vsnprintf (res, len, fmt, ap); -#else - /* HACK: vsnprintf in the WinCE API behaves like - * the one in glibc 2.0 and doesn't return the number of characters - * it needed to copy the string. - * cf http://msdn.microsoft.com/en-us/library/1kt27hek.aspx - * and cf the man page of vsnprintf - * - Guess we need no more than 50 bytes. */ - int n, size = 50; - char *res, *np; - - if ((res = (char *) malloc (size)) == NULL) - return -1; - - while (1) - { - n = vsnprintf (res, size, fmt, ap); - - /* If that worked, return the string. */ - if (n > -1 && n < size) - { - *strp = res; - return n; - } - - /* Else try again with more space. */ - size *= 2; /* twice the old size */ - - if ((np = (char *) realloc (res, size)) == NULL) - { - free(res); - return -1; - } - else - { - res = np; - } - - } -#endif /* UNDER_CE */ -} +int vasprintf (char **, const char *, va_list); #endif #ifndef HAVE_ASPRINTF -# include -# include -static inline int asprintf (char **strp, const char *fmt, ...) -{ - va_list ap; - int ret; - va_start (ap, fmt); - ret = vasprintf (strp, fmt, ap); - va_end (ap); - return ret; -} +int asprintf (char **, const char *, ...); #endif #ifndef HAVE_STRNLEN -# include -static inline size_t strnlen (const char *str, size_t max) -{ - const char *end = (const char *) memchr (str, 0, max); - return end ? (size_t)(end - str) : max; -} +size_t strnlen (const char *, size_t); #endif #ifndef HAVE_STRNDUP -# include -# include -static inline char *strndup (const char *str, size_t max) -{ - size_t len = strnlen (str, max); - char *res = (char *) malloc (len + 1); - if (res) - { - memcpy (res, str, len); - res[len] = '\0'; - } - return res; -} +char *strndup (const char *, size_t); #endif #ifndef HAVE_STRLCPY -# define strlcpy vlc_strlcpy +size_t strlcpy (char *, const char *, size_t); #endif #ifndef HAVE_STRTOF -# define strtof( a, b ) ((float)strtod (a, b)) +float strtof (const char *, char **); #endif #ifndef HAVE_ATOF -# define atof( str ) (strtod ((str), (char **)NULL, 10)) +double atof (const char *); #endif #ifndef HAVE_STRTOLL -# define strtoll vlc_strtoll +long long int strtoll (const char *, char **, int); #endif #ifndef HAVE_STRSEP -static inline char *strsep( char **ppsz_string, const char *psz_delimiters ) -{ - char *psz_string = *ppsz_string; - if( !psz_string ) - return NULL; - - char *p = strpbrk( psz_string, psz_delimiters ); - if( !p ) - { - *ppsz_string = NULL; - return psz_string; - } - *p++ = '\0'; - - *ppsz_string = p; - return psz_string; -} +char *strsep (char **, const char *); #endif #ifndef HAVE_ATOLL -# define atoll( str ) (strtoll ((str), (char **)NULL, 10)) +long long atoll (const char *); #endif #ifndef HAVE_LLDIV -typedef struct { - long long quot; /* Quotient. */ - long long rem; /* Remainder. */ -} lldiv_t; +lldiv_t lldiv (long long, long long); +#endif -static inline lldiv_t lldiv (long long numer, long long denom) -{ - lldiv_t d = { .quot = numer / denom, .rem = numer % denom }; - return d; -} +#ifndef HAVE_STRCASECMP +int strcasecmp (const char *, const char *); #endif -#ifndef HAVE_SCANDIR -# define scandir vlc_scandir -# define alphasort vlc_alphasort +#ifndef HAVE_STRNCASECMP +int strncasecmp (const char *, const char *, size_t); #endif -#ifndef HAVE_GETENV -static inline char *getenv (const char *name) -{ - (void)name; - return NULL; -} +#ifndef HAVE_STRCASESTR +char *strcasestr (const char *, const char *); #endif -#ifndef HAVE_STRCASECMP -# ifndef HAVE_STRICMP -# include -static inline int strcasecmp (const char *s1, const char *s2) -{ - for (size_t i = 0;; i++) - { - int d = tolower (s1[i]) - tolower (s2[i]); - if (d || !s1[i]) return d; - } - return 0; -} -# else -# define strcasecmp stricmp -# endif +#ifndef HAVE_GMTIME_R +struct tm *gmtime_r (const time_t *, struct tm *); #endif -#ifndef HAVE_STRNCASECMP -# ifndef HAVE_STRNICMP -# include -static inline int strncasecmp (const char *s1, const char *s2, size_t n) -{ - for (size_t i = 0; i < n; i++) - { - int d = tolower (s1[i]) - tolower (s2[i]); - if (d || !s1[i]) return d; - } - return 0; -} -# else -# define strncasecmp strnicmp -# endif +#ifndef HAVE_LOCALTIME_R +struct tm *localtime_r (const time_t *, struct tm *); #endif -#ifndef HAVE_STRCASESTR -# ifndef HAVE_STRISTR -# define strcasestr vlc_strcasestr -# else -# define strcasestr stristr -# endif +#ifndef HAVE_REWIND +void rewind (FILE *); #endif -#ifndef HAVE_LOCALTIME_R -/* If localtime_r() is not provided, we assume localtime() uses - * thread-specific storage. */ -# include -static inline struct tm *localtime_r (const time_t *timep, struct tm *result) -{ - struct tm *s = localtime (timep); - if (s == NULL) - return NULL; +#ifndef HAVE_GETCWD +char *getcwd (char *buf, size_t size); +#endif - *result = *s; - return result; -} -static inline struct tm *gmtime_r (const time_t *timep, struct tm *result) -{ - struct tm *s = gmtime (timep); - if (s == NULL) - return NULL; +#ifndef HAVE_GETDELIM +ssize_t getdelim (char **, size_t *, int, FILE *); +ssize_t getline (char **, size_t *, FILE *); +#endif + +#ifndef HAVE_GETPID +pid_t getpid (void); +#endif - *result = *s; - return result; +#ifndef HAVE_STRTOK_R +char *strtok_r(char *, const char *, char **); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#ifndef HAVE_GETENV +static inline char *getenv (const char *name) +{ + (void)name; + return NULL; } #endif @@ -424,35 +178,77 @@ static inline struct tm *gmtime_r (const time_t *timep, struct tm *result) #endif #ifndef HAVE_USELOCALE +#define LC_NUMERIC_MASK 0 +#define LC_MESSAGES_MASK 0 typedef void *locale_t; -# define newlocale( a, b, c ) ((locale_t)0) -# define uselocale( a ) ((locale_t)0) -# define freelocale( a ) (void)0 +static inline locale_t uselocale(locale_t loc) +{ + (void)loc; + return NULL; +} +static inline void freelocale(locale_t loc) +{ + (void)loc; +} +static inline locale_t newlocale(int mask, const char * locale, locale_t base) +{ + (void)mask; (void)locale; (void)base; + return NULL; +} #endif -#ifdef WIN32 -# include -# define opendir Use_utf8_opendir_or_vlc_wopendir_instead! -# define readdir Use_utf8_readdir_or_vlc_wreaddir_instead! -# define closedir vlc_wclosedir +/* libintl support */ +#define _(str) vlc_gettext (str) +#define N_(str) gettext_noop (str) +#define gettext_noop(str) (str) + +#ifndef HAVE_SWAB +void swab (const void *, void *, ssize_t); #endif -/* libintl support */ -#define _(str) vlc_gettext (str) +/* Socket stuff */ +#ifndef HAVE_INET_PTON +# define inet_pton vlc_inet_pton +#endif -#if defined (ENABLE_NLS) -# include +#ifndef HAVE_INET_NTOP +# define inet_ntop vlc_inet_ntop #endif -#define N_(str) gettext_noop (str) -#define gettext_noop(str) (str) +#ifndef HAVE_POLL +enum +{ + POLLIN=1, + POLLOUT=2, + POLLPRI=4, + POLLERR=8, // unsupported stub + POLLHUP=16, // unsupported stub + POLLNVAL=32 // unsupported stub +}; -#ifdef UNDER_CE -static inline void rewind ( FILE *stream ) +struct pollfd { - fseek(stream, 0L, SEEK_SET); - clearerr(stream); -} + int fd; + unsigned events; + unsigned revents; +}; + +# define poll(a, b, c) vlc_poll(a, b, c) +#elif defined (HAVE_MAEMO) +# include +# define poll(a, b, c) vlc_poll(a, b, c) +int vlc_poll (struct pollfd *, unsigned, int); +#endif + +#ifndef HAVE_TDESTROY +# define tdestroy vlc_tdestroy +#endif + +/* Random numbers */ +#ifndef HAVE_NRAND48 +double erand48 (unsigned short subi[3]); +long jrand48 (unsigned short subi[3]); +long nrand48 (unsigned short subi[3]); #endif #endif /* !LIBVLC_FIXUPS_H */