a99  V32.6
allegro Windows Hauptprogramm
 Alle Klassen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
airemkey.cpp
gehe zur Dokumentation dieser Datei
1 // airemkey.c : Indexeintrag loeschen (remove)
2 // 1991 / 1995 / 2011
3 // Copyright 2011 Universitätsbibliothek Braunschweig, more see bottom
4 
5 #include "includes.h" // einige Konventionen
6 #include "ai-const.h" // allg. Konstanten
7 #include "aisetup.h" // allg. Einstellungen
8 #include "aistruc.h" // Strukturen
9 #include "aiglobal.h" // glob. Variablen
10 #include "aierrors.h" // Fehlernummern
11 #include "aideclar.h" // Funktionsdeklarationen
12 
13 
14 #ifndef aiIMMED
15 STATC SHORT ai_nlem[aiTRMAX];
16 SHORT ai_tght[aiTRMAX];
17 SHORT ai_mlem[aiTRMAX];
18 #endif
19 
20 
21 /* -----------------------------------------
22  Eintrag loeschen, mit Satznummernabgleich
23  Ergebnis: 0, OK
24  3 : Sch. gef., aber Nummer ungleich
25  4 : Schl.. srcval nicht gefunden
26 */
27 
28 SHORT aiEntLo(SHORT rgnum, CHAR *srcval,PTRL recnum)
29 {
30 
31  aiINDX *aixf;
32  CHAR *aikey;
33 
34  aiG_fhln = 0;
35  if ((aixf = aichktf(rgnum)) == NULL)
36  return(aiG_fhln);
37 
38  aicopy((aikey = aiG_dpky),srcval,aixf->kylgth);
39  setdpl(aikey,aixf,&recnum);
40 
41  return(aiEntDl(aixf,aikey,recnum));
42 }
43 
44 
45 /* --------------------------------------------------------------------
46  Schl. aus Knoten lfflg loeschen
47 
48  Nur wenn aiIMMED in aisetup.h definiert
49 
50  Um im Mehrplatzbetrieb das updating zu verschnellern, werden Knoten
51  die weniger als halb voll sind nicht zusammengefasst, leere nicht
52  beseitigt.
53  Der Platz wird bei Einfuegen passender Schluessel wieder genutzt.
54  Wenn viel einseitiges Update stattfindet (d.h. Loeschung oder Einfuegung
55  am selben Ende), empfiehlt sich Index-Kompaktierung nach einer Weile.
56 */
57 
58 SHORT updted(aiDATEI *); // aiprepar.c
59 
60 SHORT aiEntDl(aiINDX *aixf,CHAR *aikey,PTRL pntr)
61 {
62  SHORT ai_nump;
63  aiTRSTR *aibloc;
64  RECNR knot;
65 
66 #ifndef aiIMMED
67  RECNR pknot,sknot;
68  SHORT cmpflg;
69  SHORT rtknot(),remlf(),rempbm();
70 
71  cmpflg = aixf->ftyf;
72 #endif
73  aiG_fhln = aiG_beb = 0;
74  if (updted(aixf))
75  return(aiG_fhln);
76  if (!(knot = aigrtrot(aixf))) /* tree may be empty or aigrtrot err */
77  if (aiG_fhln)
78  return(aiG_fhln);
79  else
80  return(aierro(FHLDELT));
81 
82  while (knot) /* walk down or across tree until lfflg knot found */
83  {
84  aiG_last = knot;
85  if ((aibloc = aiknoget(knot,aixf)) == NULL)
86  return(aiG_fhln);
87  if (aibloc->lfflg == BLATT)
88  break;
89 
90  if ((ai_nump = aifkno(aibloc,aikey,'L')) != -1)
91  {
92  if (ai_nump == -2)
93  aiAbort(220);
94 #ifndef aiIMMED
95  aiG_down[++aiG_beb] = knot;
96  ai_nlem[aiG_beb] = ai_nump;
97  if (cmpflg)
98  {
99  ai_mlem[aiG_beb] = aibloc->ckyv;
100  ai_tght[aiG_beb] = (aibloc->ckyb + aibloc->kylg)
101  > aibloc->mxbyt ? YES : NO;
102  }
103 #endif
104  knot = aidatkno(aibloc,ai_nump);
105  }
106  else
107  knot = aibloc->rgtkey;
108  }
109 
110  if (!knot) /* then no lfflg knot found */
111  aiAbort(221);
112 
113 #ifdef aiIMMED
114  if (aiLok(knot,aixf) ||
115  (aibloc = mvrght(aikey,aixf,aiknoget(knot,aixf))) == NULL)
116 #else
117  if (aiLok(knot,aixf) ||
118  (aibloc = mvrght(aikey,aixf,aibloc)) == NULL)
119 #endif
120  return(aiG_fhln);
121 
122  if (aiG_cpr)
123  {
124  if (aiUnlk(aibloc->knotid,aixf))
125  return(aiG_fhln);
126  return(aierro(FHLDELT)); /* aiG_ky does not exist */
127  }
128 
129  if (aipoidor(aibloc,aiG_pos) != pntr)
130  {
131  if (aiUnlk(aibloc->knotid,aixf))
132  return(aiG_fhln);
133  return(aierro(FHLDIFF));
134  }
135 
136  if (aichkupt(aixf))
137  return(aiG_fhln);
138 
139  delexp(aibloc);
140 
141  knot = aibloc->knotid; /* save for unlock */
142 
143 #ifdef aiIMMED
144  if (savekn(aibloc,aibloc->ckyv) || aiUnlk(knot,aixf) ||
145  updhd(aixf,(PTRL) -1))
146  return(aiG_fhln);
147 #else
148  pknot = aibloc->lftkey;
149  sknot = aibloc->rgtkey;
150  if (aibloc->ckyv > 0 || sknot == aiDRNULL || (cmpflg && rempbm(aiG_beb)))
151  {
152  if (savekn(aibloc,aibloc->ckyv) || aiUnlk(knot,aixf))
153  return(aiG_fhln);
154  }
155  else
156  {
157  /* empty lfflg knot, but not last lfflg */
158  if (aiG_beb == 0) aiAbort(242);
159  if (rtknot(knot,aixf) || aiUnlk(knot,aixf))
160  return(aiG_fhln);
161  if (pknot)
162  {
163  if ((aibloc = aiknoget(pknot,aixf)) == NULL)
164  return(aiG_fhln);
165  aibloc->rgtkey = sknot;
166  savekn(aibloc,aibloc->ckyv);
167  }
168  if (remlf(sknot,aixf))
169  return(aiG_fhln);
170  if ((aibloc = aiknoget(sknot,aixf)) == NULL)
171  return(aiG_fhln);
172  aibloc->lftkey = pknot;
173  savekn(aibloc,aibloc->ckyv);
174  }
175  if (updhd(aixf,(PTRL) -1))
176  return(aiG_fhln);
177 #endif
178  return(FHLNUL);
179 }
180 
181 #ifndef aiIMMED
182 SHORT rtknot(knot,aixf)
183 RECNR knot;
184 aiDATEI *aixf;
185 {
186  aiTRSTR *aibloc;
187  aiDATEI *ainmb;
188 
189  aiTRSTR *aiknoget();
190 
191  if ((aibloc = aiknoget(knot,aixf)) == NULL)
192  return(aiG_fhln);
193  ainmb = aixf - aixf->regnm;
194 
195  aibloc->lftkey = -1L;
196  aibloc->rgtkey = ainmb->rmstk;
197  aibloc->regnr = 0;
198  aibloc->kynum = ainmb->usrfn;
199  savekn(aibloc,0);
200  ainmb->rmstk = knot;
201  return(FHLNUL);
202 }
203 
204 static SHORT rempbm(lev)
205 SHORT lev;
206 {
207  while (lev > 0)
208  {
209  if (ai_tght[lev])
210  return(YES);
211  if (ai_nlem[lev] != ai_mlem[lev])
212  break;
213  lev--;
214  }
215  return(NO);
216 }
217 
218 static SHORT uppred(knot,aixf,ai_nump,sknot)
219 RECNR knot;
220 aiDATEI *aixf;
221 SHORT ai_nump;
222 RECNR sknot;
223 {
224  aiTRSTR *aiknoget();
225  RECNR aidatkno();
226 
227  aiTRSTR *aibloc;
228  SHORT pass;
229 
230  pass = 0;
231  while (aiG_beb > 0 && ai_nump == 1)
232  {
233  ++pass;
234  ai_nump = ai_nlem[aiG_beb];
235  knot = aiG_down[aiG_beb--];
236  }
237  aiG_beb += pass++;
238 
239  if (ai_nump-- == 1)
240  return(FHLNUL);
241 
242  if ((aibloc = aiknoget(knot,aixf)) == NULL)
243  return(aiG_fhln);
244  knot = aidatkno(aibloc,ai_nump);
245  while (pass-- != 0)
246  {
247  if ((aibloc = aiknoget(knot,aixf)) == NULL)
248  return(aiG_fhln);
249  knot = aidatkno(aibloc,aibloc->ckyv);
250  }
251  aibloc->rgtkey = sknot;
252  savekn(aibloc,aibloc->ckyv);
253  return(FHLNUL);
254 }
255 
256 static SHORT remlf(sknot,aixf)
257 RECNR sknot;
258 aiDATEI *aixf;
259 {
260  RECNR knot;
261  SHORT ai_nump,lstdel,pass;
262  aiTRSTR *aibloc;
263  CHAR lstkey[aiMXLG];
264 
265  aiTRSTR *aiknoget(),*mvrght();
266  CHAR *aidatpoi();
267  void kyins();
268  SHORT delexp();
269 
270  pass = 0;
271 
272 del_loop:
273  if ((knot = aiG_down[aiG_beb]) == 0)
274  aiAbort(241);
275  ai_nump = ai_nlem[aiG_beb--];
276  if (pass++ && uppred(knot,aixf,ai_nump,sknot))
277  return(aiG_fhln);
278  if ((aibloc = aiknoget(knot,aixf)) == NULL)
279  return(aiG_fhln);
280  if (aiG_beb == 0 && aibloc->ckyv < 3)
281  {
282  if (ai_nump == 1)
283  {
284  if ((aixf->wurz = sknot) == aiDRNULL) aiAbort(244);
285  }
286  else
287  aiAbort(243);
288  return(rtknot(knot,aixf));
289  }
290  aidatpoi(aibloc,ai_nump);
291  lstdel = delexp(aibloc); /* delexp does not handle aiDPNL ???? */
292  if (lstdel && ai_nump > 1)
293  aicopy(lstkey,aidatpoi(aibloc,ai_nump - 1),aixf->kylgth);
294  sknot = aibloc->rgtkey;
295  if (aibloc->ckyv == 0)
296  {
297  if (rtknot(knot,aixf))
298  return(aiG_fhln);
299  goto del_loop;
300  }
301  savekn(aibloc,aibloc->ckyv);
302  /* check if last entry deleted */
303  /* if(!lstdel) return(FHLNUL); */
304  sknot = knot;
305  while (lstdel && aiG_beb > 0)
306  {
307  if ((knot = aiG_down[aiG_beb]) == aiDRNULL)
308  aiAbort(245);
309  ai_nump = ai_nlem[aiG_beb--];
310  if ((aibloc = mvrght(lstkey,aixf,aiknoget(knot,aixf))) == NULL)
311  return(aiG_fhln);
312  kyins(aibloc,lstkey,sknot);
313  aibloc->ckyv++;
314  aidatpoi(aibloc,ai_nump + 1);
315  lstdel = delexp(aibloc);
316  if (aibloc->ckyb > aibloc->mxbyt) aiAbort(246);
317  savekn(aibloc,aibloc->ckyv);
318  sknot = knot;
319  }
320 
321  return(FHLNUL);
322 }
323 #endif
324 
326 {
327  SHORT expcnt,cntpfx,cntpfx2,cntsfx2,srealg,sfstbyt;
328  SHORT poff;
329  CHAR *tp;
330 
331  if (bp->kypst == bp->ckyv) /* deleting last entry */
332  {
333  bp->ckyv--;
334  bp->ckyb -= bp->realg;
335  bp->kypst = bp->realg = bp->fstbyt = 0;
336  return(YES);
337  }
338 
339  tp = bp->knptr + bp->fstbyt;
340  if (bp->rglfflg & aiREG)
341  poff = sizeof(PTRL);
342  else
343  poff = 0;
344 
345  cntpfx = *(tp + poff) & 0x00ff;
346  cntpfx2 = *(tp + poff + bp->realg) & 0x00ff;
347 
348  cntsfx2 = *(tp + poff + bp->realg + 1) & 0x00ff;
349 
350  srealg = bp->realg;
351  sfstbyt = bp->fstbyt;
352  aidatpoi(bp,bp->kypst + 1);
353 
354  if (cntpfx2 <= cntpfx) /* applies to no prefix case as well */
355  shiftl(expcnt = srealg,bp,sfstbyt+srealg);
356  else // expandieren um bis zu cntpfx2 Bytes
357  {
358  expcnt = srealg - (cntpfx2 - cntpfx);
359  *(tp + poff + 1) = cntsfx2;
360  if (poff)
361  {
362  *(tp + srealg + poff) = cntpfx;
363  aicopy(tp,tp + srealg,poff + 2);
364  }
365  if (expcnt > 0)
366  shiftl(expcnt,bp,sfstbyt + srealg + poff + 2);
367  else /* right shift required!!!! */
368  {
369  aiAbort(238);
370  }
371  bp->realg += (cntpfx2 - cntpfx);
372  }
373 
374  bp->ckyb -= expcnt;
375  bp->fstbyt = sfstbyt;
376  bp->ckyv--;
377  bp->kypst--;
378  return(NO);
379 }
380 
381 /*
382  Copyright 2011 Universitätsbibliothek Braunschweig
383 
384  Licensed under the Apache License, Version 2.0 (the "License");
385  you may not use this file except in compliance with the License.
386  You may obtain a copy of the License at
387 
388  http://www.apache.org/licenses/LICENSE-2.0
389 
390  Unless required by applicable law or agreed to in writing, software
391  distributed under the License is distributed on an "AS IS" BASIS,
392  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
393  See the License for the specific language governing permissions and
394  limitations under the License.
395 */
396