root/trunk/aotmsa1.c

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

essage first commit

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