marshall.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- c++ -*-
  2.    marshall.h
  3.    $Id: marshall.h,v 1.4 1999/04/30 00:59:43 haldar Exp $
  4.    safely marshall and unmarshall 2 and 4 byte quantities into 
  5.    possibly unaligned feilds
  6.    NOTE: unlike the normal version of marshall, we marshall the bytes
  7.    in *HOST*BYTE*ORDER* and *not* network byte order.  we do this since
  8.    all the other quanities in the packets will be in host byte order, and
  9.    we want consistency.
  10.    */
  11. #ifndef _cmu_marshall_h_
  12. #define _cmu_marshall_h_
  13. /*#ifdef sparc  */
  14. /*#define GET4BYTE(x) (  (*(((unsigned char *)(x))  ) << 24) 
  15.   | (*(((unsigned char *)(x))+1) << 16) 
  16.   | (*(((unsigned char *)(x))+2) << 8) 
  17.   | (*(((unsigned char *)(x))+3)     ))
  18.   */
  19. /* #define GET2BYTE(x) (  (*(((unsigned char *)(x))  ) << 8) 
  20.    | (*(((unsigned char *)(x))+1)     ))
  21.    */
  22. /* let x,y be ptrs to ints, copy *x into *y */
  23. /* #define STORE4BYTE(x,y) (((unsigned char *)y)[0] = ((unsigned char *)x)[0] ,
  24.    ((unsigned char *)y)[1] = ((unsigned char *)x)[1] ,
  25.    ((unsigned char *)y)[2] = ((unsigned char *)x)[2] ,
  26.    ((unsigned char *)y)[3] = ((unsigned char *)x)[3] )
  27.    */
  28. /* #define STORE2BYTE(x,y) (((unsigned char *)y)[0] = ((unsigned char *)x)[0] ,
  29.    ((unsigned char *)y)[1] = ((unsigned char *)x)[1] )
  30.    */
  31.   /*#else
  32.     
  33.     #include <sys/types.h>
  34.     
  35.     #define GET4BYTE(x) *((u_int32_t*) (x))
  36.     
  37.     #define GET2BYTE(x) *((u_int16_t*) (x)) */
  38.   
  39.   /* let x,y be ptrs to ints, copy *x into *y */
  40.   /*#define STORE4BYTE(x,y) (*((u_int32_t*) (x)) = *y)
  41.     
  42.     #define STORE2BYTE(x,y) (*((u_int16_t*) (x)) = *y)
  43.     
  44.     #endif */
  45. /* changing STORE4BYTE and STORE2BYTE functions as they break in 
  46.    freeBSD; the old cmu version of STORE4BYTE used arrays to set the 
  47.    value: 
  48.    #define STORE4BYTE(x,y) (((unsigned char *)y)[0] = ((unsigned char *)x)[0] ,
  49.    ((unsigned char *)y)[1] = ((unsigned char *)x)[1] ,
  50.    ((unsigned char *)y)[2] = ((unsigned char *)x)[2] ,
  51.    ((unsigned char *)y)[3] = ((unsigned char *)x)[3] )
  52.    which doesn;t work on freeBSD (with gcc version 2.7.2.1).
  53.    the newer versions are tested to work in sunos/solaris/freeBSD  
  54.    --Padma, 04/99 */
  55. #define STORE4BYTE(x,y)  ((*((unsigned char *)y)) = ((*x) >> 24) & 255 ,
  56.   (*((unsigned char *)y+1)) = ((*x) >> 16) & 255 ,
  57.   (*((unsigned char *)y+2)) = ((*x) >> 8) & 255 ,
  58.   (*((unsigned char *)y+3)) = (*x) & 255 )
  59. #define STORE2BYTE(x,y)  ((*((unsigned char *)y)) = ((*x) >> 8) & 255 ,
  60.   (*((unsigned char *)y+1)) = (*x) & 255 )
  61. #define GET2BYTE(x)      (((*(unsigned char *)(x)) << 8) |
  62.   (*(((unsigned char *)(x))+1)))
  63. #define GET4BYTE(x)      (((*(unsigned char *)(x)) << 24) |
  64.   (*(((unsigned char *)(x))+1) << 16) |
  65.   (*(((unsigned char *)(x))+2) << 8) |
  66.   (*(((unsigned char *)(x))+3)))
  67. #endif /* _cmu_marshall_h_ */