]> andersk Git - splint.git/blob - test/db2/dbase.c
Temporarily set flags to splintme without warnings.
[splint.git] / test / db2 / 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   erc_elements(c, er)
43     {
44       if (eref_get(er).ssNum == key) return (er);
45     } end_erc_elements ;
46
47   return erefNIL;
48 }
49
50 eref _db_keyGet (int key)
51 {
52   int i;
53   eref er;
54   
55   for (i = firstERC; i <= lastERC; i++)
56     {
57       er = _db_ercKeyGet (db[i], key);
58       if (!eref_equal (er, erefNIL))
59         {
60           return er;
61         }
62     }
63   
64   return erefNIL;
65 }
66
67 int _db_addEmpls (erc c, int l, int h, empset s)
68 {
69   employee e;
70   int numAdded;
71   numAdded = 0;
72   
73   erc_elements (c, er) 
74     {
75       e = eref_get(er);
76       if ((e.salary >= l) && (e.salary <= h)) 
77         {
78           empset_insert(s, e);
79           numAdded++;
80         }
81     } end_erc_elements ;
82
83   return numAdded;
84 }
85
86 db_status hire (employee e)
87 {
88   if (e.gen == gender_ANY)
89     return genderERR;
90
91   if (e.j == job_ANY)
92     return jobERR;
93
94   if (e.salary < 0)
95     return salERR;
96
97   if (!eref_equal (_db_keyGet (e.ssNum), erefNIL))
98     return duplERR;
99
100   uncheckedHire (e);
101   return db_OK;
102 }
103
104 void uncheckedHire (employee e)
105 {
106   eref er;
107   
108   er = eref_alloc ();
109   eref_assign (er, e);
110   
111   if (e.gen == MALE)
112     if (e.j == MGR)
113       erc_insert (db[mMGRS], er);
114     else
115       erc_insert (db[mNON], er);
116   else
117     if (e.j == MGR)
118       erc_insert (db[fMGRS], er);
119     else
120       erc_insert (db[fNON], er);
121 }
122
123 bool fire (int ssNum)
124 {
125   int i;
126   
127   for (i = firstERC; i <= lastERC; i++)
128     {
129       erc_elements(db[i], er)
130         {
131           if (eref_get(er).ssNum == ssNum) 
132             {
133               erc_delete(db[i], er);
134               return TRUE;
135             } 
136         } end_erc_elements ;
137     }
138   
139   return FALSE;
140 }
141
142 bool promote (int ssNum)
143 {
144   eref er;
145   employee e;
146   gender g;
147   
148   g = MALE;
149   er = _db_ercKeyGet (db[mNON], ssNum);
150   
151   if (eref_equal (er, erefNIL))
152     {
153       er = _db_ercKeyGet (db[fNON], ssNum);
154       if (eref_equal (er, erefNIL))
155         return FALSE;
156       g = FEMALE;
157     }
158   
159   e = eref_get (er);
160   e.j = MGR;
161   eref_assign (er, e);
162   
163   if (g == MALE)
164     {
165       erc_delete (db[mNON], er);
166       erc_insert (db[mMGRS], er);
167     } 
168   else
169     {
170       erc_delete (db[fNON], er);
171       erc_insert (db[fMGRS], er);
172     }
173   
174   return TRUE;
175 }
176
177 db_status setSalary (int ssNum, int sal)
178 {
179   eref er;
180   employee e;
181   
182   if (sal < 0)
183     {
184       return salERR;
185     }
186
187   er = _db_keyGet (ssNum);
188
189   if (eref_equal (er, erefNIL))
190     {
191       return missERR;
192     }
193
194   e = eref_get (er);
195   e.salary = sal;
196   eref_assign (er, e);
197
198   return db_OK;
199 }
200
201 int query (db_q q, empset s)
202 {
203   int numAdded;
204   int l, h;
205   int i;
206
207   l = q.l;
208   h = q.h;
209
210   switch (q.g)
211     {
212     case gender_ANY:
213       switch (q.j)
214         {
215         case job_ANY:
216           numAdded = 0;
217           for (i = firstERC; i <= lastERC; i++)
218             numAdded += _db_addEmpls (db[i], l, h, s);
219           return numAdded;
220         case MGR:
221           numAdded = _db_addEmpls (db[mMGRS], l, h, s);
222           numAdded += _db_addEmpls (db[fMGRS], l, h, s);
223           return numAdded;
224         case NONMGR:
225           numAdded = _db_addEmpls (db[mNON], l, h, s);
226           numAdded += _db_addEmpls (db[fNON], l, h, s);
227           return numAdded;
228         }
229     case MALE:
230       switch (q.j)
231         {
232         case job_ANY:
233           numAdded = _db_addEmpls (db[mMGRS], l, h, s);
234           numAdded += _db_addEmpls (db[mNON], l, h, s);
235           return numAdded;
236         case MGR:
237           return _db_addEmpls (db[mMGRS], l, h, s);
238         case NONMGR:
239           return _db_addEmpls (db[mNON], l, h, s);
240         }
241     case FEMALE:
242       switch (q.j)
243         {
244         case job_ANY:
245           numAdded = _db_addEmpls (db[fMGRS], l, h, s);
246           numAdded += _db_addEmpls (db[fNON], l, h, s);
247           return numAdded;
248         case MGR:
249           return _db_addEmpls (db[fMGRS], l, h, s);
250         case NONMGR:
251           return _db_addEmpls (db[fNON], l, h, s);
252         }
253     }
254 }
255
256 void db_print (void)
257 {
258   int i;
259   char *printVal;
260   
261   printf ("Employees:\n");
262
263   for (i = firstERC; i <= lastERC; i++)
264     {
265       printVal = erc_sprint (db[i]);
266       printf ("%s", printVal);
267       free (printVal);
268     }
269 }
This page took 0.056549 seconds and 5 git commands to generate.