]> andersk Git - splint.git/blame - test/db1/dbase.c
noexpand always false.
[splint.git] / test / db1 / dbase.c
CommitLineData
885824d3 1# include <strings.h>
2# include "dbase.h"
3
4# define firstERC mMGRS
5# define lastERC fNON
6# define numERCS (lastERC - firstERC + 1)
7
8typedef enum
9{
10 mMGRS, fMGRS, mNON, fNON
11} employeeKinds;
12
13erc db[numERCS];
14
15bool initDone = FALSE;
16
17void 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
40eref _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
56eref _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
73int _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
94db_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
112void 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
131bool 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
149bool 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
184db_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
208int 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
265void 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.103573 seconds and 5 git commands to generate.