Subject: Re: typeof (Re: CVS commit: src)
To: None <tech-kern@NetBSD.org, tech-userlevel@NetBSD.org>
From: David Young <dyoung@pobox.com>
List: tech-kern
Date: 09/03/2006 16:59:06
On Sat, Sep 02, 2006 at 02:32:03PM +0200, Joerg Sonnenberger wrote:
> On Sat, Sep 02, 2006 at 01:40:01AM -0500, David Young wrote:
> > On Sat, Sep 02, 2006 at 12:09:19AM +0100, David Laight wrote:
> > > On Fri, Sep 01, 2006 at 09:01:06AM +0900, YAMAMOTO Takashi wrote:
> > > > >
> > > > > Make the __BIT and __BITS macros "widthless," as best I can, by
> > > > > changing their type to uintmax_t from uint32_t. XXX The manual
> > > > > page lags this change by a bit.
> > > > >
> > > > > Define __PRIxBIT and __PRIxBITS printf(3) format strings.
> > > >
> > > > is it ok to use typeof here?
> > >
> > > Almost certainly not since the header files gets built into tools.
> >
> > Please suggest an alternative.
>
> Take a look at math.h, esp. __fpmacro_unary_floating.
__fpmacro_unary_floating copes with different-sized arguments, but that is
a different problem than the one I need to solve. I want for the "return"
type of __BIT() and/or __SHIFTOUT()/__SHIFTIN() to change depending on
the width of the mask. I've tried this macro, but it always evaluates
to a uintmax_t, which is about what I'd expect:
#define __CAST(__x, __v) \
((sizeof(__x) < sizeof(uintmax_t)) \
? ((sizeof(__x) < sizeof(uint64_t)) \
? ((sizeof(__x) < sizeof(uint32_t)) \
? ((sizeof(__x) < sizeof(uint16_t)) \
? (uint8_t)(__v) \
: (uint16_t)(__v)) \
: (uint32_t)(__v)) \
: (uint64_t)(__v)) \
: (uintmax_t)(__v))
Dave
--
David Young OJC Technologies
dyoung@ojctech.com Urbana, IL * (217) 278-3933