X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=include%2Fvlc_fixups.h;h=726bb9e2e02a2ecb335df69bbbbc68dd43855272;hb=12dd5ea5617f78ad80764d9aef2fffd870a318cb;hp=4e7a8ae12f93ab7e2612eccc5716c84ddd745c0b;hpb=bb29acd2f25176a70759862417b99b8cbd082e2d;p=vlc diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index 4e7a8ae12f..726bb9e2e0 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -27,49 +27,164 @@ # define LIBVLC_FIXUPS_H 1 #ifndef HAVE_STRDUP -# define strdup vlc_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; +} #endif #ifndef HAVE_VASPRINTF -# define vasprintf vlc_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. */ + if (n == -1) + size *= 2; /* twice the old size */ + + if ((np = (char *) realloc (res, size)) == NULL) + { + free(res); + return -1; + } + else + { + res = np; + } + + } +#endif /* UNDER_CE */ +} #endif #ifndef HAVE_ASPRINTF -# define asprintf vlc_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; +} #endif -#ifndef HAVE_STRNDUP -# define strndup vlc_strndup +#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; +} #endif -#ifndef HAVE_STRNLEN -# define strnlen vlc_strnlen +#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; +} #endif #ifndef HAVE_STRLCPY # define strlcpy vlc_strlcpy #endif -#ifndef HAVE_ATOF -# define atof vlc_atof -#endif - #ifndef HAVE_STRTOF -# ifdef HAVE_STRTOD -# define strtof( a, b ) ((float)strtod (a, b)) -# endif +# define strtof( a, b ) ((float)strtod (a, b)) #endif -#ifndef HAVE_ATOLL -# define atoll vlc_atoll +#ifndef HAVE_ATOF +# define atof( str ) (strtod ((str), (char **)NULL, 10)) #endif #ifndef HAVE_STRTOLL # define strtoll vlc_strtoll #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; +} +#endif + +#ifndef HAVE_ATOLL +# define atoll( str ) (strtoll ((str), (char **)NULL, 10)) +#endif + #ifndef HAVE_LLDIV -# define lldiv vlc_lldiv +typedef struct { + long long quot; /* Quotient. */ + long long rem; /* Remainder. */ +} lldiv_t; + +static inline lldiv_t lldiv (long long numer, long long denom) +{ + lldiv_t d = { .quot = numer / denom, .rem = numer % denom }; + return d; +} #endif #ifndef HAVE_SCANDIR @@ -78,12 +193,25 @@ #endif #ifndef HAVE_GETENV -# define getenv vlc_getenv +static inline char *getenv (const char *name) +{ + (void)name; + return NULL; +} #endif #ifndef HAVE_STRCASECMP # ifndef HAVE_STRICMP -# define strcasecmp vlc_strcasecmp +# 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 @@ -91,7 +219,16 @@ #ifndef HAVE_STRNCASECMP # ifndef HAVE_STRNICMP -# define strncasecmp vlc_strncasecmp +# 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 @@ -129,6 +266,13 @@ static inline struct tm *gmtime_r (const time_t *timep, struct tm *result) } #endif +/* Alignment of critical static data structures */ +#ifdef ATTRIBUTE_ALIGNED_MAX +# define ATTR_ALIGN(align) __attribute__ ((__aligned__ ((ATTRIBUTE_ALIGNED_MAX < align) ? ATTRIBUTE_ALIGNED_MAX : align))) +#else +# define ATTR_ALIGN(align) +#endif + #ifndef HAVE_USELOCALE typedef void *locale_t; # define newlocale( a, b, c ) ((locale_t)0) @@ -137,6 +281,7 @@ typedef void *locale_t; #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 @@ -147,11 +292,17 @@ typedef void *locale_t; #if defined (ENABLE_NLS) # include -#else -# define dgettext(dom, str) ((char *)(str)) #endif #define N_(str) gettext_noop (str) #define gettext_noop(str) (str) +#ifdef UNDER_CE +static inline void rewind ( FILE *stream ) +{ + fseek(stream, 0L, SEEK_SET); + clearerr(stream); +} +#endif + #endif /* !LIBVLC_FIXUPS_H */