|
|
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[] = "@(#)lstInsert.c 5.3 (Berkeley) 6/1/90"; ! 25: #endif /* not lint */ ! 26: ! 27: /*- ! 28: * LstInsert.c -- ! 29: * Insert a new datum before an old one ! 30: */ ! 31: ! 32: #include "lstInt.h" ! 33: ! 34: /*- ! 35: *----------------------------------------------------------------------- ! 36: * Lst_Insert -- ! 37: * Insert a new node with the given piece of data before the given ! 38: * node in the given list. ! 39: * ! 40: * Results: ! 41: * SUCCESS or FAILURE. ! 42: * ! 43: * Side Effects: ! 44: * the firstPtr field will be changed if ln is the first node in the ! 45: * list. ! 46: * ! 47: *----------------------------------------------------------------------- ! 48: */ ! 49: ReturnStatus ! 50: Lst_Insert (l, ln, d) ! 51: Lst l; /* list to manipulate */ ! 52: LstNode ln; /* node before which to insert d */ ! 53: ClientData d; /* datum to be inserted */ ! 54: { ! 55: register ListNode nLNode; /* new lnode for d */ ! 56: register ListNode lNode = (ListNode)ln; ! 57: register List list = (List)l; ! 58: ! 59: ! 60: /* ! 61: * check validity of arguments ! 62: */ ! 63: if (LstValid (l) && (LstIsEmpty (l) && ln == NILLNODE)) ! 64: goto ok; ! 65: ! 66: if (!LstValid (l) || LstIsEmpty (l) || !LstNodeValid (ln, l)) { ! 67: return (FAILURE); ! 68: } ! 69: ! 70: ok: ! 71: PAlloc (nLNode, ListNode); ! 72: ! 73: nLNode->datum = d; ! 74: nLNode->useCount = nLNode->flags = 0; ! 75: ! 76: if (ln == NILLNODE) { ! 77: if (list->isCirc) { ! 78: nLNode->prevPtr = nLNode->nextPtr = nLNode; ! 79: } else { ! 80: nLNode->prevPtr = nLNode->nextPtr = NilListNode; ! 81: } ! 82: list->firstPtr = list->lastPtr = nLNode; ! 83: } else { ! 84: nLNode->prevPtr = lNode->prevPtr; ! 85: nLNode->nextPtr = lNode; ! 86: ! 87: if (nLNode->prevPtr != NilListNode) { ! 88: nLNode->prevPtr->nextPtr = nLNode; ! 89: } ! 90: lNode->prevPtr = nLNode; ! 91: ! 92: if (lNode == list->firstPtr) { ! 93: list->firstPtr = nLNode; ! 94: } ! 95: } ! 96: ! 97: return (SUCCESS); ! 98: } ! 99:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.