Annotation of libwww/Library/src/HTList.c, revision 2.22
2.8 frystyk 1: /* HTList.c
2: ** MANAGEMENT OF LINKED LISTS
3: **
2.12 frystyk 4: ** (c) COPYRIGHT MIT 1995.
2.8 frystyk 5: ** Please first read the full copyright statement in the file COPYRIGH.
1.1 timbl 6: **
7: ** A list is represented as a sequence of linked nodes of type HTList.
8: ** The first node is a header which contains no object.
9: ** New nodes are inserted between the header and the rest of the list.
10: */
11:
2.10 frystyk 12: /* Library include files */
2.22 ! frystyk 13: #include "sysdep.h"
2.10 frystyk 14: #include "HTUtils.h"
1.1 timbl 15: #include "HTList.h"
16:
2.17 frystyk 17: PUBLIC HTList * HTList_new (void)
1.1 timbl 18: {
2.20 frystyk 19: HTList *newList;
20: if ((newList = (HTList *) HT_CALLOC(1, sizeof (HTList))) == NULL)
21: HT_OUTOFMEM("HTList_new");
2.17 frystyk 22: newList->object = NULL;
23: newList->next = NULL;
24: return newList;
1.1 timbl 25: }
26:
2.17 frystyk 27: PUBLIC BOOL HTList_delete (HTList * me)
1.1 timbl 28: {
2.15 frystyk 29: if (me) {
30: HTList *current;
31: while ((current = me)) {
32: me = me->next;
2.20 frystyk 33: HT_FREE(current);
2.15 frystyk 34: }
35: return YES;
36: }
37: return NO;
1.1 timbl 38: }
39:
2.17 frystyk 40: PUBLIC BOOL HTList_addObject (HTList * me, void * newObject)
1.1 timbl 41: {
2.11 frystyk 42: if (me) {
2.20 frystyk 43: HTList *newNode;
44: if ((newNode = (HTList *) HT_CALLOC(1, sizeof(HTList))) == NULL)
45: HT_OUTOFMEM("HTList_addObject");
2.11 frystyk 46: newNode->object = newObject;
47: newNode->next = me->next;
48: me->next = newNode;
49: return YES;
50: } else {
2.13 frystyk 51: if (WWWTRACE)
2.21 eric 52: HTTrace(
2.11 frystyk 53: "HTList...... Can not add object %p to nonexisting list\n",
54: newObject);
55: }
56: return NO;
1.1 timbl 57: }
58:
2.18 frystyk 59: PUBLIC BOOL HTList_appendObject (HTList * me, void * newObject)
60: {
61: if (me) {
62: while (me->next) me = me->next;
63: return HTList_addObject(me, newObject);
64: }
65: return NO;
66: }
67:
2.17 frystyk 68: PUBLIC BOOL HTList_removeObject (HTList * me, void * oldObject)
1.1 timbl 69: {
2.11 frystyk 70: if (me) {
71: HTList *previous;
72: while (me->next) {
73: previous = me;
74: me = me->next;
2.19 frystyk 75: if (me->object == oldObject) {
2.11 frystyk 76: previous->next = me->next;
2.20 frystyk 77: HT_FREE(me);
2.11 frystyk 78: return YES; /* Success */
79: }
80: }
1.1 timbl 81: }
2.11 frystyk 82: return NO; /* object not found or NULL list */
1.1 timbl 83: }
84:
2.17 frystyk 85: PUBLIC void * HTList_removeLastObject (HTList * me)
1.1 timbl 86: {
2.17 frystyk 87: if (me && me->next) {
88: HTList *lastNode = me->next;
89: void * lastObject = lastNode->object;
90: me->next = lastNode->next;
2.20 frystyk 91: HT_FREE(lastNode);
2.17 frystyk 92: return lastObject;
93: } else /* Empty list */
94: return NULL;
95: }
96:
97: PUBLIC void * HTList_removeFirstObject (HTList * me)
98: {
99: if (me && me->next) {
100: HTList * prevNode;
101: void *firstObject;
102: while (me->next) {
103: prevNode = me;
104: me = me->next;
105: }
106: firstObject = me->object;
107: prevNode->next = NULL;
2.20 frystyk 108: HT_FREE(me);
2.17 frystyk 109: return firstObject;
110: } else /* Empty list */
111: return NULL;
1.1 timbl 112: }
113:
2.17 frystyk 114: PUBLIC int HTList_count (HTList * me)
1.1 timbl 115: {
2.17 frystyk 116: int count = 0;
117: if (me)
118: while ((me = me->next))
119: count++;
120: return count;
1.1 timbl 121: }
122:
2.17 frystyk 123: PUBLIC int HTList_indexOf (HTList * me, void * object)
1.1 timbl 124: {
2.17 frystyk 125: if (me) {
126: int position = 0;
127: while ((me = me->next)) {
128: if (me->object == object)
129: return position;
130: position++;
131: }
1.1 timbl 132: }
2.17 frystyk 133: return -1;
1.1 timbl 134: }
135:
2.17 frystyk 136: PUBLIC void * HTList_objectAt (HTList * me, int position)
1.1 timbl 137: {
2.17 frystyk 138: if (position < 0)
139: return NULL;
140: if (me) {
141: while ((me = me->next)) {
142: if (position == 0)
143: return me->object;
144: position--;
145: }
1.1 timbl 146: }
2.17 frystyk 147: return NULL; /* Reached the end of the list */
1.1 timbl 148: }
2.10 frystyk 149:
2.17 frystyk 150: PUBLIC void * HTList_removeObjectAt (HTList * me, int position)
2.10 frystyk 151: {
2.17 frystyk 152: if (position < 0)
153: return NULL;
154: if (me) {
155: HTList * prevNode;
156: prevNode = me;
157: while ((me = me->next)) {
158: if (position == 0) {
159: prevNode->next = me->next;
160: return me->object;
161: }
162: prevNode = me;
163: position--;
164: }
2.10 frystyk 165: }
2.17 frystyk 166: return NULL; /* Reached the end of the list */
2.10 frystyk 167: }
Webmaster