BSD 4_3_Reno release
[unix-history] / usr / src / usr.bin / make / lst.lib / lstInsert.c
CommitLineData
bb2109e7
KB
1/*
2 * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
3 * All rights reserved.
c65fedcf 4 *
bb2109e7
KB
5 * This code is derived from software contributed to Berkeley by
6 * Adam de Boor.
c65fedcf 7 *
1c15e888
C
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.
c65fedcf 21 */
bb2109e7 22
c65fedcf 23#ifndef lint
1c15e888 24static char sccsid[] = "@(#)lstInsert.c 5.3 (Berkeley) 6/1/90";
bb2109e7
KB
25#endif /* not lint */
26
27/*-
28 * LstInsert.c --
29 * Insert a new datum before an old one
30 */
c65fedcf
KB
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 */
49ReturnStatus
50Lst_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