2217a37e5b
git-svn-id: svn://kolibrios.org@3960 a494cfbc-eb01-0410-851d-a64ba20cac60
179 lines
5.1 KiB
C
179 lines
5.1 KiB
C
/*
|
|
compat: Some compatibility functions and header inclusions.
|
|
Basic standard C stuff, that may barely be above/around C89.
|
|
|
|
The mpg123 code is determined to keep it's legacy. A legacy of old, old UNIX.
|
|
It is envisioned to include this compat header instead of any of the "standard" headers, to catch compatibility issues.
|
|
So, don't include stdlib.h or string.h ... include compat.h.
|
|
|
|
copyright 2007-8 by the mpg123 project - free software under the terms of the LGPL 2.1
|
|
see COPYING and AUTHORS files in distribution or http://mpg123.org
|
|
initially written by Thomas Orgis
|
|
*/
|
|
|
|
#ifndef MPG123_COMPAT_H
|
|
#define MPG123_COMPAT_H
|
|
|
|
#include "config.h"
|
|
#include "intsym.h"
|
|
|
|
#ifdef HAVE_STDLIB_H
|
|
/* realloc, size_t */
|
|
#include <stdlib.h>
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
|
|
#ifdef HAVE_SIGNAL_H
|
|
#include <signal.h>
|
|
#else
|
|
#ifdef HAVE_SYS_SIGNAL_H
|
|
#include <sys/signal.h>
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
/* Types, types, types. */
|
|
/* Do we actually need these two in addition to sys/types.h? As replacement? */
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_INTTYPES_H
|
|
#include <inttypes.h>
|
|
#endif
|
|
#ifdef HAVE_STDINT_H
|
|
#include <stdint.h>
|
|
#endif
|
|
/* We want SIZE_MAX, etc. */
|
|
#ifdef HAVE_LIMITS_H
|
|
#include <limits.h>
|
|
#endif
|
|
|
|
#ifndef SIZE_MAX
|
|
#define SIZE_MAX ((size_t)-1)
|
|
#endif
|
|
#ifndef ULONG_MAX
|
|
#define ULONG_MAX ((unsigned long)-1)
|
|
#endif
|
|
|
|
#ifdef HAVE_STRING_H
|
|
#include <string.h>
|
|
#endif
|
|
|
|
#ifdef OS2
|
|
#include <float.h>
|
|
#endif
|
|
|
|
#ifdef HAVE_SYS_TIME_H
|
|
#include <sys/time.h>
|
|
#endif
|
|
/* For select(), I need select.h according to POSIX 2001, else: sys/time.h sys/types.h unistd.h */
|
|
#ifdef HAVE_SYS_SELECT_H
|
|
#include <sys/select.h>
|
|
#endif
|
|
|
|
/* To parse big numbers... */
|
|
#ifdef HAVE_ATOLL
|
|
#define atobigint atoll
|
|
#else
|
|
#define atobigint atol
|
|
#endif
|
|
|
|
typedef unsigned char byte;
|
|
|
|
/* A safe realloc also for very old systems where realloc(NULL, size) returns NULL. */
|
|
void *safe_realloc(void *ptr, size_t size);
|
|
#ifndef HAVE_STRERROR
|
|
const char *strerror(int errnum);
|
|
#endif
|
|
|
|
#ifndef HAVE_STRDUP
|
|
char *strdup(const char *s);
|
|
#endif
|
|
|
|
/* If we have the size checks enabled, try to derive some sane printfs.
|
|
Simple start: Use max integer type and format if long is not big enough.
|
|
I am hesitating to use %ll without making sure that it's there... */
|
|
#if !(defined PLAIN_C89) && (defined SIZEOF_OFF_T) && (SIZEOF_OFF_T > SIZEOF_LONG) && (defined PRIiMAX)
|
|
# define OFF_P PRIiMAX
|
|
typedef intmax_t off_p;
|
|
#else
|
|
# define OFF_P "li"
|
|
typedef long off_p;
|
|
#endif
|
|
|
|
#if !(defined PLAIN_C89) && (defined SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > SIZEOF_LONG) && (defined PRIuMAX)
|
|
# define SIZE_P PRIuMAX
|
|
typedef uintmax_t size_p;
|
|
#else
|
|
# define SIZE_P "lu"
|
|
typedef unsigned long size_p;
|
|
#endif
|
|
|
|
#if !(defined PLAIN_C89) && (defined SIZEOF_SSIZE_T) && (SIZEOF_SSIZE_T > SIZEOF_LONG) && (defined PRIiMAX)
|
|
# define SSIZE_P PRIuMAX
|
|
typedef intmax_t ssize_p;
|
|
#else
|
|
# define SSIZE_P "li"
|
|
typedef long ssize_p;
|
|
#endif
|
|
|
|
/**
|
|
* Opening a file handle can be different.
|
|
* This function here is defined to take a path in native encoding (ISO8859 / UTF-8 / ...), or, when MS Windows Unicode support is enabled, an UTF-8 string that will be converted back to native UCS-2 (wide character) before calling the system's open function.
|
|
* @param[in] wptr Pointer to wide string.
|
|
* @param[in] mbptr Pointer to multibyte string.
|
|
* @return file descriptor (>=0) or error code.
|
|
*/
|
|
int compat_open(const char *filename, int flags);
|
|
|
|
/**
|
|
* Closing a file handle can be platform specific.
|
|
* This function takes a file descriptor that is to be closed.
|
|
* @param[in] infd File descriptor to be closed.
|
|
* @return 0 if the file was successfully closed. A return value of -1 indicates an error.
|
|
*/
|
|
int compat_close(int infd);
|
|
|
|
/* Those do make sense in a separate file, but I chose to include them in compat.c because that's the one source whose object is shared between mpg123 and libmpg123 -- and both need the functionality internally. */
|
|
|
|
#ifdef WANT_WIN32_UNICODE
|
|
/**
|
|
* win32_uni2mbc
|
|
* Converts a null terminated UCS-2 string to a multibyte (UTF-8) equivalent.
|
|
* Caller is supposed to free allocated buffer.
|
|
* @param[in] wptr Pointer to wide string.
|
|
* @param[out] mbptr Pointer to multibyte string.
|
|
* @param[out] buflen Optional parameter for length of allocated buffer.
|
|
* @return status of WideCharToMultiByte conversion.
|
|
*
|
|
* WideCharToMultiByte - http://msdn.microsoft.com/en-us/library/dd374130(VS.85).aspx
|
|
*/
|
|
int win32_wide_utf8(const wchar_t * const wptr, char **mbptr, size_t * buflen);
|
|
|
|
/**
|
|
* win32_mbc2uni
|
|
* Converts a null terminated UTF-8 string to a UCS-2 equivalent.
|
|
* Caller is supposed to free allocated buffer.
|
|
* @param[out] mbptr Pointer to multibyte string.
|
|
* @param[in] wptr Pointer to wide string.
|
|
* @param[out] buflen Optional parameter for length of allocated buffer.
|
|
* @return status of WideCharToMultiByte conversion.
|
|
*
|
|
* MultiByteToWideChar - http://msdn.microsoft.com/en-us/library/dd319072(VS.85).aspx
|
|
*/
|
|
|
|
int win32_utf8_wide(const char *const mbptr, wchar_t **wptr, size_t *buflen);
|
|
#endif
|
|
|
|
/* That one comes from Tellie on OS/2, needed in resolver. */
|
|
#ifdef __KLIBC__
|
|
typedef int socklen_t;
|
|
#endif
|
|
|
|
#endif
|