xlhtml/cole/support.h

261 lines
7.5 KiB
C

/*
Support - Provides some big and little endian abstraction functions.
Copyright (C) 1999 Roberto Arturo Tena Sanchez
This program 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.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
Arturo Tena <arturo@directmail.org>
*/
/*
Some code was from Caolan, but I have replaced all the code,
now all code here is mine, so I changed copyright announce in cole-1.0.0.
Arturo Tena
*/
#ifndef COLE_SUPPORT_H
#define COLE_SUPPORT_H
#ifdef __cplusplus
extern "C" {
#endif
#include <ctype.h>
#include <stdio.h>
#include "config.h"
#if defined(WIN32)
#define SIZEOF_FLOAT 4
#define SIZEOF_DOUBLE 8
#define SIZEOF_UNSIGNED_CHAR 1
#define SIZEOF_UNSIGNED_SHORT 2
#define SIZEOF_UNSIGNED_LONG 4
/* compile time checks for good measure */
#define COMPILE_TIME_CHECK(tag,expr) \
typedef char tag##_CHECK[ (expr) ? 1 : -1 ]
COMPILE_TIME_CHECK( FLOAT, sizeof(float) == SIZEOF_FLOAT );
COMPILE_TIME_CHECK( DOUBLE, sizeof(double) == SIZEOF_DOUBLE );
COMPILE_TIME_CHECK( CHAR, sizeof(char) == SIZEOF_UNSIGNED_CHAR );
COMPILE_TIME_CHECK( SHORT, sizeof(short) == SIZEOF_UNSIGNED_SHORT );
COMPILE_TIME_CHECK( LONG, sizeof(long) == SIZEOF_UNSIGNED_LONG );
#endif
/* F32 */
#if SIZEOF_FLOAT == 4
#define F32 float
#elif SIZEOF_DOUBLE == 4
#define F32 double
#elif SIZEOF_LONG_DOUBLE == 4
#define F32 long double
#else
#error No 4 byte length float type found.
#endif
/* F64 */
#if SIZEOF_DOUBLE == 8
#define F64 double
#elif SIZEOF_LONG_DOUBLE == 8
#define F64 long double
#else
#error No 8 byte length float type found.
#endif
/* U8 */
#if SIZEOF_UNSIGNED_CHAR == 1
#define U8 unsigned char
#else
#error No 1 byte length type found.
#error Char is not a byte! Mmmh... maybe you need another compiler.
#endif
/* U16 */
#if SIZEOF_UNSIGNED_INT == 2
#define U16 unsigned int
#elif SIZEOF_UNSIGNED_SHORT == 2
#define U16 unsigned short
#elif SIZEOF_UNSIGNED_LONG == 2
#define U16 unsigned long
#else
#error No 2 byte length type found.
#endif
/* S16 */
#if SIZEOF_UNSIGNED_INT == 2
#define S16 signed int
#elif SIZEOF_UNSIGNED_SHORT == 2
#define S16 signed short
#elif SIZEOF_UNSIGNED_LONG == 2
#define S16 signed long
#else
#error No 2 byte length type found.
#endif
/* U32 */
#if SIZEOF_UNSIGNED_LONG == 4
#define U32 unsigned long
#elif SIZEOF_UNSIGNED_INT == 4
#define U32 unsigned int
#elif SIZEOF_UNSIGNED_LONG_LONG == 4
#define U32 unsigned long long
#else
#error No 4 byte length type found.
#endif
/* S32 */
#if SIZEOF_UNSIGNED_LONG == 4
#define S32 signed long
#elif SIZEOF_UNSIGNED_INT == 4
#define S32 signed int
#elif SIZEOF_UNSIGNED_LONG_LONG == 4
#define S32 signed long long
#else
#error No 4 byte length type found.
#endif
U16 fil_sreadU16 (U8 * in);
U32 fil_sreadU32 (U8 * in);
F64 fil_sreadF64 (U8 * in);
void fil_swriteU16 (U8 * dest, U16 * src);
void fil_swriteU32 (U8 * dest, U32 * src);
void __cole_dump (void *_m, void *_start, int length, char *msg);
#define verbose_return() \
{ \
verbose_wonl ("returning from "); \
verbose_wonl (__FILE__); \
verbose_wonl (":"); \
verbose_d (__LINE__); \
}
#define test(t,retval) \
{ \
if (!(t)) \
{ \
verbose_return (); \
return retval; \
} \
}
#define test_exitf(t,retval,func) \
{ \
if (!(t)) \
{ \
func; \
verbose_return (); \
return (retval); \
} \
}
#define test_call(t,typeretval) \
{ \
typeretval retval; \
retval = (t); \
if (retval) \
{ \
verbose_return () \
return (retval); \
} \
}
#define test_call_exitf(t,typeretval,func) \
{ \
typeretval retval; \
retval = (t); \
if (retval) \
{ \
func; \
verbose_return () \
return (retval); \
} \
}
#define report_bug(prog) \
{ \
fprintf (stderr, #prog": A bug have been found: %s:%d\n"#prog \
":Please, download a most recent version and try again\n", \
__FILE__, __LINE__); \
}
#define assert_return(prog,t,retval) \
{ \
if (!(t)) \
{ \
fprintf (stderr, #prog": Condition "#t" is not valid: %s:%d\n", \
__FILE__, __LINE__); \
report_bug (prog); \
return (retval); \
} \
}
#ifdef VERBOSE
#define verbose_d(n) { printf ("%d\n", n); }
#define verbose(s) { puts(s); }
#define verbose_wonl(s) { printf (s); }
#define verboseU8(expr) { printf (#expr " = 0x%02x\n", expr); }
#define verboseU16(expr) { printf (#expr " = 0x%04x\n", expr); }
#define verboseU32(expr) { printf (#expr " = 0x%08x\n", expr); }
#define verboseS(expr) { printf (#expr " = %s\n", expr); }
#define verboseS_wonl(expr) { printf (#expr " = %s", expr); }
#define warning(t) { if (!(t)) printf ("warning: %s is false\n", #t); }
#else /* ifndef VERBOSE */
#define verbose_d(n) ;
#define verbose(s) ;
#define verbose_wonl(s) ;
#define verboseU8(expr) ;
#define verboseU16(expr) ;
#define verboseU32(expr) ;
#define verboseS(expr)
#define verboseS_wonl(expr)
#define warning(t)
#endif /* ifdef VERBOSE */
#ifdef VERBOSE
#define verboseU32Array(array,len) \
{ \
U32 temp; \
for (temp = 0; temp < len; temp++) \
printf (#array "[%lu] = 0x%08lx\n", temp, array [temp]); \
}
#else
#define verboseU32Array(array,len)
#endif
#define verboseU8Array_force(rec,len,reclen) \
__cole_dump ((rec), (rec), ((len)*(reclen)), "");
#ifdef VERBOSE
#define verboseU8Array(rec,len,reclen) verboseU8Array_force(rec,len,reclen)
#else
#define verboseU8Array(rec,len,reclen)
#endif
#ifdef __cplusplus
}
#endif
#endif /* COLE_SUPPORT_H */