a99  V32.6
allegro Windows Hauptprogramm
 Alle Klassen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
aiserial.cpp
gehe zur Dokumentation dieser Datei
1 // aiserial.c/.cpp : Indexdatei voellig neu aufbauen, nur fuer QRIX
2 // 1991-11-29 / 2005 / 2011 (seriell, geht viel schneller)
3 // Copyright 2011 Universitätsbibliothek Braunschweig, more see bottom
4 
5 
6 #include "includes.h" // einige Konventionen
7 #include "ai-const.h" // allg. Konstanten
8 #include "aisetup.h" // allg. Einstellungen
9 
10 #ifdef aiIMMED // qrix braucht Einzelplatzmodus
11 #undef aiIMMED
12 #define aiFLAX
13 #endif
14 
15 #include "aierrors.h" // Fehlernummern
16 #include "aistruc.h" // Strukturen
17 #include "aiglobal.h" // glob. Variablen
18 #include "aideclar.h" // Funktionsdeklarationen
19 
20 
22 
29 
30 aiTRSTR *serins(aiTRSTR *aibloc, CHAR *aikey, RECNR airecnum, aiDATEI *aixf)
31 {
32  aiTRSTR *lbp;
33  SHORT lfflglg;
34 
35  aiG_cpr = 0;
36  if(elem) aidatpoiS(aibloc,elem);
37  kyins(aibloc,aikey,airecnum);
38  aibloc->ckyv++;
39 
40  if(aibloc->ckyb > aibloc->mxbyt)
41  {
42  lfflglg = aibloc->lfflg == BLATT ? YES : NO;
43  aidatpoiS(aibloc,aibloc->ckyv);
44  delexp(aibloc);
45  if(lfflglg)
46  aicopy(aidathiS(aibloc),lastkey,aixf->kylgth);
47  savekn(aibloc,aibloc->ckyv);
48  prvnod = curnod;
49  if((savbp = aibloc = nwknot(aixf,&curnod,NO)) == NULL)
50  return(NULL);
51  if(lfflglg)
52  newlfflg(aibloc,aixf);
53  else
54  nonlfflg(aibloc,aixf);
55  aiG_cpra = elem = 0;
56  numknot++;
57  kyins(aibloc,aikey,airecnum);
58  aibloc->ckyv++;
59  if((lbp = aiknogetS(prvnod,aixf)) == NULL)
60  return(NULL);
61  lbp->rgtkey = curnod;
62  savekn(lbp,lbp->ckyv);
63  if((aibloc = aiknogetS(curnod,aixf)) == NULL)
64  return(NULL);
65  }
66 
67  savekn(aibloc,aibloc->ckyv);
68  elem++;
69  aicopy(lastkey,aikey,aixf->kylgth);
70  return(aibloc);
71 }
72 
74 {
75  aiTRSTR *aibloc;
76  RECNR lnods,nknots;
77 
78 
79  aiG_beb = 0;
80  begnod = curnod = aigrtrot(aixf);
81  while(curnod)
82  {
83  prvnod = aiDRNULL;
84  nknots = 0L;
85  do
86  {
87  if((aibloc = aiknogetS(curnod,aixf)) == NULL)
88  return(NULL);
89  nknots++;
90  if(nknots == 1)
91  lnods = curnod;
92  prvnod = curnod;
93  curnod = aibloc->rgtkey;
94  }
95  while(curnod);
96  if(aibloc->lfflg == BLATT)
97  break;
98  if(++aiG_beb >= aiTRMAX)
99  aiAbort(247);
101  ai_nknot[aiG_beb] = nknots;
102  if((aibloc = aiknogetS(lnods,aixf)) == NULL)
103  return(NULL);
104  curnod = aidatkno(aibloc,1);
105  }
106 
107  if((begnod = curnod = prvnod) == aiDRNULL)
108  aiAbort(248);
109 
110  numknot = nknots;
111  return(aiknogetS(curnod,aixf));
112 }
113 
114 // Eintrag hinten anfuegen
115 
116 SHORT aiEntAd(SHORT rgnum, CHAR *srcval, PTRL airecnum, SHORT aiaddt)
117 {
118  CHAR aikey[aiMXLG];
119  CHAR *tp;
120  CHAR *vp;
121  RECNR lnod;
122  aiDATEI *aixf;
123  aiTRSTR *aibloc;
124  aiTRSTR *lbp;
125 
126  aiG_fhln = FHLNUL;
127  if((aixf = aichktf(rgnum)) == NULL)
128  return(aiG_fhln);
129  else if(aixf->flgcls != aiIXCL)
130  return(aierro(FHLFMIN));
131 
132  if(aiaddt != aiBLDA)
133  {
134  aicopy(aikey,srcval,aixf->kylgth);
135  setdpl(aikey,aixf,&airecnum);
136  }
137 
138  if(aiaddt == aiNXTA)
139  {
140  /* additional key value */
141  if(started != rgnum)
142  return(aierro(FHLKNIC));
143  aibloc = savbp;
144  vp=aidatpoiS(aibloc,elem); /* $$010522 NEU */
145  if(!strcmp((char *)vp,"zzzz")) return(FHLKOUT);
146  if((aiG_cpra = compar(aikey,vp,aixf)) <= 0)
147  return(aierro(FHLKOUT));
148 
149  }
150  else if(aiaddt == aiFSTA)
151  {
152  /* first key value */
153  if(started != -1)
154  return(aierro(FHLKNIC));
155  else if(aiEntLa(rgnum,lastkey) == aiDRNULL)
156  {
157  /* start with empty tree */
158  if(aiG_fhln)
159  return(aiG_fhln);
160  elem = aiG_cpra = 0;
161  prvnod = aiDRNULL;
162  if((savbp = aibloc = nwknot(aixf,&begnod,NO)) == NULL)
163  return(aiG_fhln);
164  curnod = begnod;
165  numknot = 1L;
166  newlfflg(aibloc,aixf);
167  started = rgnum;
168  }
169  else if(compar(aikey,lastkey,aixf) > 0)
170  {
171  /* adding to end of tree */
172  if((savbp = aibloc = skpreg(aixf)) == NULL)
173  return(aiG_fhln);
174  elem = aibloc->ckyv;
175  if(elem)
176  aiG_cpra = compar(aikey,lastkey,aixf);
177  else
178  aiG_cpra = 0;
179  started = rgnum;
180  if(aichkupt(aixf))
181  return(aiG_fhln);
182  }
183  else
184  return(aierro(FHLKOUT));
185  }
186  else if(aiaddt == aiBLDA)
187  {
188  // mehr kommt nicht
189  if(started != rgnum)
190  return(aierro(FHLKNIC));
191  if((aibloc = aiknogetS(curnod,aixf)) == NULL)
192  return(aiG_fhln);
193  tp = aidathiS(aibloc);
194  elem = 0;
195  while(elem++ < aixf->kylgth)
196  *tp++ = 0xff;
197  savekn(aibloc,aibloc->ckyv);
198  while(1)
199  {
200  if(numknot == 1)
201  {
202  aixf->wurz = begnod;
203  if(aiprefwr(aixf) || aichkupt(aixf))
204  return(aiG_fhln);
205  else
206  {
207  started = -1;
208  return(FHLNUL);
209  }
210  }
211  lnod = begnod;
212  if(aiG_beb > 0)
213  {
215  begnod = aiG_down[aiG_beb--];
216  if((aibloc = aiknogetS(begnod,aixf)) == NULL)
217  return(aiG_fhln);
218  if(aibloc->rgtkey != aiDRNULL) aiAbort(249);
219  elem=aibloc->ckyv;
220  if(elem)
221  {
222  TST=aidatpoiS(aibloc,aibloc->ckyv);
223  if(aibloc->ckyv) delexp(aibloc);
224  if(!aibloc->ckyv) printf("***aibloc error 2***"); /*test*/
225  savekn(aibloc,aibloc->ckyv);
226  elem=aibloc->ckyv;
227  if(!elem) printf("***aibloc error 3 elem=%d***",elem); /*test*/
228  if(elem) TST=aidatpoiS(aibloc,elem), /* critical for elem==0 */
229  aicopy(lastkey,TST,aibloc->kylg);
230  }
231  }
232  else
233  {
234  elem = aiG_cpra = 0;
235  numknot = 1;
236  if((aibloc = nwknot(aixf,&begnod,NO)) == NULL)
237  return(aiG_fhln);
238  nonlfflg(aibloc,aixf);
239  }
240  curnod = begnod;
241  do
242  {
243  if((lbp = aiknogetS(lnod,aixf)) == NULL)
244  return(aiG_fhln);
245  if(lbp->lfflg == BLATT)
246  aicopy(aikey,aidathiS(lbp),aixf->kylgth);
247  else
248  aicopy(aikey,aidatpoiS(lbp,lbp->ckyv),
249  aixf->kylgth);
250  if(elem != 0)
251  aiG_cpra = compar(aikey,lastkey,aixf);
252  if((aibloc = aiknogetS(curnod,aixf)) == NULL)
253  return(aiG_fhln);
254  if((aibloc = serins(aibloc,aikey,lnod,aixf)) == NULL)
255  return(aiG_fhln);
256  lnod = lbp->rgtkey;
257  }
258  while(lnod);
259  }
260  }
261 
262  if(serins(aibloc,aikey,airecnum,aixf) == NULL || aichkupt(aixf))
263  return(aiG_fhln);
264  aixf->entcnt++;
265  return(FHLNUL);
266 }
267 
268 // Flag f. neues Blatt
270 {
271  bp->lfflg = BLATT;
272  bp->mxkeys = kp->maxkv;
273  bp->mxbyt = kp->kylgmx;
274  bp->rgtkey = aiDRNULL;
275  bp->lftkey = prvnod;
276  if(kp->dupflg)
277  bp->rglfflg = DUPBLATT;
278  else
279  bp->rglfflg = aiREG;
280 }
281 
282 // Flag f. neuen Knoten, Nichtblatt
284 {
285  bp->lfflg = NBLATT;
286  bp->mxkeys = kp->maxkn;
287  bp->mxbyt = kp->kybmx;
288  bp->rgtkey = aiDRNULL;
289  bp->lftkey = aiDRNULL;
290  if(kp->dupflg)
291  bp->rglfflg = aiDPNL;
292  else
293  bp->rglfflg = aiREG;
294 }
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