/
2.0.4beta/doc/
2.0.4beta/gnu/
2.0.4beta/sha/
#include "config.h"

/* 
 * List_Verify.c --
 *
 *	Description.
 *
 * Copyright 1992 Regents of the University of California
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that this copyright
 * notice appears in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 */

#include <stdio.h>

#include "list.h"

#define LIST_NIL ((List_Links *) NIL)

/*
 *----------------------------------------------------------------------
 *
 * List_Verify --
 *
 *	Verifies that the given list isn't corrupted. The descriptionPtr
 *	should be at least 80 characters.
 *
 * Results:
 *	0 if the list looks ok, 1 otherwise. If 1 is
 *	returned then a description is returned in the descriptionPtr
 *	array.
 *
 * Side effects:
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
List_Verify(headerPtr, descriptionPtr)
    List_Links	*headerPtr; 	/* Header of list to check. */
    char	*descriptionPtr;/* Description of what went wrong. */
{
    List_Links	*itemPtr;
    List_Links	*prevPtr;
    List_Links	*nextPtr;
    int		index;

    if ((List_Prev(headerPtr) == LIST_NIL) || (List_Prev(headerPtr) == NULL)) {
	sprintf(descriptionPtr,
	    "Header prevPtr is bogus: 0x%p.\n", List_Prev(headerPtr));
	return 1;
    }
    if ((List_Next(headerPtr) == LIST_NIL) || (List_Next(headerPtr) == NULL)) {
	sprintf(descriptionPtr, 
	    "Header nextPtr is bogus: 0x%p.\n", List_Next(headerPtr));
	return 1;
    }
    itemPtr = List_First(headerPtr);
    prevPtr = headerPtr;
    index = 1;
    while(List_IsAtEnd(headerPtr, itemPtr)) {
	if (List_Prev(itemPtr) != prevPtr) {
	    sprintf(descriptionPtr, 
		"Item %d doesn't point back at previous item.\n", index);
	    return 1;
	}
	nextPtr = List_Next(itemPtr);
	if ((nextPtr == LIST_NIL) || (nextPtr == NULL)) {
	    sprintf(descriptionPtr, 
		"Item %d nextPtr is bogus: 0x%p.\n", index, nextPtr);
	    return 1;
	}
	if (List_Prev(nextPtr) != itemPtr) {
	    sprintf(descriptionPtr,
		"Next item doesn't point back at item %d.\n", index);
	    return 1;
	}
	prevPtr = itemPtr;
	itemPtr = nextPtr;
	index++;
    }
    return 0;
}