1/* 2 * Platform-dependent stuff for ckutils 3 */ 4 5#ifndef _CKU_PLATFORM_H_ 6#define _CKU_PLATFORM_H_ 7 8#include <string.h> 9#include <stdlib.h> 10 11/* use this for linux compatibility testing */ 12//#define linux 1 13/* end linux test */ 14 15/* 16 * Make sure endianness is defined... 17 */ 18#if !defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) 19 #if macintosh 20 #define __BIG_ENDIAN__ 1 21 #elif defined(i386) || defined(i486) || defined(__i386__) || defined(__i486__) 22 #define __LITTLE_ENDIAN__ 1 23 #else 24 #error Platform dependent work needed 25 #endif 26#endif /* endian */ 27 28#ifdef NeXT 29 #import <libc.h> 30 #define SRAND(x) srandom(x) 31 #define RAND() random() 32#else NeXT 33 /* 34 * Use stdlib only 35 */ 36 #define SRAND(x) srand(x) 37 #define RAND() rand() 38 #define bcopy(s, d, l) memmove(d, s, l) 39 #define bzero(s, l) memset(s, 0, l) 40 #define bcmp(s, d, l) memcmp(s, d, l) 41#endif 42 43#ifdef CK_NT_C_ONLY 44 45/* 46 * Standard I/O redirects for WINNT. 47 */ 48#define open(f, b, c) _open(f, b, c) 49#define close(f) _close(f) 50#define read(f, b, c) _read(f, b, c) 51#define write(f, b, c) _write(f, b, c) 52#define fstat(f, b) _fstat(f, b) 53 54#define O_RDONLY _O_RDONLY 55#define O_WRONLY _O_WRONLY 56#define O_CREAT _O_CREAT 57#define O_TRUNC _O_TRUNC 58 59#endif CK_NT_C_ONLY 60 61/* 62 * Platform-dependent timestamp stuff. For now we assume that each platform 63 * has some kind of struct which maintains a high-resolution clock and 64 * a function which fills that struct with the current time. 65 */ 66#if macintosh 67 68 #include <Timer.h> 69 70 #define PLAT_TIME UnsignedWide 71 #define PLAT_GET_TIME(pt) Microseconds(&pt) 72 #define PLAT_GET_US(start,end) (end.lo - start.lo) 73 74#elif linux 75 76 #include <sys/time.h> 77 78 #define PLAT_TIME struct timeval 79 #define PLAT_GET_TIME(pt) gettimeofday(&pt, NULL) 80 #define PLAT_GET_US(start,end) \ 81 ( ( ( (end.tv_sec & 0xff) * 1000000) + end.tv_usec) - \ 82 ( ( (start.tv_sec & 0xff) * 1000000) + start.tv_usec) ) 83 84#elif NeXT 85 86 #include <kern/time_stamp.h> 87 88 #define PLAT_TIME struct tsval 89 #define PLAT_GET_TIME(pt) kern_timestamp(&pt) 90 #define PLAT_GET_US(start,end) (end.low_val - start.low_val) 91 92 93#elif defined(__MACH__) && defined(__APPLE__) 94 #include <CoreFoundation/CoreFoundation.h> 95 /* time as a double */ 96 #define PLAT_TIME CFAbsoluteTime 97 #define PLAT_GET_TIME(pt) pt = CFAbsoluteTimeGetCurrent() 98 #define PLAT_GET_US(start,end) \ 99 ((end - start) * 1000000.0) 100 #define PLAT_GET_NS(start,end) \ 101 ((end - start) * 1000000000.0) 102#else 103 #error Platform dependent work needed 104#endif 105 106#endif /* _CKU_PLATFORM_H_ */ 107