Date: Wed, 2 Jan 2002 09:41:00 +0100 (CET) From: Harti Brandt <brandt@fokus.gmd.de> To: Marcel Moolenaar <marcel@xcllnt.net> Cc: cvs-all@FreeBSD.ORG, <cvs-committers@FreeBSD.ORG> Subject: Re: cvs commit: src/share/man/man3 queue.3 Message-ID: <20020102093537.X1528-100000@beagle.fokus.gmd.de> In-Reply-To: <20011231190126.A755@dhcp01.pn.xcllnt.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 31 Dec 2001, Marcel Moolenaar wrote:
MM>On Mon, Dec 31, 2001 at 05:14:08PM -0800, Julian Elischer wrote:
MM>>
MM>> > I'd consider this a misuse of _FOREACH, because the something that's
MM>> > being done is definitely not done for each p. Even some_test_on() is
MM>> > not performed on each p. I'm with phk here.
MM>> >
MM>> > Note that if it's simply too easy to use _FOREACH in these cases, we
MM>> > may want to consider creating a more suitable abstraction, like:
MM>> >
MM>> > TAILQ_UNTIL(p, &list, p_next)
MM>> > some_test_on(p);
MM>> > if (p == 0)
MM>> > return ENOTFOUND;
MM>> > /* do something */
MM>> > return 0;
MM>> >
MM>> > Just a thought.
MM>>
MM>> So you think that the final value of p should be undefined,
MM>> and there is no built in way to see if there were any elements in the
MM>> list at all or whether we completed the list?
MM>
MM>Theoretically speaking, yes.
MM>
MM>> I'm just documenting what the code does, and how people have used it.
MM>
MM>I understand that and didn't really object to that.
MM>
MM>> if you think that phk is correct we should add an example to the man page
MM>> showing:
MM>>
MM>>
MM>> TAILQ_FOREACH(p, &list, p_next)
MM>> if (some_test_on(p))
MM>> goto fred;
MM>> goto jim;
MM>> fred: print ("we got one");
MM>> jim:
MM>
MM>What's wrong with the following if _FOREACH is preferred:
MM>
MM> TAILQ_FOREACH(p, &list, p_next) {
MM> if (some_test_on(p)) {
MM> /* Do something */
MM> break; /* optional */
MM> }
MM> }
This makes things harder to read if /* Do something */ is longer than a
screen. Well, I think, that relying on the pointer beeing NULL if running
to the end of the list just perfectly mirrors the usual C-idiom:
for (i = 0; i < n; i++)
if (test(i))
break;
if (i == n)
...
The TAILQ_UNTIL(...) would even more obscure things...
harti
--
harti brandt, http://www.fokus.gmd.de/research/cc/cats/employees/hartmut.brandt/private
brandt@fokus.gmd.de
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020102093537.X1528-100000>
