~ubuntu-branches/ubuntu/precise/pmake/precise

« back to all changes in this revision

Viewing changes to lst.lib/lstForEachFrom.c

  • Committer: Bazaar Package Importer
  • Author(s): Steve McIntyre
  • Date: 2002-03-12 21:59:55 UTC
  • Revision ID: james.westby@ubuntu.com-20020312215955-i183oxj3rpm464yh
Tags: 1.45-10
* Fixed broken '.Nm ""' directives in the man page. Closes: #137768
* Changed name from "make" to "pmake" in manpage.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*      $NetBSD: lstForEachFrom.c,v 1.7 1997/09/28 03:31:26 lukem Exp $ */
 
2
 
 
3
/*
 
4
 * Copyright (c) 1988, 1989, 1990, 1993
 
5
 *      The Regents of the University of California.  All rights reserved.
 
6
 *
 
7
 * This code is derived from software contributed to Berkeley by
 
8
 * Adam de Boor.
 
9
 *
 
10
 * Redistribution and use in source and binary forms, with or without
 
11
 * modification, are permitted provided that the following conditions
 
12
 * are met:
 
13
 * 1. Redistributions of source code must retain the above copyright
 
14
 *    notice, this list of conditions and the following disclaimer.
 
15
 * 2. Redistributions in binary form must reproduce the above copyright
 
16
 *    notice, this list of conditions and the following disclaimer in the
 
17
 *    documentation and/or other materials provided with the distribution.
 
18
 * 3. All advertising materials mentioning features or use of this software
 
19
 *    must display the following acknowledgement:
 
20
 *      This product includes software developed by the University of
 
21
 *      California, Berkeley and its contributors.
 
22
 * 4. Neither the name of the University nor the names of its contributors
 
23
 *    may be used to endorse or promote products derived from this software
 
24
 *    without specific prior written permission.
 
25
 *
 
26
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 
27
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
28
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
29
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 
30
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
31
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
32
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
33
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
34
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 
35
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
36
 * SUCH DAMAGE.
 
37
 */
 
38
 
 
39
#ifdef MAKE_BOOTSTRAP
 
40
static char rcsid[] = "$NetBSD: lstForEachFrom.c,v 1.7 1997/09/28 03:31:26 lukem Exp $";
 
41
#else
 
42
#include <sys/cdefs.h>
 
43
#ifndef lint
 
44
#if 0
 
45
static char sccsid[] = "@(#)lstForEachFrom.c    8.1 (Berkeley) 6/6/93";
 
46
#else
 
47
__RCSID("$NetBSD: lstForEachFrom.c,v 1.7 1997/09/28 03:31:26 lukem Exp $");
 
48
#endif
 
49
#endif /* not lint */
 
50
#endif
 
51
 
 
52
/*-
 
53
 * lstForEachFrom.c --
 
54
 *      Perform a given function on all elements of a list starting from
 
55
 *      a given point.
 
56
 */
 
57
 
 
58
#include        "lstInt.h"
 
59
 
 
60
/*-
 
61
 *-----------------------------------------------------------------------
 
62
 * Lst_ForEachFrom --
 
63
 *      Apply the given function to each element of the given list. The
 
64
 *      function should return 0 if traversal should continue and non-
 
65
 *      zero if it should abort.
 
66
 *
 
67
 * Results:
 
68
 *      None.
 
69
 *
 
70
 * Side Effects:
 
71
 *      Only those created by the passed-in function.
 
72
 *
 
73
 *-----------------------------------------------------------------------
 
74
 */
 
75
/*VARARGS2*/
 
76
void
 
77
Lst_ForEachFrom (l, ln, proc, d)
 
78
    Lst                 l;
 
79
    LstNode             ln;
 
80
    register int        (*proc) __P((ClientData, ClientData));
 
81
    register ClientData d;
 
82
{
 
83
    register ListNode   tln = (ListNode)ln;
 
84
    register List       list = (List)l;
 
85
    register ListNode   next;
 
86
    Boolean             done;
 
87
    int                 result;
 
88
 
 
89
    if (!LstValid (list) || LstIsEmpty (list)) {
 
90
        return;
 
91
    }
 
92
 
 
93
    do {
 
94
        /*
 
95
         * Take care of having the current element deleted out from under
 
96
         * us.
 
97
         */
 
98
 
 
99
        next = tln->nextPtr;
 
100
 
 
101
        (void) tln->useCount++;
 
102
        result = (*proc) (tln->datum, d);
 
103
        (void) tln->useCount--;
 
104
 
 
105
        /*
 
106
         * We're done with the traversal if
 
107
         *  - nothing's been added after the current node and
 
108
         *  - the next node to examine is the first in the queue or
 
109
         *    doesn't exist.
 
110
         */
 
111
        done = (next == tln->nextPtr &&
 
112
                (next == NilListNode || next == list->firstPtr));
 
113
 
 
114
        next = tln->nextPtr;
 
115
 
 
116
        if (tln->flags & LN_DELETED) {
 
117
            free((char *)tln);
 
118
        }
 
119
        tln = next;
 
120
    } while (!result && !LstIsEmpty(list) && !done);
 
121
 
 
122
}
 
123