|
|
1.1 root 1: /*
2: * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Adam de Boor.
7: *
8: * Redistribution and use in source and binary forms are permitted
9: * provided that: (1) source distributions retain this entire copyright
10: * notice and comment, and (2) distributions including binaries display
11: * the following acknowledgement: ``This product includes software
12: * developed by the University of California, Berkeley and its contributors''
13: * in the documentation or other materials provided with the distribution
14: * and in all advertising materials mentioning features or use of this
15: * software. Neither the name of the University nor the names of its
16: * contributors may be used to endorse or promote products derived
17: * from this software without specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)lstNext.c 5.3 (Berkeley) 6/1/90";
25: #endif /* not lint */
26:
27: /*-
28: * LstNext.c --
29: * Return the next node for a list.
30: * The sequential functions access the list in a slightly different way.
31: * CurPtr points to their idea of the current node in the list and they
32: * access the list based on it. Because the list is circular, Lst_Next
33: * and Lst_Prev will go around the list forever. Lst_IsAtEnd must be
34: * used to determine when to stop.
35: */
36:
37: #include "lstInt.h"
38:
39: /*-
40: *-----------------------------------------------------------------------
41: * Lst_Next --
42: * Return the next node for the given list.
43: *
44: * Results:
45: * The next node or NILLNODE if the list has yet to be opened. Also
46: * if the list is non-circular and the end has been reached, NILLNODE
47: * is returned.
48: *
49: * Side Effects:
50: * the curPtr field is updated.
51: *
52: *-----------------------------------------------------------------------
53: */
54: LstNode
55: Lst_Next (l)
56: Lst l;
57: {
58: register ListNode tln;
59: register List list = (List)l;
60:
61: if ((LstValid (l) == FALSE) ||
62: (list->isOpen == FALSE)) {
63: return (NILLNODE);
64: }
65:
66: list->prevPtr = list->curPtr;
67:
68: if (list->curPtr == NilListNode) {
69: if (list->atEnd == Unknown) {
70: /*
71: * If we're just starting out, atEnd will be Unknown.
72: * Then we want to start this thing off in the right
73: * direction -- at the start with atEnd being Middle.
74: */
75: list->curPtr = tln = list->firstPtr;
76: list->atEnd = Middle;
77: } else {
78: tln = NilListNode;
79: list->atEnd = Tail;
80: }
81: } else {
82: tln = list->curPtr->nextPtr;
83: list->curPtr = tln;
84:
85: if (tln == list->firstPtr || tln == NilListNode) {
86: /*
87: * If back at the front, then we've hit the end...
88: */
89: list->atEnd = Tail;
90: } else {
91: /*
92: * Reset to Middle if gone past first.
93: */
94: list->atEnd = Middle;
95: }
96: }
97:
98: return ((LstNode)tln);
99: }
100:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.