home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume38 / menushell / part03 / dl.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-30  |  2.4 KB  |  72 lines

  1. /* ============================== dl.h ============================== */
  2. #ifndef DL_H
  3. #define DL_H    /* so it isn't included more than once */
  4.  
  5. #ifndef TRUE
  6. #define TRUE    1
  7. #define FALSE    0
  8. #endif
  9.  
  10. /*
  11.  * Template for other "derived" node types.  We assume a struct dl_node is at
  12.  * the front of the derived type.  Thus dl.c knows nothing about user data.
  13.  */
  14. typedef struct dl_node {
  15.         struct dl_node *next;
  16.         struct dl_node *prev;
  17.         int size;                       /* number of bytes of data following */
  18. } DL_NODE;
  19.  
  20. /*
  21.  * Structure to refer to a doubly-linked list.
  22.  */
  23. typedef struct dl {
  24.         DL_NODE *head;
  25.         DL_NODE *tail;
  26.         DL_NODE *curr;
  27.         int size;                       /* number of nodes in list */
  28.         int flags;
  29. } *DLIST;
  30.  
  31. char *getnode();
  32. DLIST dl_create(), dl_copy();
  33. DL_NODE **dl_l2a();
  34.  
  35. #define dl_head(dl)        ((void *) ((dl)->head))
  36. #define dl_tail(dl)        ((void *) ((dl)->tail))
  37. #define dl_curr(dl)        ((void *) ((dl)->curr))
  38. #define dl_size(dl)        ((dl)->size)
  39. #define dl_flags(dl)        ((dl)->flags)
  40. #define dl_prev(dl)        ((void *) ((dl)->curr->prev))
  41. #define dl_next(dl)        ((void *) ((dl)->curr->next))
  42. #define dl_set(dl, n)        ((void *) ((dl)->curr = (DL_NODE *) (n)))
  43. #define dl_shead(dl)        ((void *) (dl_set(dl, dl_head(dl))))
  44. #define dl_stail(dl)        ((void *) (dl_set(dl, dl_tail(dl))))
  45. #define dl_snext(dl)        ((void *) (dl_set(dl, dl_next(dl))))
  46. #define dl_sprev(dl)        ((void *) (dl_set(dl, dl_prev(dl))))
  47. #define dl_nextof(n)        ((void *) (((DL_NODE *)(n))->next))
  48. #define dl_prevof(n)        ((void *) (((DL_NODE *)(n))->prev))
  49. #define dl_sflags(dl,f)        ((dl)->flags = (f))
  50. #define dl_searchlist(l,key,func)  (dl_lsearch(l, dl_head(l), NULL, key, func))
  51. #define dl_delete(l)        (dl_delete_node(l, dl_curr(l)))
  52. #define dl_detach(l)        (dl_detach_node(l, dl_curr(l)))
  53. #define dl_ins_after(l, n)    (dl_ins_after_node(l, dl_curr(l), n))
  54. #define dl_ins_before(l, n)    (dl_ins_before_node(l, dl_curr(l), n))
  55. #define dl_append(l, n)        (dl_ins_after_node(l, dl_tail(l), n))
  56. #define dl_prepend(l, n)    (dl_ins_before_node(l, dl_head(l), n))
  57. #define dl_split(l, n)        (dl_split_at_node(l, dl_curr(l)))
  58.  
  59. /* Whether to free() nodes upon deletion or not. */
  60. #define DL_FREE         1
  61. #define DL_NOFREE       0
  62.  
  63. #ifndef NULL
  64. #define NULL    (0)
  65. #endif
  66.  
  67. #define NIL     ((void *) 0)            /* for passing as param */
  68.  
  69. #define foreach(l)        for (dl_shead(l); dl_curr(l); dl_snext(l))
  70. #define foreachnode(l,p)    for ((p)=dl_shead(l); (p); (p)=dl_snext(l))
  71. #endif
  72.