root/tags/5.52/mz.c

Revision 4, 18.8 kB (checked in by heitor.barbieri, 2 years ago)

Versão 5.52 do cisis (28/04/2010)

Line 
1/* --------------------------- mz.c -------------------------------- */
2
3#include <stdio.h>
4#include <ctype.h>
5#include <string.h>
6
7#include "cisis.h"      /* CISIS Interface */
8#include "cirun.h"      /* runtime area and defines by AOT */
9
10#if RECGIZM
11#define MZGIZMO 1
12#endif
13#define MZFST   1
14
15#define ISX(s) (strcmp(s,"x") == 0 || strcmp(s,"X") == 0)
16
17int parmtrace = 0;
18int parmwait = 1;
19
20UCHR *key1p =  "!";
21UCHR *key2p =  NULL;
22UCHR qlfx = '\0';
23LONGX parmpst1=0L;
24LONGX parmpst2=0L;
25
26UCHR currkey[LE2+1];
27
28LONGX freq[LE2+1];
29
30char line[BUFSIZ];
31
32/* gizmo || fst */
33#if MZGIZMO || MZFST
34RECSTRU *recp;
35LONGX keyrec=1L;
36LONGX fstrec=2L;
37char buffup[MAXMFRL+BUFSIZ];
38int buffuplen=sizeof(buffup)-1;
39int xdir;
40#endif 
41
42/* gizmo */
43#if MZGIZMO
44VGIZPSTRU *gizmap,*vgizmap = NULL;
45#endif 
46
47/* fst */
48#if MZFST
49char *stwp=NULL;
50FST_CODE *fstpgmp=NULL;
51char *lnk1p=NULL;
52char *lnk2p=NULL;
53LONGX maxlk1=1000;
54LONGX maxlk2=500;
55int fstfd0=0;
56int fstfd1=0;
57int parmcore=0;
58#endif
59
60#if MZFST
61LONGX qtylk1,qtylk2;
62#endif
63
64
65void main(argc,argv)
66int argc;
67char *argv[];
68
69{
70    TRMSTRU *trmp;
71    LONGX itrm = 0L;
72    char *dbnp;
73    int parmcontrol,minus1,plus1;
74    int parmterms,parminfo,parmposts,parmfind=0,parmstrip=0;
75    LONGX parmtell,parmcount,count=0L;
76    int i,argnext,found,n;
77    int treecase;
78    INFX info1;
79    INFO info2;
80    INFX info3=0;
81    CNSTRU *cp;
82    UCHR *p,*q;
83    int key2l;
84    LONGX parmload=0L;
85#if SAMEL
86    int lxy;
87#endif
88
89
90    if (argc == 1) {
91        printf("%s",cicopyr("Utility MZ"));
92        printf("\n");
93        printf("mz <dbname> [<option> [...]] \n");
94        printf("\n");
95        printf("options: \n");
96        printf(" \n");
97        printf("   {from|to}=<upkey>\n");
98        printf("   {minpost|maxpost}=<no_posts> \n");
99        printf(" \n");
100#if BIREME
101        printf("   qlf=[<char>|?] \n");
102        printf("   load=<no_bytes> \n");
103        printf("\n");
104#endif
105        printf("   {tell|count}=<no_terms> \n");
106        printf("   {+|-}{control|terms[/i]|posts|all} [now] [strip] \n");
107#if MZGIZMO
108        printf("\n");
109        printf("   gizmo=<gizmo_dbn>[,<taglist>] \n");
110#endif
111#if MZFST
112        printf("   fst={<fst_spec>|@[<file>]} [stw=@[<file>]] ");
113        printf("[ln{1|2}=<file> [+fix[/m]]] \n");
114        printf("   actab=<file> \n");
115        printf("   wlookup={@|<ifn>} \n");
116#endif
117        printf("\n");
118        exit(1);
119    }
120    else {
121        dbnp=argv[1];
122        argnext=2;
123    }
124
125    if (strcmp(dbnp,"trace") == 0) {
126        parmtrace=1;
127        dbnp=argv[argnext++];
128    }
129    if (strcmp(dbnp,"trace=trm") == 0) {
130        parmtrace=1;
131        trmtrace=1;
132        dbnp=argv[argnext++];
133    }
134    if (strcmp(dbnp,"trace=dbx") == 0) {
135        parmtrace=1;
136        dbxtrace=1;
137        dbnp=argv[argnext++];
138    }
139    if (strcmp(dbnp,"trace=all") == 0) {
140        parmtrace=1;
141        dbxtrace=trmtrace=1;
142        dbnp=argv[argnext++];
143    }
144
145
146    parmcontrol=0; parmterms=1; parminfo=parmposts=0; parmtell=parmcount=0;
147    minus1=plus1=0;
148
149    for (i=argnext; i < argc; i++) {
150
151        p = argv[i];
152
153        if (*p == '-') {
154            minus1++;
155            if (minus1 == 1)
156                parmcontrol=parmterms=parminfo=parmposts=1;
157        }
158
159        if (strcmp(p,"-all") == 0) {
160            parmcontrol=parmterms=parminfo=parmposts=0;
161            continue;
162        }
163
164        if (strcmp(p,"-control") == 0) {
165            parmcontrol=0;
166            continue;
167        }
168        if (strcmp(p,"-terms") == 0) {
169            parmterms=0;
170            continue;
171        }
172        if (strcmp(p,"-terms/i") == 0) {
173            parmterms=parminfo=0;
174            continue;
175        }
176        if (strcmp(p,"-posts") == 0) {
177            parmposts=0;
178            continue;
179        }
180
181        if (strcmp(p,"nowait") == 0 || strcmp(p,"now") == 0) {
182            parmwait=0;
183            continue;
184        }
185
186#if MZFST
187        if (strcmp(p,"+fix") == 0) {
188            cifstfix=1;
189            continue;
190        }
191        if (strcmp(p,"+fix/m") == 0) {
192            cifstfix=cifstfim=1;
193            continue;
194        }
195#endif
196        if (strcmp(p,"+find") == 0) {
197            parmfind=1;
198            continue;
199        }
200
201        if (*p == '+') {
202            plus1++;
203            if (plus1 == 1)
204                parmcontrol=parmterms=parminfo=parmposts=0;
205        }
206        if (strcmp(p,"+all") == 0) {
207            parmcontrol=parmterms=parminfo=parmposts=1;
208            continue;
209        }
210
211        if (strcmp(p,"+control") == 0) {
212            parmcontrol=1;
213            continue;
214        }
215        if (strcmp(p,"+terms") == 0) {
216            parmterms=1;
217            continue;
218        }
219        if (strcmp(p,"+terms/i") == 0) {
220            parmterms=parminfo=1;
221            continue;
222        }
223        if (strcmp(p,"+posts") == 0) {
224            parmposts=1;
225            continue;
226        }
227
228        if (strncmp(p,"tell:",5) == 0 || strncmp(p,"tell=",5) == 0) {
229            if (sscanf(p+5,"%ld",&parmtell) != 1)
230                fatal(p);
231            continue;
232        }
233        if (strncmp(p,"count:",6) == 0 || strncmp(p,"count=",6) == 0) {
234            if (sscanf(p+6,"%ld",&parmcount) != 1)
235                fatal(p);
236            continue;
237        }
238
239        if (strcmp(p,"trace") == 0) {
240            parmtrace=1;
241            trmtrace=1;
242            continue;
243        }
244
245        if (strncmp(p,"key1=",5) == 0 || strncmp(p,"from=",5) == 0) {
246            key1p=p+5;
247            continue;
248        }
249
250        if (strncmp(p,"key2=",5) == 0 || strncmp(p,"to=",3) == 0) {
251            if (strncmp(p,"key2=",5) == 0) key2p=p+5; else key2p=p+3;
252            key2l=strlen(key2p);
253            continue;
254        }
255
256        if (strncmp(p,"qlf=",4) == 0) {
257            qlfx=p[4]; continue;
258        }
259
260        if (strncmp(p,"pst1:",5) == 0 || strncmp(p,"pst1=",5) == 0) {
261            if (sscanf(p+5,"%ld",&parmpst1) != 1)
262                fatal(p);
263            continue;
264        }
265        if (strncmp(p,"pst2:",5) == 0 || strncmp(p,"pst2=",5) == 0) {
266            if (sscanf(p+5,"%ld",&parmpst2) != 1)
267                fatal(p);
268            continue;
269        }
270        if (strncmp(p,"minpost:",8) == 0 || strncmp(p,"minpost=",8) == 0) {
271            if (sscanf(p+8,"%ld",&parmpst1) != 1)
272                fatal(p);
273            continue;
274        }
275        if (strncmp(p,"maxpost:",8) == 0 || strncmp(p,"maxpost=",8) == 0) {
276            if (sscanf(p+8,"%ld",&parmpst2) != 1)
277                fatal(p);
278            continue;
279        }
280
281        if (strncmp(p,"tidx:",5) == 0 || strncmp(p,"tidx=",5) == 0) {
282            if (sscanf(p+5,"%ld",&itrm) != 1)
283                fatal(p);
284            continue;
285        }
286
287        if (strncmp(p,"load:",5) == 0 || strncmp(p,"load=",5) == 0) {
288            if (sscanf(p+5,"%ld",&parmload) != 1)
289                fatal(p);
290            if (parmload > ALLOMAXV) {
291                parmload = ALLOMAXV;
292                fprintf(stderr,"+++ load=%ld\n",parmload);
293            }
294            continue;
295        }
296
297#if MZGIZMO
298        if (strncmp(p,"gizmo:",6) == 0 || strncmp(p,"gizmo=",6) == 0) {
299            q=p+6;
300            if (!*q) fatal(p);
301            if (vgizmap) {      /* gizmo already defined */
302                for (gizmap=vgizmap; gizmap->nextp; )
303                    gizmap=gizmap->nextp;
304                gizmread(q,&gizmap->nextp,keyrec);
305                gizmap=gizmap->nextp;
306            }
307            else {              /* first gizmo definition */
308                gizmread(q,&vgizmap,keyrec);
309            }
310            if (parmtrace) {
311                for (gizmap=vgizmap; gizmap; gizmap=gizmap->nextp)
312                    printf("+++ gizmo=%s \n",gizmap->gdbnp);
313            }
314            continue;
315        }
316#endif /* MZGIZMO */
317
318#if MZFST
319        if (strcmp(p,"core") == 0) {
320            parmcore=1;
321            continue;
322        }
323        if (strncmp(p,"ln1?",4) == 0 || strncmp(p,"ln1=",4) == 0) {
324            if (fst_open(NULL,p+4,0) <= 0) fatal(p);
325            fstfd0=fst_fd[0];
326            continue;
327        }
328        if (strncmp(p,"ln2?",4) == 0 || strncmp(p,"ln2=",4) == 0) {
329            if (fst_open(NULL,p+4,1) <= 0) fatal(p);
330            fstfd1=fst_fd[1];
331            continue;
332        }
333
334        if (strncmp(p,"fst?",4) == 0 || strncmp(p,"fst=",4) == 0) {
335                 q=p+4;
336            if (strcmp(q,"@") == 0) sprintf(q=line,"@%s.fst",dbnp);
337            if (!loadfile("",'@',q,buffup,buffuplen,'\n')) fatal(q);
338            fst_gener(&fstpgmp,buffup);
339            if (parmtrace) { showcore("+++ fst"); printf("%s.\n",buffup); }
340            if (fst_error) {
341                printf("\n*** FST error#%ld at line %ld\n",fst_error,fst_errl);
342                if (fst_error == FSTERRF)
343                    printf("\n*** FMT error#%ld at offset %ld\n",
344                                                fmt_error,fmt_errof);
345                fatal(fst_errp);
346            }
347            continue;
348        }
349
350        if (strncmp(p,"stw?",4) == 0 || strncmp(p,"stw=",4) == 0) {
351            q=p+4;
352            if (*q++ != '@') fatal(p);
353            if (!*q) sprintf(q=line,"%s.stw",dbnp);
354            stwp=loadstw("",q,stwp=NULL,0L,&n);
355            if (parmtrace) {
356                for (q=stwp; *q; q+=LE1+1) printf("%s/",q);
357                printf("=%d\n",n);
358                showcore("+++ stw");
359            }
360            continue;
361        }
362
363
364        if (strcmp(p,"strip") == 0) {
365            parmstrip=1;
366            continue;
367        }
368
369
370        if (strncmp(p,"actab?",6) == 0 || strncmp(p,"actab=",6) == 0) {
371            if (strcmp(p+6,",numbers") == 0) {
372              int c;
373    if (!isiswctot) {
374        memset(isiswctab,0x00,256);
375        for (isiswctot=0; isisactab[isiswctot]; isiswctot++)
376            isiswctab[isisactab[isiswctot]]=1;
377    }
378              for (c=(int)'0'; c <=(int)'9'; c++)
379                  isiswctab[c]=1;
380            }
381            else {
382              unsigned char ubuffup[256];
383              memset(isiswctab,0x00,256);
384              if (!loadactb(NULL,ubuffup,p+6)) fatal(p);
385              for (isiswctot=0; ubuffup[isiswctot]; isiswctot++)
386                  isiswctab[ubuffup[isiswctot]]=1;
387            }
388            continue;
389        }
390
391        if (strncmp(p,"wlookup?",8) == 0 || strncmp(p,"wlookup=",8) == 0) {
392            fst_wlupifnp=p+8;
393            if (strcmp(fst_wlupifnp,"@") == 0) fst_wlupifnp=dbnp;
394            continue;
395        }
396
397#endif
398
399#if MZFST
400        if (strncmp(p,"ln1?",4) == 0 || strncmp(p,"ln1=",4) == 0) {
401#if MXIFUPD
402            if (ifnp) fatal(p);
403#endif
404            if (fst_open(NULL,p+4,0) <= 0) fatal(p);
405            continue;
406        }
407        if (strncmp(p,"ln2?",4) == 0 || strncmp(p,"ln2=",4) == 0) {
408#if MXIFUPD
409            if (ifnp) fatal(p);
410#endif
411            if (fst_open(NULL,p+4,1) <= 0) fatal(p);
412            continue;
413        }
414#endif
415
416        fatal(p);
417    }
418
419
420
421    /* Set up */
422
423#if MZFST
424    if (fstpgmp) parmposts=1;
425#endif
426
427    if (parmposts+parmpst1+parmpst2 == 0) {
428        trmalloc(labs(itrm),0L);
429    }
430    if (parmload) {
431        invflush(dbnp); /* test it */
432        invsetup(dbnp,parmload,parmload,parmload);
433    }
434    memset(freq,0x00,sizeof(freq));
435
436    dbxopt_ordwr=O_RDONLY;
437    TERM(itrm,dbnp,key1p);
438
439    if (parmcontrol || parmtrace) {
440#if SAMEL
441        printf("*%s [%d/%d]\n",dbnp,TDBiflxx,TDBifmap->iflxn);
442#else
443        printf("*%s\n",dbnp);
444#endif
445
446        printf("idtype ordn ordf   n   k  liv    ");
447        printf("posrx nmaxpos  fmaxpos  abnormal\n");
448
449        for (treecase=0; treecase < 2; treecase++) {
450            cp= &TDBifmap->cn[treecase];
451            printf("%4d  %4d %4d %4d%4d",
452                                cp->idtype,cp->ordn,cp->ordf,cp->n,cp->k);
453            printf("%4d %8ld",cp->liv,cp->posrx);
454            printf("%8ld %8ld    %4d\n",
455                                cp->nmaxpos,cp->fmaxpos,cp->abnormal);
456        }
457        if (parmtrace) {
458#if IFUPDAT
459        printf("cn =%3d     \n",TDBifmap->cnopn);
460#else
461        printf("cn =%3d = %p  +%6ld\n",0,NULL,TDBifmap->cc_offset);
462#endif
463#if CNCLx
464        printf("n1 =%3d = %p  +%6ld\n",
465                TDBifmap->n1opn,TDBifmap->nybasep[0],TDBifmap->cn_offset[0]);
466        printf("n2 =%3d = %p  +%6ld\n",
467                TDBifmap->n2opn,TDBifmap->nybasep[1],TDBifmap->cn_offset[1]);
468        printf("l1 =%3d = %p  +%6ld\n",
469                TDBifmap->l1opn,TDBifmap->lybasep[0],TDBifmap->cl_offset[0]);
470        printf("l2 =%3d = %p  +%6ld\n",
471                TDBifmap->l2opn,TDBifmap->lybasep[1],TDBifmap->cl_offset[1]);
472#endif
473#if SAMEL
474        printf("if =%3d = %p  +%6ld [#%d]\n",
475                TDBifmap->ifopn[0],TDBifmap->iybasep,TDBifmap->ci_offset,
476                TDBiflxx);
477        for (lxy=2; lxy <= TDBifmap->iflxn; lxy++)
478            printf("if =%3d = %p          [#%d]\n",
479                TDBifmap->ifopn[lxy-1],NULL,lxy);
480#else
481        printf("if =%3d = %p\n",TDBifmap->ifopn,TDBifmap->iybasep);
482#endif
483#if NX
484        printf("n1 0 %3d %3d %p\n",TDBifmap->nx[0][0].pages);
485#endif
486    } /* parmtrace */
487    }
488
489
490
491    /* Execution */
492
493    for (; TRMrc != RCEOF; ) {
494
495                if (key2p)
496                    if (memcmp(TRMkey,key2p,key2l) > 0)
497                        break;
498
499                if (parmwait)
500                    if (count) {
501                        printf(".."); gets(line);
502                        if (ISX(line) || strcmp(line,"/*") == 0) break;
503                        if (line[0]) { 
504printf("%s<=\n",line);                 
505                            TERM(itrm,dbnp,line); 
506                            continue; 
507                        }
508                    }
509
510                if (parmposts+parmpst1+parmpst2) {
511                    posthdr1(trmp); /* get ifp 1st segm */
512                }
513
514                    if (TRMlcase) {            /* {} yes */
515                        info1=((L2IDXE *)TRMlidxp(1))->info1;
516                        info2=((L2IDXE *)TRMlidxp(1))->info2;
517#if LIND
518                        info3=((L2IDXE *)TRMlidxp(1))->info3info4.info3;
519#endif
520                    }
521                    else {
522                        info1=((L1IDXE *)TRMlidxp(0))->info1;
523                        info2=((L1IDXE *)TRMlidxp(0))->info2;
524#if LIND
525                        info3=((L1IDXE *)TRMlidxp(0))->info3info4.info3;
526#endif
527                    }
528                   
529                if (parmpst1) 
530                    if (TRMxytotp < parmpst1) { NXTERM(itrm); continue; }
531                if (parmpst2)
532                    if (TRMxytotp > parmpst2) { NXTERM(itrm); continue; }
533
534#if MZFST || MZGIZMO
535        if (
536#if MZGIZMO
537            vgizmap ||
538#endif
539                       fstpgmp) {
540                if (!recinit) recinit();
541                if (!vrecp[keyrec]) recallok(keyrec,MAXMFRL);
542                recp=vrecp[keyrec];
543                RECtype=TYPEMFR;
544                memset(MFX,0x00,LEADER); MFRbase=MFRmfrl=LEADER;
545                MFRmfn=count+1;
546      for (n=vlex[TRMlcase]; n--; ) if (TRMkey[n] != ' ') break;
547                p=buffup; *p='\0';
548#if BEFORE20030113
549                sprintf(p,"A1\x01%s\x01",TRMkey);
550#else
551      if (parmstrip) {
552        int wlen;
553        UCHR word[LE2+1+1]/*,*wp*/;
554                  for (q=(UCHR *)TRMkey; ; ) {
555          word[wlen=0]='\0';
556                    while (isiswctab[*q]) {
557                            if (wlen < sizeof(word)) word[wlen++] = *q;
558                            if (!*++q) break;
559                    }
560                    while (!isiswctab[*q]) if (*q) q++; else break;
561                    if (wlen == 0) if (*q) continue; else break;
562                    word[wlen] = '\0';
563                    /* for (wp=word; *wp; wp++) *wp = isisuctab[*wp]; */
564          if (wlen == n+1) {
565                      sprintf(p,""); break;
566          }
567          else {
568                      sprintf(p,"A1\x01");  p+=strlen(p);
569            sprintf(p,"%s ",word); p+=strlen(p);
570            sprintf(p,"\x01");    p+=strlen(p);
571          }
572          if (!*q) break;
573        }
574      }
575      else {
576                    sprintf(p,"A1\x01%s\x01",TRMkey);
577      }
578#endif
579                p+=strlen(p);
580                sprintf(p,"A2~%d~",n+1);
581                p+=strlen(p);
582                sprintf(p,"A5~^l%d^w%d^p%ld^i%d^o%d~",
583                        TRMlcase+1,vlex[TRMlcase],
584                        (TRMlcase)?TRMl2buf.pos:TRMl1buf.pos,
585                        TRMliock(TRMlcase)+1,
586                        (TRMlcase)?TRMl2buf.ock:TRMl1buf.ock);
587                p+=strlen(p);
588                sprintf(p,"A3~^a%"P_OFF_T"^b%ld^c%"P_OFF_T"~",(LONG_LONG)info1,info2,(LONG_LONG)info3);
589                p+=strlen(p);
590                sprintf(p,"A10~%ld~",TRMxytotp);
591                if (fldupdat(keyrec,buffup)) fatal(buffup);
592                if (parmtrace || parmcontrol) prtfields(recp,MFRmfn);
593        }
594#if MZGIZMO
595            for (gizmap=vgizmap; gizmap; gizmap=gizmap->nextp)
596                recgizmo(keyrec,gizmap);
597#endif
598#endif /* MZFST || MZGIZMO */
599
600
601                if (parmterms) {
602                    if (qlfx) {
603                        found=0;
604                        for (n=(TRMlcase)?LE2:LE1; n--; )
605                            if (TRMkey[n] != ' ') break;
606
607                        if (qlfx == '?') {
608                            /* fprintf(stderr,"%s=%d\n",TRMkey,n+1); */
609                            freq[n+1]++;
610                        }
611                        else {
612                            if (memchr(TRMkey+1,qlfx,n))
613                                found=1; /* /xx is ok */
614                            if (!found) {
615                                TRMkey[n+1]='\0';
616                                printf("%s\n",TRMkey);
617                            }
618                        }
619                    }
620                    else 
621                        if (/*parmcontrol || */ parminfo || parmtrace)
622                            printf(" + %s: %"P_OFF_T"/%ld/%"P_OFF_T"\n",
623                                TRMkey,(LONG_LONG)info1,info2,(LONG_LONG)info3);
624                        else
625                            printf("%s\n",TRMkey);
626                }
627
628                if (parmposts) {
629                    for (; posting(itrm,TRMpost+1) > 0; ) {
630#if MZFST
631        if (fstpgmp) {
632                recp=vrecp[keyrec];
633                MFRmfn=TRMpmfn;
634                sprintf(buffup,
635                        "D11D12D13D14A11~%ld~A12~%u~A13~%u~A14~%u~",
636                                TRMpmfn,TRMptag,TRMpocc,TRMpcnt);
637                if (fldupdat(keyrec,buffup)) fatal(buffup);
638                if (parmtrace || parmcontrol) prtfields(recp,MFRmfn);
639if (parmcore) {
640            *buffup='\0'; fst_batchp=buffup; fst_fd[0]=fst_fd[1]=0;
641} /* parmcore */
642            fst_inter(fstpgmp,keyrec,stwp,
643                        &lnk1p,maxlk1,&lnk2p,maxlk2,&qtylk1,&qtylk2);
644            fst_fx[0]+=qtylk1; /* lnk1p */
645            fst_fx[1]+=qtylk2; /* lnk2p */
646if (parmcore) {
647                fst_fd[0]=fstfd0; fst_fd[1]=fstfd1;
648                if (!vrecp[fstrec]) recallok(fstrec,(MAXMFRL+BUFSIZ));
649                recp=vrecp[fstrec];
650                RECtype=TYPEMFR;
651                memset(MFX,0x00,LEADER); MFRbase=MFRmfrl=LEADER;
652                MFRmfn=count+1;
653            if (*buffup) if (fldupdat(fstrec,buffup)) fatal(buffup);
654                if (parmtrace || parmcontrol) prtfields(recp,MFRmfn);
655            for (xdir=0; xdir < MFRnvf; xdir++) {
656/*
657  1  �ABSORPTION^m9^o1^c1^l1�
658*/
659                ;
660            }
661} /* parmcore */
662        }
663        else
664#endif
665                        printf("   #%ld/%ld: mfn=%ld tag=%d occ=%d cnt=%d\n",
666                            TRMpost,TRMxytotp,
667                            TRMpmfn,TRMptag,TRMpocc,TRMpcnt);
668                    }
669                }
670
671                count++;
672                if (parmtell)
673                    if ((count % parmtell) == 0)
674                        fprintf(stderr,"+++ %ld\n",count);
675
676                if (parmcount)
677                    if (count >= parmcount)
678                        break;
679                       
680                NXTERM(itrm);
681                if (parmfind) TERM(itrm,TDBname,TRMkey);
682    }
683
684    if (qlfx == '?') 
685        for (n=0; n <= LE2; n++)
686            if (freq[n]) printf("%2d|%9ld\n",n,freq[n]);
687
688
689#if MZFST
690    if (fstpgmp) {
691        if (lnk1p) FREE(lnk1p); 
692        if (lnk2p) FREE(lnk2p);
693        lnk1p=lnk2p=NULL;
694        fst_clos(0); fst_clos(1); fst_fd[0]=fst_fd[1]=0;
695        if (fst_fx[0]+fst_fx[1])
696          if (parmtrace || parmcontrol)
697            fprintf(stderr,"+++ %ld+%ld links \n",fst_fx[0],fst_fx[1]);
698    }
699#endif
700
701    exit(0);
702}
Note: See TracBrowser for help on using the browser.