a99  V32.6
allegro Windows Hauptprogramm
 Alle Klassen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
aifinds.cpp
gehe zur Dokumentation dieser Datei
1 // aifinds.cpp/.c : Indexeintrag finden SngUser Mode (schneller beim Blaettern)
2 // 1991 / 1995-05-23 /2011 Nutzt Funktionen in aicore2s.cpp; ident. f. c und c++
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 "aierrors.h" // Fehlernummern
9 #include "aistruc.h" // Strukturen
10 #include "aiglobal.h" // glob. Variablen
11 #include "aideclar.h" // Funktionsdeklarationen
12 
13 // Einzelplatz einstellen
14 #undef aiIMMED
15 #define aiFLAX
16 
17 /* ---------------------------------------------------------------------
18  Liefert die interne Satznummer zum naechsten Eintrag im Register rgnum,
19  Der betr. Schl. wird nach aikey kopiert.
20  Kein weiterer Eintrag: Ergebnis 0
21 */
22 
23 PTRL aiEntNxS(SHORT rgnum, CHAR *aikey)
24 {
25  aiINDX *aixf;
26  SHORT temp;
27  aiTRSTR *ret;
28 
29  aiG_fhln = 0;
30  if((aixf = aichktf(rgnum)) == 0)
31  return(0);
32 
33 again:
34  if(!aixf->curknt)
35  {
36  *aikey=0;
37  return(0);
38  }
39  if((ret = aiknogetS(aixf->curknt,aixf)) == 0)// dann Fehler
40  return(0);
41  if((temp = aixf->knotel) < ret->ckyv)
42  {
43  aicopy(aikey,aidatpoiS(ret,++temp),aixf->kylgth);
44  aixf->knotel = temp;
45  return(aipoidorS(ret,temp));
46  }
47  else
48  {
49  aixf->curknt = ret->rgtkey;
50  aixf->knotel = 0;
51  goto again;
52  }
53 }
54 
55 
56 /* -----------------------------------------------------------------
57  Liefert die interne Satznumer zum ersten Schl. im Register rgnum,
58  der groesser oder gleich srcval ist. Falls es keinen gibt: 0
59  Der betr. Schl. wird nach aikey kopiert.
60 */
61 
62 
63 PTRL aiEntGeS(SHORT rgnum, CHAR *srcval, CHAR *aikey)
64 {
65  aiINDX *aixf;
66  STATC PTRL temp;
67 
68  aiG_fhln = 0;
69  if((aixf = aichktf(rgnum)) == 0)
70  return(aiDRNULL);
71 
72  if((temp = aifentS(aixf,srcval,'G')))
73  {
74  aixf->knotel = aiG_pos;
75  aixf->curknt = aiG_knot;
76  aicopy(aikey,aiG_keyar,aixf->kylgth);
77  }
78  else
79  {
80  aixf->knotel = 0;
81  aixf->curknt = aiNODNUL;
82  *aikey=0;
83  }
84  return(temp);
85 }
86 
87 // ----------------------------------------
88 // Letzten Eintrag im Register rgnum finden
89 
90 
91 PTRL aiEntLaS(SHORT rgnum, CHAR *aikey)
92 {
93  STATC RECNR knot;
94  aiTRSTR *aibloc;
95  aiINDX *aixf;
96  SHORT tmpsiz;
97 
98 
99  aiG_fhln = 0;
100  if((aixf = aichktf(rgnum)) == 0)
101  return(aiDRNULL);
102 
103  if(!(knot = aigrtrot(aixf)))
104  goto empty2;
105 
106  while(knot) // walk down or across tree until lfflg knot found
107  {
108  if((aibloc = aiknoget(knot,aixf)) == 0)
109  return(aiDRNULL);
110  if(aibloc->lfflg == BLATT)
111  break;
112  if(!(knot = aibloc->rgtkey))
113  knot = aidatkno(aibloc,aibloc->ckyv);
114  }
115  if(!knot) // => no lfflg knot found
116  aiAbort(213);
117 
118  while(!aibloc->ckyv) // walk across empty rightmost lfflg knots
119  if(!(knot = aibloc->lftkey))
120  goto empty2;
121  else if((aibloc = aiknoget(knot,aixf)) == 0)
122  return(aiDRNULL);
123 
124  aixf->curknt = knot;
125  aixf->knotel = tmpsiz = aibloc->ckyv;
126  aicopy(aikey,aidatpoi(aibloc,tmpsiz),aixf->kylgth);
127  return(aipoidor(aibloc,tmpsiz));
128 
129 empty2:
130  *aikey=0;
131  aixf->knotel = 0;
132  aixf->curknt = aiNODNUL;
133  return(0);
134 }
135 
136 PTRL aiEntPrS(SHORT rgnum, CHAR *aikey)
137 {
138  aiTRSTR *ret;
139  SHORT prdtst,temp;
140  aiINDX *aixf;
141  RECNR oldknot;
142 
143  aiG_fhln = 0;
144  if((aixf = aichktf(rgnum)) == 0)
145  return(0);
146 
147  if(!aixf->curknt)
148  {
149  *aikey=0;
150  return(aiDRNULL);
151  }
152 
153  prdtst = aiRETRY;
154 
155 split:
156  if((ret = aiknoget((oldknot = aixf->curknt),aixf)) == 0)
157  return(0); // then error
158 again2:
159  if((temp = aixf->knotel) > 1)
160  {
161  aicopy(aikey,aidatpoiS(ret,--temp),aixf->kylgth);
162  aixf->knotel = temp;
163  return(aipoidorS(ret,temp));
164  }
165  else if((aixf->curknt = ret->lftkey))
166  {
167  if((ret = aiknoget(aixf->curknt,aixf)) == 0) // Fehler
168  return(0);
169  if((temp = ret->ckyv) < 0)
170  aiAbort(211);
171  if(oldknot != ret->rgtkey)
172  {
173  if(!(prdtst--))
174  {
175  aierro(FHLRPFL);
176  return(aiDRNULL);
177  }
178  aixf->curknt = oldknot;
179  goto split; // Knotenteilung
180  }
181  aixf->knotel = temp;
182  if(!temp)
183  {
184  oldknot = aixf->curknt;
185  goto again2;
186  }
187  aicopy(aikey,aidatpoiS(ret,temp),aixf->kylgth);
188  return(aipoidorS(ret,temp));
189  }
190  else
191  {
192  *aikey=0;
193  return(aiDRNULL);
194  }
195 }
196 
197 /* --------------------------------------------------------------------
198  Allgemeine Suchfunktion, nicht direkt aus der Anwendung zu rufen
199  sondern aus anderen Suchroutinen: rtriev, search, u.a.
200 */
201 
202 PTRL aifentS(aiINDX *aixf, CHAR *aikey, CHAR ai_str)
203 
204 // aixf Zeiger auf eine aiG_ky Struktur (eine Art Nummer des Eintrags)
205 // aikey Zeiger auf einen Schluesselstring
206 // ai_str Suchrichtung: 'E'== Gleichheit, 'G' == groesser oder gleich
207 {
208 
209  STATC RECNR knot;
210  STATC SHORT ai_nump;
211  aiTRSTR *aibloc;
212 
213  aiG_knot = aiG_last = 0; // fuer die zuletzt besuchten Knoten
214  *aiG_keyar=0; // Rueckgabestring leer setzen
215  if(!(knot = aigrtrot(aixf))) // Baum u.U. leer, oder Fehler
216  {
217  aiG_pos = 0;
218  return(0);
219  }
220 
221  while(knot) // Baum abgrasen, bis Knoten lfflg gefunden
222  {
223  aiG_last = knot;
224  if((aibloc = aiknoget(knot,aixf)) == 0) // Fehler
225  return(0);
226  if(aibloc->lfflg == BLATT) // unteres Ende getroffen
227  break;
228  if((ai_nump = aifkno(aibloc,aikey,'L')) != -1)
229  {
230  if(ai_nump == -2) // Baum schadhaft
231  aiAbort(214);
232  // Unterknoten besorgen
233  knot = aidatkno(aibloc,ai_nump);
234  }
235  else
236  // nach rechts bewegen wegen unvollst. Angaben
237  knot = aibloc->rgtkey;
238  }
239 
240  if(!knot) // Kein lfflg gefunden, Indexstruktur schadhaft
241  aiAbort(215);
242 
243  return(leftixS(aikey,aixf,aibloc,ai_str)); // Den Knoten lfflg durchsuchen
244 }
245 
246 
247 // ----------------------------
248 // Den Knoten lfflg durchsuchen
249 
250 PTRL leftixS(CHAR *aikey, aiINDX *aixf, aiTRSTR *aibloc, CHAR ai_str)
251 
252 // aikey Zeiger auf einen Schluesselstring
253 // aixf Schluesselnummer
254 // aibloc Block, der den KNoten lfflg enthaelt
255 // ai_str 'E/G': siehe aifent
256 
257 {
258  STATC SHORT temp;
259 
260 // ist es noetig, die lfflg-Knoten nach rechts abzusuchen?
261 
262  while((temp = aifkno(aibloc,aikey,ai_str == 'E' ? 'E' : 'S')) == -1)
263  if((aibloc = aiknoget((aiG_last = aibloc->rgtkey),aixf)) == 0)
264  return(0); // Fehler in aiknoget
265 
266  aiG_knot = aiG_last;
267  if(temp != -2) // lfflg Suche erfolgreich
268  {
269  aicopy(aiG_keyar,aidatpoiS(aibloc,temp),
270  aixf->kylgth); // Schluesselstring aus aiG_keyar kopieren
271  return(aipoidorS(aibloc,temp));
272  }
273  else // srcval nicht gefunden
274  return(0);
275 }
276 
277 /*
278  Copyright 2011 Universitätsbibliothek Braunschweig
279 
280  Licensed under the Apache License, Version 2.0 (the "License");
281  you may not use this file except in compliance with the License.
282  You may obtain a copy of the License at
283 
284  http://www.apache.org/licenses/LICENSE-2.0
285 
286  Unless required by applicable law or agreed to in writing, software
287  distributed under the License is distributed on an "AS IS" BASIS,
288  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
289  See the License for the specific language governing permissions and
290  limitations under the License.
291 */
292