1 /* General purpose, i.e. non SoX specific, utility functions and macros. 2 * 3 * (c) 2006-8 Chris Bagwell and SoX contributors 4 * 5 * This library is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU Lesser General Public License as published by 7 * the Free Software Foundation; either version 2.1 of the License, or (at 8 * your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with this library; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20 #include <stdio.h> 21 #include <stdlib.h> 22 #include <inttypes.h> 23 #include "soxconfig.h" 24 25 #ifdef HAVE_SYS_TYPES_H 26 #include <sys/types.h> /* For off_t not found in stdio.h */ 27 #endif 28 29 #ifdef HAVE_SYS_STAT_H 30 #include <sys/stat.h> /* Needs to be included before we redefine off_t. */ 31 #endif 32 33 #include "xmalloc.h" 34 35 /*---------------------------- Portability stuff -----------------------------*/ 36 37 #ifdef __GNUC__ 38 #define NORET __attribute__((noreturn)) 39 #define UNUSED __attribute__ ((unused)) 40 #else 41 #define NORET 42 #define UNUSED 43 #endif 44 45 #ifdef _MSC_VER 46 47 #define __STDC__ 1 48 #define O_BINARY _O_BINARY 49 #define O_CREAT _O_CREAT 50 #define O_RDWR _O_RDWR 51 #define O_TRUNC _O_TRUNC 52 #define S_IFMT _S_IFMT 53 #define S_IFREG _S_IFREG 54 #define S_IREAD _S_IREAD 55 #define S_IWRITE _S_IWRITE 56 #define close _close 57 #define dup _dup 58 #define fdopen _fdopen 59 #define fileno _fileno 60 61 #ifdef _fstati64 62 #define fstat _fstati64 63 #else 64 #define fstat _fstat 65 #endif 66 67 #define ftime _ftime 68 #define inline __inline 69 #define isatty _isatty 70 #define kbhit _kbhit 71 #define mktemp _mktemp 72 #define off_t _off_t 73 #define open _open 74 #define pclose _pclose 75 #define popen _popen 76 #define setmode _setmode 77 #define snprintf _snprintf 78 79 #ifdef _stati64 80 #define stat _stati64 81 #else 82 #define stat _stat 83 #endif 84 85 #define strdup _strdup 86 #define timeb _timeb 87 #define unlink _unlink 88 89 #if defined(HAVE__FSEEKI64) && !defined(HAVE_FSEEKO) 90 #undef off_t 91 #define fseeko _fseeki64 92 #define ftello _ftelli64 93 #define off_t __int64 94 #define HAVE_FSEEKO 1 95 #endif 96 97 #elif defined(__MINGW32__) 98 99 #if !defined(HAVE_FSEEKO) 100 #undef off_t 101 #define fseeko fseeko64 102 #define fstat _fstati64 103 #define ftello ftello64 104 #define off_t off64_t 105 #define stat _stati64 106 #define HAVE_FSEEKO 1 107 #endif 108 109 #endif 110 111 #if defined(DOS) || defined(WIN32) || defined(__NT__) || defined(__DJGPP__) || defined(__OS2__) 112 #define LAST_SLASH(path) max(strrchr(path, '/'), strrchr(path, '\\')) 113 #define IS_ABSOLUTE(path) ((path)[0] == '/' || (path)[0] == '\\' || (path)[1] == ':') 114 #define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) 115 #define POPEN_MODE "rb" 116 #else 117 #define LAST_SLASH(path) strrchr(path, '/') 118 #define IS_ABSOLUTE(path) ((path)[0] == '/') 119 #define SET_BINARY_MODE(file) 120 #endif 121 122 #ifdef WORDS_BIGENDIAN 123 #define MACHINE_IS_BIGENDIAN 1 124 #define MACHINE_IS_LITTLEENDIAN 0 125 #else 126 #define MACHINE_IS_BIGENDIAN 0 127 #define MACHINE_IS_LITTLEENDIAN 1 128 #endif 129 130 /*--------------------------- Language extensions ----------------------------*/ 131 132 /* Compile-time ("static") assertion */ 133 /* e.g. assert_static(sizeof(int) >= 4, int_type_too_small) */ 134 #define assert_static(e,f) enum {assert_static__##f = 1/(e)} 135 #define array_length(a) (sizeof(a)/sizeof(a[0])) 136 #define field_offset(type, field) ((size_t)&(((type *)0)->field)) 137 #define unless(x) if (!(x)) 138 139 /*------------------------------- Maths stuff --------------------------------*/ 140 141 #include <math.h> 142 143 #ifdef min 144 #undef min 145 #endif 146 #define min(a, b) ((a) <= (b) ? (a) : (b)) 147 148 #ifdef max 149 #undef max 150 #endif 151 #define max(a, b) ((a) >= (b) ? (a) : (b)) 152 153 #define range_limit(x, lower, upper) (min(max(x, lower), upper)) 154 155 #ifndef M_PI 156 #define M_PI 3.14159265358979323846 157 #endif 158 #ifndef M_PI_2 159 #define M_PI_2 1.57079632679489661923 /* pi/2 */ 160 #endif 161 #ifndef M_LN10 162 #define M_LN10 2.30258509299404568402 /* natural log of 10 */ 163 #endif 164 #ifndef M_SQRT2 165 #define M_SQRT2 sqrt(2.) 166 #endif 167 168 #define sqr(a) ((a) * (a)) 169 #define sign(x) ((x) < 0? -1 : 1) 170 171 /* Numerical Recipes in C, p. 284 */ 172 #define ranqd1(x) ((x) = 1664525L * (x) + 1013904223L) /* int32_t x */ 173 #define dranqd1(x) (ranqd1(x) * (1. / (65536. * 32768.))) /* [-1,1) */ 174 175 #define dB_to_linear(x) exp((x) * M_LN10 * 0.05) 176 #define linear_to_dB(x) (log10(x) * 20) 177 178 extern int lsx_strcasecmp(const char *s1, const char *st); 179 extern int lsx_strncasecmp(char const *s1, char const *s2, size_t n); 180 181 #ifndef HAVE_STRCASECMP 182 #define strcasecmp(s1, s2) lsx_strcasecmp((s1), (s2)) 183 #define strncasecmp(s1, s2, n) lsx_strncasecmp((s1), (s2), (n)) 184 #endif 185