6 dtepack(Fmt *f, DTExpr *e)
10 fmtprint(f, "e%d\n", e->n);
11 for(i = 0; i < e->n; i++)
12 fmtprint(f, "%#.8ux\n", e->b[i]);
16 dtgpack(Fmt *f, DTActGr *g)
20 fmtprint(f, "g%ud\n", g->id);
25 fmtprint(f, "a%d\n", g->nact);
26 for(i = 0; i < g->nact; i++){
27 fmtprint(f, "t%d\n", g->acts[i].type);
28 fmtprint(f, "s%d\n", g->acts[i].size);
29 dtepack(f, g->acts[i].p);
30 switch(g->acts[i].type){
33 fmtprint(f, "A%#.8ux\n", g->acts[i].agg.id);
41 dtclpack(Fmt *f, DTClause *c)
45 fmtprint(f, "c%d\n", c->nprob);
46 for(i = 0; i < c->nprob; i++)
47 fmtprint(f, "%s\n", c->probs[i]);
52 u32unpack(char *s, u32int *np)
56 *np = strtoul(s, &r, 0);
57 if(r == s || *r != '\n') return nil;
62 dteunpack(char *s, DTExpr **rp)
69 if(*s++ != 'e') return nil;
71 if(s == nil) return nil;
72 e = dtmalloc(sizeof(DTExpr) + n * sizeof(u32int));
74 e->b = (void*)(e + 1);
75 for(i = 0; i < n; i++){
76 s = u32unpack(s, &e->b[i]);
92 for(i = 0; i < g->nact; i++)
101 dtgunpack(char *s, DTActGr **rp)
108 g = dtmalloc(sizeof(DTActGr));
111 if(*s++ != 'g') goto fail;
112 s = u32unpack(s, &g->id);
113 if(s == nil) goto fail;
117 s = dteunpack(s, &g->pred);
118 if(s == nil) goto fail;
121 s = u32unpack(s, &n);
122 if(s == nil) goto fail;
123 g->acts = dtmalloc(n * sizeof(DTAct));
125 for(i = 0; i < n; i++){
126 if(*s++ != 't') goto fail;
127 s = u32unpack(s, (u32int *) &g->acts[i].type);
128 if(s == nil) goto fail;
129 if(*s++ != 's') goto fail;
130 s = u32unpack(s, (u32int *) &g->acts[i].size);
131 if(s == nil) goto fail;
132 s = dteunpack(s, &g->acts[i].p);
133 if(s == nil) goto fail;
134 switch(g->acts[i].type){
136 g->reclen += g->acts[i].size;
139 g->reclen += g->acts[i].size;
142 if(*s++ != 'A') goto fail;
143 s = u32unpack(s, (u32int *) &g->acts[i].agg.id);
144 if(s == nil) goto fail;
147 if(*s++ != 'A') goto fail;
148 s = u32unpack(s, (u32int *) &g->acts[i].agg.id);
149 if(s == nil) goto fail;
169 dtclunpack(char *s, DTClause **rp)
176 c = dtmalloc(sizeof(DTClause));
177 if(*s++ != 'c') goto fail;
178 s = u32unpack(s, (u32int*) &c->nprob);
179 if(s == nil) goto fail;
180 c->probs = dtmalloc(sizeof(char *) * c->nprob);
181 for(i = 0; i < c->nprob; i++){
183 if(e == nil) goto fail;
184 c->probs[i] = dtmalloc(e - s + 1);
185 memmove(c->probs[i], s, e - s);
188 s = dtgunpack(s, &c->gr);
189 if(s == nil) goto fail;
198 dtclfree(DTClause *c)
203 if(c->gr != nil && --c->gr->ref == 0)
205 for(i = 0; i < c->nprob; i++)