root/trunk/aotmsa2x3.c

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

essage first commit

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