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