a99  V32.6
allegro Windows Hauptprogramm
 Alle Klassen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
aicore2s.cpp
gehe zur Dokumentation dieser Datei
1 // aicore2s.cpp/.c : Kernfunktionen Teil 2, ident. f. .c und .cpp
2 // 1995-05-23 aC EA : SingleUser Versionen bestimmter Funktionen
3 // Copyright 2011 Universitätsbibliothek Braunschweig, more see bottom
4 
5 // damit gehen gewisse Indexzugriffe schneller
6 // wird gebraucht in aifinds.cpp
7 // Funktionsnamen wie in aicore2.c, mit Suffix S
8 
9 #include "includes.h"
10 #include "ai-const.h" // allg. Konstanten
11 #include "aisetup.h" // allg. Einstellungen Einzelpl.
12 #include "aierrors.h" // Fehlernummern
13 #include "aistruc.h" // Strukturen
14 #include "aiglobal.h" // glob. Variablen
15 #include "aideclar.h" // Funktionsdeklarationen
16 
17 #include "string.h"
18 
19 
20 /* aifkno() Sucht einen Knoten, ob Blatt oder nicht.
21  Return: Relative Position des schluessels aikey im Knoten
22  aiG_pos wird auf diesen Wert gesetzt
23  aiG_cpr zeigt die Art des Vergleichs an:
24  Wenn kein Treffer, dann Return -2,
25  wenn aikey jenseits des letzten Schl. im Kn., dann -1
26 */
27 
28 SHORT aifknoS(aiTRSTR *aibloc, CHAR *aikey, CHAR ai_str)
29 // aibloc Zeiger zum Knoten
30 // aikey; Zeiger zum Schl., der gesucht werden soll
31 // ai_str; Art der Suche: E == eq L == le S == le
32 {
33 
34  SHORT astrg,estrg,size,poff;
35  aiINDX *aixf;
36 
37  aixf = aiG_ky + aibloc->kynum; // Zeiger zur Schl.Nummer
38 
39  astrg = 1;
40  estrg = aibloc->ckyv;
41  aiG_cpra = poff = 0;
42 
43 // Vergl. mit dem hohen Schl.Wert
44  if((aibloc->lfflg == BLATT &&
45  (compar(aikey,aidathiS(aibloc),aixf) > 0 ||
46  (ai_str == 'S' && !estrg && aibloc->rgtkey))) ||
47  (aibloc->lfflg == NBLATT && !aibloc->cprv &&
48  compar(aikey,aidatpoiS(aibloc,estrg),aixf) > 0))
49  {
50  // srcval groesser als groesster im Knoten
51  aiG_cpr = 1;
52  aiG_pos = 0;
53  return(-1);
54  }
55 
56 // Knoten leer?
57  if(!estrg)
58  {
59  aiG_pos = 0;
60  aiG_cpr = -1;
61  return(-2);
62  }
63 
64 // Binaere Suche
65  if(aibloc->kypst)
66  {
67  if(aibloc->rglfflg & AI_NRML)
68  poff = sizeof(PTRL);
69  aiG_cpra = compar(aikey,aibloc->kyxpns + poff,aixf);
70  aiG_sufc = aibloc->sffct;
71  if(aiG_cpra > 0)
72  astrg = aibloc->kypst + 1;
73  else if(aiG_cpra == 0)
74  {
75  aiG_cpr = 0;
76  aiG_cpra = -1;
77  return(aiG_pos = aibloc->kypst);
78  }
79  else
80  aiG_cpra = 0;
81  }
82 
83 // restliche Faelle sequentiell durchpruefen
84 
85  aiG_pos = astrg;
86 
87  while(aiG_pos <= estrg)
88  {
89  aiG_cpr = compar(aikey,aidatpoiS(aibloc,aiG_pos),aixf);
90  if(aiG_cpr > 0)
91  {
92  aiG_cpra = aiG_cpr;
93  aiG_sufc = aibloc->sffct;
94  }
95  else if(aiG_cpr < 0 && ai_str == 'E')
96  return(-2);
97  else
98  return(aiG_pos);
99  ++aiG_pos;
100  }
101  if((ai_str == 'S' && aibloc->rgtkey) || (aibloc->cprv &&
102  aibloc->lfflg == NBLATT))
103  {
104  aiG_cpr = 1;
105  aiG_pos = 0;
106  return(-1);
107  }
108  else
109  {
110  aiG_cpr = aiG_cpra;
111  aiG_pos = aibloc->ckyv + 1;
112  return(-2);
113  }
114 }
115 
116 
117 
118 /* aiknogetS() schaut im Puffer nach dem Knoten knot/aixf.
119  Return: Zeiger zum Puffer.
120  Der am laengsten nicht benutzte Knoten fliegt raus, der angeforderte
121  kommt in den geleerten Puffer, dessen Zeiger wird zurueckgegeben
122 */
123 
125 // knot; Nummer des angeforderten Knotens
126 // aixf; Schluesselzeiger
127 {
128 // Liefert Zeiger auf aibloc, sonst 0
129 
130 #ifdef aiIMMED
131  aiDATEI *ainmb;
132 #endif
133  aiTRSTR *aigetf;
134  aiTRSTR *fnbloc;
135  // Zeiger auf aiblocs
136  SHORT i; // counter
137  uSHORT ailuse; // Speicher fuer den lru Knoten
138 
139  if(knot == aiNODNUL)
140  aiAbort(237);
141  aigetf = fnbloc = aiG_tre;
142  ailuse = fnbloc->acctr;
143  i = 0;
144  while(i++ < aiG_blocmx)
145  {
146  if(fnbloc->knotid == knot && fnbloc->kynum == aixf->usrfn)
147  {
148 
149  aipraxr(fnbloc); // Knoten gefunden, kein Upd.Flag
150  return(fnbloc);
151  }
152  if(fnbloc->acctr < ailuse) /* aigetf auf aibloc mit
153  niedrigstem acctr setzen */
154  ailuse = (aigetf = fnbloc)->acctr;
155  ++fnbloc;
156  }
157 
158 
159 // Knoten in aiblocs nicht gefunden. Lese Knoten in den lru aibloc
160 
161  if((fnbloc = aidatlru(aigetf)) == 0) // Dann Fehler in aidatlru
162  return((aiTRSTR *)NULL);
163  if(aiknordS(fnbloc,knot,aixf)) // Dann Fehler in aiknord
164  return((aiTRSTR *)NULL);
165  return(fnbloc);
166 }
167 
168 
169 /* --------------------------------------------------------------------
170  Hole einen Knoten aus der Indexdatei aixf nach aibloc.
171  Liefert Nicht-Null wenn Fehler
172 */
173 
174 SHORT aiknordS(aiTRSTR *aibloc,RECNR knot, aiINDX *aixf)
175 {
176  aiDATEI *ainmb;
177 
178 // Aendern der aibloc Statuswerte im Header
179 
180  aibloc->knotid = knot;
181  aibloc->kynum = aixf->usrfn;
182  aibloc->coruf = 'n';
183  aibloc->kylg = aixf->kylgth;
184  aibloc->cprv = aixf->ftyf;
185  aibloc->kypst = aibloc->realg = aibloc->fstbyt = 0;
186  aipraxr(aibloc);
187 
188 // Knoten in aibloc einlesen
189 
190  if(aixf->regnm > 0)
191  ainmb = aixf - aixf->regnm;
192  else
193  ainmb = aixf;
194 
195  if(airw(aiREAD,ainmb,knot,aibloc->kntptr,ainmb->knotsz))
196  return(aiG_fhln);
197 
198 // Hole Knotenstatus in den Bereich aiTRSTR
199 
200  aicopy((char *)&aibloc->rgtkey,(char *)aibloc->kntptr,aiSTAT);
201 
202 #ifdef HITOLO
203  ai_flip((CHAR *)&aibloc->rgtkey,6);
204  aiwritrv((CHAR *)&aibloc->rgtkey,2);
205 #endif
206 
207 // Registernr pruefenr
208 
209  if(aibloc->regnr != aixf->regnm)
210  aiAbort(231);
211 
212  if(aibloc->lfflg == BLATT)
213  {
214  aibloc->mxkeys = aixf->maxkv;
215  aibloc->mxbyt = aixf->kylgmx;
216  aibloc->rglfflg = AI_DBLY;
217  }
218  else
219  {
220  aibloc->mxkeys = aixf->maxkn;
221  aibloc->mxbyt = aixf->kybmx;
222  aibloc->rglfflg = AI_DBLN;
223  }
224 
225  return(FHLNUL);
226 }
227 
228 
229 // --------------------------------
230 // Liefert Zeiger auf Schluessel in bestimmter Pos. von aibloc
231 
233 {
234  return(aivlxpr(aibloc,aiG_pos));
235 }
236 
238 {
239  SHORT i;
240 
241  i = aibloc->kylg+2;
242 
243  if(aibloc->rglfflg & AI_NRML)
244  return(aibloc->knptr + (aibloc->mxkeys - 1) *
245  (i + sizeof(PTRL)) + sizeof(PTRL));
246  else
247  return(aibloc->knptr + (aibloc->mxkeys - 1) * i);
248 }
249 
250 
251 // -------------------------
252 // Liefert Zeiger auf Knoten
253 
254 #ifdef LoHi
255 
257 {
258  CHAR *tp,*pp;
259  SHORT i;
260  PTRL pntr;
261 
262  pp = (CHAR *) &pntr;
263  tp = aidatpoiS(aibloc,aiG_pos);
264  if(aibloc->rglfflg & AI_NRML)
265  aicopy(pp,tp - sizeof(PTRL),sizeof(PTRL));
266  else
267  {
268  tp += aibloc->kylg;
269  i = 0;
270  while(i++ < (int) sizeof(PTRL))
271  *pp++ = *--tp;
272  }
273  return(pntr);
274 }
275 
276 #else
277 
279 {
280  CHAR *tp;
281  PTRL pntr;
282 
283  tp = aidatpoiS(aibloc,aiG_pos) - sizeof(PTRL);
284  if(aibloc->rglfflg == AI_DBLY)
285  tp += aibloc->kylg;
286  aicopy(&pntr,tp,sizeof(PTRL));
287 #ifdef HITOLO
288  if(aibloc->rglfflg != AI_DBLY)
289  ai_exchg((CHAR *)&pntr,sizeof(PTRL));
290 #endif
291  return(pntr);
292 }
293 
294 #endif
295 
296 /*
297  Copyright 2011 Universitätsbibliothek Braunschweig
298 
299  Licensed under the Apache License, Version 2.0 (the "License");
300  you may not use this file except in compliance with the License.
301  You may obtain a copy of the License at
302 
303  http://www.apache.org/licenses/LICENSE-2.0
304 
305  Unless required by applicable law or agreed to in writing, software
306  distributed under the License is distributed on an "AS IS" BASIS,
307  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
308  See the License for the specific language governing permissions and
309  limitations under the License.
310 */
311