diff options
Diffstat (limited to 'src/dbinc/db_swap.h')
| -rw-r--r-- | src/dbinc/db_swap.h | 88 |
1 files changed, 74 insertions, 14 deletions
diff --git a/src/dbinc/db_swap.h b/src/dbinc/db_swap.h index 352ae227..06f4eb47 100644 --- a/src/dbinc/db_swap.h +++ b/src/dbinc/db_swap.h @@ -1,7 +1,7 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 2012 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015 Oracle and/or its affiliates. All rights reserved. */ /* * Copyright (c) 1990, 1993, 1994 @@ -51,15 +51,26 @@ extern "C" { #define M_64_SWAP(a) { \ u_int64_t _tmp; \ _tmp = (u_int64_t)a; \ - ((u_int8_t *)&a)[0] = ((u_int8_t *)&_tmp)[7]; \ - ((u_int8_t *)&a)[1] = ((u_int8_t *)&_tmp)[6]; \ - ((u_int8_t *)&a)[2] = ((u_int8_t *)&_tmp)[5]; \ - ((u_int8_t *)&a)[3] = ((u_int8_t *)&_tmp)[4]; \ - ((u_int8_t *)&a)[4] = ((u_int8_t *)&_tmp)[3]; \ - ((u_int8_t *)&a)[5] = ((u_int8_t *)&_tmp)[2]; \ - ((u_int8_t *)&a)[6] = ((u_int8_t *)&_tmp)[1]; \ - ((u_int8_t *)&a)[7] = ((u_int8_t *)&_tmp)[0]; \ + ((u_int8_t *)&(a))[0] = ((u_int8_t *)&_tmp)[7]; \ + ((u_int8_t *)&(a))[1] = ((u_int8_t *)&_tmp)[6]; \ + ((u_int8_t *)&(a))[2] = ((u_int8_t *)&_tmp)[5]; \ + ((u_int8_t *)&(a))[3] = ((u_int8_t *)&_tmp)[4]; \ + ((u_int8_t *)&(a))[4] = ((u_int8_t *)&_tmp)[3]; \ + ((u_int8_t *)&(a))[5] = ((u_int8_t *)&_tmp)[2]; \ + ((u_int8_t *)&(a))[6] = ((u_int8_t *)&_tmp)[1]; \ + ((u_int8_t *)&(a))[7] = ((u_int8_t *)&_tmp)[0]; \ } +#undef P_64_COPYSWAP +#define P_64_COPYSWAP(a, b) do { \ + ((u_int8_t *)b)[0] = ((u_int8_t *)a)[7]; \ + ((u_int8_t *)b)[1] = ((u_int8_t *)a)[6]; \ + ((u_int8_t *)b)[2] = ((u_int8_t *)a)[5]; \ + ((u_int8_t *)b)[3] = ((u_int8_t *)a)[4]; \ + ((u_int8_t *)b)[4] = ((u_int8_t *)a)[3]; \ + ((u_int8_t *)b)[5] = ((u_int8_t *)a)[2]; \ + ((u_int8_t *)b)[6] = ((u_int8_t *)a)[1]; \ + ((u_int8_t *)b)[7] = ((u_int8_t *)a)[0]; \ +} while (0) #undef P_64_COPY #define P_64_COPY(a, b) { \ ((u_int8_t *)b)[0] = ((u_int8_t *)a)[0]; \ @@ -113,7 +124,7 @@ extern "C" { P_32_COPYSWAP(&_tmp, a); \ } while (0) #undef M_32_SWAP -#define M_32_SWAP(a) P_32_SWAP(&a) +#define M_32_SWAP(a) P_32_SWAP(&(a)) /* * Little endian <==> big endian 16-bit swap macros. @@ -139,8 +150,13 @@ extern "C" { P_16_COPYSWAP(&_tmp, a); \ } while (0) #undef M_16_SWAP -#define M_16_SWAP(a) P_16_SWAP(&a) +#define M_16_SWAP(a) P_16_SWAP(&(a)) +#undef SWAP64 +#define SWAP64(p) { \ + P_64_SWAP(p); \ + (p) += sizeof(u_int64_t); \ +} #undef SWAP32 #define SWAP32(p) { \ P_32_SWAP(p); \ @@ -168,6 +184,25 @@ extern "C" { P_32_SWAP(p); \ } while (0) +#undef DB_NTOHLL_COPYIN +#define DB_NTOHLL_COPYIN(env, i, p) do { \ + u_int8_t *tmp; \ + tmp = (u_int8_t *)&(i); \ + if (F_ISSET(env, ENV_LITTLEENDIAN)) { \ + tmp[7] = *p++; \ + tmp[6] = *p++; \ + tmp[5] = *p++; \ + tmp[4] = *p++; \ + tmp[3] = *p++; \ + tmp[2] = *p++; \ + tmp[1] = *p++; \ + tmp[0] = *p++; \ + } else { \ + memcpy(&(i), p, sizeof(u_int64_t)); \ + p = (u_int8_t *)p + sizeof(u_int64_t); \ + } \ +} while (0) + #undef DB_NTOHL_COPYIN #define DB_NTOHL_COPYIN(env, i, p) do { \ u_int8_t *tmp; \ @@ -178,7 +213,7 @@ extern "C" { tmp[1] = *p++; \ tmp[0] = *p++; \ } else { \ - memcpy(&i, p, sizeof(u_int32_t)); \ + memcpy(&(i), p, sizeof(u_int32_t)); \ p = (u_int8_t *)p + sizeof(u_int32_t); \ } \ } while (0) @@ -191,11 +226,29 @@ extern "C" { tmp[1] = *p++; \ tmp[0] = *p++; \ } else { \ - memcpy(&i, p, sizeof(u_int16_t)); \ + memcpy(&(i), p, sizeof(u_int16_t)); \ p = (u_int8_t *)p + sizeof(u_int16_t); \ } \ } while (0) +#undef DB_HTONLL_COPYOUT +#define DB_HTONLL_COPYOUT(env, p, i) do { \ + u_int8_t *tmp; \ + tmp = (u_int8_t *)p; \ + if (F_ISSET(env, ENV_LITTLEENDIAN)) { \ + *tmp++ = ((u_int8_t *)&(i))[7]; \ + *tmp++ = ((u_int8_t *)&(i))[6]; \ + *tmp++ = ((u_int8_t *)&(i))[5]; \ + *tmp++ = ((u_int8_t *)&(i))[4]; \ + *tmp++ = ((u_int8_t *)&(i))[3]; \ + *tmp++ = ((u_int8_t *)&(i))[2]; \ + *tmp++ = ((u_int8_t *)&(i))[1]; \ + *tmp++ = ((u_int8_t *)&(i))[0]; \ + } else \ + memcpy(p, &(i), sizeof(u_int64_t)); \ + p = (u_int8_t *)p + sizeof(u_int64_t); \ +} while (0) + #undef DB_HTONL_COPYOUT #define DB_HTONL_COPYOUT(env, p, i) do { \ u_int8_t *tmp; \ @@ -206,7 +259,7 @@ extern "C" { *tmp++ = ((u_int8_t *)&(i))[1]; \ *tmp++ = ((u_int8_t *)&(i))[0]; \ } else \ - memcpy(p, &i, sizeof(u_int32_t)); \ + memcpy(p, &(i), sizeof(u_int32_t)); \ p = (u_int8_t *)p + sizeof(u_int32_t); \ } while (0) @@ -229,6 +282,13 @@ extern "C" { */ #define LOG_SWAPPED(env) !F_ISSET(env, ENV_LITTLEENDIAN) +#define LOGCOPY_64(env, x, p) do { \ + if (LOG_SWAPPED(env)) \ + P_64_COPYSWAP((p), (x)); \ + else \ + memcpy((x), (p), sizeof(u_int64_t)); \ +} while (0) + #define LOGCOPY_32(env, x, p) do { \ if (LOG_SWAPPED(env)) \ P_32_COPYSWAP((p), (x)); \ |
