db_swap.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. /*
  8.  * Copyright (c) 1990, 1993, 1994
  9.  * The Regents of the University of California.  All rights reserved.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  * 1. Redistributions of source code must retain the above copyright
  15.  *    notice, this list of conditions and the following disclaimer.
  16.  * 2. Redistributions in binary form must reproduce the above copyright
  17.  *    notice, this list of conditions and the following disclaimer in the
  18.  *    documentation and/or other materials provided with the distribution.
  19.  * 3. Neither the name of the University nor the names of its contributors
  20.  *    may be used to endorse or promote products derived from this software
  21.  *    without specific prior written permission.
  22.  *
  23.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  *
  35.  * $Id: db_swap.h,v 11.5 2000/03/28 16:14:36 bostic Exp $
  36.  */
  37. #ifndef _DB_SWAP_H_
  38. #define _DB_SWAP_H_
  39. /*
  40.  * Little endian <==> big endian 32-bit swap macros.
  41.  * M_32_SWAP swap a memory location
  42.  * P_32_COPY copy potentially unaligned 4 byte quantities
  43.  * P_32_SWAP swap a referenced memory location
  44.  */
  45. #define M_32_SWAP(a) {
  46. u_int32_t _tmp;
  47. _tmp = a;
  48. ((u_int8_t *)&a)[0] = ((u_int8_t *)&_tmp)[3];
  49. ((u_int8_t *)&a)[1] = ((u_int8_t *)&_tmp)[2];
  50. ((u_int8_t *)&a)[2] = ((u_int8_t *)&_tmp)[1];
  51. ((u_int8_t *)&a)[3] = ((u_int8_t *)&_tmp)[0];
  52. }
  53. #define P_32_COPY(a, b) {
  54. ((u_int8_t *)b)[0] = ((u_int8_t *)a)[0];
  55. ((u_int8_t *)b)[1] = ((u_int8_t *)a)[1];
  56. ((u_int8_t *)b)[2] = ((u_int8_t *)a)[2];
  57. ((u_int8_t *)b)[3] = ((u_int8_t *)a)[3];
  58. }
  59. #define P_32_SWAP(a) {
  60. u_int32_t _tmp;
  61. P_32_COPY(a, &_tmp);
  62. ((u_int8_t *)a)[0] = ((u_int8_t *)&_tmp)[3];
  63. ((u_int8_t *)a)[1] = ((u_int8_t *)&_tmp)[2];
  64. ((u_int8_t *)a)[2] = ((u_int8_t *)&_tmp)[1];
  65. ((u_int8_t *)a)[3] = ((u_int8_t *)&_tmp)[0];
  66. }
  67. /*
  68.  * Little endian <==> big endian 16-bit swap macros.
  69.  * M_16_SWAP swap a memory location
  70.  * P_16_COPY copy potentially unaligned 2 byte quantities
  71.  * P_16_SWAP swap a referenced memory location
  72.  */
  73. #define M_16_SWAP(a) {
  74. u_int16_t _tmp;
  75. _tmp = (u_int16_t)a;
  76. ((u_int8_t *)&a)[0] = ((u_int8_t *)&_tmp)[1];
  77. ((u_int8_t *)&a)[1] = ((u_int8_t *)&_tmp)[0];
  78. }
  79. #define P_16_COPY(a, b) {
  80. ((u_int8_t *)b)[0] = ((u_int8_t *)a)[0];
  81. ((u_int8_t *)b)[1] = ((u_int8_t *)a)[1];
  82. }
  83. #define P_16_SWAP(a) {
  84. u_int16_t _tmp;
  85. P_16_COPY(a, &_tmp);
  86. ((u_int8_t *)a)[0] = ((u_int8_t *)&_tmp)[1];
  87. ((u_int8_t *)a)[1] = ((u_int8_t *)&_tmp)[0];
  88. }
  89. #define SWAP32(p) {
  90. P_32_SWAP(p);
  91. (p) += sizeof(u_int32_t);
  92. }
  93. #define SWAP16(p) {
  94. P_16_SWAP(p);
  95. (p) += sizeof(u_int16_t);
  96. }
  97. /*
  98.  * DB has local versions of htonl() and ntohl() that only operate on pointers
  99.  * to the right size memory locations, the portability magic for finding the
  100.  * real ones isn't worth the effort.
  101.  */
  102. #if defined(WORDS_BIGENDIAN)
  103. #define DB_HTONL(p)
  104. #define DB_NTOHL(p)
  105. #else
  106. #define DB_HTONL(p) P_32_SWAP(p)
  107. #define DB_NTOHL(p) P_32_SWAP(p)
  108. #endif
  109. #endif /* !_DB_SWAP_H_ */