SET, CLR, ISSET in types.h for _KERNEL builds
Bruce Evans
bde at zeta.org.au
Wed Jun 28 12:55:30 UTC 2006
On Wed, 28 Jun 2006, Poul-Henning Kamp wrote:
> In message <20060628094221.GA50978 at comp.chem.msu.su>, Yar Tikhiy writes:
>> On Tue, Jun 27, 2006 at 01:58:17PM -0600, M. Warner Losh wrote:
>
>>> NetBSD recently added SET, CLR, ISSET to sys/types.h (only if _KERNEL
>>> is defined).
I see no types here.
> As one of the people who have worked with the original /bin/sh source
> code, I have a slight alergic reaction to attempts to paste over
> the implementation language with macros like these.
>
> Setting a bit in 'C' is spelled
> variable |= bit;
> not
> SET(variable, bit);
Only slightly?
In FreeBSD, these mistakes were only in kern/tty.c and in some usb
files obtained from NetBSD and related to tty.c. In tty.c, they appear
to be just to avoid adding a USL copyright. (tty.c was obfuscated
between FreeBSD-1 and FreeBSD-2 by globally substituting "variable |=
BIT" by "SET(variable, BIT)", etc.) I noticed that NetBSD started
using these macros elsewhere many years ago. However, their use was
still relatively limited in NetBSD a year ago (in kern, they were only
in kern-fork.c (1), kern_subr.c (2), kern_systrace.c (many), sys_process.c
(a few), tty.c (many), tty_pty.c (many), vfs_bio.c (many) and vfs_lookup.c
(1); 211 lines altogether vs 1565 lines matching ' & ' and 27 lines
matching the style bug '[A-Za-z]&[A-Za-z]'). It must have been in
tty_pty.c that I noticed them many years ago.
> Higher order macros like roundup(), ispow2() are fine with me,
> because they implement something on top of the language and make
> the source code more compact and thus faster to read.
>
> But all of the three proposed macros take up more space than
> the native language they obfuscate, what is the sense in that ?
They might be to hide the implementation of a set of flags as a bitmap,
but they don't even do that.
Another problem with these macros is that a bitmap is more useful than
a set of flags, but a much larger and uglier set of macros would be
needed to give enough operations on bitmaps, and code that has been
blindly translated from an integer-bitmap operation still assumes that
the implementation is an integer-bitmap. E.g., in tty.c:
%%%
/*
* delayed suspend (^Y)
*/
if (CCEQ(cc[VDSUSP], c) &&
ISSET(lflag, IEXTEN | ISIG) == (IEXTEN | ISIG)) {
%%%
Bruce
More information about the freebsd-arch
mailing list