a99  V32.6
allegro Windows Hauptprogramm
 Alle Klassen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
exet3.cpp
gehe zur Dokumentation dieser Datei
1 // exet3.cpp %% DOS: naexp3.c
2 // 1995-08-19 Parameterdatei, Hilfsroutinen bei der Abarb.
3 // Klasse EXET, Teil 3 (c) UB Braunschweig 1995
4 
5 // Copyright 2011 Universitätsbibliothek Braunschweig, more see bottom
6 
7 #include "allegro.hpp"
8 #include "record.hpp"
9 #include "exet.hpp"
10 
11 
12 // FUNCTIONS
13 // Zur Nutzung von aussen interessant nur
14 // E3Coding() Umcodieren mit o.apt
15 // und
16 // E3SpecKat(fieldlabel)
17 // detect special category, #dt etc.
18 // interne Nummer einer Sonderkategorie finden, z.B. #op = -252-256
19 // Man muss dann 256 wieder draufaddieren, um mit ExFindKat() den Wert zu kriegen
20 // also: ExFindKat(E3SpecKat("#op")+256) = Name des Operators
21 // (Die Gruende fuer diese Umstaendlichkeit liegen in exet.cpp)
22 
23 short EXET::E3SpecKat(CHAR *w) // w="#xyz..." finde Sonderkategorie
24 {
25  short f;
26  switch (w[1])
27  {
28  case 'd': // #dt = date
29  case 'z': // #zz any
30  f=240; // vorher 253 $$980709
31  break;
32  case 'f': // #fn = file name
33  f=241; // $$970603 NEU
34  break;
35  case 'o': // #op = Operator
36  f=252;
37  break;
38  case 'n': // #nr = number of rec within file
39  case 'r':
40  f=250;
41  break;
42  case 'h': // #hi = Hierarchy code
43  f=249;
44  break;
45  case 'g': // #gt = gesamttitel
46  f=248;
47  break;
48  case 'a': // #ax = Indexdatei MultiX
49  f=247;
50  break;
51 
52  case 'c': // #cn = card number of mult card - obsolete
53  // #cc = current category
54  // #ch = current heading from ak=...
55  if (w[2]=='c') f=251;
56  else f=231;
57  break;
58 
59  case 'p': // #pi = page #
60  if (w[2]=='0') f=246; // #p0 : even
61  else if (w[2]=='1') f=245; // #p1 : odd
62  else if (w[2]=='a') f=243; // #pa : actual number of set 0!
63 // $$961207 NEU: #pz
64  else if (w[2]=='z') f=229; // #pz : current line
65  else f=244; // #p2 : no matter
66  break;
67 
68  case 'w': // repeat text for heading (wiederhole) up until here
69  f=242;
70  break;
71 
72  case 'm': // is it a multivolume work?
73  f=230;
74  break;
75 
76 
77  case 'u': // user variables : #ua=2049, #ub=2050, ..
78  f=w[2]-'a'+2049; // #u0 = 2000 0,1,2,3 $$931212 neue #u-Kategor
79  // = nr of fields, 1st, nxt, last field
80  break;
81 
82  default:
83  return -1;
84  }
85  return(-f-256);
86 }
87 
88 // Suchroutine fuer Manip.Bef. b"...", e"...", c"...", b"[...] usw.
89 // wird auch in a99/acon gebraucht fuer b"[...]"
90 
91 // $$961214 : st kann jetzt mit # beginnen, dann Kategorietext
92 // $$081128 : gm neu (wg. FLEX b,e,x : <>-Modus nicht wirksam!
93 
94 CHAR *EXET::fndstr(CHAR *adr,CHAR *St,int m,int qt,int gm)
95 // find st in adr, end-of-st = qt
96 // m=0: pos of st in adr , ?=wildcard in st
97 // 1: pos after st
98 // gm=0 : Modus <> wirksam 1: unwirksam
99 // return: addr of st or NULL
100 // SPECIAL CASE: st=[xyz]: find any of xyz in adr
101 // st="#nnn" use #nnn
102 {
103  int i=0,j=0,k=0,n;
104  char xx=0;
105  // $$961214 NEU 4 Zeilen:
106  int gk=0; // groesser/kleiner modus $$961218
107  int nm=0; // NON-Modus $$010314 NEU
108  CHAR *st;
109 #ifndef WIN32
110 // extern char *ExFindKat(); // ve: "extern" Deklaration ueberhaupt noetig??
111 #endif
112  st=St;
113 
114  j=strlen(adr); // st=~xyz: ignore upper case
115  // $$060403 st[1]!=qt
116  if (*st==255) ++st;
117  else if (*st=='^' && st[1]!=qt) ++st,nm=1; // $$010314 NEU
118  if (*st=='~' && st[1]!=qt) ++st,xx=32; // $$040824 : ==255 wg. FLEX
119 
120  // $$961214 NEUer Abschnitt
121  if (!gm) if (*st=='<' || *st=='>') gk=*st++; // $$961218
122 
123  if (!*st) return adr; // Suchwort leer - Erfolg!
124 
125  if (*st=='#' && st[1]) // b"#abc" : bei #uxy wird Inhalt von #uxy gesucht, sonst Zeichenfolge "#abc"
126  {
127  k=kfg->KoVerify(st+1);
128  if (k==-1) k=E3SpecKat(st)+256;
129  if (k==255) goto TEXT; // keine guelt. KatNr, dann als Text suchen
130  *Aerror=0; // $$990917 NEU wg c"#uxy"
131  if (st[1]=='u') n=st[3]; // $$000215 NEU: #u kuerzer als #nnn
132  else n=st[tgl+1];
133  if (n==1) n=' ';
134  st=ExFindKat(k,(CHAR) n,cri);
135  if (!st) return (CHAR*)NULL;
136  else st+=kfg->skt;
137  qt=0;
138  }
139 // if(*st=='?') ++st; // '?' am Anfang nicht sinnvoll $$970115
140 
141 TEXT:
142  if (*st!='[') while (i<j) // srch for string st
143  {
144  k=0; // $$961218 : 2 zeilen
145  if (!gk)
146  {
147  if (*st==wildc_e) ++i;
148  else
149  while (i<j && (adr[i++]|xx)!= ((*st)|xx)) // 1. Zeichen von st suchen
150  if (i==j)
151  {
152  if (nm) return adr;
153  return (CHAR *)NULL;
154  }
155  }
156  else --k;
157  n=i; // jetzt weiter vergleichen
158  while (st[++k]!=qt && ((st[k]|xx)==(adr[n]|xx) || st[k]==wildc_e)) ++n;
159  if (st[k]==qt)
160  {
161  if (gk && !gm) if (!adr[k]) return 0; // Verb. $$20070201
162  else if (gk=='<') return 0;
163  else return adr+k; // not > or <, both equal
164  if (m==1) if (nm) return (CHAR *)NULL;
165  else return(adr+i+k-1);
166  else if (nm) return (CHAR *)NULL;
167  else return(adr+i-1);
168  }
169  if (gk=='<' && !gm) if (st[k]>(adr[k]|xx)) return adr;
170  else return (CHAR *)NULL;
171  if (gk=='>' && !gm) if (st[k]<(adr[k]|xx)) return adr;
172  else return (CHAR *)NULL;
173  }
174  else // b"[xyz"] : srch for character in st
175  {
176  while (*adr)
177  {
178  k=1;
179  while (st[k]!=']')
180  if (*adr==st[k]) if (m) if (nm) return (CHAR *)NULL;
181  else return adr+1;
182  else if (nm) return (CHAR *)NULL;
183  else return adr;
184  else ++k;
185  ++adr;
186  }
187  }
188  if (nm) return adr;
189  return (CHAR *)NULL; // result neg.
190 }
191 
192 
193 // Globale Ersetzungen als Parameterbefehl
194 
195 int EXET::replace(int md, int ps) // do global replacements
196 // md 1: replace, 0: restore
197 // 2: replace in an uploaded rec
198 // ps 0: repl. belonging to param set
199 // 1: editor replacements
200 // return: >0: sthg was repl, 0:nthg
201 {
202  int i=0;
203  int k=1;
204  static int j;
205  int p;
206  int result=0;
207  static CHAR *dest, *src, *dest0, *src0, *gend0;
208  static unsigned int cnt, cnt0, cri0, cri1, gri0;
209  if (!gri || !xrp[ps]) return 0; // rec space empty!
210  if (md)
211  {
212  cri1=cri;
213  if (md==1)
214  {
215  while (ga[cri][1]!=1) --cri;
216  cri0=cri;
217  dest0=src=rec->ga[cri]; // Anfang der Verschiebung
218  cnt0=cnt=rec->gend-src+1; // Laenge
219  src0=dest=rec->ga[0]+(kfg->gspace)-cnt; // oberer Bereich von ga[]
220  gend0=rec->gend;
221  memmove(dest,src,cnt);
222  while (ga[k][1]!=1 && k<gri) ++k; // nxt main entry
223  gri0=gri;
224  gri=k;
225  rec->gend=ga[k];
226  k=gri0;
227  j=kfg->gdim-1;
228  while (k>=(int)cri)
229  {
230  ga[j]=ga[k];
231  gi[j]=gi[k];
232  --j;
233  --k;
234  }
235  ++j;
236  }
237  *ga[gri]=EOD;
238  k=30000+Gns*500;
239  while (i<xrp[ps])
240  {
241  p=phi-1;
242  while (p>=0 && pi[p]>k+i) --p;
243  if (*pa[p]=='*')
244  {
245  if (rec->FSrRp(pa[p],1)) ++result; // repl in field
246  }
247  else
248  {
249  if (rec->SrRp(pa[p],ga[cri],1,1,1)) ++result; // replace in whole rec
250  }
251  ++i;
252  }
253  }
254  else
255  {
256  k=cri0;
257  memmove(dest0,src0,cnt0);
258  gri=gri0;
259  rec->gend=gend0;
260  while (j<(int)kfg->gdim)
261  {
262  ga[k]=ga[j];
263  gi[k]=gi[j];
264  ++k;
265  ++j;
266  }
267  }
268  cri=cri1;
269  return result;
270 }
271 
272 // Glob. Ersetzungen rueckgaengig
273 
274 void EXET::restore() // undo the global replacements
275 {
276  replace(0,0);
277  return;
278 }
279 
280 // remove whitespace and punctuation from end of string a, using i3
282 {
283  int i=strlen(a)-1;
284  while (strchr(xisep3,a[i]) && i) a[i--]=NL; // i3
285  return;
286 }
287 
288 
289 // String mit o.apt behandeln
290 void EXET::E3Coding(CHAR *a, unsigned int len, int md) // ANSI-ASCII Coding
291 // len: Laenge der Zeichenkette, 0: bis zum Code 0
292 // md: 0: ASCII->ANSI, 1: ANSI->ASCII
293 {
294  int j=0;
295  CHAR *cd;
296  if (*Aextra>1) return; // UNICODE mode is on
297  if (md) cd=etb[1];
298  else cd=etb[0];
299  if (!len) len=strlen(a);
300  while (j<(int)len)
301  {
302  if (cd[a[j]]) a[j]=cd[a[j]];
303  else ++j;
304  ++j;
305  }
306  return;
307 }
308 
309 
310 // Vergleich in der Stoppwortliste, Woerter stehen in nonterm[]
311 
312 int EXET::ntfind(int a, int z) // binary srch in nonterm list between a and z
313 // CHAR *bkey is the term,
314 // result: 1:its a term, 0: its a nonterm
315 {
316  int az, b;
317  if (!*bkey) return 0;
318  if (z<=a) return 1;
319  if (z==a+1) // there's only a left: check both
320  if (!STRCMP(bkey,nonterm[a]) || !STRCMP(bkey,nonterm[z])) return 0;
321  else return 1;
322  az=a+(z-a)/2;
323  b=STRCMP(bkey,nonterm[az]); // s.u.
324  if (b<0) return ntfind(a,az);
325  if (b==0) return 0;
326  return ntfind(az,z); // recursive
327 }
328 
329 
330 // Vergleiche zwei Schluessel
331 
332 int EXET::STRCMP(CHAR *a, CHAR *b) // allegro strcmp() : are 2 keys equal?
333 {
334  // $$940224 naechste Zeile: (wg. Joker in Stopw.Liste)
335  while (*b && (*a==*b || *b=='?'))
336  {
337  if (*a) ++a;
338  ++b;
339  }
340  if (!*b || *b=='?') if (!*a || strchr((char *)xisep1,(int)*a)) return 0; // keys are equal
341  // significant portion of key ends at any char from xisep1[] = i1
342  return (int)*a-(int)*b;
343 }
344 
345 /*
346  Copyright 2011 Universitätsbibliothek Braunschweig
347 
348  Licensed under the Apache License, Version 2.0 (the "License");
349  you may not use this file except in compliance with the License.
350  You may obtain a copy of the License at
351 
352  http://www.apache.org/licenses/LICENSE-2.0
353 
354  Unless required by applicable law or agreed to in writing, software
355  distributed under the License is distributed on an "AS IS" BASIS,
356  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
357  See the License for the specific language governing permissions and
358  limitations under the License.
359 */
360