Graphviz  2.41.20171026.1811
dtrestore.c
Go to the documentation of this file.
1 #include "dthdr.h"
2 
3 /* Restore dictionary from given tree or list of elements.
4 ** There are two cases. If called from within, list is nil.
5 ** From without, list is not nil and data->size must be 0.
6 **
7 ** Written by Kiem-Phong Vo (5/25/96)
8 */
9 
10 int dtrestore(reg Dt_t* dt, reg Dtlink_t* list)
11 {
12  reg Dtlink_t *t, **s, **ends;
13  reg int type;
14  reg Dtsearch_f searchf = dt->meth->searchf;
15 
16  type = dt->data->type&DT_FLATTEN;
17  if(!list) /* restoring a flattened dictionary */
18  { if(!type)
19  return -1;
20  list = dt->data->here;
21  }
22  else /* restoring an extracted list of elements */
23  { if(dt->data->size != 0)
24  return -1;
25  type = 0;
26  }
27  dt->data->type &= ~DT_FLATTEN;
28 
29  if(dt->data->type&(DT_SET|DT_BAG))
30  { dt->data->here = NIL(Dtlink_t*);
31  if(type) /* restoring a flattened dictionary */
32  { for(ends = (s = dt->data->htab) + dt->data->ntab; s < ends; ++s)
33  { if((t = *s) )
34  { *s = list;
35  list = t->right;
36  t->right = NIL(Dtlink_t*);
37  }
38  }
39  }
40  else /* restoring an extracted list of elements */
41  { dt->data->size = 0;
42  while(list)
43  { t = list->right;
44  (*searchf)(dt,(void*)list,DT_RENEW);
45  list = t;
46  }
47  }
48  }
49  else
50  { if(dt->data->type&(DT_OSET|DT_OBAG))
51  dt->data->here = list;
52  else /*if(dt->data->type&(DT_LIST|DT_STACK|DT_QUEUE))*/
53  { dt->data->here = NIL(Dtlink_t*);
54  dt->data->head = list;
55  }
56  if(!type)
57  dt->data->size = -1;
58  }
59 
60  return 0;
61 }
#define reg
Definition: dthdr.h:14
#define DT_SET
Definition: cdt.h:125
#define DT_BAG
Definition: cdt.h:126
#define NIL(t)
Definition: dthdr.h:13
#define DT_OSET
Definition: cdt.h:127
Definition: grammar.c:79
#define DT_OBAG
Definition: cdt.h:128
void *(* Dtsearch_f)(Dt_t *, void *, int)
Definition: cdt.h:37
CDT_API int dtrestore(Dt_t *, Dtlink_t *)
#define DT_FLATTEN
Definition: dthdr.h:22
Definition: cdt.h:99
#define DT_RENEW
Definition: cdt.h:145