]> git.saurik.com Git - wxWidgets.git/blame - utils/Install/incace/portable.h
wxUniversal fixes:
[wxWidgets.git] / utils / Install / incace / portable.h
CommitLineData
f6bcfd97
BP
1/****************************************************************/
2/* */
3/* A collection of routines used in making ACE portable for */
4/* different computers */
5/* */
6/****************************************************************/
7
8#ifndef __portable_h
9#define __portable_h
10
11#include "os.h"
12
13#ifdef HI_LO_BYTE_ORDER
14
15/* All kinds of inplace swap routines, to reverse from LOHI to HILO byte order */
16
17#ifdef AMIGA
18
19#if __SASC && __VERSION__>=6 && __REVISION__>=58
20
21#define WORDswap(n) (*(n) = __builtin_rol(*(n), 8, 1))
22#define LONGswap(n) ( WORDswap(&((WORD *)(n))[0]),\
23 WORDswap(&((WORD *)(n))[1]),\
24 *(n) = __builtin_rol(*(n), 16, 2) )
25#else /* __SASC */
26
27#define EORSWAP
28
29#endif /* !__SASC */
30
31#endif /* AMIGA */
32
33
34#ifdef EORSWAP
35
36/* With some compilers and processors these work faster then the
37 * regular swap below, for example on a Amiga 68040 using SAS C 6.58.
38 * But using builtin rotates works even faster, see above.
39 */
40
41#define WORDswap(n) (((BYTE*)(n))[0] ^= ((BYTE*)(n))[1],\
42 ((BYTE*)(n))[1] ^= ((BYTE*)(n))[0],\
43 ((BYTE*)(n))[0] ^= ((BYTE*)(n))[1])
44#define LONGswap(n) (((BYTE*)(n))[0] ^= ((BYTE*)(n))[3],\
45 ((BYTE*)(n))[3] ^= ((BYTE*)(n))[0],\
46 ((BYTE*)(n))[0] ^= ((BYTE*)(n))[3],\
47 ((BYTE*)(n))[1] ^= ((BYTE*)(n))[2],\
48 ((BYTE*)(n))[2] ^= ((BYTE*)(n))[1],\
49 ((BYTE*)(n))[1] ^= ((BYTE*)(n))[2])
50#endif /* EORSWAP */
51
52#ifndef WORDswap
53
54/* If not yet defined use the standard swaps */
55
56#define WORDswap(n) (*(n) = (*(n) << 8) | (*(n) >> 8))
57#define LONGswap(n) ( WORDswap(&((WORD *)(n))[0]),\
58 WORDswap(&((WORD *)(n))[1]),\
59 *(n) = (*(n) >> 16) | (*(n) << 16) )
60#endif /* WORDSWAP */
61
62#endif /* HI_LO_BYTE_ORDER */
63
64
65/* GENERIC: Convert to LONG or WORD from BYTE-Pointer-to-LOHI-byte-order data,
66 * without worrying if the bytes are word alined in memory.
67 * p is a pointer to char.
68 */
69
70#ifdef HI_LO_BYTE_ORDER
71
72#define BUFP2WORD(p) ((UWORD)*(p)++ | ((*(p)++)<<8))
73#define BUFP2LONG(p) ((ULONG)*(p)++ | ((*(p)++)<<8) | ((*(p)++)<<16) | ((*(p)++)<<24))
74
75#define BUF2WORD(p) ((UWORD)*(p) | (*((p)+1)<<8))
76#define BUF2LONG(p) ((ULONG)*(p) | (*((p)+1)<<8) | (*((p)+2)<<16) | (*((p)+3)<<24))
77
78#else /* HI_LO_BYTE_ORDER */
79
80#define BUFP2WORD(p) *(UWORD*)((p+=2)-2)
81#define BUFP2LONG(p) *(ULONG*)((p+=4)-4)
82
83#define BUF2WORD(p) (*(UWORD*)p)
84#define BUF2LONG(p) (*(ULONG*)p)
85
86#endif /* !HI_LO_BYTE_ORDER */
87
88/* Timestamp macros */
89
90#define get_tx(m,d,h,n) (((ULONG)m<<21)+((ULONG)d<<16)+((ULONG)h<<11)+(n<<5))
91#define get_tstamp(y,m,d,h,n,s) ((((ULONG)(y-1980))<<25)+get_tx(m,d,h,n)+(s/2))
92
93#define ts_year(ts) ((UINT)((ts >> 25) & 0x7f) + 1980)
94#define ts_month(ts) ((UINT)(ts >> 21) & 0x0f) // 1..12 means Jan..Dec
95#define ts_day(ts) ((UINT)(ts >> 16) & 0x1f) // 1..31 means 1st..31st
96#define ts_hour(ts) ((UINT)(ts >> 11) & 0x1f)
97#define ts_min(ts) ((UINT)(ts >> 5) & 0x3f)
98#define ts_sec(ts) ((UINT)((ts & 0x1f) * 2))
99
100
101#endif /* __portable_h */