Files
m241Neelima/vxworks-6.9/target/h/wrn/wm/common/fldmacro.h
T
2026-07-30 11:19:44 +05:30

96 lines
2.9 KiB
C

/* $Header: /usr/cvsroot/target/h/wrn/wm/common/fldmacro.h,v 1.2 2003/01/16 18:20:12 josh Exp $ */
/*
* Copyright (C) 1999-2005 Wind River Systems, Inc.
* All rights reserved. Provided under license only.
* Distribution or other use of this software is only
* permitted pursuant to the terms of a license agreement
* from Wind River Systems (and is otherwise prohibited).
* Refer to that license agreement for terms of use.
*/
/****************************************************************************
* Copyright 2000-2001 Wind River Systems, Inc.
* Copyright 1998 Integrated Systems, Inc.
* All rights reserved.
****************************************************************************/
/*
* $Log: fldmacro.h,v $
* Revision 1.2 2003/01/16 18:20:12 josh
* directory structure shifting
*
* Revision 1.1.1.1 2001/11/05 17:47:18 tneale
* Tornado shuffle
*
* Revision 1.4 2001/01/19 22:21:27 paul
* Update copyright.
*
* Revision 1.3 2000/03/17 00:16:37 meister
* Update copyright message
*
* Revision 1.2 1998/12/15 05:45:58 sra
* Get new NI interface code working on pSOS/X86.
*
* Revision 1.1 1998/12/09 21:48:44 sra
* Initial revision.
*
*/
/* [clearcase]
modification history
-------------------
01a,20apr05,job update copyright notices
*/
#ifndef COMMON_FLDMACRO_H
#define COMMON_FLDMACRO_H
/*
* Primative macros to get and set bitfields in an array of integers.
* Should work for either signed or unsigned integers, which means that
* these macros have to be very careful about right-shift operations.
*
* Parameters:
*
* _a_: "array" (name of array)
* _i_: "index" (offset into array)
* _w_: "width" (width in bits of the field)
* _p_: "position" (bit offset of field)
* _n_: "new_value" (replacement value, for sets)
*
* Macros:
*
* FLD_MSK() Construct mask _w_ bits wide, left shifted _p_ bits
* FLD_GET() Extract field to right justified value
* FLD_SET() Replace field content with right-justified value
*
* I would have preferred the index-and-mask mechanism we used back
* when all real programmers rode dinosaurs (bareback), because the
* masks are easier to sight-read than this position-and-width values,
* but the mask stuff is just too horrid when coded for the ANSI C
* preprocessor. I miss MIDAS....
*
* These macros are intended primarily for use with IPC mechanisms like
* pSOS message queues. For network packets, see the layout directory.
*/
#define FLD_MAX_WIDTH 32
#define FLD_MSK(_w_, _p_) ((~((~0UL) << (_w_))) << (_p_))
#define FLD_GET(_m_, _i_, _w_, _p_) \
(((_w_) == FLD_MAX_WIDTH) \
? ((_m_)[_i_]) \
: ((((_m_)[_i_]) >> (_p_)) & FLD_MSK(_w_, 0)))
#define FLD_SET(_m_, _i_, _w_, _p_, _n_) \
(((_m_)[_i_]) = (((_w_) == FLD_MAX_WIDTH) \
? (_n_) \
: ((((_m_)[_i_]) & ~FLD_MSK(_w_, _p_)) | \
(((_n_) & FLD_MSK(_w_, 0)) << (_p_)))))
#endif /* COMMON_FLDMACRO_H */