root/trunk/aotmsa3.c

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

essage first commit

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