home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / lr.zip / X.INC < prev   
Text File  |  1993-05-15  |  10KB  |  193 lines

  1. /*
  2. _____________________________________________________________
  3. Object connector
  4. Philip R Brenan,  Transcendental Automation,  1992,  800-FOR-PHIL
  5. _____________________________________________________________
  6. */
  7.  
  8. /*
  9. **      Last revision - Serge Kovalyov, February 1993.
  10. **      Tree extract routine prototype & macros added.
  11. */
  12.  
  13. #ifndef X_INC
  14. #define X_INC
  15. #define x_vector_show 32
  16. /*
  17. _____________________________________________________________
  18. Object connectors
  19. _____________________________________________________________
  20. */
  21. typedef  struct XL
  22.  {struct Xl *f, *l;
  23.   void      *d;
  24.  } XL;
  25.  
  26. typedef  struct Xl
  27.  {struct Xl *n, *p;
  28.   struct XL *u;
  29.   void      *d;
  30.  } Xl;
  31.  
  32. typedef  struct XT
  33.  {struct Xt *td;
  34.   void      *d;
  35.  } XT;
  36.  
  37. typedef  struct Xt
  38.  {struct Xt *tl, *tr, *tu;
  39.   struct XT *u;
  40.   void      *d;
  41.   char      *k;
  42.   int        color:1;
  43.  } Xt;
  44.  
  45. typedef  struct XV
  46.  {long   count;
  47.   long   k;
  48.   void  *d[x_vector_show];
  49.  } XV;
  50. /*
  51. _____________________________________________________________
  52. Object connection procedure declarations
  53. _____________________________________________________________
  54. */
  55. long  x_list_count      (XL *p);
  56. long  x_tree_count      (XT *p);
  57.  
  58. Xt   *x_tree_do_first   (XT *p, void **r);
  59. Xt   *x_tree_do_last    (XT *p, void **r);
  60. Xt   *x_tree_do_next    (Xt *q, void **r);
  61. Xt   *x_tree_do_prev    (Xt *q, void **r);
  62.  
  63. void *x_tree_get        (XT *p, char *k);
  64. void *x_tree_get_n      (XT *p, char *k, int n);
  65. void *x_tree_get_cmp    (XT *p, void *k, int (*cmp)());
  66. void *x_tree_get_int    (XT *p, char *k);
  67.  
  68. Xt   *x_tree_ext_balance(Xt *q);
  69.  
  70. /* Prototype for x_tree_print added */
  71.  
  72. void  x_tree_print      (Xt *p, int d);
  73.  
  74. void *x_vector_get      (XV *p, char *k);
  75. void *x_vector_get_int  (XV *p, char *k);
  76.  
  77. int   x_tree_put        (XT *p, Xt *q);
  78. int   x_tree_put_n      (XT *p, Xt *q,   int n);
  79. int   x_tree_put_cmp    (XT *p, Xt *q,   int (*cmp)());
  80. int   x_tree_put_int    (XT *p, Xt *q);
  81. void  x_tree_put_balance(XT *p, Xt *q);
  82. void  x_rotate_left     (XT *p, Xt *q);
  83. void  x_rotate_right    (XT *p, Xt *q);
  84.  
  85. int   x_cmp_tree_int    (XT *a, XT *b);
  86.  
  87. void *x_list_copy       (XL *p, void *a, long size);
  88. void *x_tree_copy       (XT *p, void *a, long size);
  89. XV   *x_list_vector     (XL *p, XV *V,   long d);
  90. XV   *x_tree_vector     (XT *p, XV *V,   long d, long k);
  91.  
  92. void  x_vector_relocate (XV **V, long r);
  93.  
  94. /* There, prototypes for x_*_do_all_* */
  95.  
  96. Xt   *x_tree_do_all_first(XT *q, void **r, long O);
  97. Xt   *x_tree_do_all_last(XT *q, void **r, long O);
  98. Xt   *x_tree_do_all_next(Xt *q, void **r, long O, long o);
  99. Xt   *x_tree_do_all_prev(Xt *q, void **r, long O, long o);
  100. Xl   *x_list_do_all_first(XL *q, void **r, long O);
  101. Xl   *x_list_do_all_last(XL *q, void **r, long O);
  102. Xl   *x_list_do_all_next(Xl *q, void **r, long O, long o);
  103. Xl   *x_list_do_all_prev(Xl *q, void **r, long O, long o);
  104.  
  105. void x_test_list_put    (void);
  106. void x_test_tree_put    (void);
  107. /*
  108. _____________________________________________________________
  109. Object connection macros
  110. _____________________________________________________________
  111. */
  112. #define x_list_do(a,b,c)   if (a && (b = ((XL *)a)->f)) for(c = (void *)b->d; b; b = b->n, b ? (c = (void *)b->d) : 0)
  113. #define x_list_od(a,b,c)   if (a && (b = ((XL *)a)->l)) for(c = (void *)b->d; b; b = b->p, b ? (c = (void *)b->d) : 0)
  114. #define x_list_from(a,b,c) if (a && (b = a))            for(c = (void *)b->d; b; b = b->n, b ? (c = (void *)b->d) : 0)
  115. #define x_list_current(a, b) (a = memcpy(&b, a, sizeof(Xl)))
  116.  
  117. #define x_tree_do(a,b,c)   if (a && ((XT *)a)->td)      for(b = x_tree_do_first((XT *)a, (void *)&c); b; b = x_tree_do_next(b, (void *)&c))
  118. #define x_tree_od(a,b,c)   if (a && ((XT *)a)->td)      for(b = x_tree_do_last ((XT *)a, (void *)&c); b; b = x_tree_do_prev(b, (void *)&c))
  119. #define x_tree_from(a,b,c)                              for(b = a;                                  ; b; b = x_tree_do_next(b, (void *)&c))
  120. #define x_tree_current(a, b) (a = memcpy(&b, a, sizeof(Xt)))
  121.  
  122. #define x_list_put_first(_p, _q)    (x_list_zap(_q), (_q)->u = (_p),    ((_p)->f ? ((_p)->f->p = (_q), (_q)->n = (_p)->f, (_p)->f = (_q))                 : ((_p)->f = (_p)->l = (_q))),                          (_p))
  123. #define x_list_put_last(_p, _q)     (x_list_zap(_q), (_q)->u = (_p),    ((_p)->f ? ((_p)->l->n = (_q), (_q)->p = (_p)->l, (_p)->l = (_q))                 : ((_p)->f = (_p)->l = (_q))),                          (_p))
  124. #define x_list_put_next(_p, _q)     (x_list_zap(_q), (_q)->u = (_p)->u, ((_p)->n ? ((_p)->n->p = (_q), (_q)->n = (_p)->n, (_q)->p = (_p), (_p)->n = (_q)) : ((_p)->n = (_q), (_q)->p = (_p), (_p)->u->l = (_q))), (_q))
  125. #define x_list_put_prev(_p, _q)     (x_list_zap(_q), (_q)->u = (_p)->u, ((_p)->p ? ((_p)->p->n = (_q), (_q)->p = (_p)->p, (_q)->n = (_p), (_p)->p = (_q)) : ((_p)->p = (_q), (_q)->n = (_p), (_p)->u->f = (_q))), (_q))
  126. #define x_list_ext(_q)              (((_q)->p ? ((_q)->p->n = (_q)->n) : ((_q)->u->f = (_q)->n)), ((_q)->n ? ((_q)->n->p = (_q)->p) : ((_q)->u->l = (_q)->p)),                                                    (_q))
  127. #define x_zap_list(_p)              ((_p)->f  = (_p)->l  = 0,                                (_p))
  128. #define x_list_zap(_p)              ((_p)->n  = (_p)->p  = 0, (_p)->u  = 0,                  (_p))
  129. #define x_zap_tree(_p)              ((_p)->td = 0,                                           (_p))
  130. #define x_tree_zap(_p)              ((_p)->tl = (_p)->tr = 0, (_p)->tu = 0, (_p)->color = 0, (_p))
  131.  
  132. #define X_DPTR_TO_PTR
  133.  
  134. #if (defined X_DPTR_TO_PTR)
  135. #define x_tree_do_all(a, O, o, b, c) if (a && a->O && ((XT *)a->O)->td) for(b = x_tree_do_all_first((XT *)a->O, (void *)&c, x_offset(c, O)); b; b = x_tree_do_all_next(b, (void *)&c, x_offset(c, O), x_offset(c, o)))
  136. #define x_tree_up(a, o, b, c) if (a) for(b = a->o, c = a; b; b = (b->u) ? *(Xt **)((char *)(b->u->d) + x_offset(a, o)) : 0, b ? (c = b->d) : 0)
  137. #endif
  138.  
  139. #ifdef X_DPTR_TO_PTR
  140. #define x_tree_od_all(a, O, o, b, c) if (a && a->O && ((XT *)a->O)->td) for(b = x_tree_do_all_last ((XT *)a->O, (void *)&c, x_offset(c, O)); b; b = x_tree_do_all_prev(b, (void *)&c, x_offset(c, O), x_offset(c, o)))
  141. #define x_list_do_all(a, O, o, b, c) if (a && a->O && ((XL *)a->O)->f)  for(b = x_list_do_all_first((XL *)a->O, (void *)&c, x_offset(c, O)); b; b = x_list_do_all_next(b, (void *)&c, x_offset(c, O), x_offset(c, o)))
  142. #define x_list_od_all(a, O, o, b, c) if (a && a->O && ((XL *)a->O)->l)  for(b = x_list_do_all_last ((XL *)a->O, (void *)&c, x_offset(c, O)); b; b = x_list_do_all_prev(b, (void *)&c, x_offset(c, O), x_offset(c, o)))
  143. #else
  144. #define x_tree_up(a, o, b, c)        if (a) for(b = a->o, c = a; b; b = (b->u) ? (Xt *)((char *)(b->u->d) + x_offset(a, o)) : 0, b ? (c = b->d) : 0)
  145. #define x_tree_do_all(a, O, o, b, c) if (a && a->O.td) for(b = x_tree_do_all_first(&a->O, (void *)&c, x_offset(c, O)); b; b = x_tree_do_all_next(b, (void *)&c, x_offset(c, O), x_offset(c, o)))
  146. #define x_tree_od_all(a, O, o, b, c) if (a && a->O.td) for(b = x_tree_do_all_last (&a->O, (void *)&c, x_offset(c, O)); b; b = x_tree_do_all_prev(b, (void *)&c, x_offset(c, O), x_offset(c, o)))
  147. #define x_list_do_all(a, O, o, b, c) if (a && a->O.f)  for(b = x_list_do_all_first(&a->O, (void *)&c, x_offset(c, O)); b; b = x_list_do_all_next(b, (void *)&c, x_offset(c, O), x_offset(c, o)))
  148. #define x_list_od_all(a, O, o, b, c) if (a && a->O.l)  for(b = x_list_do_all_last (&a->O, (void *)&c, x_offset(c, O)); b; b = x_list_do_all_prev(b, (void *)&c, x_offset(c, O), x_offset(c, o)))
  149. #endif
  150.  
  151. #define x_vector_do(a,b,c) if (a) for(b = 0,            c = a->d[b]; b <  a->count; ++b, c = a->d[b])
  152. #define x_vector_od(a,b,c) if (a) for(b = a->count - 1, c = a->d[b]; b >= 0;        --b, c = a->d[b])
  153.  
  154. /* In case you prefer x_tree_ext */
  155.  
  156. #define x_tree_ext     x_tree_ext_balance
  157.  
  158. /*
  159. _____________________________________________________________
  160. Object empty macros
  161. _____________________________________________________________
  162. */
  163. #define x_list_empty(X)   ((X) == 0 || (X)->f     == 0)
  164. #define x_tree_empty(X)   ((X) == 0 || (X)->td    == 0)
  165. #define x_vector_empty(X) ((X) == 0 || (X)->count == 0)
  166. /*
  167. _____________________________________________________________
  168. Object size macros
  169. _____________________________________________________________
  170. */
  171. #define x_list_vector_size(X) ((X)->f  ? sizeof(XV) + (x_list_count(X) - x_vector_show) * sizeof(void *) : 0)
  172. #define x_tree_vector_size(X) ((X)->td ? sizeof(XV) + (x_tree_count(X) - x_vector_show) * sizeof(void *) : 0)
  173. #define x_vector_size(N)      (sizeof(XV) + (N - x_vector_show) * sizeof(void *))
  174. /*
  175. _____________________________________________________________
  176. Object allocation macros
  177. _____________________________________________________________
  178. */
  179. #define x_LIST_alloc(m, s, D)       (s->D = m_alloc(m, sizeof(XL)), s->D->d = s,                                                   s)
  180. #define x_list_alloc(m, s, D, A, L) (s->D = m_alloc(m, sizeof(Xl)), s->D->d = s,                        x_list_put_##A##(L, s->D), s)
  181. #define x_list_ALLOC(m, s, D, A, L) (s    = m_alloc(m, sizeof(Xl)), s   ->d = D,                        x_list_put_##A##(L, s),    s)
  182. #define x_TREE_alloc(m, s, D)       (s->D = m_alloc(m, sizeof(XT)), s->D->d = s,                                                   s)
  183. #define x_tree_alloc(m, s, D, K, T) (s->D = m_alloc(m, sizeof(Xt)), s->D->d = s, s->D->k = s->K,        x_tree_put      (T, s->D), s)
  184. #define x_tree_ALLOC(m, s, D, K, T) (s    = m_alloc(m, sizeof(Xt)), s   ->d = D, s   ->k = (char *)(K), x_tree_put      (T, s),    s)
  185. #define x_tree_int(m,   s, D, K, T) (s->D = m_alloc(m, sizeof(Xt)), s->D->d = s, s->D->k = (char *)(K), x_tree_put_int  (T, s->D), s)
  186. /*
  187. _____________________________________________________________
  188. Object offsets
  189. _____________________________________________________________
  190. */
  191. #define x_offset(X, Y) ((char *)&X->Y - (char *)X)
  192.  
  193. #endif