root/trunk/aotmsa2mfn.c

Revision 389, 89.6 kB (checked in by heitor.barbieri, 3 weeks ago)

essage first commit

Line 
1/* =============================================================================
2   AOTMSA2     Adalberto Otranto Tardelli / Meide da Silva Ancao
3               Application 1
4               by AOT, 05/01/2002
5
6               Reads BIREME's Medline
7               by AOT, 09/03/2003
8
9   aotmsa2.c   CI/tabula casos segundo variavel/variaveis de controle
10   -----------------------------------------------------------------------------
11
12   aotmsa2 <action>[,...] [<option> [...]]
13
14      actions:   C  - get parameters from cgi
15                 1  - display header MDL:
16                TA  - search amdl
17                      tabulate amdl (v351/)
18                      store F tab and W tab
19                DA  - read F tab and W tab
20                      display formA results
21
22      options:  bool=<expr>
23                cip=<>                             c:/2001x300/usersaot/cip.cip
24                decs=<>                            decs
25                amdl=<>                            amdl351 | MEDLINE*.def
26                atmdl=<>                           atmdl (000001..039999)
27                name=<>                            c:\windows\temp\tmp1.$$$
28                pft=<>                             aotmsa2A.pft
29                atmdl99                            amdl351.maxmfn
30                {from||loop|count|tell|setno}=<n>
31   -----------------------------------------------------------------------------
32============================================================================= */
33
34#include <stdio.h>
35#include <string.h>
36#include <ctype.h>
37#include <time.h>
38#include <math.h>
39#include "cisis.h"          /* CISIS Interface header file */
40#include "cirun.h"          /* CISIS Interface runtime declarations */
41#include "cib70.h"          /* CISIS Interface search engine */
42
43
44#if 1  /* ANSITABS */
45/* ---------------------------------------------------------------------- ansiuc.tab -- */
46unsigned char ansiuctab[256]=
47{
48          0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
49         16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
50         32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
51         48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
52         64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
53         80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
54         96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
55         80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
56        128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
57        144,145,146,147,148,149,150,151,152,153,138,155,140,157,158,159,
58        160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
59        176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
60         65, 65, 65, 65, 65, 65, 65, 67, 69, 69, 69, 69, 73, 73, 73, 73,
61         68, 78, 79, 79, 79, 79, 79,215,216, 85, 85, 85, 85, 89,222,223,
62         65, 65, 65, 65, 65, 65, 65, 67, 69, 69, 69, 69, 73, 73, 73, 73,
63        208, 78, 79, 79, 79, 79, 79,247,216, 85, 85, 85, 85,221,222,221
64};
65/* ---------------------------------------------------------------------- ansiac.tab -- */
66unsigned char ansiactab[] = {
67 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
68 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
69 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99,100,101,102,103,104,
70 105,106,107,108,109,110,111,112,113,114,115,116,117,
71118,119,120,121,122,128,129,130,131,132,133,134,135,136,137,138,139,140,141,
72142,143,144,145,146,147,148,149,150,151,152,153,154,
73160,161,162,163,164,165,168,192,193,194,195,196,199,200,201,202,203,204,205,
74206,207,209,210,211,212,213,214,217,218,219,220,221,
75224,225,226,227,228,231,232,233,234,235,236,237,238,239,241,242,243,244,245,
76246,249,250,251,252,253,255
77,000
78};
79/* ------------------------------------------------------------------------------------ */
80#endif /* 0000 */
81
82
83#define CLASSES   40000     /* default */
84
85#define TAG351      351     /* DecsMfn tag - MH by serverw::\bases\mdl.006\aot\get*\ */
86#define TAG020       20     /* DecsCateg tag - standard A00.000.000.000...000 - currently up to 39 chrs */
87
88#define MAXCATLEN    47     /* 111.222.333.444.555.666.777.888.999.000.111.222 */
89
90#define DECSTAGNAME(x)        (      \
91  (toupper(*x) == 'I') ? 1 :         \
92  (toupper(*x) == 'E') ? 2 :         \
93  (toupper(*x) == 'P') ? 3 : 1 )
94
95#define TAG022       22     /* DecsCDallCategs tag  */
96#define TAG005        5     /* DecsCDCateg1MFN tag  */
97
98#define ATMDLTAG999 999     /* atmdl/999999 tag 999 = amdl351.maxmfn */
99
100typedef struct tabfreqf_entry {
101    LONGX v351;
102    LONGX freq;         /*           = docs de TT em xA */
103} TABFREQF_ENTRY;
104
105typedef struct tabfreqd_entry {
106    LONGX v351;
107//    LONGX delta;
108    char delca[MAXCATLEN+1];
109    LONGX gmfn;
110} TABFREQD_ENTRY;
111
112typedef struct tabfreqw_entry {
113    LONGX v351;
114    float peso;
115    LONGX docsTTxA;       /*  v999[1] = docs de TT em xA */
116    LONGX docsTTamdl;     /*  v999[2] = docs de TT em amdl = postings de TT em amdl */
117//    LONGX docsTOTxA;    /* v9991[1] = docs de xA - nao vazios */
118//    LONGX docsTOTamdl;  /* v9991[2] = docs de amdl */
119    float frelTTxA;      /* v1991[1] = frelTTxA = docs de TT em xA / docs de xA */
120    float frelTTamdl;    /* v1991[2] = frelTTamdl = docs de TT em amdl / docs de amdl */
121//see peso    float pesoTTxA;      /* v2991[1] = frelTTxA / frelTTamdl */
122//    char pesoTTxAout[4]; /* v2221[1] = 'out' se peso < 1 */
123} TABFREQW_ENTRY;
124
125/* prototypes */
126#if ANSI
127int rutfreqF(LONGX *tabcntA, int ntabs, LONGX drec, LONGX *tabcntArankF, TABFREQF_ENTRY **tabfreqFp);
128int outfreqF(int ntabs, char *dbnoutp, LONGX *tabcntArankW, LONGX *tabcntArankD, TABFREQF_ENTRY *tabfreqFp);
129int rutfreqW(TABFREQF_ENTRY *tabfreqF, int ntabs, char *amdlname, LONGX docsTOTxA, LONGX docsTOTamdl, LONGX *tabcntArankF, LONGX *tabcntArankW, TABFREQW_ENTRY **tabfreqWp, LONGX *tabcntMDL, LONGX *gtabcntA);
130int outfreqW(int ntabs, char *dbnoutp, LONGX docsTOTxA, LONGX docsTOTamdl, LONGX *tabcntArankF, LONGX *tabcntArankD, TABFREQD_ENTRY *tabfreqD, TABFREQW_ENTRY *tabfreqW);
131int rutfreqD(TABFREQF_ENTRY *tabfreqF, int ntabs, LONGX *tabcntArankF, LONGX *tabcntArankW, LONGX *tabcntArankD, TABFREQD_ENTRY **tabfreqDp, LONGX *tabcntGMDL, LONGX *gtabcntA);
132int outfreqD(int ntabs, char *dbnoutp, LONGX *tabcntArankF, LONGX *tabcntArankW, TABFREQD_ENTRY *tabfreqD);
133
134char *recsfldv(char *areap, char *fldp, FFI fldlen, char *defaultp);
135#else
136int rutfreqF();
137int outfreqF();
138int rutfreqW();
139int outfreqW();
140int rutfreqD();
141int outfreqD();
142char *recsfldv();
143#endif
144
145                                      /* <========================= */
146LONGX ddrec;
147char *ddecsdbnp;
148                                      /* <========================= */
149
150/* tabs here */
151    int  ntabs=0;                  /* numero de entradas de tabcntA/tabcntArankx */
152    LONGX tabcntA     [CLASSES+1];  /* indexed by DecsMfn */ /* avoid -1 */
153    LONGX tabcntArankF[CLASSES+1];  /* indexed by DecsMfn */
154    LONGX tabcntArankW[CLASSES+1];  /* indexed by DecsMfn */
155    LONGX tabcntArankD[CLASSES+1];  /* indexed by DecsMfn */
156
157    int  gntabs=0;                  /* numero de entradas de gtabcntA */
158    LONGX gtabcntA    [CLASSES+1];   /* indexed by DecsMfn */
159
160    LONGX tabcntMDL   [CLASSES+1];  /* indexed by DecsMfn */
161    LONGX tabcntGMDL  [CLASSES+1];  /* indexed by DecsMfn */
162
163#define MAXTABV05  42099
164    LONGX vcategmfn[26][10][10];    /* indexed by [A][0][0] */  /* 10K */
165    int ntabv05=0;                 /* avail */
166    LONGX vtabv05[MAXTABV05];       /* indexed by vtabv05xrf[DecsMnf] */
167    int  vtabv05xrf[CLASSES+1];    /* starting index 0..MAXTABV05-1 */
168    int  vtabv05len[CLASSES+1];    /* number of entries */
169/* tabs here */
170
171
172void main(argc,argv_main)
173int argc;
174char *argv_main[];
175{
176#define MAXARGS 512
177    char *argv[MAXARGS+1];
178    int i,argnext=1;
179
180    void *ciapip = NULL;
181
182    RECSTRU *recp;
183    LONGX irec=0L;
184    unsigned char *p,*q;
185
186    LONGX   vtime[100];   /* watch */
187    char *vtimid[100];   /* watch */
188    int      ntimes=0;   /* watch */
189
190    int parmtime=0;
191    int parmloadmdl=1;
192
193    int parmgroup=0;
194    LONGX mydrec=0L;
195
196    char parmsortx='\0'; /* actual sort parameter */
197    int parmshowgrp1=0;  /* show group01.w information */       /* 1 */
198    int parmshowcat1=0;  /* show first cat1 - name */           /* c */
199    int parmshowtree=0;  /* show hierarchy?? lines */           /* t */
200    int parmshowzero=0;  /* don't show condition lines */       /* z */
201   
202       
203#define ENVASIZE  8000
204    char envarea[ENVASIZE];
205
206    char *usernamp="aot";
207    char *parmaid=NULL;
208
209    /* ---------------------------------------------------------------------- */
210    LONGX boolridx=0L;
211    LONGX booldbcrec=0L; /* b5_exp usa booldbcrec condicionado a namedbnp */
212
213    LONGX boolhits=0;
214    LONGX boolh;
215    LONGX booltell=0L;               /* 0L = no msg; 1L = tell; 2L = tell+root */
216    LONGX booltlir=0L;               /* b70 invx */
217    b7_CIB7 *cib7p=NULL;
218    B7HITLIST *hitlistp;            /* hit processing */
219    LONGX *mfnlistp;                 /* hit processing */
220
221    char booltmpnam[128]={'\0'};    /* b72 MFQTHMEM tmp file */
222
223    /* ---------------------------------------------------------------------- */
224/* tabs here */
225    TABFREQF_ENTRY *tabfreqF=NULL; /* indexed by rankF */
226    TABFREQW_ENTRY *tabfreqW=NULL; /* indexed by rankW */
227    TABFREQD_ENTRY *tabfreqD=NULL; /* indexed by rankD */
228
229    LONGX docsTOTxA;    /* v9991[1] = docs de xA - nao vazios */
230    LONGX docsTOTamdl;  /* v9991[2] = docs de amdl */
231
232    LONGX count1=0L;                /* registros lidos */
233    LONGX count2=0L;                /* casos tabulados */
234
235    LONGX drec=0L;
236    char *gidbnp=NULL;
237
238    int parmtrace=0;
239/*nu     LONGX parmfrom=1,parmto=999999999L,parmcount=0; */
240
241/* -------------------------------------------------------------------------- */
242    char *deffnamp=NULL;
243    char *deffmhxp=NULL;
244    char deffbuffup[ENVASIZE];
245
246    char *cipfnamp=NULL;
247    char *decsdbnp=NULL;
248    char *amdldbnp=NULL;
249    char *atmdldbnp=NULL;
250    char *tmp1dbnp=NULL;
251    char *pftfnamp=NULL;
252    char *langp=NULL;
253    LONGX  parmloopTA=0;
254    LONGX  parmtellTA=0;
255    LONGX  parmfromDA=0;
256    LONGX  parmcountDA=0;
257    char *parmsortp=NULL;
258    char *parmdownp=NULL;
259    char *namedbnp=NULL;     /* b7x query dbn */
260    char *boolqryp=NULL;     /* bool= */
261    LONGX  boolsetno=0;       /* b7x set no. */
262    int   parmatmdl99=0;
263
264    char *prmloopTA =NULL;
265    char *prmfromDA =NULL;
266    char *prmcountDA=NULL;
267    char *prmboolset=NULL;
268    char *prmatmdl99=NULL;
269
270    char *actionp=NULL;
271
272    int   actionCG=0;
273    int   actionDD=0;
274    int   actionTA=0;
275    int   actionDA=0;
276
277    int   parmdown=0;
278
279/* -------------------------------------------------------------------------- */
280    char namedbnarea[BUFSIZ];
281
282    char dbnoutF[BUFSIZ];
283    char dbnoutW[BUFSIZ];
284    char dbnoutD[BUFSIZ];
285/* -------------------------------------------------------------------------- */
286
287#if CICGI
288    char *cgipfxp="tag";
289    UWORD cgitag=2000;
290    char *wwwp=NULL;
291    LONGX wrec;
292#endif
293
294    /* here we go..
295    */
296#if CIAPI
297    ciapip = cisisApplication( MAXNREC,MAXNTRM );/* mandatory for CIAPI definitions */
298#endif /* CIAPI */
299
300    /* get calling arguments
301    */
302    for (i=0; i < argc; i++) argv[i]=argv_main[i];
303
304    /* set watch
305    */
306    vtimid[ntimes]="start"; time(&vtime[ntimes++]); /* watch */
307
308    /* set ansiuc & ansiac
309    */
310#if 1  /* ANSITABS */
311    memcpy(isisuctab,ansiuctab,sizeof(ansiuctab));
312    memset(isiswctab,0x00,256);
313    for (isiswctot=0; ansiactab[isiswctot]; isiswctot=isiswctot+1) isiswctab[ansiactab[isiswctot]]=1;
314#endif /* 0000 */
315
316    /* check if trace is present */
317    for (i=0; i < argc; i++) {
318        p=argv[i];
319        if (strncmp(p,"trace?",6) == 0 || strncmp(p,"trace=",6) == 0) {
320            if (sscanf(p+6,"%d",&parmtrace) != 1) fatal(p);
321              if (parmtrace) {
322                  printf("+++trace: trace='%.11s\n'",p);
323                  printf("Content-type: text/plain\n\n");
324                  printf("+++trace: \n");
325              }
326            break;
327        }
328    }
329
330#ifndef FORCECGI
331#define FORCECGI 0
332#endif
333#if FORCECGI
334    putenv("REQUEST_METHOD=GET");
335/*
336    putenv("QUERY_STRING=lang=p&action=C%2CTA%2CDA&amdl=amdl351&bool=009068&bool=034268&bool=034269&loop=100&sort=f&from=1&count=20&x=39&y=3");
337*/
338    putenv("QUERY_STRING=lang=p&action=C,TA,DA&amdl=MEDLINE_6687.def&loop=1&bool=006621&sort=f&from=1&count=20");
339#endif
340
341
342    /* get CGI data
343    */
344#if CICGI
345    RECORD(wrec=nrecs,"null",1L); RECrc=RCNORMAL; MFRstatus=ACTIVE;
346    wwwp=NULL; cicgi0(&argc, argv, &wwwp, cgitag, cgipfxp);
347
348    if (wwwp) {
349
350      DIRSTRU *dirp;
351      int xdir,iocc,loop;
352      if (fldupdat(wrec,wwwp)) fatal(wwwp);
353
354      /* check if trace is present */
355      for (parmtrace=0, dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++)
356        if (dirp->tag == cgitag) {
357          p=FIELDP(xdir);
358          if (strncmp(p,"^ntrace^v",2+5+2) == 0) {
359              parmtrace=1;
360              if (parmtrace) {
361                  printf("+++trace: trace='%.11s\n'",p);
362                  printf("Content-type: text/plain\n\n");
363                  printf("+++trace: \n");
364                  break;
365              }
366          }
367        }
368
369      /* check if cgi is enabled */
370      for (actionCG=0, dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++)
371        if (dirp->tag == cgitag) {
372          p=FIELDP(xdir);
373          if (strncmp(p,"^naction^vC",2+6+2+1) == 0) {
374              actionCG=1;
375              if (parmtrace) printf("+++trace: action='%.11s'\n",p);
376              break;
377          }
378        }
379
380      if (actionCG) { /* cgi is enabled */
381
382      for (dirp=MFRdir, xdir=iocc=0, loop=MFRnvf; loop--; dirp++, xdir++) {
383        if (dirp->tag == cgitag) {
384          FFI plen;
385          p=FIELDP(xdir); plen=dirp->len; iocc++;
386          /* get CGI by name
387          */
388          if (strncmp(p,"^ncip^v"    , 3+4) == 0)   cipfnamp  =recsfldv(NULL,p,plen,"");
389          if (strncmp(p,"^ndecs^v"   , 4+4) == 0)   decsdbnp  =recsfldv(NULL,p,plen,"");
390          if (strncmp(p,"^namdl^v"   , 4+4) == 0)   amdldbnp  =recsfldv(NULL,p,plen,"");
391          if (strncmp(p,"^natmdl^v"  , 5+4) == 0)   atmdldbnp =recsfldv(NULL,p,plen,"");
392          if (strncmp(p,"^ntmp1^v"   , 4+4) == 0)   tmp1dbnp  =recsfldv(NULL,p,plen,"");
393          if (strncmp(p,"^npft^v"    , 3+4) == 0)   pftfnamp  =recsfldv(NULL,p,plen,"");
394          if (strncmp(p,"^nlang^v"   , 4+4) == 0)   langp     =recsfldv(NULL,p,plen,"");
395          if (strncmp(p,"^nloop^v"   , 4+4) == 0) { prmloopTA =recsfldv(NULL,p,plen,""); parmloopTA =atol(prmloopTA ); }
396          if (strncmp(p,"^nfrom^v"   , 4+4) == 0) { prmfromDA =recsfldv(NULL,p,plen,""); parmfromDA =atol(prmfromDA ); }
397          if (strncmp(p,"^ncount^v"  , 5+4) == 0) { prmcountDA=recsfldv(NULL,p,plen,""); parmcountDA=atol(prmcountDA); }
398          if (strncmp(p,"^nsort^v"   , 4+4) == 0)   parmsortp =recsfldv(NULL,p,plen,"");
399          if (strncmp(p,"^ndown^v"   , 4+4) == 0)   parmdownp =recsfldv(NULL,p,plen,"");
400          q=NULL;
401          if (strncmp(p,"^nbool^v"   , 4+4) == 0)   q         =recsfldv(NULL,p,plen,"");
402          if (q) {
403              if (boolqryp) {
404                  sprintf(envarea,"%s or %s",boolqryp,q);
405                  boolqryp=strdup(envarea);
406              }
407              else boolqryp=q;
408          }
409          if (strncmp(p,"^nname^v"   , 4+4) == 0)   namedbnp  =recsfldv(NULL,p,plen,"");
410          if (strncmp(p,"^natmdl99^v", 7+4) == 0) { prmatmdl99=recsfldv(NULL,p,plen,""); parmatmdl99=atoi(prmatmdl99); }
411          if (strncmp(p,"^naction^v" , 6+4) == 0)   actionp   =recsfldv(NULL,p,plen,"");
412          if (strncmp(p,"^nsetno^v"   , 5+4) == 0) { prmboolset=recsfldv(NULL,p,plen,""); boolsetno=atol(prmboolset); }
413
414        } /* end if (dirp->tag == cgitag) */
415      } /* end for (dirp=MFRdir) */
416    } /* end if (cgi is enabled */
417    } /* end if (wwwp) */
418#endif /* CICGI */
419
420
421    /* set default values
422    */
423#if 0
424PATH_DATA=/iah/online/
425PATH_CGI-BIN=/users/www/cgi-bin/iah/
426#endif
427
428#if UNIX
429    if (!cipfnamp)    cipfnamp    = "/users/www/aot/aotmsa2/cip.cip";
430    if (!decsdbnp)    decsdbnp    = "decs";
431    if (!amdldbnp)    amdldbnp    = "/users/www/data/iah/online/MEDLINE_2001.def";
432#else
433    if (!cipfnamp)    cipfnamp    = "c:/2001x300/usersaot/cip.cip";
434    if (!decsdbnp)    decsdbnp    = "decs";
435    if (!amdldbnp)    amdldbnp    = "amdl351";
436#endif
437    if (!atmdldbnp)   atmdldbnp   = "atmdl";
438    if (!tmp1dbnp)    tmp1dbnp    = NULL;
439    if (!pftfnamp)    pftfnamp    = "aotmsa2A.pft";
440    if (!langp)       langp       = "p";
441    if (!parmloopTA)  parmloopTA  = 1;
442    if (!parmtellTA)  parmtellTA  = 0; /* */
443    if (!parmfromDA)  parmfromDA  = 1;
444    if (!parmcountDA) parmcountDA = 0;
445    if (!parmsortp)   parmsortp   = "f";
446    if (!parmdownp)   parmdownp   = "0";
447    if (!parmatmdl99) parmatmdl99 = 0;
448    if (!actionp)    {actionCG    = 0;
449                      actionDD    = 0;
450                      actionTA    = 0;
451                      actionDA    = 0; }
452    if (!boolsetno)   boolsetno   = 0;
453
454    dbnoutF[0]='\0';   /* .f */
455    dbnoutW[0]='\0';   /* .w */
456    dbnoutD[0]='\0';   /* .w */
457
458
459    if (argc < 2 && !wwwp) {
460        printf("%s",cicopyr("Application AOTMSA2"));
461        printf(" \n");
462        printf("aotmsa2 <action>[,...] [<option> [...]] \n");
463        printf(" \n");
464        printf("actions:  C   - get parameters from cgi \n");
465        printf("          TA  - search amdl \n");
466        printf("                tabulate amdl (v351/) \n");
467        printf("                store tableF and tableW \n");
468        printf("                DA  - read tableF or tableW \n");
469        printf("                      display formA results \n");
470        printf(" \n");
471        printf("options: loop=<n>       \n");
472        printf("         from|count=<n> \n");
473        printf("         sort={f|w} \n");
474        printf("         btell|tell=<n> \n");
475        printf("         bool=<expr> [setno=<n>]  \n");
476        printf("         atmdl99    \n");
477        printf(" \n");
478        printf("         cip    ,                              %s \n",  cipfnamp    );
479        printf("         decs   ,                              %s \n",  decsdbnp    );
480        printf("         amdl   ,                              %s \n",  amdldbnp    );
481        printf("         atmdl  ,                              %s \n",  atmdldbnp   );
482        printf("         tmp1   ,                              %s \n",  tmp1dbnp    );
483        printf("         pft    ,                              %s \n",  pftfnamp    );
484        printf("         lang   ,                              %s \n",  langp       );
485        printf("         loop   ,                              %"_LD_" \n",  parmloopTA  );
486        printf("         from   ,                              %"_LD_" \n",  parmfromDA  );
487        printf("         count  ,                              %"_LD_" \n",  parmcountDA );
488        printf("         sort   ,                              %s \n",  parmsortp   );
489        printf("         down   ,                              %s \n",  parmdownp   );
490        printf("         bool   ,                              %s \n",  boolqryp    );
491        printf("         name   ,                              %s \n",  namedbnp    );
492        printf("         atmdl99,                              %d \n",  parmatmdl99 );
493        printf("         action ,                              %s \n",  actionp     );
494        printf("         setno  ,                              %"_LD_" \n",  boolsetno );
495        printf(" \n");
496        exit(1);
497        }
498
499
500    /*
501        get options
502    */
503    for (; argnext < argc; argnext++) {
504        p=argv[argnext];
505
506        if (strncmp(p,"cip?",4) == 0 || strncmp(p,"cip=",4) == 0) {
507            cipfnamp=p+4;
508            continue;
509        }
510        if (strncmp(p,"decs?",5) == 0 || strncmp(p,"decs=",5) == 0) {
511            decsdbnp=p+5;
512            continue;
513        }
514        if (strncmp(p,"amdl?",5) == 0 || strncmp(p,"amdl=",5) == 0) {
515            amdldbnp=p+5;
516            continue;
517        }
518        if (strncmp(p,"atmdl?",6) == 0 || strncmp(p,"atmdl=",6) == 0) {
519            atmdldbnp=p+6;
520            continue;
521        }
522        if (strncmp(p,"tmp1?",5) == 0 || strncmp(p,"tmp1=",5) == 0) {
523            tmp1dbnp=p+5;
524            continue;
525        }
526        if (strncmp(p,"pft?",4) == 0 || strncmp(p,"pft=",4) == 0) {
527            pftfnamp=p+4;
528            continue;
529        }
530        if (strncmp(p,"loop?",5) == 0 || strncmp(p,"loop=",5) == 0) {
531            if (sscanf(p+5,"%"_LD_,&parmloopTA) != 1) fatal(p);
532            continue;
533        }
534        if (strncmp(p,"from?",5) == 0 || strncmp(p,"from=",5) == 0) {
535            if (sscanf(p+5,"%"_LD_,&parmfromDA) != 1) fatal(p);
536            continue;
537        }
538        if (strncmp(p,"count?",6) == 0 || strncmp(p,"count=",6) == 0) {
539            if (sscanf(p+6,"%"_LD_,&parmcountDA) != 1) fatal(p);
540            continue;
541        }
542        if (strncmp(p,"sort?",5) == 0 || strncmp(p,"sort=",5) == 0) {
543            parmsortp=p+5;
544            continue;
545        }
546        if (strncmp(p,"down?",5) == 0 || strncmp(p,"down=",5) == 0) {
547            parmdownp=p+5;
548            if (sscanf(parmdownp,"%d",&parmdown) != 1) fatal(p);
549            continue;
550        }
551        if (!strncmp(p,"bool=",5)) {
552            q=loadfile(gidbnp,'@',p+5,NULL,0L,'\n');
553            if (!q) fatal(p);
554            if (boolqryp) {
555                  sprintf(envarea,"%s or %s",boolqryp,q);
556                  boolqryp=strdup(envarea);
557            }
558            else boolqryp=q;
559            continue;
560        }
561        if (strncmp(p,"name?",5) == 0 || strncmp(p,"name=",5) == 0) {
562            namedbnp=p+5;
563            strcpy(namedbnarea,namedbnp);
564            continue;
565        }
566        if (strcmp(p,"atmdl99") == 0) {
567            parmatmdl99=1;
568            continue;
569        }
570        if (strncmp(p,"action?",7) == 0 || strncmp(p,"action=",7) == 0) {
571            actionp=q=p+7;
572            if (!*q) fatal(p);
573            continue;
574        }
575        if (strncmp(p,"setno?",6) == 0 || strncmp(p,"setno=",6) == 0) {
576            if (sscanf(p+6,"%"_LD_,&boolsetno) != 1) fatal(p);
577            continue;
578        }
579        /* offer */
580        if (strncmp(p,"tell?",5) == 0 || strncmp(p,"tell=",5) == 0) {
581            if (sscanf(p+5,"%"_LD_,&parmtellTA) != 1) fatal(p);
582            continue;
583        }
584        if (strncmp(p,"btell?",6) == 0 || strncmp(p,"btell=",6) == 0) {
585            if (sscanf(p+6,"%"_LD_,&booltell) != 1) fatal(p);
586            continue;
587        }
588        if (strcmp(p,"trace") == 0) {
589            parmtrace=1;
590            continue;
591        }
592
593        fatal(p);
594    }
595
596
597    /* actions */
598    if (actionp) {
599      for (q=actionp; *q; ) {
600     
601         if (*q == 'C' && strncmp(q,"C" ,1) == 0)
602                   { /*actionCG=1;*/                  if (*(q+=1) == ',') q++; continue; }
603                   
604         if (isdigit(*q))
605                   {   actionDD=(int)(*q)-(int)'0';   if (*(q+=1) == ',') q++; continue; }
606                   
607         if (*q == 'T' && strncmp(q,"TA",2) == 0)
608                   {   actionTA=1;                    if (*(q+=2) == ',') q++; continue; }
609                   
610         if (*q == 'D' && strncmp(q,"DA",2) == 0)
611                   {   actionDA=1;                    if (*(q+=2) == ',') q++; continue; }
612
613         if (*q) fatal(p);
614      }
615    }
616
617    if (parmsortp) {
618        q=parmsortp;
619        if (*q == 'g') { parmgroup=1;    q++; parmsortp=q; }
620        if (*q == '1') { parmshowgrp1=1; q++; }
621        if (*q == 'c') { parmshowcat1=1; q++; }
622        if (*q == 't') { parmshowtree=1; q++; }
623        if (*q == 'z') { parmshowzero=1; q++; }
624        if (strcmp(q,"f") && strcmp(q,"w") && strcmp(q,"d")) fatal(parmsortp);
625        parmsortx= *q;
626    }
627#if 0
628    for (q=parmsortp; *q; q++) {
629        if (*q == 'g') { parmgroup=1; parmsortp=q+1; }
630        if (*q == '1') { parmshowgrp1=1; }
631        if (*q == 'c') { parmshowcat1=1; }
632        if (*q == 't') { parmshowtree=1; }
633        if (*q == 'z') { parmshowzero=1; }
634        if (*q == 'f' || *q == 'w' || *q == 'd') { parmsortx= *q; }
635    }
636#endif
637
638if (parmtrace) {
639  if (amdldbnp) printf("+++trace: amdldbnp=%s\n",amdldbnp);
640  if (tmp1dbnp) printf("+++trace: tmp1dbnp=%s\n",tmp1dbnp);
641  printf("+++trace: actionp=%s\n",actionp);
642  printf("+++trace: actionDD=%d\n",actionDD);
643  printf("+++trace: actionTA=%d\n",actionTA);
644  printf("+++trace: actionDA=%d\n",actionDA);
645  printf("+++trace:     sort=%s\n",parmsortp);
646  printf("+++trace:    group=%d\n",parmgroup);
647}
648
649
650    /* Common setup
651    */
652
653    /* get MEDLINE*.def parameters
654    */
655    if (strlen(amdldbnp) > 4) if (strcmp(amdldbnp+strlen(amdldbnp)-4,".def") == 0) {
656        char loadname[1+BUFSIZ];
657        char *defarea;
658        deffnamp=amdldbnp;
659        sprintf(loadname,"@%s",deffnamp);
660        defarea=loadfile(gidbnp,'@',loadname,NULL,0L,'\n');
661        if (!defarea) {
662                printf("Content-type: text/plain\n\n");
663                printf("file %s not found \n",deffnamp);
664                exit(120);
665        }
666/*
667FILE DATABASE.*=/base2/mdl/back3/mdl8590.*
668FILE MH.*=/base1/mdl/back3/mdlmh%lang%.*
669FILE M.*=/base1/mdl/back3/mdlmh.*
670*/
671        p=strstr(defarea,"FILE DATABASE.*=");
672        if (p) if (strstr((p+=strlen("FILE DATABASE.*="))+1,".*")) {
673            *(strstr(p+1,".*"))='\0';
674            amdldbnp=strdup(p);
675            if (parmtrace) printf("+++trace: amdldbnp=%s\n",amdldbnp);
676        }
677        p=strstr(defarea,"FILE MH.*=");
678        if (p) if (strstr((p+=strlen("FILE MH.*="))+1,"%lang%.*")) {
679            *(strstr(p+1,"%lang%.*"))='\0'; strcat(p,langp);
680            deffmhxp=strdup(p);
681            if (parmtrace) printf("+++trace: deffmhxp=%s\n",deffmhxp);
682        }
683        /* free(defarea); */
684    }
685
686    /* set cipar */
687    if ((dbxcipfp=fopen(cipfnamp,"r")) == NULL) fatal(cipfnamp);
688    /* rec_maxmfrl */
689    p=dbxcipar(NULL,"maxmfrl",'='); if (dbxcipok) { sscanf(p,"%"_LD_,&rec_maxmfrl); }
690
691    /* set tempfile */
692    if (tmp1dbnp) strcpy(booltmpnam,tmp1dbnp);
693
694    /* set query db */
695    if (namedbnp) {
696        if (strncmp(namedbnp,"create=",7) == 0) {
697            namedbnp+=7;
698            recisis0(namedbnp);
699        } else {
700            int xfd;
701            dbxopt_fatal=0; xfd=dbxopen("",namedbnp,xx1extp);
702            if (xfd > 0) CLOSE(xfd); else recisis0(namedbnp);
703        }
704        RECORD(boolridx=nrecs,namedbnp,0L);
705        if (boolsetno < 1 || boolsetno > MF0nxtmfn-1) boolsetno=MF0nxtmfn-1; /* last set */
706    }
707    else {
708        if (!dbxtmpnm("CI_TEMPDIR", 0, namedbnarea)) fatal("aotmsa2/dbxtmpnm");
709        namedbnp=namedbnarea;
710        if (parmtrace) printf("+++trace: namedbnp=%s\n",namedbnp);
711        recisis0(namedbnp);
712        boolsetno=1L; /* set#1 */
713    }
714
715    /* make output file names
716    */
717    sprintf(dbnoutF,"%s%s",namedbnp,".f");
718    sprintf(dbnoutW,"%s%s",namedbnp,".w");
719    sprintf(dbnoutD,"%s%s",namedbnp,".d");
720
721    parmdown=atoi(parmdownp);
722    if (parmdown < 0x00 || parmdown > 0xFF) parmdown=0;
723   
724
725/* =======================         =============          ================== */
726/* =======================         =============          ================== */
727if (actionTA) {
728
729    /* Tabulate A
730    */
731
732    /* init docsTOTamdl - number of docs in Cluster MDL */
733    /* init reading */
734    if (!irec) irec=nrecs;
735    RECORD(irec,amdldbnp,0L);
736    docsTOTamdl=MF0nxtmfn-1;
737    if (parmatmdl99) {
738        RECSTRU *recp;
739        TRMSTRU *trmp;
740        LONGX /*nu irec,*/itrm;
741        char *p;
742        TERM(itrm=ntrms,atmdldbnp,"999999"); if (TRMrc != RCNORMAL) fatal("aotmsa2/atmdl/TERM");
743        RECORD(/*nu irec=*/nrecs,atmdldbnp,posting(itrm,1));  if (TRMrc != RCNORMAL) fatal("aotmsa2/atmdl/RECORD");
744        p=recfield(NULL,boolridx,ATMDLTAG999,1,"");
745        docsTOTamdl = atol(p); if (docsTOTamdl < 1) fatal("aotmsa2/atmdl/999999");
746    }
747
748    /* init docsTOTxa - number of docs in Cluster A */
749    docsTOTxA=docsTOTamdl;
750
751    vtimid[ntimes]="search"; time(&vtime[ntimes++]); /* watch */
752    /*
753        Search "bool=" parameter
754    */
755    if (boolqryp) { /* mxbool/boolh */
756
757        RECSTRU *recp;
758        char *p;
759        LONGX mfn;
760        int errno;
761
762        LONGX asize=strlen(amdldbnp) +                 /* field MFQTDBN0=11 (may be longer than 128+4+1) */
763                   strlen(boolqryp) +                 /* the expression */
764                   2*strlen(boolqryp) +               /* the terms + pseudo operators _1termX+11X */
765                   BUFSIZ+strlen(amdldbnp) +          /* field MFQSWDBN=20 + a diferent db */
766                   24*(strlen(B7DELADD)+3*B7UPLEN) +  /* 2 duzias de control fields */  /* DxxAxx|xxx| */
767                   strlen(boolqryp)+4 +               /* tmpfile .%03x */
768                   BUFSIZ;                            /* por si las moscas */
769
770        char *buffup=loadfile(NULL,'@',"",NULL,asize,'\0');
771
772        cib7p=b7_cib7(cib7p,ciapip);
773
774        /* initialize ridx and b7_xxx() parameters and run b7_run()
775        */
776        for (boolridx=nrecs, mfn=1; ; mfn++) { /* get actual maxmfn */
777            RECORD(boolridx,amdldbnp,mfn);
778            if (RECrc == RCEOF) fatal(amdldbnp);
779            if (RECrc == RCNORMAL) break;
780        }
781
782        if (namedbnp) {
783            if (!booldbcrec) booldbcrec=nrecs;
784            /*RECORD(booldbcrec,namedbnp,0L); */ /* b7_exp faz "record(crec,qrydbnp,0L)"
785                                                          (se houver "qrydbnp")
786                                                       */
787/*<R>
788            vrecp[boolridx]->recdbxp=RECdbxp;
789*/          /* VRECdbxp(boolridx)=RECdbxp; */ /* b7_exp faz "RECdbxp = dbxstorp(qrydbnp)" */
790        }
791        else {
792            VRECdbxp(boolridx)=NULL; /* nao usa base de log */
793            VMFRmfn(boolridx)=0L;
794        }
795
796        /* run b7_exp() / b7_run() / b7_hit(0)
797        */
798        p=b7_exp(cib7p,boolridx,amdldbnp,boolqryp,buffup,namedbnp,booldbcrec,&errno);
799        if (p || errno) printf("Expression syntax error %d: '%s'\n",errno,p);
800        else {
801            LONGX bufsiz;
802            /* .. sprintf(buffup,"%s.%03x",RDBname,(int)b7setno) .. */
803            char *hitfnamp="null";
804            if (booltmpnam[0]) hitfnamp=booltmpnam;
805            sprintf(buffup,"D%dA%d|%s|",MFQTHMEM,MFQTHMEM,hitfnamp);
806            if (fldupdat(boolridx,buffup) != NULL) fatal("aotmsa2/fldupdat/boolridx");
807
808            /* b7_run faz "trirecp=vrep[tlirec]" */
809            if (!booltlir) record(booltlir=nrecs,"null",1L);
810
811            /* set default index to actual INDEX MH= */
812            if (deffmhxp) {
813                char buffup[BUFSIZ+CIMPL];
814                sprintf(buffup,"A101|^p*^y%s|",deffmhxp);
815                if (fldupdat(booltlir,buffup)) fatal("aotmsa2/booltlir/fldupdat");
816            }
817
818            /* alloc buffer for 20000 hits = 80Kbytes */
819            bufsiz=20000*sizeof(LONGX);
820            if (b7bufferp) b7_hbfree(cib7p,&b7bufferp);
821            b7_hballoc(cib7p,bufsiz,&b7bufferp);
822
823
824            deffbuffup[0]='\0';
825#if 1
826            /* translate DecsMfn to MH
827            */
828            if (deffmhxp) {
829                char *batchp=deffbuffup;
830                size_t left=sizeof(deffbuffup);
831                int xdir;
832                sprintf(batchp,"D%dA%d|",MFQTOBJ0,MFQTOBJ0); batchp+=strlen(batchp);
833                if ((xdir=fieldx(boolridx,MFQTOBJ0,1)) >= 0) {
834                    char *b7p;
835                    LONGX v351;
836                    for (b7p=(unsigned char *)FIELDP(xdir); *b7p; ) {
837                        if (*b7p == OPRXEND) break;
838                        if (*b7p != ZLDV) {
839                            *batchp++ = *b7p++; /* move other */ left--;
840                            continue;
841                        }
842                        *batchp++ = *b7p++; /* move b7opr */ left--;
843                        *batchp++ = *b7p++; /* move postlen */ left--;
844                        v351=atol(b7p);
845                        while (*b7p != OPRNULL) b7p++; /* skip DecsMfn */
846                        if (v351) {
847                            if (!drec) drec=nrecs;
848                            record(drec,decsdbnp,v351);
849                            recfield(batchp,drec,DECSTAGNAME(langp),1,"");  batchp[LE2]='\0';  /* move MH */
850                            while (*batchp) { *batchp=isisuctab[*batchp]; batchp++; left--; }
851                        }
852                        *batchp++ = *b7p++; /* move OPRNULL */ left--;
853                    } /* end for (b7p) */
854                    *batchp++ = *b7p++; /* move OPRXEND */
855                } /* end if (xdir) */
856                sprintf(batchp,"|"                           ); /*nu batchp+=strlen(batchp); */
857            } /* end if (deffmhxp) */
858#endif
859
860            /* run search */
861            p=b7_run(cib7p,boolridx,amdldbnp,buffup,asize,
862                booltell,isisuctab,deffbuffup/*btch0p*/,booltlir,booldbcrec,&errno);
863            if (p || errno) printf("Execution error %d: '%s'\n",errno,p);
864            else {
865                boolhits=b7bufferp->ndocs; /* b7_hit(cib7p,boolridx,0L,b7setno); */
866                if (booltell) printf("Hits=%"_LD_"\n",boolhits);
867            }
868        }
869        if (p || errno) fatal("Expression execution error");
870
871        /* set# */
872        boolsetno=b7setno;  /* last mfn */
873
874        /* set docsTOTxa - number of docs in Cluster A */
875        docsTOTxA=boolhits;
876
877    } /* mxbool/boolh */
878
879
880    vtimid[ntimes]="set"; time(&vtime[ntimes++]); /* watch */
881
882    /* init tabcntMDL
883    */
884    if (parmloadmdl) {
885        /* loadcnt(amdldbnp,treecase,tabcntMDL,CLASSES);
886AMDL351  CNT            52  12-21-01  9:54p amdl351.cnt
887AMDL351  N01        21,216  12-21-01 10:00p amdl351.n01
888AMDL351  N02             0  12-21-01 10:00p amdl351.n02
889AMDL351  LY1       269,064  12-21-01  9:55p amdl351.ly1
890AMDL351  LY2             0  12-21-01  9:55p amdl351.ly2
891AMDL351  IYP    48,611,328  12-21-01  9:55p amdl351.iyp
892        */
893        int treecase=0;
894        INVMAP *invp;
895        LONGX punt,punt2;
896        char lparea[sizeof(L1STRU)];
897        L1STRU *l1p=(L1STRU *)lparea;
898        int loop;
899        char *keyp;
900        int v351;
901        LONGX ndocs;
902        LONGX tell=0;
903
904        memset(tabcntMDL,0x00,sizeof(tabcntMDL));
905        invsetup(amdldbnp,0L,0L,0L);
906        invp=dbxstorp(amdldbnp)->dbxifmap;
907        if (parmtellTA) tell=(punt2=invp->cn[treecase].fmaxpos)/10+1;
908        if (parmtrace) fprintf(stderr,"+++ punt2=%"_LD_"\n",punt2);
909        /* for each leaf */
910        for (punt=1; punt; punt=l1p->ps) {
911            leafread(lparea,invp,treecase,punt,0); /* read a leaf */
912            /* for each term */
913            for (loop=0; loop < l1p->ock; loop++) {
914                keyp=l1p->idx[loop].key;
915                v351=atoi(keyp); /* LE1 */
916                ndocs=l1p->idx[loop].info2;
917                tabcntMDL[v351]=ndocs;
918            }
919            if (parmtrace) if (tell) if (punt%tell==0) fprintf(stderr,"+++ punt=%"_LD_"\n",punt);
920        }
921
922        memset(tabcntGMDL,0x00,sizeof(tabcntGMDL));
923        if (parmgroup) {
924            RECSTRU *recp;
925            LONGX irec=nrecs;
926            LONGX mfn;
927            char x351[6+1];
928            LONGX v351;
929            DIRSTRU *dirp;
930            int xdir,loop;
931
932            for (mfn=1; ; mfn++) {
933                RECORD(irec,"group01.f",mfn);
934                if (RECrc == RCEOF) break;
935                if (RECrc != RCNORMAL) continue;
936                /* get total records for each group */
937#define G01TAG999 999
938#define G01TAG001   1
939                for (dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++) {
940                    if (dirp->tag == G01TAG999) {
941                       LONGX ndocs=0;
942                       char *p=FIELDP(xdir);
943                       int loop;
944                       for (loop=dirp->len; loop--; p++) ndocs=ndocs*10+((int)(*p)-(int)'0');
945                       recfield(x351,irec,G01TAG001,1,""); v351=atol(x351);
946                       tabcntGMDL[v351]=ndocs;
947#if 0
948printf("+++tabcntGMDL[%"_LD_"]=%"_LD_"\n",v351,tabcntGMDL[v351]);
949getchar();
950#endif
951                       break;
952                    } /* end tag == 999 */
953                } /* end for dirp */
954            } /* end for mfn */
955        }
956
957        /* VTABV05*/
958        memset(vcategmfn,0x00,sizeof(vcategmfn));
959        memset(vtabv05len,0x00,sizeof(vcategmfn)); ntabv05=0;
960
961    }
962
963
964    /* init mxtb
965    */
966    memset(tabcntA,0x00,sizeof(tabcntA));
967    memset(gtabcntA,0x00,sizeof(gtabcntA));
968
969    /* create output
970    */
971    recisis0(dbnoutF);
972    recisis0(dbnoutW);
973    recisis0(dbnoutD);
974
975
976    vtimid[ntimes]="loop"; time(&vtime[ntimes++]); /* watch */
977
978    /*
979        loop principal
980    */
981
982#define MAXN20 30
983#define MAXZ20 12 /* hoje=10 (1*3+9*4=39) */
984#define MAXL20 (MAXZ20*4)
985
986#define MAXNVG 30
987#define MAXN05 30
988
989    for (boolh=1; boolh <= boolhits; boolh+=parmloopTA) {
990
991        LONGX mfn;
992        int v351,v351nocc,xdir,loop;
993        DIRSTRU *dirp;
994        char area[BUFSIZ];
995
996        LONGX vgmfns[MAXNVG];
997        int nvgs=0;
998        int ivg;
999
1000        /* hit processing */
1001
1002        if (boolh == 1) {
1003            hitlistp=(B7HITLIST *)b7bufferp->area;
1004            mfnlistp=hitlistp->mfnlist;
1005        }
1006
1007        /* get next hit */
1008        if (b7bufferp->hcase == BITSTRING)
1009            mfn=b7_hit(cib7p,boolridx,boolh,b7setno);
1010        else
1011            mfn = *mfnlistp; mfnlistp+=parmloopTA;
1012
1013        if (mfn <= 0) fatal("aotmsa2/TA/amdldbnp/hit");
1014
1015        if (parmtrace) printf("+++ hit#%"_LD_" mfn=%"_LD_"\n",boolh,mfn);
1016
1017        RECORD(irec,amdldbnp,mfn);
1018        if (RECrc != RCNORMAL) fatal("aotmsa2/TA/amdldbnp/RCNORMAL");
1019
1020        /* tabulate (v351/) in tabcntA, exploding in gtabcntA
1021        */
1022        /* get a subject descriptor */
1023        v351nocc=0;
1024        for (dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++) {
1025            if (dirp->tag == TAG351) {
1026
1027                /* tabulate it */
1028                memcpy(area,FIELDP(xdir),dirp->len); area[dirp->len]='\0';
1029                v351=atoi(area);
1030                if (1/*parmgroup*/)  {
1031#if 1 /*V02BAK9J*/ /* v0.2bak9j */
1032                    RECSTRU *recp; /* local */
1033                    int xdir,loop;
1034                    DIRSTRU *dirp;
1035#if 0
1036                    int parmgrouplen=4;
1037                    LONGX mfn;
1038                    char *p;
1039                    char v20[MAXN20][MAXL20+1];
1040                    int n20=0;
1041                    char x20[MAXL20+1];
1042                    int len,found;
1043                    int glen=(parmgroup*parmgrouplen)-1;
1044#else
1045                    LONGX v05[MAXN05];
1046                    int n05=0;
1047#endif
1048
1049                    if (!mydrec) {
1050                        LONGX loadxrf=200000;
1051                        LONGX loadmst=4000000;
1052                        mstsetup("mydecs",loadxrf,loadmst);
1053                        mydrec=nrecs;
1054                    }
1055                    RECORD(mydrec,"mydecs",v351);
1056                    if (RECrc != RCNORMAL) fatal("aotmsa2/TA/mydecs/RCNORMAL");
1057#if 0
1058                    /* build v351groups in v20[] from mydecs (v20/) */
1059                    for (dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++) {
1060                        if (dirp->tag == TAG020) {
1061                            p=FIELDP(xdir);
1062                            if (*p == 'C' or *p == 'D') { /* ... */
1063                                if ((len=dirp->len) > glen) len=glen;
1064                                memcpy(x20,p,len);
1065                                if (len < glen) memset(x20+len,' ',glen-len)
1066                                for (found=0, i=0; i<n20; i++)
1067                                    if (memcmp(x20,v20[i],parmgrouplen1) == 0) { found=1; break; }
1068                                if (!found) {
1069                                    if (n20 >= MAXN20) fatal("aotmsa2/TA/mydecs/MAXN20");
1070                                    memcpy(v20[n20++],x20,parmgrouplen);
1071                                }
1072                            } /* end 'C' or 'D' */
1073                        } /* end tag == TAG020 */
1074                    } /* end for dirp */
1075#else
1076                    /* store v351groups in v05[] from mydecs (v5/) */
1077                    for (dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++) {
1078                        if (dirp->tag == TAG005) {
1079                           LONGX mfn=0;
1080                           char *p=FIELDP(xdir);
1081                           int loop;
1082                           for (loop=dirp->len; loop--; p++) mfn=mfn*10+((int)(*p)-(int)'0');
1083                           if (n05 >= MAXN05) fatal("aotmsa2/TA/mydecs/MAXN05");
1084                           v05[n05++]=mfn;
1085                        } /* end tag == TAG005 */
1086                    } /* end for dirp */
1087#endif
1088                    /* store v05groups in vgmfns[] */
1089                    for (i=0; i<n05; i++) {
1090                        LONGX mfn=v05[i];
1091                        int found;
1092                        for (found=0, ivg=0; ivg < nvgs; ivg++)
1093                            if (mfn == vgmfns[ivg]) { found=1; break; }
1094                        if (!found) {
1095                            if (nvgs >= MAXNVG) fatal("aotmsa2/TA/mydecs/MAXNVG");
1096                            vgmfns[nvgs++]=mfn;
1097                        }
1098                    } /* end for v05[] */
1099#else /* v0.2bak9j */
1100#endif /* v0.2bak9j */
1101                } /* end if (1 parmgroup) */
1102
1103                if (v351 >= CLASSES) fatal("aotmsa2/CLASSES overflow/v351");
1104                if (!tabcntA[v351]) ntabs++;
1105                tabcntA[v351]++;
1106                v351nocc++;
1107
1108            } /* end if (dirp->tag == TAG351) */
1109        } /* end for (dirp=MFRdir, ) */
1110
1111        if (v351nocc) count2++;
1112
1113        /*
1114           tabulate groups
1115        */
1116        for (ivg=0; ivg < nvgs; ivg++) {
1117            LONGX gmfn=vgmfns[ivg];
1118            if (gmfn >= CLASSES) fatal("aotmsa2/CLASSES overflow/gmfn");
1119            if (!gtabcntA[gmfn]) gntabs++;
1120            gtabcntA[gmfn]++;
1121        } /* end for vgmfns[] */
1122
1123
1124        /* .... */
1125
1126        count1++;
1127        if (parmtellTA) if ((count1 % parmtellTA) == 0)
1128          fprintf(stderr,"+++ %"_LD_": %"_LD_"/%d \n",count1,count2,ntabs);
1129   
1130    } /* end for (boolh=1; boolh <= boolhits;  ) */
1131
1132    /*
1133    if (booltmpnam[0]) remove(booltmpnam);   / * b72 MFQTHMEM tmp file * /
1134    */
1135   
1136
1137
1138    /* run tabfreqF, tabfreqW and tabfreqD
1139    */
1140    if (ntabs) {
1141#if DCTFILTER
1142        /* set docsTOTxa - number of docs in Cluster A */
1143        docsTOTxA=count2_filtered;
1144#endif
1145
1146        /* run tabfreqF
1147        */
1148        vtimid[ntimes]="freqF"; time(&vtime[ntimes++]); /* watch */
1149        if (parmtrace) fprintf(stderr,"+++ ntabs=%d ..\n",ntabs);
1150        if (parmtrace) fprintf(stderr,"+++ running %s ..\n",dbnoutF);
1151        if (!drec) record(drec=nrecs,decsdbnp,0L);
1152ddrec=drec;
1153ddecsdbnp=decsdbnp;
1154        if (rutfreqF(tabcntA,ntabs,drec,tabcntArankF,&tabfreqF)) exit(3);
1155
1156        /* run tabfreqW
1157        */
1158        vtimid[ntimes]="freqW"; time(&vtime[ntimes++]); /* watch */
1159        if (parmtrace) fprintf(stderr,"+++ runing %s ..\n",dbnoutW);
1160        if (rutfreqW(tabfreqF,ntabs,(deffmhxp?deffmhxp:amdldbnp),docsTOTxA,docsTOTamdl,tabcntArankF,tabcntArankW,&tabfreqW,(parmloadmdl?tabcntMDL:NULL),gtabcntA)) exit(4);
1161
1162        /* run tabfreqD
1163        */
1164        vtimid[ntimes]="freqD"; time(&vtime[ntimes++]); /* watch */
1165        if (parmtrace) fprintf(stderr,"+++ runing %s ..\n",dbnoutD);
1166        if (rutfreqD(tabfreqF,ntabs,tabcntArankF,tabcntArankW,tabcntArankD,&tabfreqD,tabcntGMDL, gtabcntA)) exit(5);
1167
1168        /* output tabfreqD
1169        */
1170        vtimid[ntimes]="outD"; time(&vtime[ntimes++]); /* watch */
1171        if (parmtrace) fprintf(stderr,"+++ updating %s ..\n",dbnoutD);
1172        if (outfreqD(ntabs,dbnoutD,tabcntArankF,tabcntArankW,tabfreqD)) exit(6);
1173        /* output tabfreqF
1174        */
1175        vtimid[ntimes]="outF"; time(&vtime[ntimes++]); /* watch */
1176        if (parmtrace) fprintf(stderr,"+++ updating %s ..\n",dbnoutF);
1177        if (outfreqF(ntabs,dbnoutF,tabcntArankW,tabcntArankD,tabfreqF)) exit(7);
1178        /* output tabfreqW
1179        */
1180        vtimid[ntimes]="outW"; time(&vtime[ntimes++]); /* watch */
1181        if (parmtrace) fprintf(stderr,"+++ updating %s ..\n",dbnoutW);
1182        if (outfreqW(ntabs,dbnoutW,docsTOTxA,docsTOTamdl,tabcntArankF,tabcntArankD,tabfreqD,tabfreqW)) exit(8);
1183    }
1184
1185if (ntabs) {
1186
1187    /* log A1
1188    */
1189    if (!parmaid) parmaid="A1";
1190    if (strcmp(parmaid,"A1") == 0) {
1191        char *batchp=envarea;
1192    /* environment */
1193    if (usernamp   ) { sprintf(batchp,"a3300|%s|" , usernamp    ); batchp+=strlen(batchp); }
1194    if (cipfnamp   ) { sprintf(batchp,"a3000|%s|" , cipfnamp    ); batchp+=strlen(batchp); }
1195    if (decsdbnp   ) { sprintf(batchp,"a3001|%s|" , decsdbnp    ); batchp+=strlen(batchp); }
1196    if (amdldbnp   ) { sprintf(batchp,"a3002|%s|" , amdldbnp/**/); batchp+=strlen(batchp); }
1197    if (atmdldbnp  ) { sprintf(batchp,"a3003|%s|" , atmdldbnp   ); batchp+=strlen(batchp); }
1198    if (tmp1dbnp   ) { sprintf(batchp,"a3004|%s|" , tmp1dbnp    ); batchp+=strlen(batchp); }
1199    if (pftfnamp   ) { sprintf(batchp,"a3005|%s|" , pftfnamp    ); batchp+=strlen(batchp); }
1200    if (langp      ) { sprintf(batchp,"a3006|%s|" , langp       ); batchp+=strlen(batchp); }
1201    if (parmloopTA ) { sprintf(batchp,"a3007|%"_LD_"|", parmloopTA  ); batchp+=strlen(batchp); }
1202    if (parmfromDA ) { sprintf(batchp,"a3008|%"_LD_"|", parmfromDA  ); batchp+=strlen(batchp); }
1203    if (parmcountDA) { sprintf(batchp,"a3009|%"_LD_"|", parmcountDA ); batchp+=strlen(batchp); }
1204    if (parmsortp  ) { sprintf(batchp,"a3010|%s|" , parmsortp   ); batchp+=strlen(batchp); }
1205    if (boolqryp   ) { sprintf(batchp,"a3011|%s|" , boolqryp    ); batchp+=strlen(batchp); }
1206    if (namedbnp   ) { sprintf(batchp,"a3012|%s|" , namedbnp    ); batchp+=strlen(batchp); }
1207    if (parmatmdl99) { sprintf(batchp,"a3013|%d|" , parmatmdl99 ); batchp+=strlen(batchp); }
1208    if (actionp    ) { sprintf(batchp,"a3014|%s|" , actionp     ); batchp+=strlen(batchp); }
1209/**/
1210                       sprintf(batchp,"a3015|%"_LD_"|", boolsetno   ); batchp+=strlen(batchp);
1211                       sprintf(batchp,"a4001|%d|" , ntabs       ); batchp+=strlen(batchp);
1212/**/
1213        if (1) {
1214        /* add watch */
1215            int hours,mins,secs;
1216            int i;
1217            vtimid[ntimes]="end1"; time(&vtime[ntimes++]); /* watch */
1218            //vtimid[ntimes]="xT";   time(&vtime[ntimes++]); /* watch */
1219            secs=vtime[ntimes-1]-vtime[0];
1220            hours=secs/3600; secs-=hours*3600;
1221            mins=secs/60; secs-=mins*60;
1222            sprintf(batchp,"a3216|%02d:%02d:%02d|",hours,mins,secs); batchp+=strlen(batchp);
1223            for (i=0; i<ntimes-1; i++) {
1224                sprintf(batchp,"a3214|%s|",  vtimid[i]);             batchp+=strlen(batchp);
1225                sprintf(batchp,"a3215|%"_LD_"|", vtime[i+1]-vtime[i]);   batchp+=strlen(batchp);
1226            }
1227            //ntimes--;
1228        }
1229
1230        if (fldupdat(boolridx,envarea)) fatal("aotmsa2/TA/env/fldupdat");
1231        if (recupdat(booldbcrec,boolridx)) fatal("aotmsa2/TA/env/fldupdat");
1232    }
1233
1234    /* done
1235    */
1236    if (parmtellTA)
1237        fprintf(stderr,"aotmsa2: %"_LD_" recs in | %"_LD_" tabs | %d recs out\n",count1,count2,ntabs);
1238
1239} else { /* else if (ntabs) */
1240    actionDA=0;
1241} /* end if (ntabs) */
1242
1243} /* end actionTA */
1244
1245
1246/* =======================         =============          ================== */
1247/* =======================         =============          ================== */
1248
1249
1250if (actionDA) {
1251
1252    /* List tableF/tableW
1253    */
1254
1255#define MFQTAENV   102
1256
1257#define FMTASIZE 32000
1258
1259    FMT_CODE *tabfmtp=NULL;           /* formato para tab= */
1260    LONGX ntabfmts=0;
1261    char fmtspec[BUFSIZ];
1262    char *batchp;
1263    LONGX parmfrom,parmto;
1264    LONGX parmtell=/*0*/parmtellTA;
1265    LONGX mfn1;
1266    char *file1p;
1267    DBXSTRU *dbx1p;
1268   
1269    char fmtarea[FMTASIZE+1];
1270    LONGX fmtasize=FMTASIZE;
1271
1272    char *vMFQTQRY0=NULL;
1273    char *vMFQTHITS=NULL;
1274/*nu     char *vMFQTAENV; */
1275    char *p;
1276
1277    char vbreak[2][3];
1278    int nbreak;
1279    char v2992[MAXCATLEN+1];
1280    LONGX mfn351;
1281
1282    LONGX setno=boolsetno;
1283
1284    int ndownf=parmdown;
1285    int ndownw=parmdown;
1286    int ncolors=5;
1287    int kdownf=ndownf/ncolors;
1288    int kdownw=ndownw/ncolors;
1289    float rangef,stepf;
1290    float rangew,stepw;
1291    LONGX freq1,freq2,freq;
1292    float peso1,peso2,peso;
1293    int fcolor=0;
1294    char x999[20];
1295    int wcolor=0;
1296    char x2991[20];
1297
1298    if (parmtrace) printf("+++trace: DA/namedbnp=%s\n",namedbnp);
1299
1300    vtimid[ntimes]="fmt1"; time(&vtime[ntimes++]); /* watch */
1301
1302    if (!booldbcrec) RECORD(booldbcrec=nrecs,namedbnp,0L);
1303    if (!boolridx) boolridx=nrecs;
1304
1305    RECORD(boolridx,namedbnp,setno);
1306
1307    vMFQTQRY0 = recfield(NULL,boolridx,MFQTQRY0,1,"");
1308    if (!boolqryp) boolqryp=vMFQTQRY0;
1309
1310    vMFQTHITS = recfield(NULL,boolridx,MFQTHITS,1,"");
1311
1312    /* get booldbn environment  */
1313/*nu     vMFQTAENV = recfield(NULL,boolridx,MFQTAENV,1,""); */
1314    /* p=vMFQTAENV; ... */
1315
1316    /* set master file */
1317    if (parmsortx == 'f') file1p=dbnoutF; /* alternate file is dbnoutW */
1318    if (parmsortx == 'w') file1p=dbnoutW;
1319    if (parmsortx == 'd') file1p=dbnoutD; /* alternate file is dbnoutW */
1320    dbx1p=dbxstorp(file1p);
1321
1322    /* init reading */
1323    if (!irec) irec=nrecs;
1324    RECORD(irec,file1p,0L);
1325    parmto=MF0nxtmfn-1; if (!ntabs) ntabs=parmto;
1326    count1=0;
1327    if (parmsortx == 'd') parmfrom=1;
1328    else {
1329        parmfrom=parmfromDA;
1330        if (parmcountDA) parmto=parmfromDA+parmcountDA-1;
1331        if (parmto > MF0nxtmfn-1) parmto=MF0nxtmfn-1;
1332        count2=parmto-parmfromDA+1;
1333    }
1334
1335    /* environment */
1336    batchp=envarea;
1337    if (cipfnamp   ) { sprintf(batchp,"a3000|%s|" , cipfnamp    ); batchp+=strlen(batchp); }
1338    if (decsdbnp   ) { sprintf(batchp,"a3001|%s|" , decsdbnp    ); batchp+=strlen(batchp); }
1339    if (amdldbnp   ) { sprintf(batchp,"a3002|%s|" , amdldbnp    ); batchp+=strlen(batchp); }
1340    if (atmdldbnp  ) { sprintf(batchp,"a3003|%s|" , atmdldbnp   ); batchp+=strlen(batchp); }
1341    if (tmp1dbnp   ) { sprintf(batchp,"a3004|%s|" , tmp1dbnp    ); batchp+=strlen(batchp); }
1342    if (pftfnamp   ) { sprintf(batchp,"a3005|%s|" , pftfnamp    ); batchp+=strlen(batchp); }
1343    if (langp      ) { sprintf(batchp,"a3006|%s|" , langp       ); batchp+=strlen(batchp); }
1344    if (parmloopTA ) { sprintf(batchp,"a3007|%"_LD_"|", parmloopTA  ); batchp+=strlen(batchp); }
1345    if (parmfromDA ) { sprintf(batchp,"a3008|%"_LD_"|", parmfromDA  ); batchp+=strlen(batchp); }
1346    if (parmcountDA) { sprintf(batchp,"a3009|%"_LD_"|", parmcountDA ); batchp+=strlen(batchp); }
1347    if (parmsortp  ) { sprintf(batchp,"a3010|%s|" , parmsortp   ); batchp+=strlen(batchp); }
1348    if (boolqryp   ) { sprintf(batchp,"a3011|%s|" , boolqryp    ); batchp+=strlen(batchp); }
1349    if (namedbnp   ) { sprintf(batchp,"a3012|%s|" , namedbnp    ); batchp+=strlen(batchp); }
1350    if (parmatmdl99) { sprintf(batchp,"a3013|%d|" , parmatmdl99 ); batchp+=strlen(batchp); }
1351    if (actionp    ) { sprintf(batchp,"a3014|%s|" , actionp     ); batchp+=strlen(batchp); }
1352/**/
1353                       sprintf(batchp,"a3015|%"_LD_"|", setno       ); batchp+=strlen(batchp);
1354                       sprintf(batchp,"a4001|%d|" , ntabs       ); batchp+=strlen(batchp);
1355/**/
1356
1357
1358/* -----------------------------------------------------------------------------
1359v4001 = ntabs
1360
1361v3210[1] = 'A'
1362v3211[1] = Aboolqryp
1363v3212 = hits
1364v3213[1] = Aboolqrypdecs
1365
1366p/ v1001='1'
1367  v3214[] = time id
1368  v3215[] = seconds
1369  v3216   = elapsed "%02d:%02d:%02d",hours,mins,secs
1370
1371decs data fields
1372  v3203 = v3
1373*/
1374
1375    if (vMFQTQRY0) {
1376        int v351;
1377        RECSTRU *recp;
1378        sprintf(batchp,"a3210|%s|" , "A"             ); batchp+=strlen(batchp);
1379        sprintf(batchp,"a3211|%s|" , vMFQTQRY0       ); batchp+=strlen(batchp);
1380        sprintf(batchp,"a3212|%"_LD_"|", atol(vMFQTHITS) ); batchp+=strlen(batchp);
1381        sprintf(batchp,"a3213|"                      ); batchp+=strlen(batchp);
1382        for (p=vMFQTQRY0; *p; ) {
1383            for (v351=0; isdigit(*p); p++) v351=v351*10+((int)(*p)-(int)'0');
1384            if (v351) {
1385                if (!drec) drec=nrecs;
1386                RECORD(drec,decsdbnp,v351);
1387                recfield(batchp,drec,DECSTAGNAME(langp),1,"");    batchp+=strlen(batchp);
1388            }
1389            else { *batchp++ = *p; if (*p) p++; }
1390        }
1391        sprintf(batchp,"|"                           ); /*nu batchp+=strlen(batchp); */
1392    }
1393    /* end of envarea */
1394
1395    /* init summary */
1396    memset(vbreak,0x00,sizeof(vbreak));
1397
1398    /* do it */
1399    for (mfn1=parmfrom/*DA*/; mfn1 <= parmto; mfn1++) {
1400
1401        /* compile strip CR if CRLF + display format */
1402        if (!tabfmtp) {
1403            /* use fmtarea for actual format specification */
1404            sprintf(fmtspec,"@%s",pftfnamp);
1405            if (!loadfile(NULL,'@',fmtspec,fmtarea,fmtasize,'\0')) {
1406                printf("Content-type: text/plain\n\n");
1407                printf("format error: file %s not found \n",pftfnamp);
1408                exit(12);
1409            }
1410            if (fmt_gener(&tabfmtp,fmtarea)) {
1411                printf("Content-type: text/plain\n\n");
1412                printf("format error: file %s error#%d offset %"_LD_" [%.512s%s]\n",
1413                        pftfnamp,fmt_error,fmt_errof,fmtarea+fmt_errof,"...");
1414                exit(12);
1415            }
1416        }
1417
1418        /* get color limits */
1419        if (parmdown) if ((count1+1) == 1) {
1420            RECORD(irec,dbnoutF,1L);
1421            freq1=atol(recfield(x999,irec,999,1,""));
1422            RECORD(irec,dbnoutF,0L);
1423            freq2=freq1;
1424            if (MF0nxtmfn-1 > 1) {
1425                RECORD(irec,dbnoutF,MF0nxtmfn-1);
1426                freq2=atol(recfield(x999,irec,999,1,""));
1427            }
1428            rangef=freq1-freq2; if (rangef < 0) rangef = -rangef; /* ok */
1429            stepf=(rangef+1)/(float)ncolors;
1430            if (stepf <= 0) { stepf=1; kdownf=1; ndownf=0; }
1431
1432            RECORD(irec,dbnoutW,1L);
1433            peso1=atof(recfield(x2991,irec,2991,1,""));
1434            RECORD(irec,dbnoutW,0L);
1435            peso2=peso1;
1436            if (MF0nxtmfn-1 > 1) {
1437                RECORD(irec,dbnoutW,MF0nxtmfn-1);
1438                peso2=atof(recfield(x2991,irec,2991,1,""));
1439            }
1440            rangew=peso1-peso2; if (rangew < 0) rangew = -rangew; /* ok */
1441            stepw=(rangew+1)/(float)ncolors;
1442            if (stepw <= 0) { stepw=1; kdownw=1; ndownw=0; }
1443        }
1444
1445        /* get record */
1446        RECORD(irec,file1p,mfn1);
1447        if (RECrc != RCNORMAL) fatal("aotmsa2/DA/RCNORMAL");
1448        count1++;
1449        if (parmtrace) printf("+++ mfnDA=%"_LD_"\n",mfn1);
1450
1451        /* process parmsort
1452        */
1453        batchp=fmtarea;
1454        if (file1p == dbnoutW /* parmsortx=='w' */) {
1455/*
1456            LONGX rankf=atol(recfield(fmtarea,irec,2220,1,""));
1457            LONGX rankd=atol(recfield(fmtarea,irec,2220,2,""));
1458            sprintf(batchp,"D2220A2220/%"_LD_"/A2220/%"_LD_"/A2220/%"_LD_"/",rankf,MFRmfn,rankd); batchp+=strlen(batchp);
1459*/
1460        }
1461        else {
1462/*
1463            LONGX rank1=atol(recfield(fmtarea,irec,2220,1,""));
1464*/
1465            LONGX rankw=atol(recfield(fmtarea,irec,2220,2,""));
1466            char *v1f=recfield(fmtarea,irec,1,1,"");
1467            char *v1w=fmtarea+strlen(fmtarea)+1;
1468            RECORD(irec,dbnoutW,rankw); RECdbxp=dbx1p;
1469            recfield(v1w,irec,1,1,"");
1470            if (!*v1f || !*v1w || strcmp(v1f,v1w)) fatal("aotmsa2/DA/join");
1471/*
1472            sprintf(batchp,"D2220A2220/%"_LD_"/A2220/%"_LD_"/",mfn1,MFRmfn); batchp+=strlen(batchp);
1473*/
1474        }
1475
1476        /* process summary */
1477        memset(v2992,0x00,sizeof(v2992));
1478        nbreak=0;
1479        p=recfield(v2992,irec,2992,1,""); /* 1st mesh C/D */
1480        if (memcmp(vbreak[0],p+0,3)) {
1481            memcpy(vbreak[0],p+0,3); nbreak+=1; *vbreak[1]='\0';
1482        }
1483        if (memcmp(vbreak[1],p+4,3)) {
1484            memcpy(vbreak[1],p+4,3); nbreak+=2;
1485        }
1486
1487        if (nbreak) {
1488
1489            if (nbreak & 0x01) {
1490                sprintf(batchp,"A3994/%d/"  ,nbreak&0x01);  batchp+=strlen(batchp);
1491                sprintf(batchp,"A3995/%.3s/",v2992      );  batchp+=strlen(batchp);
1492                if (nbreak & 0x02) {
1493                sprintf(batchp,"A3995/%.7s/",v2992      );  batchp+=strlen(batchp);
1494                }
1495                nbreak=1;
1496            }
1497            else {
1498                nbreak=2;
1499                sprintf(batchp,"A3994/%d/",nbreak       ); batchp+=strlen(batchp);
1500                sprintf(batchp,"A3995//"                ); batchp+=strlen(batchp);
1501                sprintf(batchp,"A3995/%.7s/",v2992      ); batchp+=strlen(batchp);
1502            }
1503   
1504        } /* end if (nbreak) */
1505
1506        /* skip records if parmshowzero
1507        */
1508        if (parmshowzero)
1509            if (!nbreak)
1510                if (count1 > 1)
1511                    if (count1 < count2)
1512                        continue;
1513
1514        /* add CGI and +hits data fields
1515        */
1516        sprintf(batchp,"A1001/%"_LD_"/A1002/%"_LD_"/",count1,count2); batchp+=strlen(batchp);
1517
1518        /* add decs data fields
1519        */
1520        mfn351=atol(recfield(batchp,irec,1,1,"")); /* the condition */
1521        sprintf(batchp,"a3203|"                      ); batchp+=strlen(batchp);
1522        if (!drec) drec=nrecs;
1523        RECORD(drec,"mydecs",mfn351);
1524        recfield(batchp,drec,DECSTAGNAME(langp),1,"");            batchp+=strlen(batchp);
1525        sprintf(batchp,"|"                           ); batchp+=strlen(batchp);
1526
1527        /* add watch */
1528        if (count1 == 1) {
1529            int hours,mins,secs;
1530            int i;
1531            vtimid[ntimes]="fmt2"; time(&vtime[ntimes++]); /* watch */
1532            secs=vtime[ntimes-1]-vtime[0];
1533            hours=secs/3600; secs-=hours*3600;
1534            mins=secs/60; secs-=mins*60;
1535            sprintf(batchp,"a3216|%02d:%02d:%02d|",hours,mins,secs); batchp+=strlen(batchp);
1536            for (i=0; i<ntimes-1; i++) {
1537                sprintf(batchp,"a3214|%s|",  vtimid[i]);             batchp+=strlen(batchp);
1538                sprintf(batchp,"a3215|%"_LD_"|", vtime[i+1]-vtime[i]);   batchp+=strlen(batchp);
1539            }
1540        }
1541
1542        /* get color */
1543        if (parmdown) {
1544            freq=atol(recfield(x999,irec,999,1,""));
1545            fcolor=(int)(0xFF-ndownf+(freq/stepf)*kdownf);
1546            peso=atof(recfield(x2991,irec,2991,1,""));
1547            wcolor=(int)(0xFF-ndownw+(peso/stepw)*kdownw);
1548            sprintf(batchp,"a1515/%02x/",fcolor);   batchp+=strlen(batchp);
1549            sprintf(batchp,"a1515/%02x/",wcolor);   batchp+=strlen(batchp);
1550        }
1551
1552
1553        /* add/del fields */
1554        if (fldupdat(irec,fmtarea)) fatal("aotmsa2/DA/fldupdat/fmt");
1555        if (fldupdat(irec,envarea)) fatal("aotmsa2/DA/fldupdat/env");
1556
1557        /* apply display format */
1558        if (fmt_inter(tabfmtp,irec,fmtasize,fmtarea,fmtasize) < 0) {
1559            printf("Content-type: text/plain\n\n");
1560            printf("error: %s [format execution error %d]\n",pftfnamp,fmt_error);
1561            exit(21);
1562        }
1563        /* close fmt_ every each MAXTABFMTS calls */
1564        if (++ntabfmts == 1000 /*MAXTABFMTS*/) {
1565            fmt_free(tabfmtp); tabfmtp=(FMT_CODE *)NULL;
1566            ntabfmts=0;
1567        }
1568
1569        /* output format results
1570        */
1571        puts(fmtarea); /* for (left=strlen(fmtarea), p=fmtarea; left; ) .s{ int len=BUFSIZ/2; char c;
1572                            if (len > left) len=left; c=p[len]; p[len]='\0'; puts(p); p[len]=c;
1573                            p+=len; left-=len; } */
1574
1575        if (parmtell) if ((count1 % parmtell) == 0)
1576            fprintf(stderr,"+++ %"_LD_"/%"_LD_" \n",count1,count2);
1577        if (parmtrace)
1578            fprintf(stderr,"+++ %"_LD_"/%"_LD_" \n",count1,count2);
1579
1580    }
1581
1582    vtimid[ntimes]="end2"; time(&vtime[ntimes++]); /* watch */
1583
1584} /* actionDA */
1585
1586
1587/* =======================         =============          ================== */
1588/* =======================         =============          ================== */
1589if (actionDD) {
1590
1591    int errno1=0;
1592    int errno2=0;
1593    char *p1=NULL;
1594    char *p2=NULL;
1595    LONGX decsnxtmfn;
1596    char *decsdbp=decsdbnp;
1597
1598    /* Search DECS
1599    */
1600    boolsetno=0;
1601    boolhits=0;
1602
1603    /* init reading */
1604    if (!drec) drec=nrecs;
1605    RECORD(drec,decsdbnp,0L);
1606    decsnxtmfn=MF0nxtmfn;
1607   
1608    /* will call format even on error and/or expression missing */
1609    count2=1;
1610
1611    /* display MeSH Diseases (cat C$)
1612    */
1613    if (actionDD == 2) if (!boolqryp) {
1614        boolqryp="CAT1=C$";
1615        decsdbp="mydecs";
1616    }
1617   
1618    /*
1619        Search "bool=" parameter
1620    */
1621    if (boolqryp) { /* boolqryp */
1622
1623        LONGX mfn;
1624
1625        LONGX asize=strlen(decsdbp) +                  /* field MFQTDBN0=11 (may be longer than 128+4+1) */
1626                   strlen(boolqryp) +                 /* the expression */
1627                   2*strlen(boolqryp) +               /* the terms + pseudo operators _1termX+11X */
1628                   BUFSIZ+strlen(amdldbnp) +          /* field MFQSWDBN=20 + a diferent db */
1629                   24*(strlen(B7DELADD)+3*B7UPLEN) +  /* 2 duzias de control fields */  /* DxxAxx|xxx| */ 
1630                   strlen(boolqryp)+4 +               /* tmpfile .%03x */
1631                   BUFSIZ;                            /* por si las moscas */
1632                   
1633        char *buffup=loadfile(NULL,'@',"",NULL,asize,'\0');
1634
1635        if (!cib7p) cib7p=b7_cib7(cib7p,ciapip);
1636
1637        /* initialize ridx and b7_xxx() parameters and run b7_run()
1638        */
1639        for (boolridx=nrecs, mfn=1; ; mfn++) { /* get actual maxmfn */
1640            RECORD(boolridx,decsdbp,mfn);
1641            if (RECrc == RCEOF) fatal(decsdbp);
1642            if (RECrc == RCNORMAL) break;
1643        }
1644        RECdbxp=NULL;                /* nao usa base de log */
1645        MFRmfn=0L;
1646
1647        /* run b7_exp() / b7_run() / b7_hit(0)
1648        */
1649        p1=b7_exp(cib7p,boolridx,decsdbp,boolqryp,buffup,NULL,0L,&errno1);
1650        if (p1 || errno1) ; /* printf("Expression syntax error %d: '%s'\n",errno1,p1); */
1651        else {
1652            LONGX bufsiz;
1653            char *hitfnamp="null";
1654            if (booltmpnam[0]) hitfnamp=booltmpnam;
1655            sprintf(buffup,"D%dA%d|%s|",MFQTHMEM,MFQTHMEM,hitfnamp);
1656            if (fldupdat(boolridx,buffup) != NULL) fatal("aotmsa2/DD/fldupdat/boolridx");
1657
1658            /* b7_run faz "trirecp=vrep[tlirec]" */
1659            if (!booltlir) record(booltlir=nrecs,"null",1L);
1660
1661            /* alloc buffer for 20000 hits = 80Kbytes */
1662            bufsiz=20000*sizeof(LONGX);
1663            if (b7bufferp) b7_hbfree(cib7p,&b7bufferp);
1664            b7_hballoc(cib7p,bufsiz,&b7bufferp);
1665
1666            /* run search */
1667            p2=b7_run(cib7p,boolridx,decsdbp,buffup,sizeof(buffup),
1668                booltell,isisuctab,""/*btch0p*/,booltlir,0L,&errno2);
1669            if (p2 || errno2) ; /* printf("Execution error %d: '%s'\n",errno2,p2); */
1670            else {
1671                boolsetno=b7setno;  /* =1 ??? */
1672                boolhits=b7bufferp->ndocs; /* b7_hit(cib7p,boolridx,0L,b7setno); */
1673                if (booltell) printf("Hits=%"_LD_"\n",boolhits);
1674            }
1675        }
1676        if (p2 || errno2) fatal("Expression execution error");
1677
1678    } /* boolqryp */
1679
1680    /* set number of times format is called */
1681    if (boolhits) count2=boolhits;
1682
1683    if (p1 || errno1 /* || p2 || errno2*/) { ; }
1684
1685    if (1) { /* errno */
1686//#define FMTASIZE 32000
1687        FMT_CODE *tabfmtp=NULL;           /* formato para tab= */
1688        char fmtspec[BUFSIZ];
1689        char *batchp;
1690        char fmtarea[FMTASIZE+1];
1691        LONGX fmtasize=FMTASIZE;
1692
1693        count1=0;
1694
1695        /* environment */
1696        batchp=envarea;
1697        if (cipfnamp   ) { sprintf(batchp,"a3000|%s|" , cipfnamp    ); batchp+=strlen(batchp); }
1698        if (decsdbnp   ) { sprintf(batchp,"a3001|%s|" , decsdbnp    ); batchp+=strlen(batchp); }
1699        if (amdldbnp   ) { sprintf(batchp,"a3002|%s|" , amdldbnp    ); batchp+=strlen(batchp); }
1700        if (atmdldbnp  ) { sprintf(batchp,"a3003|%s|" , atmdldbnp   ); batchp+=strlen(batchp); }
1701        if (tmp1dbnp   ) { sprintf(batchp,"a3004|%s|" , tmp1dbnp    ); batchp+=strlen(batchp); }
1702        if (pftfnamp   ) { sprintf(batchp,"a3005|%s|" , pftfnamp    ); batchp+=strlen(batchp); }
1703        if (langp      ) { sprintf(batchp,"a3006|%s|" , langp       ); batchp+=strlen(batchp); }
1704        if (parmloopTA ) { sprintf(batchp,"a3007|%"_LD_"|", parmloopTA  ); batchp+=strlen(batchp); }
1705        if (parmfromDA ) { sprintf(batchp,"a3008|%"_LD_"|", parmfromDA  ); batchp+=strlen(batchp); }
1706        if (parmcountDA) { sprintf(batchp,"a3009|%"_LD_"|", parmcountDA ); batchp+=strlen(batchp); }
1707        if (parmsortp  ) { sprintf(batchp,"a3010|%s|" , parmsortp   ); batchp+=strlen(batchp); }
1708//        if (boolqryp   ) { sprintf(batchp,"a3011|%s|" , boolqryp    ); batchp+=strlen(batchp); }
1709        if (namedbnp   ) { sprintf(batchp,"a3012|%s|" , namedbnp    ); batchp+=strlen(batchp); }
1710        if (parmatmdl99) { sprintf(batchp,"a3013|%d|" , parmatmdl99 ); batchp+=strlen(batchp); }
1711        if (actionp    ) { sprintf(batchp,"a3014|%s|" , actionp     ); batchp+=strlen(batchp); }
1712/**/
1713//                           sprintf(batchp,"a3015|%"_LD_"|", setno       ); batchp+=strlen(batchp);
1714//                           sprintf(batchp,"a4001|%d|" , ntabs       ); batchp+=strlen(batchp);
1715/**/
1716        /* end of envarea */
1717
1718        /* compile strip CR if CRLF + display format */
1719        pftfnamp="aotmsa2D.pft";
1720        sprintf(fmtspec,"%s,@%s","if size(s(#))=2 then newline(s(#)*1) fi",pftfnamp);
1721        if (fmt_gener(&tabfmtp,fmtspec)) {
1722            printf("Content-type: text/plain\n\n");
1723            printf("error: %s [format error %d:%s]\n",pftfnamp,fmt_error,fmtspec+fmt_errof);
1724            exit(12);
1725        }
1726
1727
1728        /*
1729            loop decs
1730        */
1731
1732        for (boolh=1; ; boolh++) {
1733
1734            LONGX mfn;
1735
1736            /* hit processing */
1737            if (boolhits) {
1738
1739                if (boolh > boolhits) break;
1740               
1741                if (boolh == 1) {
1742                    hitlistp=(B7HITLIST *)b7bufferp->area;
1743                    mfnlistp=hitlistp->mfnlist;
1744                }
1745                if (b7bufferp->hcase == BITSTRING)
1746                    mfn=b7_hit(cib7p,boolridx,boolh,b7setno);
1747                else
1748                    mfn = *mfnlistp; mfnlistp++;
1749
1750                if (mfn <= 0) fatal("aotmsa2/DD/decsdbnp/hit");
1751   
1752                if (parmtrace) printf("+++ hit#%"_LD_" mfn=%"_LD_"\n",boolh,mfn);
1753   
1754                RECORD(drec,decsdbnp,mfn);
1755                if (RECrc != RCNORMAL) fatal("aotmsa2/DD/decsdbnp/RCNORMAL");
1756
1757            }
1758            else {
1759                RECORD(drec,decsdbnp,mfn=decsnxtmfn);
1760                RECrc=RCNORMAL; MFRstatus=ACTIVE;
1761//                sprintf(fmtarea,"a%"_LD_"|x|",(LONGX)DECSTAGP);
1762//                if (fldupdat(drec,fmtarea)) fatal("aotmsa2/DD/fldupdat/x");
1763            }
1764
1765            count1++;
1766            if (parmtrace) printf("+++ mfnDD=%"_LD_"\n",mfn);
1767   
1768            /* process record
1769            */
1770            batchp=fmtarea;
1771   
1772            /* add CGI and +hits data fields
1773            */
1774            sprintf(batchp,"A1001/%"_LD_"/A1002/%"_LD_"/",count1,count2); batchp+=strlen(batchp);
1775   
1776            /* add decs data fields
1777            */
1778            sprintf(batchp,"a3203|"                      ); batchp+=strlen(batchp);
1779            recfield(batchp,drec,DECSTAGNAME(langp),1,"");            batchp+=strlen(batchp);
1780            sprintf(batchp,"|"                           ); batchp+=strlen(batchp);
1781
1782            if (fldupdat(drec,fmtarea)) fatal("aotmsa2/DD/fldupdat/fmt");
1783            if (fldupdat(drec,envarea)) fatal("aotmsa2/DD/fldupdat/env");
1784
1785            if (fmt_inter(tabfmtp,drec,fmtasize,fmtarea,fmtasize) < 0) {
1786                printf("Content-type: text/plain\n\n");
1787                printf("error: %s [format execution error %d]\n",pftfnamp,fmt_error);
1788                exit(21);
1789            }
1790
1791            /* output format results
1792            */
1793            puts(fmtarea);
1794           
1795            if (!boolhits) break;
1796
1797        } /* end for (boolh=1; ;  ) */
1798
1799    } /* errno */
1800
1801} /* end actionDD */
1802
1803/* =======================         =============          ================== */
1804/* =======================         =============          ================== */
1805
1806    /* watch */
1807    time(&vtime[ntimes++]);
1808    if (parmtime) {
1809        struct tm *tp;
1810        char fmt_time[21+1]; /* aaaammdd hhmmss WDAY YDAY */
1811                             /* 1234567890123456 7  8 901 */
1812        int hours,mins,secs;
1813        LONGX time_start=vtime[0];
1814        LONGX time_elapsed;
1815        vtimid[ntimes]="exit"; time(&vtime[ntimes++]); /* watch */
1816        time_elapsed=vtime[ntimes-1];
1817        tp=localtime(&time_elapsed);
1818        sprintf(fmt_time,"%02d/%02d/%02d %02d:%02d:%02d",
1819                           tp->tm_mday,tp->tm_mon+1,tp->tm_year%100,
1820                           tp->tm_hour,tp->tm_min,tp->tm_sec);
1821        fprintf(stderr,"+++ localtime %s \n",fmt_time);
1822        secs=time_elapsed - time_start;
1823        hours=secs/3600; secs-=hours*3600;
1824        mins=secs/60; secs-=mins*60;
1825        sprintf(fmt_time,"%02d:%02d:%02d",hours,mins,secs);
1826        fprintf(stderr,"+++ elapsed %s \n",fmt_time);
1827    }
1828
1829    /* exit
1830    */
1831    if (cib7p) cib7p=b7_cib7_delete(cib7p);
1832#if CIAPI
1833    cisisApplicationDelete(ciapip);
1834    ciapip=NULL;
1835#endif /* CIAPI */
1836
1837    exit(0);
1838}
1839
1840
1841/* =======================         =============          ================== */
1842/* =======================         =============          ================== */
1843
1844#if ANSI
1845int rutfreqF(LONGX *tabcntA, int ntabs, LONGX drec, LONGX *tabcntArankF, TABFREQF_ENTRY **tabfreqFp)
1846#else
1847int rutfreqF(tabcntA, ntabs, dbnoutp, drec, tabcntArankF, tabfreqFp)
1848LONGX *tabcntA;
1849int ntabs;
1850LONGX drec;
1851LONGX *tabcntArankF;
1852TABFREQF_ENTRY **tabfreqFp;
1853#endif
1854{
1855    LONGX mfn;
1856    char buffup[BUFSIZ];
1857    int v351;
1858
1859    LONGX nbytes;
1860    char *p;
1861
1862    TABFREQF_ENTRY *tabfreqF,*tabF;
1863
1864typedef struct outfreqF_sort_entry {
1865    char x999[10];
1866    char categ[39];
1867    char null[1];
1868    char align[2];
1869    LONGX v351;
1870    LONGX freq;
1871} OUTFREQF_SORT_ENTRY;
1872
1873    OUTFREQF_SORT_ENTRY *sort_tab,*sort_tmp,*sortp,*ip,*jp;
1874    int catlen;
1875    int i,j,k;
1876
1877    int keylen=sizeof(sortp->x999)+sizeof(sortp->categ);
1878
1879
1880    /* init tabcntArankF (indexed by DecsMfn)
1881    */
1882    memset(tabcntArankF,0,sizeof(LONGX)*CLASSES);
1883
1884    *tabfreqFp=NULL;
1885    if (!ntabs) return(0);
1886
1887    /* alloc tabfreqF (indexed by rankF)
1888    */
1889    nbytes=sizeof(TABFREQF_ENTRY)*ntabs;
1890    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqF/tabfreqF/ALLOMAXV");
1891    p=(char *)ALLOC((ALLOPARM)(nbytes));
1892    if (p == ALLONULL) fatal("aotmsa2/rutfreqF/tabfreqF/ALLOC");
1893    memset(p,0,nbytes); /* init */
1894    tabfreqF=(TABFREQF_ENTRY *)p;
1895    *tabfreqFp=tabfreqF;
1896
1897    nbytes=sizeof(OUTFREQF_SORT_ENTRY)*ntabs+sizeof(OUTFREQF_SORT_ENTRY);
1898    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqF/sort_tab/ALLOMAXV");
1899    p=(char *)ALLOC((ALLOPARM)(nbytes));
1900    if (p == ALLONULL) fatal("aotmsa2/rutfreqF/sort_tab/ALLOC");
1901    sort_tab=(OUTFREQF_SORT_ENTRY *)p;
1902    sort_tmp=sort_tab+ntabs;
1903
1904    for (mfn=0L, v351=1; mfn<ntabs; v351++) {
1905        if (!tabcntA[v351]) continue;
1906        sortp=sort_tab+mfn;
1907        sprintf(sortp->x999,"%10"_LD_,999999999L-tabcntA[v351]);
1908        if (drec) { /* use decs/v20 as 2nd sort key for sortF */
1909            record(drec,ddecsdbnp,(LONGX)v351);
1910            recfield(buffup,drec,TAG020,1,""); if (!*buffup) fatal("aotmsa2/rutfreqF/decs/TAG020");
1911            catlen=strlen(buffup); if (catlen>sizeof(sortp->categ)) buffup[catlen=sizeof(sortp->categ)]='\0';
1912            memset(buffup+catlen,(int)' ',sizeof(sortp->categ)-catlen);
1913            memcpy(sortp->categ,buffup,sizeof(sortp->categ));
1914        } else memset(sortp->categ,(int)' ',sizeof(sortp->categ));
1915        sortp->null[0]='\0';
1916        sortp->v351=v351;
1917        sortp->freq=tabcntA[v351];
1918        mfn++;
1919    }
1920
1921    /* sort F
1922    */
1923    for (k=ntabs-1, i=0; i<k; i++) {
1924        ip=sort_tab+i;
1925        for (j=i+1; j<ntabs; j++) {
1926            jp=sort_tab+j;
1927            if (memcmp((void *)ip,(void *)jp,keylen) > 0) {
1928                memcpy((void *)sort_tmp,(void *)ip,      sizeof(OUTFREQF_SORT_ENTRY));
1929                memcpy((void *)ip      ,(void *)jp,      sizeof(OUTFREQF_SORT_ENTRY));
1930                memcpy((void *)jp      ,(void *)sort_tmp,sizeof(OUTFREQF_SORT_ENTRY));
1931            }
1932        }
1933    }
1934
1935    /* store tabcntArankF (indexed by DecsMfn) and tabfreqF (indexed by rankF)
1936    */
1937    for (sortp=sort_tab, tabF=tabfreqF, mfn=1L; mfn<=ntabs; mfn++, sortp++, tabF++) {
1938        tabF->v351=sortp->v351;
1939        tabF->freq=sortp->freq;
1940        tabcntArankF[sortp->v351]=mfn;
1941    }
1942
1943    return(0);
1944}
1945
1946
1947#if ANSI
1948int outfreqF(int ntabs, char *dbnoutp, LONGX *tabcntArankW, LONGX *tabcntArankD, TABFREQF_ENTRY *tabfreqF)
1949#else
1950int outfreqF(ntabs, dbnoutp, tabcntArankW, tabcntArankD, tabfreqF)
1951int ntabs;
1952char *dbnoutp;
1953LONGX *tabcntArankW;
1954LONGX *tabcntArankD;
1955TABFREQF_ENTRY *tabfreqF;
1956#endif
1957{
1958    RECSTRU *recp;
1959    LONGX mfn;
1960    char buffup[BUFSIZ],*batchp;
1961    LONGX upirec;
1962    LONGX upcrec;
1963    TABFREQF_ENTRY *tabF;
1964
1965    if (!ntabs) return(0);
1966
1967    /* output tabfreqF (indexed by rankF) and tabcntArankW (indexed by DecsMfn)
1968    */
1969    record(upcrec=nrecs,dbnoutp,0L);
1970    record(upirec=nrecs,dbnoutp,1L);
1971    for (tabF=tabfreqF, mfn=1L; mfn<=ntabs; mfn++, tabF++) {
1972        batchp=buffup;
1973        sprintf(batchp,"A1/%06"_LD_"/A999/%"_LD_"/",tabF->v351,tabF->freq); batchp+=strlen(batchp);
1974        sprintf(batchp,"A2220/%"_LD_"/"    ,mfn                     ); batchp+=strlen(batchp);
1975        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankW[tabF->v351]); batchp+=strlen(batchp);
1976        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankD[tabF->v351]); batchp+=strlen(batchp);
1977        *batchp='\0';
1978        RECORD(upirec,dbnoutp,mfn); MFRstatus=ACTIVE;
1979        if (fldupdat(upirec,buffup)) return(mfn);
1980        recupdat(upcrec,upirec);
1981    }
1982
1983    return(0);
1984}
1985
1986
1987
1988#if ANSI
1989int rutfreqW(TABFREQF_ENTRY *tabfreqF, int ntabs, char *amdlname, LONGX docsTOTxA, LONGX docsTOTamdl, LONGX *tabcntArankF, LONGX *tabcntArankW, TABFREQW_ENTRY **tabfreqWp, LONGX *tabcntMDL, LONGX *gtabcntA)
1990#else
1991int rutfreqW(tabfreqF, ntabs, amdlname, docsTOTxA, docsTOTamdl, tabcntArankF, tabcntArankW, tabfreqWp, tabcntMDL, gtabcntA)
1992TABFREQF_ENTRY *tabfreqF;
1993int ntabs;
1994char *amdlname;
1995LONGX docsTOTxA;    /* v9991[1] = docs de xA - nao vazios */
1996LONGX docsTOTamdl;  /* v9991[2] = docs de amdl */
1997LONGX *tabcntArankF;
1998LONGX *tabcntArankW;
1999TABFREQW_ENTRY **tabfreqWp;
2000LONGX *tabcntMDL;
2001LONGX *gtabcntA;
2002#endif
2003{
2004    LONGX mfn;
2005    int v351;
2006
2007    LONGX nbytes;
2008    char *p;
2009
2010    TABFREQW_ENTRY *tabfreqW,*tabW;
2011    TABFREQF_ENTRY *tabF;
2012
2013typedef struct outfreqW_sort_entry {
2014    char x2991[10];
2015    char xrankF[6];
2016    char null[1];
2017    char align[3];
2018    LONGX v351;
2019    LONGX docsTTxA;         /*  v999[1] = docs de TT em xA */
2020    LONGX docsTTamdl;       /*  v999[2] = docs de TT em amdl = postings de TT em amdl */
2021    float frelTTxA;        /* v1991[1] = frelTTxA = docs de TT em xA / docs de xA */
2022    float frelTTamdl;      /* v1991[2] = frelTTamdl = docs de TT em amdl / docs de amdl */
2023    float pesoTTxA;        /* v2991[1] = frelTTxA / frelTTamdl */
2024//    char pesoTTxAout[4]; /* v2221[1] = 'out' se peso < 1 */
2025} OUTFREQW_SORT_ENTRY;
2026
2027    OUTFREQW_SORT_ENTRY *sort_tab,*sort_tmp,*sortp,*ip,*jp;
2028    int i,j,k;
2029
2030    TRMSTRU *trmp;
2031    LONGX itrm;
2032    char x351[6+1];
2033
2034    int keylen=sizeof(sortp->x2991)+sizeof(sortp->xrankF);
2035
2036
2037    /* init tabcntArankW (indexed by DecsMfn)
2038    */
2039    memset(tabcntArankW,0,sizeof(LONGX)*CLASSES);
2040
2041    *tabfreqWp=NULL;
2042    if (!ntabs) return(0);
2043
2044    /* alloc tabfreqW (indexed by rankW)
2045    */
2046    nbytes=sizeof(TABFREQW_ENTRY)*ntabs;
2047    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqW/tabfreqW/ALLOMAXV");
2048    p=(char *)ALLOC((ALLOPARM)(nbytes));
2049    if (p == ALLONULL) fatal("aotmsa2/rutfreqW/tabfreqW/ALLOC");
2050    memset(p,0,nbytes); /* init */
2051    tabfreqW=(TABFREQW_ENTRY *)p;
2052    *tabfreqWp=tabfreqW;
2053
2054    nbytes=sizeof(OUTFREQW_SORT_ENTRY)*ntabs+sizeof(OUTFREQW_SORT_ENTRY);
2055    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqW/sort_tab/ALLOMAXV");
2056    p=(char *)ALLOC((ALLOPARM)(nbytes));
2057    if (p == ALLONULL) fatal("aotmsa2/rutfreqW/sort_tab/ALLOC");
2058    sort_tab=(OUTFREQW_SORT_ENTRY *)p;
2059    sort_tmp=sort_tab+ntabs;
2060
2061
2062    if (!tabcntMDL) TRMALLOC((itrm=1L),0L); /* do not load .iyp */
2063
2064    for (sortp=sort_tab, tabF=tabfreqF, mfn=1L; mfn<=ntabs; mfn++, tabF++, sortp++) {
2065        v351=tabF->v351;
2066        /* */
2067        sortp->docsTTxA   = tabF->freq;     /* v999[1] = docs de TT em xA */
2068        if (tabcntMDL)
2069            sortp->docsTTamdl = tabcntMDL[v351];   /*  v999[2] = docs de TT em amdl = postings de TT em amdl */
2070        else {
2071            sprintf(x351,"%06"_LD_,v351);
2072            TERM(itrm,amdlname,x351); if (TRMrc != RCNORMAL) fatal("aotmsa2/rutfreqW/TERM/amdl");
2073            sortp->docsTTamdl = TRMxytotp;         /*  v999[2] = docs de TT em amdl = postings de TT em amdl */
2074        }
2075        sortp->frelTTxA   = (docsTOTxA   > 0) ? sortp->docsTTxA   / (float)docsTOTxA   : 0;   /* v1991[1] = frelTTxA = docs de TT em xA / docs de xA */
2076        sortp->frelTTamdl = (docsTOTamdl > 0) ? sortp->docsTTamdl / (float)docsTOTamdl : 0;   /* v1991[2] = frelTTamdl = docs de TT em amdl / docs de amdl */
2077        sortp->pesoTTxA   = (sortp->frelTTamdl > 0)  ? sortp->frelTTxA   / sortp->frelTTamdl  : 0;   /* v2991[1] = frelTTxA / frelTTamdl */
2078        sprintf(sortp->x2991,"%10.3f",999999.999-sortp->pesoTTxA);
2079#define WGTAOT 1
2080#if WGTAOT
2081        if (1) {
2082              double lognum = (double)docsTOTamdl;
2083              double logden = (double)sortp->docsTTamdl;
2084              double logarg = (double)(1+sortp->docsTTxA);
2085              float GLOBALWEIGHT = (float)log(lognum/logden);
2086              float LOCALWEIGHT = (float)log(logarg);
2087              float PRODWEIGHT = LOCALWEIGHT*GLOBALWEIGHT;
2088              sortp->pesoTTxA  = PRODWEIGHT;   /* v2991[1] = log(1+docsTTxA) * log(docsTOTamdl/docsTTamdl) */
2089              //sprintf(sortp->x2991,"%10.3f",999999.999-sortp->pesoTTxA);
2090        }
2091        else {
2092              double lognum = (double)docsTOTamdl-sortp->docsTTamdl;
2093              double logden = (double)sortp->docsTTamdl;
2094              double arg = (double)sortp->docsTTxA/docsTOTxA;
2095              float GLOBALWEIGHT = (float)log(lognum/logden);
2096              float LOCALWEIGHT = (float)(/*0.5+0.5**/arg);
2097              float PRODWEIGHT = LOCALWEIGHT*GLOBALWEIGHT;
2098              sortp->pesoTTxA  = PRODWEIGHT;
2099/*
2100              double lognum = (double)sortp->docsTTamdl+docsTOTxA;
2101              double logden = (double)docsTOTxA;
2102              double logarg = (double)sortp->docsTTxA;
2103              float GLOBALWEIGHT = (float)log(lognum/logden);
2104              float LOCALWEIGHT = (float)log(logarg);
2105              float PRODWEIGHT = LOCALWEIGHT*GLOBALWEIGHT;
2106              sortp->pesoTTxA  = PRODWEIGHT;
2107*/
2108/*
2109              double lognum = (double)docsTOTamdl;
2110              double logden = (double)sortp->docsTTamdl;
2111              double arg = (double)sortp->docsTTxA;
2112              float GLOBALWEIGHT = (float)log(lognum/logden);
2113              float LOCALWEIGHT = (float)arg;
2114              float PRODWEIGHT = LOCALWEIGHT*GLOBALWEIGHT;
2115              sortp->pesoTTxA  = PRODWEIGHT;
2116*/
2117        }
2118#endif
2119        //memcpy(sortp->pesoTTxAout,(frelTTxA < frelTTamdl)?"out":"  ",sizeof(sortp->pesoTTxA)); /* if v1991[1]<v1991[2] then 'a2221|out|' fi */
2120        /* */
2121
2122        sprintf(sortp->xrankF,"%6"_LD_,tabcntArankF[v351]); /* key */
2123        sortp->null[0]='\0';
2124        memset(sortp->align,(int)' ',sizeof(sortp->align));
2125        sortp->v351=v351;
2126    }
2127
2128    /* sort W
2129    */
2130    for (k=ntabs-1, i=0; i<k; i++) {
2131        ip=sort_tab+i;
2132        for (j=i+1; j<ntabs; j++) {
2133            jp=sort_tab+j;
2134            if (memcmp((void *)ip,(void *)jp,keylen) > 0) {
2135                memcpy((void *)sort_tmp,(void *)ip,      sizeof(OUTFREQW_SORT_ENTRY));
2136                memcpy((void *)ip      ,(void *)jp,      sizeof(OUTFREQW_SORT_ENTRY));
2137                memcpy((void *)jp      ,(void *)sort_tmp,sizeof(OUTFREQW_SORT_ENTRY));
2138            }
2139        }
2140    }
2141
2142
2143    /* store tabcntArankW (indexed by DecsMfn) and tabfreqW (indexed by rankW)
2144    */
2145    for (sortp=sort_tab, tabW=tabfreqW, mfn=1L; mfn<=ntabs; mfn++, sortp++, tabW++) {
2146        tabW->v351=sortp->v351;
2147        tabW->docsTTxA=sortp->docsTTxA;       /*  v999[1] = docs de TT em xA */
2148        tabW->docsTTamdl=sortp->docsTTamdl;   /*  v999[2] = docs de TT em amdl = postings de TT em amdl */
2149        tabW->frelTTxA=sortp->frelTTxA;       /* v1991[1] = frelTTxA = docs de TT em xA / docs de xA */
2150        tabW->frelTTamdl=sortp->frelTTamdl;   /* v1991[2] = frelTTamdl = docs de TT em amdl / docs de amdl */
2151        tabW->peso=sortp->pesoTTxA;           /* v2991    = frelTTxA / frelTTamdl */
2152//        strcpy(tabW->pesoTTxAout,(sortp->frelTTxA < sortp->frelTTamdl)?"out":""); /* if v1991[1]<v1991[2] then 'a2221|out|' fi */
2153        tabcntArankW[sortp->v351]=mfn;
2154    }
2155
2156
2157    return(0);
2158}
2159
2160
2161#if ANSI
2162int outfreqW(int ntabs, char *dbnoutp, LONGX docsTOTxA, LONGX docsTOTamdl, LONGX *tabcntArankF, LONGX *tabcntArankD, TABFREQD_ENTRY *tabfreqD, TABFREQW_ENTRY *tabfreqW)
2163#else
2164int outfreqW(ntabs, dbnoutp, docsTOTxA, docsTOTamdl, tabcntArankF, tabcntArankD, tabfreqD, tabfreqW)
2165int ntabs;
2166char *dbnoutp;
2167LONGX docsTOTxA;    /* v9991[1] = docs de xA - nao vazios */
2168LONGX docsTOTamdl;  /* v9991[2] = docs de amdl */
2169LONGX *tabcntArankF;
2170LONGX *tabcntArankD;
2171TABFREQD_ENTRY *tabfreqD;
2172TABFREQW_ENTRY *tabfreqW;
2173#endif
2174{
2175    RECSTRU *recp;
2176    LONGX mfn;
2177    char buffup[BUFSIZ],*batchp;
2178
2179    LONGX upirec;
2180    LONGX upcrec;
2181
2182    TABFREQD_ENTRY *tabD;
2183    LONGX xrankD;
2184
2185    TABFREQW_ENTRY *tabW;
2186
2187    if (!ntabs) return(0);
2188
2189    /* output
2190    */
2191    record(upcrec=nrecs,dbnoutp,0L);
2192    record(upirec=nrecs,dbnoutp,1L);
2193    for (tabW=tabfreqW, mfn=1L; mfn<=ntabs; mfn++, tabW++) {
2194        batchp=buffup;
2195
2196        sprintf(batchp,"A1/%06"_LD_"/"     ,tabW->v351              ); batchp+=strlen(batchp);
2197        sprintf(batchp,"A999/%"_LD_"/"     ,tabW->docsTTxA          ); batchp+=strlen(batchp);
2198        sprintf(batchp,"A999/%"_LD_"/"     ,tabW->docsTTamdl        ); batchp+=strlen(batchp);
2199
2200        sprintf(batchp,"A9991/%"_LD_"/"    ,      docsTOTxA         ); batchp+=strlen(batchp);
2201        sprintf(batchp,"A9991/%"_LD_"/"    ,      docsTOTamdl       ); batchp+=strlen(batchp);
2202
2203        sprintf(batchp,"A1991/%10.8f/" ,tabW->frelTTxA          ); batchp+=strlen(batchp);
2204        sprintf(batchp,"A1991/%10.8f/" ,tabW->frelTTamdl        ); batchp+=strlen(batchp);
2205        sprintf(batchp,"A2991/%5.3f/"  ,tabW->peso              ); batchp+=strlen(batchp);
2206
2207//        if (tabW->pesoTTxAout[0])
2208//      sprintf(batchp,"A2221/%s/"     ,tabW->pesoTTxAout       ); batchp+=strlen(batchp);
2209
2210        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankF[tabW->v351]); batchp+=strlen(batchp);
2211        sprintf(batchp,"A2220/%"_LD_"/"    ,mfn                     ); batchp+=strlen(batchp);
2212        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankD[tabW->v351]); batchp+=strlen(batchp);
2213
2214        xrankD=tabcntArankD[tabW->v351];
2215        tabD=tabfreqD; tabD+=(xrankD-1);
2216        sprintf(batchp,"A2992/%s/"     ,tabD->delca             ); batchp+=strlen(batchp);
2217        sprintf(batchp,"A2993/%"_LD_"/"    ,gtabcntA[tabD->gmfn]    ); batchp+=strlen(batchp);
2218        sprintf(batchp,"A2994/%06"_LD_"/"  ,tabD->gmfn              ); batchp+=strlen(batchp);
2219
2220        *batchp='\0';
2221        RECORD(upirec,dbnoutp,mfn); MFRstatus=ACTIVE;
2222        if (fldupdat(upirec,buffup)) return(mfn);
2223        recupdat(upcrec,upirec);
2224    }
2225
2226    return(0);
2227}
2228
2229
2230
2231#if ANSI
2232int rutfreqD(TABFREQF_ENTRY *tabfreqF, int ntabs, LONGX *tabcntArankF, LONGX *tabcntArankW, LONGX *tabcntArankD, TABFREQD_ENTRY **tabfreqDp, LONGX *tabcntGMDL, LONGX *gtabcntA)
2233#else
2234int rutfreqD(tabfreqF, ntabs,tabcntArankF, tabcntArankW, tabcntArankD, tabfreqDp, gtabcntA)
2235TABFREQF_ENTRY *tabfreqF;
2236int ntabs;
2237LONGX *tabcntArankF;
2238LONGX *tabcntArankW;
2239LONGX *tabcntArankD;
2240TABFREQD_ENTRY **tabfreqDp;
2241LONGX *tabcntGMDL;
2242LONGX *gtabcntA;
2243#endif
2244{
2245    LONGX mfn;
2246    int v351;
2247
2248    LONGX nbytes;
2249    char *p;
2250
2251    TABFREQD_ENTRY *tabfreqD,*tabD;
2252    TABFREQF_ENTRY *tabF;
2253
2254typedef struct outfreqD_sort_entry {
2255//    char x2992[10];
2256    char x2992_cat[1]; /* memcpy(,,1) */
2257    char x2993[10];
2258    char x2992[MAXCATLEN+1];
2259    char xrankF[6];
2260    LONGX v351;
2261    LONGX gmfn;
2262//    LONGX delta;
2263} OUTFREQD_SORT_ENTRY;
2264
2265    OUTFREQD_SORT_ENTRY *sort_tab,*sort_tmp,*sortp,*ip,*jp;
2266    int i,j,k;
2267
2268    int keylen=sizeof(sortp->x2992_cat)+sizeof(sortp->x2993)+sizeof(sortp->x2992)+sizeof(sortp->xrankF);
2269
2270
2271    /* init tabcntArankD (indexed by DecsMfn)
2272    */
2273    memset(tabcntArankD,0,sizeof(LONGX)*CLASSES);
2274
2275    *tabfreqDp=NULL;
2276    if (!ntabs) return(0);
2277
2278    /* alloc tabfreqD (indexed by rankD)
2279    */
2280    nbytes=sizeof(TABFREQD_ENTRY)*ntabs;
2281    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqD/tabfreqD/ALLOMAXV");
2282    p=(char *)ALLOC((ALLOPARM)(nbytes));
2283    if (p == ALLONULL) fatal("aotmsa2/rutfreqD/tabfreqD/ALLOC");
2284    memset(p,0,nbytes); /* init */
2285    tabfreqD=(TABFREQD_ENTRY *)p;
2286    *tabfreqDp=tabfreqD;
2287
2288    nbytes=sizeof(OUTFREQD_SORT_ENTRY)*ntabs+sizeof(OUTFREQD_SORT_ENTRY);
2289    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqD/sort_tab/ALLOMAXV");
2290    p=(char *)ALLOC((ALLOPARM)(nbytes));
2291    if (p == ALLONULL) fatal("aotmsa2/rutfreqD/sort_tab/ALLOC");
2292    sort_tab=(OUTFREQD_SORT_ENTRY *)p;
2293    sort_tmp=sort_tab+ntabs;
2294
2295    for (sortp=sort_tab, tabF=tabfreqF, mfn=1L; mfn<=ntabs; mfn++, tabF++, sortp++) {
2296        v351=tabF->v351;
2297////        sortp->delta=tabcntArankW[v351]-tabcntArankF[v351];
2298////        sprintf(sortp->x2992,"%10"_LD_,555555555-sortp->delta);
2299//        sortp->delta=tabcntGMDL[v351];
2300//        sprintf(sortp->x2992,"%10"_LD_,999999999-sortp->delta);
2301
2302
2303#if 0
2304            (if v20.1='C' or v20.1='D'
2305                then v20,break
2306                else if iocc=1 then v20'<br>' fi
2307             fi
2308            )
2309#endif
2310          if (1) {
2311              DIRSTRU *dirp;
2312              int len,xdir;
2313              RECSTRU *recp;
2314       
2315              RECORD(ddrec,"mydecs",v351); //        recfield(sortp->x2992,ddrec,20,1,"");
2316       
2317              for (dirp=MFRdir, xdir=0; xdir < MFRnvf; dirp++, xdir++)
2318                if (dirp->tag == TAG005) {
2319                    int loop;
2320                    LONGX mfn=0;
2321                    p=FIELDP(xdir);
2322                    for (loop=dirp->len; loop--; p++) mfn=mfn*10+((int)(*p)-(int)'0');
2323                    if (mfn > CLASSES) fatal("aotmsa2/rutfreqD/TAG005/CLASSES");
2324                    sprintf(sortp->x2993,"%10"_LD_,999999999L-gtabcntA[mfn]);
2325                    sortp->gmfn=mfn;
2326                    break;
2327                }
2328              for (dirp=MFRdir, xdir=0; xdir < MFRnvf; dirp++, xdir++)
2329                if (dirp->tag == TAG022) {
2330                    p=FIELDP(xdir);
2331                    if (*p == 'C' || *p == 'D') ; else fatal("aotmsa2/rutfreqD/TAG022/CD");
2332                    len=dirp->len; if (len>=sizeof(sortp->x2992)) len=sizeof(sortp->x2992)-1;
2333                    strncpy(sortp->x2992,p,len); sortp->x2992[len]='\0';
2334                    memcpy(sortp->x2992_cat,p,1); /* memcpy(,,1) */
2335                    break;
2336                }
2337          }
2338          sprintf(sortp->xrankF,"%6"_LD_,tabcntArankF[v351]); /* key */
2339          sortp->v351=v351;
2340         
2341    } /* end for (sortp=sort_tab) */
2342
2343    /* sort D
2344    */
2345    for (k=ntabs-1, i=0; i<k; i++) {
2346        ip=sort_tab+i;
2347        for (j=i+1; j<ntabs; j++) {
2348            jp=sort_tab+j;
2349            if (memcmp((void *)ip,(void *)jp,keylen) > 0) {
2350                memcpy((void *)sort_tmp,(void *)ip,      sizeof(OUTFREQD_SORT_ENTRY));
2351                memcpy((void *)ip      ,(void *)jp,      sizeof(OUTFREQD_SORT_ENTRY));
2352                memcpy((void *)jp      ,(void *)sort_tmp,sizeof(OUTFREQD_SORT_ENTRY));
2353            }
2354        }
2355    }
2356
2357
2358    /* store tabcntArankD (indexed by DecsMfn) and tabfreqD (indexed by rankD)
2359    */
2360    for (sortp=sort_tab, tabD=tabfreqD, mfn=1L; mfn<=ntabs; mfn++, sortp++, tabD++) {
2361        tabD->v351=sortp->v351;
2362//        tabD->delta=sortp->delta;
2363        memcpy(tabD->delca,sortp->x2992,MAXCATLEN);
2364        tabD->gmfn=sortp->gmfn;
2365        tabcntArankD[sortp->v351]=mfn;
2366    }
2367
2368    return(0);
2369}
2370
2371#if ANSI
2372int outfreqD(int ntabs, char *dbnoutp, LONGX *tabcntArankF, LONGX *tabcntArankW, TABFREQD_ENTRY *tabfreqD)
2373#else
2374int outfreqD(ntabs, dbnoutp, tabcntArankF, tabcntArankW, tabfreqD)
2375int ntabs;
2376char *dbnoutp;
2377LONGX *tabcntArankF;
2378LONGX *tabcntArankW;
2379TABFREQD_ENTRY *tabfreqD;
2380#endif
2381{
2382    RECSTRU *recp;
2383    LONGX mfn;
2384    char buffup[BUFSIZ],*batchp;
2385
2386    LONGX upirec;
2387    LONGX upcrec;
2388
2389    TABFREQD_ENTRY *tabD;
2390
2391    if (!ntabs) return(0);
2392
2393    /* output
2394    */
2395    record(upcrec=nrecs,dbnoutp,0L);
2396    record(upirec=nrecs,dbnoutp,1L);
2397    for (tabD=tabfreqD, mfn=1L; mfn<=ntabs; mfn++, tabD++) {
2398        batchp=buffup;
2399
2400        sprintf(batchp,"A1/%06"_LD_"/"     ,tabD->v351              ); batchp+=strlen(batchp);
2401
2402        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankF[tabD->v351]); batchp+=strlen(batchp);
2403        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankW[tabD->v351]); batchp+=strlen(batchp);
2404        sprintf(batchp,"A2220/%"_LD_"/"    ,mfn                     ); batchp+=strlen(batchp);
2405
2406        *batchp='\0';
2407        RECORD(upirec,dbnoutp,mfn); MFRstatus=ACTIVE;
2408        if (fldupdat(upirec,buffup)) return(mfn);
2409        recupdat(upcrec,upirec);
2410    }
2411
2412    return(0);
2413}
2414
2415
2416#if 0
2417#define MFQTDBN0        11
2418#define MFQTQRY0        12
2419#define MFQTOBJ0        13
2420
2421#define MFQTXCTS        20
2422
2423#define MFQSWTIM        't'
2424#define MFQSWDBN        'd'
2425#define MFQSWQTY        'q'
2426
2427#define MFQTASET        21
2428#define MFQTALCC        22
2429
2430#define MFQTHITS        31
2431#define MFQTHCUR        32
2432#define MFQTHMFN        33
2433#define MFQTHSIZ        34
2434#define MFQTHMEM        35
2435
2436#define OPRNULL         0x01
2437#define OPRXEND         0x02
2438#define PSTLEVEL        0x03
2439#define ACCLEVEL        0x04
2440
2441#define B7UPLEN         9               /* length for b40 numeric fields */
2442#define B7DELADD        "D%dA%d|%09"_LD_"|" /* sprintf format for dir/field */
2443#define B7EDIT1         "%09"_LD_         /* sprintf format for field edit */
2444
2445#define MFQTXTAG        101             /* inverted files prefixes */
2446
2447#endif
2448
2449
2450#if ANSI
2451char *recsfldv(char *areap, char *fldp, FFI fldlen, char *defaultp)
2452#else
2453char *recsfldv(areap,fldp,fldlen,defaultp)
2454char *areap;
2455char *fldp;
2456FFI fldlen;
2457char *defaultp;
2458#endif /* CIAPI_SOURCE */
2459{
2460    FFI n;
2461    unsigned char *p;
2462
2463    p=subfldp(fldp,'v',&fldlen);
2464
2465    if (p) n=fldlen; /* ja' decrementado */
2466    else
2467        if (defaultp)
2468            n=(FFI)strlen((char*)(p=(unsigned char*)defaultp));
2469        else
2470            n=(FFI)strlen((char*)(p=(unsigned char*)"\0"));
2471    if (!areap)
2472        if ((areap=(char *)ALLOC((ALLOPARM)n+1)) == (char *)ALLONULL)
2473            fatal("aotmsa2/recsfldv/ALLOC");
2474    memcpy(areap,p,n); areap[n]='\0';
2475    return(areap);
2476}
2477
2478
2479#if 0
2480                for (tag=0; isdigit(*p); p++) tag=tag*10+(*p-'0');
2481            if (*p) {
2482            freex(srcareap,dirarea);
2483                    return(errp);
2484            }
2485        if (tag) {
2486                for (i=0; i+1 < MFRnvf; i++) {
2487                    if (DIRtag(i) != tag) continue;
2488                    for (j=i+1; j < MFRnvf; j++) {
2489                        if (DIRtag(j) != tag) continue;
2490                            if (memcmp(FIELDP(i),FIELDP(j),DIRlen(i)) > 0) {
2491                                memcpy(tempdir,&MFRdir[i],sizeof(DIRSTRU));
2492                                memcpy(&MFRdir[i],&MFRdir[j],sizeof(DIRSTRU));
2493                                memcpy(&MFRdir[j],tempdir,sizeof(DIRSTRU));
2494                        }
2495                }
2496                }
2497                break;
2498        }
2499#endif
Note: See TracBrowser for help on using the browser.