]> andersk Git - splint.git/blob - test/db1/dbase.c
noexpand always false.
[splint.git] / test / db1 / dbase.c
1 # include <strings.h>
2 # include "dbase.h"
3
4 # define firstERC mMGRS
5 # define lastERC fNON
6 # define numERCS (lastERC - firstERC + 1)
7
8 typedef enum
9 {
10   mMGRS, fMGRS, mNON, fNON
11 } employeeKinds;
12
13 erc db[numERCS];
14
15 bool initDone = FALSE;
16
17 void db_initMod (void)
18 {
19   int i;
20   
21   if (initDone)
22     {
23       return;
24     }
25   
26   bool_initMod ();
27   employee_initMod ();
28   eref_initMod ();
29   erc_initMod ();
30   empset_initMod ();
31   
32   for (i = firstERC; i <= lastERC; i++)
33     {
34       db[i] = erc_create ();
35     }
36   
37   initDone = TRUE;
38 }
39
40 eref _db_ercKeyGet (erc c, int key) 
41 {
42   eref er;
43   ercIter it;
44   
45   for_ercElems (er, it, c)
46     {
47       if (eref_get (er).ssNum == key)
48         {
49           erc_iterReturn (it, er);
50         }
51     }
52   
53   return erefNIL;
54 }
55
56 eref _db_keyGet (int key)
57 {
58   int i;
59   eref er;
60   
61   for (i = firstERC; i <= lastERC; i++)
62     {
63       er = _db_ercKeyGet (db[i], key);
64       if (!eref_equal (er, erefNIL))
65         {
66           return er;
67         }
68     }
69   
70   return erefNIL;
71 }
72
73 int _db_addEmpls (erc c, int l, int h, empset s)
74 {
75   eref er;
76   ercIter it;
77   employee e;
78   int numAdded;
79   numAdded = 0;
80   
81   for_ercElems (er, it, c)
82     {
83       e = eref_get (er);
84       if ((e.salary >= l) && (e.salary <= h))
85         {
86           empset_insert (s, e);
87           numAdded++;
88         }
89     }
90   
91   return numAdded;
92 }
93
94 db_status hire (employee e)
95 {
96   if (e.gen == gender_ANY)
97     return genderERR;
98
99   if (e.j == job_ANY)
100     return jobERR;
101
102   if (e.salary < 0)
103     return salERR;
104
105   if (!eref_equal (_db_keyGet (e.ssNum), erefNIL))
106     return duplERR;
107
108   uncheckedHire (e);
109   return db_OK;
110 }
111
112 void uncheckedHire (employee e)
113 {
114   eref er;
115   
116   er = eref_alloc ();
117   eref_assign (er, e);
118   
119   if (e.gen == MALE)
120     if (e.j == MGR)
121       erc_insert (db[mMGRS], er);
122     else
123       erc_insert (db[mNON], er);
124   else
125     if (e.j == MGR)
126       erc_insert (db[fMGRS], er);
127     else
128       erc_insert (db[fNON], er);
129 }
130
131 bool fire (int ssNum)
132 {
133   int i;
134   eref er;
135   ercIter it;
136   
137   for (i = firstERC; i <= lastERC; i++)
138     for_ercElems (er, it, db[i])
139       if (eref_get (er).ssNum == ssNum)
140         {
141           erc_iterFinal (it);
142           erc_delete (db[i], er);
143           return TRUE;
144         }
145   
146   return FALSE;
147 }
148
149 bool promote (int ssNum)
150 {
151   eref er;
152   employee e;
153   gender g;
154   
155   g = MALE;
156   er = _db_ercKeyGet (db[mNON], ssNum);
157   
158   if (eref_equal (er, erefNIL))
159     {
160       er = _db_ercKeyGet (db[fNON], ssNum);
161       if (eref_equal (er, erefNIL))
162         return FALSE;
163       g = FEMALE;
164     }
165   
166   e = eref_get (er);
167   e.j = MGR;
168   eref_assign (er, e);
169   
170   if (g == MALE)
171     {
172       erc_delete (db[mNON], er);
173       erc_insert (db[mMGRS], er);
174     } 
175   else
176     {
177       erc_delete (db[fNON], er);
178       erc_insert (db[fMGRS], er);
179     }
180   
181   return TRUE;
182 }
183
184 db_status setSalary (int ssNum, int sal)
185 {
186   eref er;
187   employee e;
188   
189   if (sal < 0)
190     {
191       return salERR;
192     }
193
194   er = _db_keyGet (ssNum);
195
196   if (eref_equal (er, erefNIL))
197     {
198       return missERR;
199     }
200
201   e = eref_get (er);
202   e.salary = sal;
203   eref_assign (er, e);
204
205   return db_OK;
206 }
207
208 int query (db_q q, empset s)
209 {
210   eref er;             
211   employee e;           
212   int numAdded;
213   int l, h;
214   int i;
215
216   l = q.l;
217   h = q.h;
218
219   switch (q.g)
220     {
221     case gender_ANY:
222       switch (q.j)
223         {
224         case job_ANY:
225           numAdded = 0;
226           for (i = firstERC; i <= lastERC; i++)
227             numAdded += _db_addEmpls (db[i], l, h, s);
228           return numAdded;
229         case MGR:
230           numAdded = _db_addEmpls (db[mMGRS], l, h, s);
231           numAdded += _db_addEmpls (db[fMGRS], l, h, s);
232           return numAdded;
233         case NONMGR:
234           numAdded = _db_addEmpls (db[mNON], l, h, s);
235           numAdded += _db_addEmpls (db[fNON], l, h, s);
236           return numAdded;
237         }
238     case MALE:
239       switch (q.j)
240         {
241         case job_ANY:
242           numAdded = _db_addEmpls (db[mMGRS], l, h, s);
243           numAdded += _db_addEmpls (db[mNON], l, h, s);
244           return numAdded;
245         case MGR:
246           return _db_addEmpls (db[mMGRS], l, h, s);
247         case NONMGR:
248           return _db_addEmpls (db[mNON], l, h, s);
249         }
250     case FEMALE:
251       switch (q.j)
252         {
253         case job_ANY:
254           numAdded = _db_addEmpls (db[fMGRS], l, h, s);
255           numAdded += _db_addEmpls (db[fNON], l, h, s);
256           return numAdded;
257         case MGR:
258           return _db_addEmpls (db[fMGRS], l, h, s);
259         case NONMGR:
260           return _db_addEmpls (db[fNON], l, h, s);
261         }
262     }
263 }
264
265 void db_print (void)
266 {
267   int i;
268   char *printVal;
269   
270   printf ("Employees:\n");
271
272   for (i = firstERC; i <= lastERC; i++)
273     {
274       printVal = erc_sprint (db[i]);
275       printf ("%s", printVal);
276       free (printVal);
277     }
278 }
This page took 0.060464 seconds and 5 git commands to generate.