Initial checking of the libpng library.
[oota-llvm.git] / utils / Burg / map.c
1 char rcsid_map[] = "$Id$";
2
3 #include <stdio.h>
4 #include <string.h>
5 #include "b.h"
6 #include "fe.h"
7
8 Mapping globalMap;
9
10 static void growMapping ARGS((Mapping));
11 static int hash ARGS((Item_Set, int));
12
13 Mapping
14 newMapping(size) int size;
15 {
16         Mapping m;
17
18         m = (Mapping) zalloc(sizeof(struct mapping));
19         assert(m);
20
21         m->count = 0;
22         m->hash = (List*) zalloc(size * sizeof(List));
23         m->hash_size = size;
24         m->max_size = STATES_INCR;
25         m->set = (Item_Set*) zalloc(m->max_size * sizeof(Item_Set));
26         assert(m->set);
27
28         return m;
29 }
30
31 static void
32 growMapping(m) Mapping m;
33 {
34         Item_Set *tmp;
35
36         m->max_size += STATES_INCR;
37         tmp = (Item_Set*) zalloc(m->max_size * sizeof(Item_Set));
38         memcpy(tmp, m->set, m->count * sizeof(Item_Set));
39         zfree(m->set);
40         m->set = tmp;
41 }
42
43 static int
44 hash(ts, mod) Item_Set ts; int mod;
45 {
46         register Item *p = ts->virgin;
47         register int v;
48         register Relevant r = ts->relevant;
49         register int nt;
50
51         if (!ts->op) {
52                 return 0;
53         }
54
55         v = 0;
56         for (; (nt = *r) != 0; r++) {
57                 v ^= ((long)p[nt].rule) + (PRINCIPLECOST(p[nt].delta)<<4);
58         }
59         v >>= 4;
60         v &= (mod-1);
61         return v;
62 }
63
64 Item_Set
65 encode(m, ts, new) Mapping m; Item_Set ts; int *new;
66 {
67         int h;
68         List l;
69
70         assert(m);
71         assert(ts);
72         assert(m->count <= m->max_size);
73
74         if (grammarNts && errorState && m == globalMap) {
75                 List l;
76                 int found;
77
78                 found = 0;
79                 for (l = grammarNts; l; l = l->next) {
80                         Symbol s;
81                         s = (Symbol) l->x;
82
83                         if (ts->virgin[s->u.nt->num].rule) {
84                                 found = 1;
85                                 break;
86                         }
87                 }
88                 if (!found) {
89                         *new = 0;
90                         return errorState;
91                 }
92         }
93
94         *new = 0;
95         h = hash(ts, m->hash_size);
96         for (l = m->hash[h]; l; l = l->next) {
97                 Item_Set s = (Item_Set) l->x;
98                 if (ts->op == s->op && equivSet(ts, s)) {
99                         ts->num = s->num;
100                         return s;
101                 }
102         }
103         if (m->count >= m->max_size) {
104                 growMapping(m);
105         }
106         assert(m->count < m->max_size);
107         m->set[m->count] = ts;
108         ts->num = m->count++;
109         *new = 1;
110         m->hash[h] = newList(ts, m->hash[h]);
111         return ts;
112 }
113
114 Item_Set
115 decode(m, t) Mapping m; ItemSetNum t;
116 {
117         assert(m);
118         assert(t);
119         assert(m->count < m->max_size);
120         assert(t < m->count);
121
122         return m->set[t];
123 }
124
125 void
126 dumpMapping(m) Mapping m;
127 {
128         int i;
129
130         printf("BEGIN Mapping: Size=%d\n", m->count);
131         for (i = 0; i < m->count; i++) {
132                 dumpItem_Set(m->set[i]);
133         }
134         printf("END Mapping\n");
135 }