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/