/*
  dlist.h

  (c) Copyright 1989 by David M. Siegel and Sundar Narasimhan.
      All rights reserved.
*/

#include <stdtypes.h> 

#ifndef INCdlisth
#define INCdlisth 1

#define DLIST_ASCENDING	    -1   /* Is this ever used ? */
#define DLIST_DESCENDING     1   /* Is this ever used ? */

typedef struct _dnode {
    struct _dnode *next;
    struct _dnode *previous;
    char *value;
} DNODE;

typedef struct _dlist {
    int32 count;
    int32 (*cmp_func)();
    int32 (*free_func)();
    DNODE *head;
    DNODE *tail;
} DLIST;

#define dlist_dnode_value(x) ((x == 0) ? 0 : x->value)


extern DLIST *dlist_add();
extern DLIST *dlist_add_dnode();
extern DLIST *dlist_add_first();
extern DLIST *dlist_append(); 
extern char  *dlist_car(); 
extern DLIST *dlist_cdr(); 
extern DLIST *dlist_delete(); 
extern DLIST *dlist_delete_first();
extern DLIST *dlist_delete_last(); 
extern char  *dlist_delete_next();
extern DLIST *dlist_delete_with_function();
extern DLIST *dlist_filter(); 
extern DLIST *dlist_filter_with_function(); 
extern char  *dlist_find(); 
extern char  *dlist_first(); 
extern DNODE *dlist_first_dnode();
extern DLIST *dlist_insert();
extern char  *dlist_last(); 
extern DNODE *dlist_last_dnode();
extern DLIST *dlist_make();
extern DNODE *dlist_make_dnode();
extern char  *dlist_next();
extern DNODE *dlist_next_dnode();
extern char  *dlist_nth(); 
extern DNODE *dlist_nth_dnode();
extern char  *dlist_pop();
extern DLIST *dlist_push(); 
extern DLIST *dlist_push_new();

/*VARARGS*/
int dlist_map();

#ifdef __RPC_HEADER__
bool_t xdr_dlist();
#endif

#endif
