free ((Address)l2);
free(l2);
Lst_Concat (l1, l2, flags)    Lst    	  	l1; 	/* The list to which l2 is to be appended */    Lst    	  	l2; 	/* The list to append to l1 */    int	   	  	flags;  /* LST_CONCNEW if LstNode's should be duplicated				 * LST_CONCLINK if should just be relinked */{    register ListNode  	ln;     /* original LstNode */    register ListNode  	nln;    /* new LstNode */    register ListNode  	last;   /* the last element in the list. Keeps				 * bookkeeping until the end */    register List 	list1 = (List)l1;    register List 	list2 = (List)l2;    if (!LstValid (l1) || !LstValid (l2)) {	return;    }    if (flags == LST_CONCLINK) {	if (list2->firstPtr != NULL) {	    /*	     * We set the nextPtr of the	     * last element of list two to be NULL to make the loop easier and	     * so we don't need an extra case should the first list turn	     * out to be non-circular -- the final element will already point	     * to NULL space and the first element will be untouched if it	     * existed before and will also point to NULL space if it didn't.	     */	    list2->lastPtr->nextPtr = NULL;	    /*	     * So long as the second list isn't empty, we just link the	     * first element of the second list to the last element of the	     * first list. If the first list isn't empty, we then link the	     * last element of the list to the first element of the second list	     * The last element of the second list, if it exists, then becomes	     * the last element of the first list.	     */	    list2->firstPtr->prevPtr = list1->lastPtr;	    if (list1->lastPtr != NULL) { 		list1->lastPtr->nextPtr = list2->firstPtr;	    } else {		list1->firstPtr = list2->firstPtr;	    }	    list1->lastPtr = list2->lastPtr;	}	free ((Address)l2);    } else if (list2->firstPtr != NULL) {	/*	 * We set the nextPtr of the last element of list 2 to be NULL to make	 * the loop less difficult. The loop simply goes through the entire	 * second list creating new LstNodes and filling in the nextPtr, and	 * prevPtr to fit into l1 and its datum field from the	 * datum field of the corresponding element in l2. The 'last' node	 * follows the last of the new nodes along until the entire l2 has	 * been appended. Only then does the bookkeeping catch up with the	 * changes. During the first iteration of the loop, if 'last' is NULL,	 * the first list must have been empty so the newly-created node is	 * made the first node of the list.	 */	list2->lastPtr->nextPtr = NULL;	for (last = list1->lastPtr, ln = list2->firstPtr;	     ln != NULL;	     ln = ln->nextPtr)	{	    PAlloc (nln, ListNode);	    nln->datum = ln->datum;	    if (last != NULL) {		last->nextPtr = nln;	    } else {		list1->firstPtr = nln;	    }	    nln->prevPtr = last;	    nln->flags = nln->useCount = 0;	    last = nln;	}	/*	 * Finish bookkeeping. The last new element becomes the last element	 * of list one.	 */	list1->lastPtr = last;	last->nextPtr = NULL;	list2->lastPtr->nextPtr = list2->firstPtr;    }}