Re: [PATCH] circleq.3, list.3, slist.3, stailq.3, tailq.3: Improve readability, especially in SYNOPSIS

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



BTW, I didn't reorder the descriptions to match the groups.
I wasn't sure about what to do,
so I prefered to leave them for now.

On 1/4/21 11:45 PM, Alejandro Colomar wrote:
> - Group macros by kinds.
> - Align so that it's easiest to distinguish differences
>   between related macros.
> - Fix minor typos.
> - Remove redundant text ('The macro xxx() ...'):
>   The first paragraph already says that these are macros.
> - Fit lines into 78 columns.
> 
> I noticed a bug which should be fixed next:
> CIRCLEQ_LOOP_*() return a 'struct TYPE *'.
> 
> Signed-off-by: Alejandro Colomar <alx.manpages@xxxxxxxxx>
> ---
> 
> Hi Michael,
> 
> Here's my attempt of making queue.3 pages more readable.
> I think it's quite nicer now.
> But please, review it, because I may have introduced a few bugs
> while moving the text around.
> Also, if you feel something could be nicer, please tell me.
> 
> BTW, it's been the first time I use Vim for something not trivial,
> and I quite liked it.
> I think I'll stop using Gedit for a while :-)
> 
> Cheers,
> 
> Alex
> 
>  man3/circleq.3 |  77 +++++++++++++----------------------
>  man3/list.3    |  59 ++++++++++++---------------
>  man3/slist.3   |  58 ++++++++++++---------------
>  man3/stailq.3  |  76 +++++++++++++++--------------------
>  man3/tailq.3   | 106 +++++++++++++++++++++----------------------------
>  5 files changed, 154 insertions(+), 222 deletions(-)
> 
> diff --git a/man3/circleq.3 b/man3/circleq.3
> index 49c7bad66..97f290cbd 100644
> --- a/man3/circleq.3
> +++ b/man3/circleq.3
> @@ -54,43 +54,39 @@ CIRCLEQ_REMOVE
>  .nf
>  .B #include <sys/queue.h>
>  .PP
> -.BI "int CIRCLEQ_EMPTY(CIRCLEQ_HEAD *" head ");"
> -.PP
>  .B CIRCLEQ_ENTRY(TYPE);
>  .PP
> -.BI "struct TYPE *CIRCLEQ_FIRST(CIRCLEQ_HEAD *" head ");"
> -.PP
> -.BI "CIRCLEQ_FOREACH(struct TYPE *" var ", CIRCLEQ_HEAD *" head ,
> -.BI "                CIRCLEQ_ENTRY " NAME ");"
> -.BI "CIRCLEQ_FOREACH_REVERSE(struct TYPE *" var ", CIRCLEQ_HEAD *" head ","
> -.BI "                CIRCLEQ_ENTRY " NAME ");"
> -.PP
>  .B CIRCLEQ_HEAD(HEADNAME, TYPE);
> -.BI "CIRCLEQ_HEAD CIRCLEQ_HEAD_INITIALIZER(CIRCLEQ_HEAD " head ");"
> -.BI "void CIRCLEQ_INIT(CIRCLEQ_HEAD *" head ");"
> -.PP
> -.BI "void CIRCLEQ_INSERT_AFTER(CIRCLEQ_HEAD *" head ", struct TYPE *" listelm ,
> -.BI "                struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME ");"
> -.BI "void CIRCLEQ_INSERT_BEFORE(CIRCLEQ_HEAD *" head ", struct TYPE *" listelm ,
> -.BI "                struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME ");"
> +.BI "CIRCLEQ_HEAD CIRCLEQ_HEAD_INITIALIZER(CIRCLEQ_HEAD " head );
> +.BI "void CIRCLEQ_INIT(CIRCLEQ_HEAD *" head );
>  .PP
> -.BI "void CIRCLEQ_INSERT_HEAD(CIRCLEQ_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                CIRCLEQ_ENTRY " NAME ");"
> -.BI "void CIRCLEQ_INSERT_TAIL(CIRCLEQ_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                CIRCLEQ_ENTRY " NAME ");"
> +.BI "int CIRCLEQ_EMPTY(CIRCLEQ_HEAD *" head );
>  .PP
> -.BI "struct TYPE *CIRCLEQ_LAST(CIRCLEQ_HEAD *" head ");"
> +.BI "void CIRCLEQ_INSERT_HEAD(CIRCLEQ_HEAD *" head ,
> +.BI "                           struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
> +.BI "void CIRCLEQ_INSERT_TAIL(CIRCLEQ_HEAD *" head ,
> +.BI "                           struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
> +.BI "void CIRCLEQ_INSERT_BEFORE(CIRCLEQ_HEAD *" head ", struct TYPE *" listelm ,
> +.BI "                           struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
> +.BI "void CIRCLEQ_INSERT_AFTER(CIRCLEQ_HEAD *" head ", struct TYPE *" listelm ,
> +.BI "                           struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
>  .PP
> -.BI "void CIRCLEQ_LOOP_NEXT(CIRCLEQ_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                CIRCLEQ_ENTRY " NAME ");"
> -.BI "void CIRCLEQ_LOOP_PREV(CIRCLEQ_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                CIRCLEQ_ENTRY " NAME ");"
> +.BI "struct TYPE *CIRCLEQ_FIRST(CIRCLEQ_HEAD *" head );
> +.BI "struct TYPE *CIRCLEQ_LAST(CIRCLEQ_HEAD *" head );
> +.BI "struct TYPE *CIRCLEQ_PREV(struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
> +.BI "struct TYPE *CIRCLEQ_NEXT(struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
> +.BI "void CIRCLEQ_LOOP_PREV(CIRCLEQ_HEAD *" head ,
> +.BI "                           struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
> +.BI "void CIRCLEQ_LOOP_NEXT(CIRCLEQ_HEAD *" head ,
> +.BI "                           struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
>  .PP
> -.BI "struct TYPE *CIRCLEQ_NEXT(struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME ");"
> -.BI "struct TYPE *CIRCLEQ_PREV(struct TYPE *" elm ", CIRCLEQ_ENTRY " NAME ");"
> +.BI "CIRCLEQ_FOREACH(struct TYPE *" var ", CIRCLEQ_HEAD *" head ,
> +.BI "                        CIRCLEQ_ENTRY " NAME );
> +.BI "CIRCLEQ_FOREACH_REVERSE(struct TYPE *" var ", CIRCLEQ_HEAD *" head ,
> +.BI "                        CIRCLEQ_ENTRY " NAME );
>  .PP
>  .BI "void CIRCLEQ_REMOVE(CIRCLEQ_HEAD *" head ", struct TYPE *" elm ,
> -.BI "                CIRCLEQ_ENTRY " NAME ");"
> +.BI "                    CIRCLEQ_ENTRY " NAME );
>  .fi
>  .SH DESCRIPTION
>  These macros define and operate on doubly linked circular queues.
> @@ -148,25 +144,20 @@ and
>  .I headp
>  are user selectable.)
>  .PP
> -The macro
>  .BR CIRCLEQ_HEAD_INITIALIZER ()
>  evaluates to an initializer for the circular queue
>  .IR head .
>  .PP
> -The macro
>  .BR CIRCLEQ_EMPTY ()
>  evaluates to true if there are no items on the circular queue.
>  .PP
> -The macro
>  .BR CIRCLEQ_ENTRY ()
>  declares a structure that connects the elements in
>  the circular queue.
>  .PP
> -The macro
>  .BR CIRCLEQ_FIRST ()
>  returns the first item on the circular queue.
>  .PP
> -The macro
>  .BR CIRCLEQ_FOREACH ()
>  traverses the circular queue referenced by
>  .I head
> @@ -177,75 +168,63 @@ is set to
>  .I &head
>  if the loop completes normally, or if there were no elements.
>  .PP
> -The macro
>  .BR CIRCLEQ_FOREACH_REVERSE ()
>  traverses the circular queue referenced by
>  .I head
>  in the reverse direction, assigning each element in turn to
>  .IR var .
>  .PP
> -The macro
>  .BR CIRCLEQ_INIT ()
>  initializes the circular queue referenced by
>  .IR head .
>  .PP
> -The macro
>  .BR CIRCLEQ_INSERT_HEAD ()
>  inserts the new element
>  .I elm
>  at the head of the circular queue.
>  .PP
> -The macro
>  .BR CIRCLEQ_INSERT_TAIL ()
>  inserts the new element
>  .I elm
>  at the end of the circular queue.
>  .PP
> -The macro
>  .BR CIRCLEQ_INSERT_AFTER ()
>  inserts the new element
>  .I elm
>  after the element
>  .IR listelm .
>  .PP
> -The macro
>  .BR CIRCLEQ_INSERT_BEFORE ()
>  inserts the new element
>  .I elm
>  before the element
>  .IR listelm .
>  .PP
> -The macro
>  .BR CIRCLEQ_LAST ()
>  returns the last item on the circular queue.
>  .PP
> -The macro
>  .BR CIRCLEQ_NEXT ()
>  returns the next item on the circular queue, or
>  .I &head
>  if this item is the last one.
>  .PP
> -The macro
>  .BR CIRCLEQ_PREV ()
>  returns the previous item on the circular queue, or
>  .I &head
>  if this item is the first one.
>  .PP
> -The macro
>  .BR CIRCLEQ_LOOP_NEXT ()
>  returns the next item on the circular queue.
>  If
>  .I elm
>  is the last element on the circular queue, the first element is returned.
>  .PP
> -The macro
>  .BR CIRCLEQ_LOOP_PREV ()
>  returns the previous item on the circular queue.
>  If
>  .I elm
>  is the first element on the circular queue, the last element is returned.
>  .PP
> -The macro
>  .BR CIRCLEQ_REMOVE ()
>  removes the element
>  .I elm
> @@ -257,10 +236,10 @@ and zero if the queue contains at least one entry.
>  .PP
>  .BR CIRCLEQ_FIRST (),
>  .BR CIRCLEQ_LAST (),
> -.BR CIRCLEQ_NEXT (),
> +.BR CIRCLEQ_PREV (),
>  and
> -.BR CIRCLEQ_PREV ()
> -return a pointer to the first, last, next or previous
> +.BR CIRCLEQ_NEXT ()
> +return a pointer to the first, last, previous or next
>  .I TYPE
>  structure, respectively.
>  .PP
> @@ -272,7 +251,6 @@ Not in POSIX.1, POSIX.1-2001 or POSIX.1-2008.
>  Present on the BSDs
>  (CIRCLEQ macros first appeared in 4.4BSD).
>  .SH BUGS
> -The macros
>  .BR CIRCLEQ_FOREACH ()
>  and
>  .BR CIRCLEQ_FOREACH_REVERSE ()
> @@ -280,7 +258,6 @@ don't allow
>  .I var
>  to be removed or freed within the loop,
>  as it would interfere with the traversal.
> -The macros
>  .BR CIRCLEQ_FOREACH_SAFE ()
>  and
>  .BR CIRCLEQ_FOREACH_REVERSE_SAFE (),
> diff --git a/man3/list.3 b/man3/list.3
> index dde0960db..2efa1403d 100644
> --- a/man3/list.3
> +++ b/man3/list.3
> @@ -53,33 +53,38 @@ LIST_REMOVE
>  .nf
>  .B #include <sys/queue.h>
>  .PP
> -.BI "int LIST_EMPTY(LIST_HEAD *" head ");"
> -.PP
>  .B LIST_ENTRY(TYPE);
>  .PP
> -.BI "struct TYPE *LIST_FIRST(LIST_HEAD *" head ");"
> +.B LIST_HEAD(HEADNAME, TYPE);
> +.BI "LIST_HEAD LIST_HEAD_INITIALIZER(LIST_HEAD " head );
> +.BI "void LIST_INIT(LIST_HEAD *" head );
>  .PP
> -.BI "LIST_FOREACH(struct TYPE *" var ", LIST_HEAD *" head ", LIST_ENTRY " NAME ");"
> -.\".BI "LIST_FOREACH_FROM(struct TYPE *" var ", LIST_HEAD *" head ", LIST_ENTRY " NAME ");"
> -.\".BI "LIST_FOREACH_FROM_SAFE(struct TYPE *" var ", LIST_HEAD *" head ", LIST_ENTRY " NAME ", struct TYPE *" temp_var ");"
> -.\".BI "LIST_FOREACH_SAFE(struct TYPE *" var ", LIST_HEAD *" head ", LIST_ENTRY " NAME ", struct TYPE *" temp_var ");"
> +.BI "int LIST_EMPTY(LIST_HEAD *" head );
>  .PP
> -.B LIST_HEAD(HEADNAME, TYPE);
> -.BI "LIST_HEAD LIST_HEAD_INITIALIZER(LIST_HEAD " head ");"
> -.BI "void LIST_INIT(LIST_HEAD *" head ");"
> +.BI "void LIST_INSERT_HEAD(LIST_HEAD *" head ,
> +.BI "                        struct TYPE *" elm ", LIST_ENTRY " NAME );
> +.BI "void LIST_INSERT_AFTER(struct TYPE *" listelm ,
> +.BI "                        struct TYPE *" elm ", LIST_ENTRY " NAME );
> +.BI "void LIST_INSERT_BEFORE(struct TYPE *" listelm ,
> +.BI "                        struct TYPE *" elm ", LIST_ENTRY " NAME );
>  .PP
> -.BI "void LIST_INSERT_AFTER(struct TYPE *" listelm ", struct TYPE *" elm ","
> -.BI "                LIST_ENTRY " NAME ");"
> -.BI "void LIST_INSERT_BEFORE(struct TYPE *" listelm ", struct TYPE *" elm ","
> -.BI "                LIST_ENTRY " NAME ");"
> -.BI "void LIST_INSERT_HEAD(LIST_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                LIST_ENTRY " NAME ");"
> +.BI "struct TYPE *LIST_FIRST(LIST_HEAD *" head );
> +.\" .BI "struct TYPE *LIST_PREV(struct TYPE *" elm ", LIST_HEAD *" head ,
> +.\" .BI "                        struct TYPE, LIST_ENTRY " NAME );
> +.BI "struct TYPE *LIST_NEXT(struct TYPE *" elm ", LIST_ENTRY " NAME );
>  .PP
> -.BI "struct TYPE *LIST_NEXT(struct TYPE *" elm ", LIST_ENTRY " NAME ");"
> -.\".BI "struct TYPE *LIST_PREV(struct TYPE *" elm ", LIST_HEAD *" head ", struct TYPE, LIST_ENTRY " NAME ");"
> +.BI "LIST_FOREACH(struct TYPE *" var ", LIST_HEAD *" head ", LIST_ENTRY " NAME );
> +.\" .BI "LIST_FOREACH_FROM(struct TYPE *" var ", LIST_HEAD *" head ", LIST_ENTRY " NAME );
> +.\" .PP
> +.\" .BI "LIST_FOREACH_SAFE(struct TYPE *" var ", LIST_HEAD *" head ,
> +.\" .BI "                       LIST_ENTRY " NAME ", struct TYPE *" temp_var );
> +.\" .BI "LIST_FOREACH_FROM_SAFE(struct TYPE *" var ", LIST_HEAD *" head ,
> +.\" .BI "                       LIST_ENTRY " NAME ", struct TYPE *" temp_var );
>  .PP
> -.BI "void LIST_REMOVE(struct TYPE *" elm ", LIST_ENTRY " NAME ");"
> -.\".BI "void LIST_SWAP(LIST_HEAD *" head1 ", LIST_HEAD *" head2 ", struct TYPE, LIST_ENTRY " NAME ");"
> +.BI "void LIST_REMOVE(struct TYPE *" elm ", LIST_ENTRY " NAME );
> +.\" .PP
> +.\" .BI "void LIST_SWAP(LIST_HEAD *" head1 ", LIST_HEAD *" head2 ,
> +.\" .BI "               struct TYPE, LIST_ENTRY " NAME );
>  .fi
>  .SH DESCRIPTION
>  These macros define and operate on doubly linked lists.
> @@ -135,33 +140,27 @@ and
>  .I headp
>  are user selectable.)
>  .PP
> -The macro
>  .BR LIST_HEAD_INITIALIZER ()
>  evaluates to an initializer for the list
>  .IR head .
>  .PP
> -The macro
>  .BR LIST_EMPTY ()
>  evaluates to true if there are no elements in the list.
>  .PP
> -The macro
>  .BR LIST_ENTRY ()
>  declares a structure that connects the elements in
>  the list.
>  .PP
> -The macro
>  .BR LIST_FIRST ()
>  returns the first element in the list or NULL if the list
>  is empty.
>  .PP
> -The macro
>  .BR LIST_FOREACH ()
>  traverses the list referenced by
>  .I head
>  in the forward direction, assigning each element in turn to
>  .IR var .
>  .\" .PP
> -.\" The macro
>  .\" .BR LIST_FOREACH_FROM ()
>  .\" behaves identically to
>  .\" .BR LIST_FOREACH ()
> @@ -200,32 +199,27 @@ in the forward direction, assigning each element in turn to
>  .\" instead of the first element in the LIST referenced by
>  .\" .IR head .
>  .PP
> -The macro
>  .BR LIST_INIT ()
>  initializes the list referenced by
>  .IR head .
>  .PP
> -The macro
>  .BR LIST_INSERT_HEAD ()
>  inserts the new element
>  .I elm
>  at the head of the list.
>  .PP
> -The macro
>  .BR LIST_INSERT_AFTER ()
>  inserts the new element
>  .I elm
>  after the element
>  .IR listelm .
>  .PP
> -The macro
>  .BR LIST_INSERT_BEFORE ()
>  inserts the new element
>  .I elm
>  before the element
>  .IR listelm .
>  .PP
> -The macro
>  .BR LIST_NEXT ()
>  returns the next element in the list, or NULL if this is the last.
>  .\" .PP
> @@ -237,7 +231,6 @@ returns the next element in the list, or NULL if this is the last.
>  .\" must contain element
>  .\" .IR elm .
>  .PP
> -The macro
>  .BR LIST_REMOVE ()
>  removes the element
>  .I elm
> @@ -269,13 +262,11 @@ Not in POSIX.1, POSIX.1-2001 or POSIX.1-2008.
>  Present on the BSDs
>  (LIST macros first appeared in 4.4BSD).
>  .SH BUGS
> -The macro
>  .BR LIST_FOREACH ()
>  doesn't allow
>  .I var
>  to be removed or freed within the loop,
>  as it would interfere with the traversal.
> -The macro
>  .BR LIST_FOREACH_SAFE (),
>  which is present on the BSDs but is not present in glibc,
>  fixes this limitation by allowing
> diff --git a/man3/slist.3 b/man3/slist.3
> index 6868a63c2..714289a57 100644
> --- a/man3/slist.3
> +++ b/man3/slist.3
> @@ -53,33 +53,38 @@ SLIST_REMOVE_HEAD
>  .nf
>  .B #include <sys/queue.h>
>  .PP
> -.BI "int SLIST_EMPTY(SLIST_HEAD *" head ");"
> -.PP
>  .B SLIST_ENTRY(TYPE);
>  .PP
> -.BI "struct TYPE *SLIST_FIRST(SLIST_HEAD *" head ");"
> +.B SLIST_HEAD(HEADNAME, TYPE);
> +.BI "SLIST_HEAD SLIST_HEAD_INITIALIZER(SLIST_HEAD " head );
> +.BI "void SLIST_INIT(SLIST_HEAD *" head );
>  .PP
> -.BI "SLIST_FOREACH(struct TYPE *" var ", SLIST_HEAD *" head ", SLIST_ENTRY " NAME ");"
> -.\".BI "SLIST_FOREACH_FROM(struct TYPE *" var ", SLIST_HEAD *" head ", SLIST_ENTRY " NAME ");"
> -.\".BI "SLIST_FOREACH_FROM_SAFE(struct TYPE *" var ", SLIST_HEAD *" head ", SLIST_ENTRY " NAME ", struct TYPE *" temp_var ");"
> -.\".BI "SLIST_FOREACH_SAFE(struct TYPE *" var ", SLIST_HEAD *" head ", SLIST_ENTRY " NAME ", struct TYPE *" temp_var ");"
> +.BI "int SLIST_EMPTY(SLIST_HEAD *" head );
>  .PP
> -.B SLIST_HEAD(HEADNAME, TYPE);
> -.BI "SLIST_HEAD SLIST_HEAD_INITIALIZER(SLIST_HEAD " head ");"
> -.BI "void SLIST_INIT(SLIST_HEAD *" head ");"
> +.BI "void SLIST_INSERT_HEAD(SLIST_HEAD *" head ,
> +.BI "                        struct TYPE *" elm ", SLIST_ENTRY " NAME );
> +.BI "void SLIST_INSERT_AFTER(struct TYPE *" listelm ,
> +.BI "                        struct TYPE *" elm ", SLIST_ENTRY " NAME );
>  .PP
> -.BI "void SLIST_INSERT_AFTER(struct TYPE *" listelm ", struct TYPE *" elm ","
> -.BI "                SLIST_ENTRY " NAME ");"
> -.BI "void SLIST_INSERT_HEAD(SLIST_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                SLIST_ENTRY " NAME ");"
> +.BI "struct TYPE *SLIST_FIRST(SLIST_HEAD *" head );
> +.BI "struct TYPE *SLIST_NEXT(struct TYPE *" elm ", SLIST_ENTRY " NAME );
>  .PP
> -.BI "struct TYPE *SLIST_NEXT(struct TYPE *" elm ", SLIST_ENTRY " NAME ");"
> +.BI "SLIST_FOREACH(struct TYPE *" var ", SLIST_HEAD *" head ", SLIST_ENTRY " NAME );
> +.\" .BI "SLIST_FOREACH_FROM(struct TYPE *" var ", SLIST_HEAD *" head ", SLIST_ENTRY " NAME );
> +.\" .PP
> +.\" .BI "SLIST_FOREACH_SAFE(struct TYPE *" var ", SLIST_HEAD *" head ,
> +.\" .BI "                        SLIST_ENTRY " NAME ", struct TYPE *" temp_var );
> +.\" .BI "SLIST_FOREACH_FROM_SAFE(struct TYPE *" var ", SLIST_HEAD *" head ,
> +.\" .BI "                        SLIST_ENTRY " NAME ", struct TYPE *" temp_var );
>  .PP
> -.BI "void SLIST_REMOVE(SLIST_HEAD *" head ", struct TYPE *" elm ", SLIST_ENTRY " NAME ");"
> -.\".BI "void SLIST_REMOVE_AFTER(struct TYPE *" elm ", SLIST_ENTRY " NAME ");"
> -.BI "void SLIST_REMOVE_HEAD(SLIST_HEAD *" head ", SLIST_ENTRY " NAME ");"
> -.\".PP
> -.\".BI "void SLIST_SWAP(SLIST_HEAD *" head1 ", SLIST_HEAD *" head2 ", SLIST_ENTRY " NAME ");"
> +.BI "void SLIST_REMOVE(SLIST_HEAD *" head ", struct TYPE *" elm ,
> +.BI "                       SLIST_ENTRY " NAME );
> +.BI "void SLIST_REMOVE_HEAD(SLIST_HEAD *" head ,
> +.BI "                       SLIST_ENTRY " NAME );
> +.\" .BI "void SLIST_REMOVE_AFTER(struct TYPE *" elm ,
> +.\" .BI "                        SLIST_ENTRY " NAME );
> +.\" .PP
> +.\" .BI "void SLIST_SWAP(SLIST_HEAD *" head1 ", SLIST_HEAD *" head2 ", SLIST_ENTRY " NAME );
>  .fi
>  .SH DESCRIPTION
>  These macros define and operate on doubly linked lists.
> @@ -135,25 +140,20 @@ and
>  .I headp
>  are user selectable.)
>  .PP
> -The macro
>  .BR SLIST_HEAD_INITIALIZER ()
>  evaluates to an initializer for the list
>  .IR head .
>  .PP
> -The macro
>  .BR SLIST_EMPTY ()
>  evaluates to true if there are no elements in the list.
>  .PP
> -The macro
>  .BR SLIST_ENTRY ()
>  declares a structure that connects the elements in
>  the list.
>  .PP
> -The macro
>  .BR SLIST_FIRST ()
>  returns the first element in the list or NULL if the list is empty.
>  .PP
> -The macro
>  .BR SLIST_FOREACH ()
>  traverses the list referenced by
>  .I head
> @@ -201,25 +201,21 @@ turn to
>  .\" instead of the first element in the SLIST referenced by
>  .\" .IR head .
>  .PP
> -The macro
>  .BR SLIST_INIT ()
>  initializes the list referenced by
>  .IR head .
>  .PP
> -The macro
>  .BR SLIST_INSERT_HEAD ()
>  inserts the new element
>  .I elm
>  at the head of the list.
>  .PP
> -The macro
>  .BR SLIST_INSERT_AFTER ()
>  inserts the new element
>  .I elm
>  after the element
>  .IR listelm .
>  .PP
> -The macro
>  .BR SLIST_NEXT ()
>  returns the next element in the list.
>  .\" .PP
> @@ -232,7 +228,6 @@ returns the next element in the list.
>  .\" .IR SLIST_REMOVE ,
>  .\" this macro does not traverse the entire list.
>  .PP
> -The macro
>  .BR SLIST_REMOVE_HEAD ()
>  removes the element
>  .I elm
> @@ -243,7 +238,6 @@ this macro instead of the generic
>  .I SLIST_REMOVE
>  macro.
>  .PP
> -The macro
>  .BR SLIST_REMOVE ()
>  removes the element
>  .I elm
> @@ -275,13 +269,11 @@ Not in POSIX.1, POSIX.1-2001 or POSIX.1-2008.
>  Present on the BSDs
>  (SLIST macros first appeared in 4.4BSD).
>  .SH BUGS
> -The macro
>  .BR SLIST_FOREACH ()
>  doesn't allow
>  .I var
>  to be removed or freed within the loop,
>  as it would interfere with the traversal.
> -The macro
>  .BR SLIST_FOREACH_SAFE (),
>  which is present on the BSDs but is not present in glibc,
>  fixes this limitation by allowing
> diff --git a/man3/stailq.3 b/man3/stailq.3
> index 4a0e0bc5f..b825632c0 100644
> --- a/man3/stailq.3
> +++ b/man3/stailq.3
> @@ -56,41 +56,45 @@ STAILQ_REMOVE_HEAD,
>  .nf
>  .B #include <sys/queue.h>
>  .PP
> -.BI "void STAILQ_CONCAT(STAILQ_HEAD *" head1 ", STAILQ_HEAD *" head2 ");"
> -.PP
> -.BI "int STAILQ_EMPTY(STAILQ_HEAD *" head ");"
> -.PP
>  .B STAILQ_ENTRY(TYPE);
>  .PP
> -.BI "struct TYPE *STAILQ_FIRST(STAILQ_HEAD *" head ");"
> +.B STAILQ_HEAD(HEADNAME, TYPE);
> +.BI "STAILQ_HEAD STAILQ_HEAD_INITIALIZER(STAILQ_HEAD " head );
> +.BI "void STAILQ_INIT(STAILQ_HEAD *" head );
>  .PP
> -.BI "STAILQ_FOREACH(struct TYPE *" var ", STAILQ_HEAD *" head ", STAILQ_ENTRY " NAME ");"
> -.\" .BI "STAILQ_FOREACH_FROM(struct TYPE *" var ", STAILQ_HEAD *" head ", STAILQ_ENTRY " NAME ");"
> -.\" .BI "STAILQ_FOREACH_FROM_SAFE(struct TYPE *" var ", STAILQ_HEAD *" head ", STAILQ_ENTRY " NAME ", struct TYPE *" temp_var ");"
> -.\" .BI "STAILQ_FOREACH_SAFE(struct TYPE *" var ", STAILQ_HEAD *" head ", STAILQ_ENTRY " NAME ", struct TYPE *" temp_var ");"
> +.BI "int STAILQ_EMPTY(STAILQ_HEAD *" head );
>  .PP
> -.B STAILQ_HEAD(HEADNAME, TYPE);
> -.BI "STAILQ_HEAD STAILQ_HEAD_INITIALIZER(STAILQ_HEAD " head ");"
> -.BI "void STAILQ_INIT(STAILQ_HEAD *" head ");"
> +.BI "void STAILQ_INSERT_HEAD(STAILQ_HEAD *" head ,
> +.BI "                         struct TYPE *" elm ", STAILQ_ENTRY " NAME );
> +.BI "void STAILQ_INSERT_TAIL(STAILQ_HEAD *" head ,
> +.BI "                         struct TYPE *" elm ", STAILQ_ENTRY " NAME );
> +.BI "void STAILQ_INSERT_AFTER(STAILQ_HEAD *" head ", struct TYPE *" listelm ,
> +.BI "                         struct TYPE *" elm ", STAILQ_ENTRY " NAME );
>  .PP
> -.BI "void STAILQ_INSERT_AFTER(STAILQ_HEAD *" head ", struct TYPE *" listelm ","
> -.BI "                struct TYPE *" elm ", STAILQ_ENTRY " NAME ");"
> -.BI "void STAILQ_INSERT_HEAD(STAILQ_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                STAILQ_ENTRY " NAME ");"
> -.BI "void STAILQ_INSERT_TAIL(STAILQ_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                STAILQ_ENTRY " NAME ");"
> -.\" .PP
> -.\" .BI "struct TYPE *STAILQ_LAST(STAILQ_HEAD *" head ", struct TYPE *" elm ", STAILQ_ENTRY " NAME ");"
> +.BI "struct TYPE *STAILQ_FIRST(STAILQ_HEAD *" head );
> +.\" .BI "struct TYPE *STAILQ_LAST(STAILQ_HEAD *" head ", struct TYPE *" elm ,
> +.\" .BI "                          STAILQ_ENTRY " NAME );
> +.BI "struct TYPE *STAILQ_NEXT(struct TYPE *" elm ", STAILQ_ENTRY " NAME );
>  .PP
> -.BI "struct TYPE *STAILQ_NEXT(struct TYPE *" elm ", STAILQ_ENTRY " NAME ");"
> +.BI "STAILQ_FOREACH(struct TYPE *" var ", STAILQ_HEAD *" head ", STAILQ_ENTRY " NAME );
> +.\" .BI "STAILQ_FOREACH_FROM(struct TYPE *" var ", STAILQ_HEAD *" head ,
> +.\" .BI "                    STAILQ_ENTRY " NAME );
> +.\" .PP
> +.\" .BI "STAILQ_FOREACH_SAFE(struct TYPE *" var ", STAILQ_HEAD *" head ,
> +.\" .BI "                         STAILQ_ENTRY " NAME ", struct TYPE *" temp_var );
> +.\" .BI "STAILQ_FOREACH_FROM_SAFE(struct TYPE *" var ", STAILQ_HEAD *" head ,
> +.\" .BI "                         STAILQ_ENTRY " NAME ", struct TYPE *" temp_var );
>  .PP
>  .BI "void STAILQ_REMOVE(STAILQ_HEAD *" head ", struct TYPE *" elm ", TYPE,"
> -.BI "                STAILQ_ENTRY " NAME ");"
> -.\" .BI "void STAILQ_REMOVE_AFTER(STAILQ_HEAD *" head ", struct TYPE *" elm ","
> -.\" .BI "                STAILQ_ENTRY " NAME ");"
> -.BI "void STAILQ_REMOVE_HEAD(STAILQ_HEAD *" head ", STAILQ_ENTRY " NAME ");"
> -.\" .BI "void STAILQ_SWAP(STAILQ_HEAD *" head1 ", STAILQ_HEAD *" head2 ","
> -.\" .BI "                STAILQ_ENTRY " NAME ");"
> +.BI "                        STAILQ_ENTRY " NAME );
> +.BI "void STAILQ_REMOVE_HEAD(STAILQ_HEAD *" head ,
> +.BI "                        STAILQ_ENTRY " NAME );
> +.\" .BI "void STAILQ_REMOVE_AFTER(STAILQ_HEAD *" head ", struct TYPE *" elm ,
> +.\" .BI "                         STAILQ_ENTRY " NAME );
> +.PP
> +.BI "void STAILQ_CONCAT(STAILQ_HEAD *" head1 ", STAILQ_HEAD *" head2 );
> +.\" .BI "void STAILQ_SWAP(STAILQ_HEAD *" head1 ", STAILQ_HEAD *" head2 ,
> +.\" .BI "                   STAILQ_ENTRY " NAME );
>  .fi
>  .SH DESCRIPTION
>  These macros define and operate on singly linked tail queues.
> @@ -148,12 +152,10 @@ and
>  .I headp
>  are user selectable.)
>  .PP
> -The macro
>  .BR STAILQ_HEAD_INITIALIZER ()
>  evaluates to an initializer for the tail queue
>  .IR head .
>  .PP
> -The macro
>  .BR STAILQ_CONCAT ()
>  concatenates the tail queue headed by
>  .I head2
> @@ -161,21 +163,17 @@ onto the end of the one headed by
>  .I head1
>  removing all entries from the former.
>  .PP
> -The macro
>  .BR STAILQ_EMPTY ()
>  evaluates to true if there are no items on the tail queue.
>  .PP
> -The macro
>  .BR STAILQ_ENTRY ()
>  declares a structure that connects the elements in
>  the tail queue.
>  .PP
> -The macro
>  .BR STAILQ_FIRST ()
>  returns the first item on the tail queue or NULL if the tail queue
>  is empty.
>  .PP
> -The macro
>  .BR STAILQ_FOREACH ()
>  traverses the tail queue referenced by
>  .I head
> @@ -183,7 +181,6 @@ in the forward direction, assigning each element
>  in turn to
>  .IR var .
>  .\" .PP
> -.\" The macro
>  .\" .BR STAILQ_FOREACH_FROM ()
>  .\" behaves identically to
>  .\" .BR STAILQ_FOREACH ()
> @@ -196,7 +193,6 @@ in turn to
>  .\" instead of the first element in the STAILQ referenced by
>  .\" .IR head .
>  .\" .PP
> -.\" The macro
>  .\" .BR STAILQ_FOREACH_SAFE ()
>  .\" traverses the tail queue referenced by
>  .\" .I head
> @@ -210,7 +206,6 @@ in turn to
>  .\" as well as free it from within the loop safely without interfering with the
>  .\" traversal.
>  .\" .PP
> -.\" The macro
>  .\" .BR STAILQ_FOREACH_FROM_SAFE ()
>  .\" behaves identically to
>  .\" .BR STAILQ_FOREACH_SAFE ()
> @@ -223,24 +218,20 @@ in turn to
>  .\" instead of the first element in the STAILQ referenced by
>  .\" .IR head .
>  .PP
> -The macro
>  .BR STAILQ_INIT ()
>  initializes the tail queue referenced by
>  .IR head .
>  .PP
> -The macro
>  .BR STAILQ_INSERT_HEAD ()
>  inserts the new element
>  .I elm
>  at the head of the tail queue.
>  .PP
> -The macro
>  .BR STAILQ_INSERT_TAIL ()
>  inserts the new element
>  .I elm
>  at the end of the tail queue.
>  .PP
> -The macro
>  .BR STAILQ_INSERT_AFTER ()
>  inserts the new element
>  .I elm
> @@ -252,7 +243,6 @@ after the element
>  .\" returns the last item on the tail queue.
>  .\" If the tail queue is empty the return value is NULL .
>  .PP
> -The macro
>  .BR STAILQ_NEXT ()
>  returns the next item on the tail queue, or NULL this item is the last.
>  .\" .PP
> @@ -265,7 +255,6 @@ returns the next item on the tail queue, or NULL this item is the last.
>  .\" .BR STAILQ_REMOVE (),
>  .\" this macro does not traverse the entire tail queue.
>  .PP
> -The macro
>  .BR STAILQ_REMOVE_HEAD ()
>  removes the element at the head of the tail queue.
>  For optimum efficiency,
> @@ -274,7 +263,6 @@ use this macro explicitly rather than the generic
>  .BR STAILQ_REMOVE ()
>  macro.
>  .PP
> -The macro
>  .BR STAILQ_REMOVE ()
>  removes the element
>  .I elm
> @@ -306,13 +294,11 @@ Not in POSIX.1, POSIX.1-2001 or POSIX.1-2008.
>  Present on the BSDs
>  (STAILQ macros first appeared in 4.4BSD).
>  .SH BUGS
> -The macro
>  .BR STAILQ_FOREACH ()
>  doesn't allow
>  .I var
>  to be removed or freed within the loop,
>  as it would interfere with the traversal.
> -The macro
>  .BR STAILQ_FOREACH_SAFE (),
>  which is present on the BSDs but is not present in glibc,
>  fixes this limitation by allowing
> diff --git a/man3/tailq.3 b/man3/tailq.3
> index 14af54878..163b9556e 100644
> --- a/man3/tailq.3
> +++ b/man3/tailq.3
> @@ -60,47 +60,57 @@ TAILQ_REMOVE
>  .nf
>  .B #include <sys/queue.h>
>  .PP
> -.BI "void TAILQ_CONCAT(TAILQ_HEAD *" head1 ", TAILQ_HEAD *" head2 ","
> -.BI "                TAILQ_ENTRY " NAME ");"
> -.PP
> -.BI "int TAILQ_EMPTY(TAILQ_HEAD *" head ");"
> -.PP
>  .B TAILQ_ENTRY(TYPE);
>  .PP
> -.BI "struct TYPE *TAILQ_FIRST(TAILQ_HEAD *" head ");"
> -.PP
> -.BI "TAILQ_FOREACH(struct TYPE *" var ", TAILQ_HEAD *" head ", TAILQ_ENTRY " NAME ");"
> -.\" .BI "TAILQ_FOREACH_FROM(struct TYPE *" var ", TAILQ_HEAD *" head ", TAILQ_ENTRY " NAME ");"
> -.\" .BI "TAILQ_FOREACH_FROM_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head ", TAILQ_ENTRY " NAME ", struct TYPE *" temp_var ");"
> -.BI "TAILQ_FOREACH_REVERSE(struct TYPE *" var ", TAILQ_HEAD *" head ", HEADNAME,"
> -.BI "                TAILQ_ENTRY " NAME ");"
> -.\" .PP
> -.\" .BI "TAILQ_FOREACH_REVERSE_FROM(struct TYPE *" var ", TAILQ_HEAD *" head ", HEADNAME, TAILQ_ENTRY " NAME ");"
> -.\" .BI "TAILQ_FOREACH_REVERSE_FROM_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head ", HEADNAME, TAILQ_ENTRY " NAME ", struct TYPE *" temp_var ");"
> -.\" .BI "TAILQ_FOREACH_REVERSE_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head ", HEADNAME, TAILQ_ENTRY " NAME ", TYPE *" temp_var ");"
> -.\" .BI "TAILQ_FOREACH_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head ", TAILQ_ENTRY " NAME ", struct TYPE *" temp_var ");"
> -.PP
>  .B TAILQ_HEAD(HEADNAME, TYPE);
> -.BI "TAILQ_HEAD TAILQ_HEAD_INITIALIZER(TAILQ_HEAD " head ");"
> -.BI "void TAILQ_INIT(TAILQ_HEAD *" head ");"
> +.BI "TAILQ_HEAD TAILQ_HEAD_INITIALIZER(TAILQ_HEAD " head );
> +.BI "void TAILQ_INIT(TAILQ_HEAD *" head );
>  .PP
> -.BI "void TAILQ_INSERT_AFTER(TAILQ_HEAD *" head ", struct TYPE *" listelm ","
> -.BI "                struct TYPE *" elm ", TAILQ_ENTRY " NAME ");"
> -.BI "void TAILQ_INSERT_BEFORE(struct TYPE *" listelm ", struct TYPE *" elm ","
> -.BI "                TAILQ_ENTRY " NAME ");"
> +.BI "int TAILQ_EMPTY(TAILQ_HEAD *" head );
>  .PP
> -.BI "void TAILQ_INSERT_HEAD(TAILQ_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                TAILQ_ENTRY " NAME ");"
> -.BI "void TAILQ_INSERT_TAIL(TAILQ_HEAD *" head ", struct TYPE *" elm ","
> -.BI "                TAILQ_ENTRY " NAME ");"
> +.BI "void TAILQ_INSERT_HEAD(TAILQ_HEAD *" head ,
> +.BI "                         struct TYPE *" elm ", TAILQ_ENTRY " NAME );
> +.BI "void TAILQ_INSERT_TAIL(TAILQ_HEAD *" head ,
> +.BI "                         struct TYPE *" elm ", TAILQ_ENTRY " NAME );
> +.BI "void TAILQ_INSERT_BEFORE(struct TYPE *" listelm ,
> +.BI "                         struct TYPE *" elm ", TAILQ_ENTRY " NAME );
> +.BI "void TAILQ_INSERT_AFTER(TAILQ_HEAD *" head ", struct TYPE *" listelm ,
> +.BI "                         struct TYPE *" elm ", TAILQ_ENTRY " NAME );
>  .PP
> +.BI "struct TYPE *TAILQ_FIRST(TAILQ_HEAD *" head );
>  .BI "struct TYPE *TAILQ_LAST(TAILQ_HEAD *" head ", HEADNAME);"
> -.BI "struct TYPE *TAILQ_NEXT(struct TYPE *" elm ", TAILQ_ENTRY " NAME ");"
> -.BI "struct TYPE *TAILQ_PREV(struct TYPE *" elm ", HEADNAME, TAILQ_ENTRY " NAME ");"
> -.BI "void TAILQ_REMOVE(TAILQ_HEAD *" head ", struct TYPE *" elm ,
> -.BI "                TAILQ_ENTRY " NAME ");"
> +.BI "struct TYPE *TAILQ_PREV(struct TYPE *" elm ", HEADNAME, TAILQ_ENTRY " NAME );
> +.BI "struct TYPE *TAILQ_NEXT(struct TYPE *" elm ", TAILQ_ENTRY " NAME );
> +.PP
> +.BI "TAILQ_FOREACH(struct TYPE *" var ", TAILQ_HEAD *" head ,
> +.BI "                      TAILQ_ENTRY " NAME );
> +.\" .BI "TAILQ_FOREACH_FROM(struct TYPE *" var ", TAILQ_HEAD *" head ,
> +.\" .BI "                           TAILQ_ENTRY " NAME );
> +.BI "TAILQ_FOREACH_REVERSE(struct TYPE *" var ", TAILQ_HEAD *" head ", HEADNAME,"
> +.BI "                      TAILQ_ENTRY " NAME );
> +.\" .BI "TAILQ_FOREACH_REVERSE_FROM(struct TYPE *" var ", TAILQ_HEAD *" head ", HEADNAME,"
> +.\" .BI "                           TAILQ_ENTRY " NAME );
>  .\" .PP
> -.\" .BI "void TAILQ_SWAP(TAILQ_HEAD *" head1 ", TAILQ_HEAD *" head2 ", TYPE, TAILQ_ENTRY " NAME ");"
> +.\" .BI "TAILQ_FOREACH_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head ,
> +.\" .BI "                                TAILQ_ENTRY " NAME ,
> +.\" .BI "                                struct TYPE *" temp_var );
> +.\" .BI "TAILQ_FOREACH_FROM_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head ,
> +.\" .BI "                                TAILQ_ENTRY " NAME ,
> +.\" .BI "                                struct TYPE *" temp_var );
> +.\" .BI "TAILQ_FOREACH_REVERSE_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head ,
> +.\" .BI "                                HEADNAME, TAILQ_ENTRY " NAME ,
> +.\" .BI "                                struct TYPE *" temp_var );
> +.\" .BI "TAILQ_FOREACH_REVERSE_FROM_SAFE(struct TYPE *" var ", TAILQ_HEAD *" head ,
> +.\" .BI "                                HEADNAME, TAILQ_ENTRY " NAME ,
> +.\" .BI "                                struct TYPE *" temp_var );
> +.PP
> +.BI "void TAILQ_REMOVE(TAILQ_HEAD *" head ", struct TYPE *" elm ,
> +.BI "                  TAILQ_ENTRY " NAME );
> +.PP
> +.BI "void TAILQ_CONCAT(TAILQ_HEAD *" head1 ", TAILQ_HEAD *" head2 ,
> +.BI "                  TAILQ_ENTRY " NAME );
> +.\" .BI "void TAILQ_SWAP(TAILQ_HEAD *" head1 ", TAILQ_HEAD *" head2 ", TYPE,"
> +.\" .BI "                  TAILQ_ENTRY " NAME );
>  .fi
>  .SH DESCRIPTION
>  These macros define and operate on doubly linked tail queues.
> @@ -158,12 +168,10 @@ and
>  .I headp
>  are user selectable.)
>  .PP
> -The macro
>  .BR TAILQ_HEAD_INITIALIZER ()
>  evaluates to an initializer for the tail queue
>  .IR head .
>  .PP
> -The macro
>  .BR TAILQ_CONCAT ()
>  concatenates the tail queue headed by
>  .I head2
> @@ -171,21 +179,17 @@ onto the end of the one headed by
>  .I head1
>  removing all entries from the former.
>  .PP
> -The macro
>  .BR TAILQ_EMPTY ()
>  evaluates to true if there are no items on the tail queue.
>  .PP
> -The macro
>  .BR TAILQ_ENTRY ()
>  declares a structure that connects the elements in
>  the tail queue.
>  .PP
> -The macro
>  .BR TAILQ_FIRST ()
>  returns the first item on the tail queue or NULL if the tail queue
>  is empty.
>  .PP
> -The macro
>  .BR TAILQ_FOREACH ()
>  traverses the tail queue referenced by
>  .I head
> @@ -195,7 +199,6 @@ in the forward direction, assigning each element in turn to
>  is set to NULL if the loop completes normally,
>  or if there were no elements.
>  .\" .PP
> -.\" The macro
>  .\" .BR TAILQ_FOREACH_FROM ()
>  .\" behaves identically to
>  .\" .BR TAILQ_FOREACH ()
> @@ -208,14 +211,12 @@ or if there were no elements.
>  .\" instead of the first element in the TAILQ referenced by
>  .\" .IR head .
>  .PP
> -The macro
>  .BR TAILQ_FOREACH_REVERSE ()
>  traverses the tail queue referenced by
>  .I head
>  in the reverse direction, assigning each element in turn to
>  .IR var .
>  .\" .PP
> -.\" The macro
>  .\" .BR TAILQ_FOREACH_REVERSE_FROM ()
>  .\" behaves identically to
>  .\" .BR TAILQ_FOREACH_REVERSE ()
> @@ -228,7 +229,6 @@ in the reverse direction, assigning each element in turn to
>  .\" instead of the last element in the TAILQ referenced by
>  .\" .IR head .
>  .\" .PP
> -.\" The macros
>  .\" .BR TAILQ_FOREACH_SAFE ()
>  .\" and
>  .\" .BR TAILQ_FOREACH_REVERSE_SAFE ()
> @@ -246,7 +246,6 @@ in the reverse direction, assigning each element in turn to
>  .\" as well as free it from within the loop safely without interfering with the
>  .\" traversal.
>  .\" .PP
> -.\" The macro
>  .\" .BR TAILQ_FOREACH_FROM_SAFE ()
>  .\" behaves identically to
>  .\" .BR TAILQ_FOREACH_SAFE ()
> @@ -259,7 +258,6 @@ in the reverse direction, assigning each element in turn to
>  .\" instead of the first element in the TAILQ referenced by
>  .\" .IR head .
>  .\" .PP
> -.\" The macro
>  .\" .BR TAILQ_FOREACH_REVERSE_FROM_SAFE ()
>  .\" behaves identically to
>  .\" .BR TAILQ_FOREACH_REVERSE_SAFE ()
> @@ -272,58 +270,48 @@ in the reverse direction, assigning each element in turn to
>  .\" instead of the last element in the TAILQ referenced by
>  .\" .IR head .
>  .PP
> -The macro
>  .BR TAILQ_INIT ()
>  initializes the tail queue referenced by
>  .IR head .
>  .PP
> -The macro
>  .BR TAILQ_INSERT_HEAD ()
>  inserts the new element
>  .I elm
>  at the head of the tail queue.
>  .PP
> -The macro
>  .BR TAILQ_INSERT_TAIL ()
>  inserts the new element
>  .I elm
>  at the end of the tail queue.
>  .PP
> -The macro
>  .BR TAILQ_INSERT_AFTER ()
>  inserts the new element
>  .I elm
>  after the element
>  .IR listelm .
>  .PP
> -The macro
>  .BR TAILQ_INSERT_BEFORE ()
>  inserts the new element
>  .I elm
>  before the element
>  .IR listelm .
>  .PP
> -The macro
>  .BR TAILQ_LAST ()
>  returns the last item on the tail queue.
>  If the tail queue is empty the return value is NULL.
>  .PP
> -The macro
>  .BR TAILQ_NEXT ()
>  returns the next item on the tail queue, or NULL if this item is the last.
>  .PP
> -The macro
>  .BR TAILQ_PREV ()
>  returns the previous item on the tail queue, or NULL if this item
>  is the first.
>  .PP
> -The macro
>  .BR TAILQ_REMOVE ()
>  removes the element
>  .I elm
>  from the tail queue.
>  .\" .PP
> -.\" The macro
>  .\" .BR TAILQ_SWAP ()
>  .\" swaps the contents of
>  .\" .I head1
> @@ -336,10 +324,10 @@ and zero if the queue contains at least one entry.
>  .PP
>  .BR TAILQ_FIRST (),
>  .BR TAILQ_LAST (),
> -.BR TAILQ_NEXT (),
> +.BR TAILQ_PREV (),
>  and
> -.BR TAILQ_PREV ()
> -return a pointer to the first, last, next or previous
> +.BR TAILQ_NEXT ()
> +return a pointer to the first, last, previous or next
>  .I TYPE
>  structure, respectively.
>  .PP
> @@ -351,7 +339,6 @@ Not in POSIX.1, POSIX.1-2001 or POSIX.1-2008.
>  Present on the BSDs.
>  (TAILQ functions first appeared in 4.4BSD).
>  .SH BUGS
> -The macros
>  .BR TAILQ_FOREACH ()
>  and
>  .BR TAILQ_FOREACH_REVERSE ()
> @@ -359,7 +346,6 @@ don't allow
>  .I var
>  to be removed or freed within the loop,
>  as it would interfere with the traversal.
> -The macros
>  .BR TAILQ_FOREACH_SAFE ()
>  and
>  .BR TAILQ_FOREACH_REVERSE_SAFE (),
> 

-- 
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/



[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux