db_byteorder.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:1k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: db_byteorder.c,v 11.8 2002/02/01 18:15:29 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #include "db_int.h"
  15. /*
  16.  * __db_isbigendian --
  17.  * Return 1 if big-endian (Motorola and Sparc), not little-endian
  18.  * (Intel and Vax).  We do this work at run-time, rather than at
  19.  * configuration time so cross-compilation and general embedded
  20.  * system support is simpler.
  21.  *
  22.  * PUBLIC: int __db_isbigendian __P((void));
  23.  */
  24. int
  25. __db_isbigendian()
  26. {
  27. union { /* From Harbison & Steele.  */
  28. long l;
  29. char c[sizeof(long)];
  30. } u;
  31. u.l = 1;
  32. return (u.c[sizeof(long) - 1] == 1);
  33. }
  34. /*
  35.  * __db_byteorder --
  36.  * Return if we need to do byte swapping, checking for illegal
  37.  * values.
  38.  *
  39.  * PUBLIC: int __db_byteorder __P((DB_ENV *, int));
  40.  */
  41. int
  42. __db_byteorder(dbenv, lorder)
  43. DB_ENV *dbenv;
  44. int lorder;
  45. {
  46. int is_bigendian;
  47. is_bigendian = __db_isbigendian();
  48. switch (lorder) {
  49. case 0:
  50. break;
  51. case 1234:
  52. if (is_bigendian)
  53. return (DB_SWAPBYTES);
  54. break;
  55. case 4321:
  56. if (!is_bigendian)
  57. return (DB_SWAPBYTES);
  58. break;
  59. default:
  60. __db_err(dbenv,
  61.     "unsupported byte order, only big and little-endian supported");
  62. return (EINVAL);
  63. }
  64. return (0);
  65. }