root/trunk/aotmsa2.c

Revision 389, 93.9 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 0  /* 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    = "/home/aot/bases/cip.cip";
448    if (!decsdbnp)    decsdbnp    = "mydecs";
449    if (!amdldbnp)    amdldbnp    = "amdl351";
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#define MDLPROC 1
753#if MDLPROC
754    /* setup BIREME's Medline */
755    int mdlproc=0;
756    int mdlgizmo=0;
757    p=dbxcipar(NULL,"PROC.PFT",'=');
758    if (dbxcipok) if (strcmp(p,"y") == 0) mdlproc=1;
759    p=dbxcipar(NULL,"TAB130.*",'=');
760    if (dbxcipok) mdlgizmo=1;
761#endif /* MDLPROC */
762
763    /* build boolqryp_new, boolqryp_3213 */
764    if (boolqryp) { /* boolqryp_new */
765        char *p;
766        int alen=0;
767        envarea[0]='\0';
768        for (p=boolqryp; *p; ) {
769            RECSTRU *recp;
770            LONGX v351;
771            int putpar=0;
772            if (envarea[0]) putpar=1;
773            for (v351=0; isdigit(*p); p++) v351=v351*10+((int)(*p)-(int)'0');
774            if (v351) {
775                int n22,iocc;
776                int putor=0;
777                if (!mydrec) mydrec=nrecs;
778                RECORD(mydrec,"mydecs",v351);
779                if (RECrc != RCNORMAL) fatal("aotmsa2/boolqryp/RECrc/RCNORMAL");
780                if (parmqdollar) {
781                    n22=nocc(mydrec,MYDECSTAG022);
782                    if (n22 > 1) if (putpar) envarea[alen++]='(';
783                    for (iocc=1; iocc <= n22; iocc++) {
784                        if (putor) { strcpy(envarea+alen," or "); alen+=4; }
785                        else putor=1;
786                        recfield(envarea+alen,mydrec,MYDECSTAG022,iocc,"");
787                        alen+=strlen(envarea+alen);
788                        strcpy(envarea+alen,"$"); alen+=1;
789                    }
790                    if (n22 > 1) if (putpar) envarea[alen++]=')';
791                }
792                else {
793                    recfield(envarea+alen,mydrec,MYDECSTAG022,1,"");
794                    alen+=strlen(envarea+alen);
795                }
796            }
797            else { envarea[alen++] = *p; if (*p) p++; }
798        }
799        boolqryp_new=strdup(envarea); /* points to built area */
800    }
801    if (boolqryp) { /* boolqryp_3213 */
802        char *p;
803        int alen=0;
804        for (p=boolqryp; *p; ) {
805            RECSTRU *recp;
806            LONGX v351;
807            for (v351=0; isdigit(*p); p++) v351=v351*10+((int)(*p)-(int)'0');
808            if (v351) {
809                if (!mydrec) mydrec=nrecs;
810                RECORD(mydrec,"mydecs",v351);
811                if (RECrc != RCNORMAL) fatal("aotmsa2/boolqryp_3213/RECrc/RCNORMAL");
812                recfield(envarea+alen,mydrec,DECSTAGNAME(langp),1,""); alen+=strlen(envarea+alen);
813                if (parmqdollar) { strcpy(envarea+alen,"$"); alen+=1; }
814            }
815            else { envarea[alen++] = *p; if (*p) p++; }
816        }
817        boolqryp_3213=strdup(envarea); /* points to built area */
818    }
819
820    /* init docsTOTamdl - number of docs in Cluster MDL */
821    /* init reading */
822    if (!irec) irec=nrecs;
823    RECORD(irec,amdldbnp,0L);
824    docsTOTamdl=MF0nxtmfn-1;
825
826    /* init docsTOTxa - number of docs in Cluster A */
827    docsTOTxA=docsTOTamdl;
828
829    vtimid[ntimes]="search"; time(&vtime[ntimes++]); /* watch */
830    /*
831        Search "bool=" parameter
832    */
833    if (boolqryp_new) { /* mxbool/boolh */
834
835        RECSTRU *recp;
836        char *p;
837        LONGX mfn;
838        int errno;
839
840        LONGX asize=strlen(amdldbnp) +                 /* field MFQTDBN0=11 (may be longer than 128+4+1) */
841                   strlen(boolqryp_new) +                 /* the expression */
842                   2*strlen(boolqryp_new) +               /* the terms + pseudo operators _1termX+11X */
843                   BUFSIZ+strlen(amdldbnp) +          /* field MFQSWDBN=20 + a diferent db */
844                   24*(strlen(B7DELADD)+3*B7UPLEN) +  /* 2 duzias de control fields */  /* DxxAxx|xxx| */
845                   strlen(boolqryp_new)+4 +               /* tmpfile .%03x */
846                   BUFSIZ;                            /* por si las moscas */
847
848        char *buffup=loadfile(NULL,'@',"",NULL,asize,'\0');
849
850        cib7p=b7_cib7(cib7p,ciapip);
851
852        /* initialize ridx and b7_xxx() parameters and run b7_run()
853        */
854        for (boolridx=nrecs, mfn=1; ; mfn++) { /* get actual maxmfn */
855            RECORD(boolridx,amdldbnp,mfn);
856            if (RECrc == RCEOF) fatal(amdldbnp);
857            if (RECrc == RCNORMAL) break;
858        }
859
860        if (namedbnp) {
861            if (!booldbcrec) booldbcrec=nrecs;
862            /*RECORD(booldbcrec,namedbnp,0L); */ /* b7_exp faz "record(crec,qrydbnp,0L)"
863                                                          (se houver "qrydbnp")
864                                                       */
865/*<R>
866            vrecp[boolridx]->recdbxp=RECdbxp;
867*/          /* VRECdbxp(boolridx)=RECdbxp; */ /* b7_exp faz "RECdbxp = dbxstorp(qrydbnp)" */
868        }
869        else {
870            VRECdbxp(boolridx)=NULL; /* nao usa base de log */
871            VMFRmfn(boolridx)=0L;
872        }
873
874        /* run b7_exp() / b7_run() / b7_hit(0)
875        */
876        p=b7_exp(cib7p,boolridx,amdldbnp,boolqryp_new,buffup,namedbnp,booldbcrec,&errno);
877        if (p || errno) printf("Expression syntax error %d: '%s'\n",errno,p);
878        else {
879            LONGX bufsiz;
880            /* .. sprintf(buffup,"%s.%03x",RDBname,(int)b7setno) .. */
881            char *hitfnamp="null";
882            if (booltmpnam[0]) hitfnamp=booltmpnam;
883            sprintf(buffup,"D%dA%d|%s|",MFQTHMEM,MFQTHMEM,hitfnamp);
884            if (fldupdat(boolridx,buffup) != NULL) fatal("aotmsa2/fldupdat/boolridx");
885
886            /* b7_run faz "trirecp=vrep[tlirec]" */
887            if (!booltlir) record(booltlir=nrecs,"null",1L);
888
889            /* set default index to actual INDEX MH= */
890            if (deffmhxp) {
891                char buffup[BUFSIZ+CIMPL];
892                sprintf(buffup,"A101|^p*^y%s|",deffmhxp);
893                if (fldupdat(booltlir,buffup)) fatal("aotmsa2/booltlir/fldupdat");
894            }
895
896            /* alloc buffer for 50000 hits = 200Kbytes */
897            bufsiz=50000*sizeof(LONGX);
898            if (b7bufferp) b7_hbfree(cib7p,&b7bufferp);
899            b7_hballoc(cib7p,bufsiz,&b7bufferp);
900
901
902            /* run search */
903            p=b7_run(cib7p,boolridx,amdldbnp,buffup,asize,
904                booltell,isisuctab,NULL/*btch0p*/,booltlir,booldbcrec,&errno);
905            if (p || errno) printf("Execution error %d: '%s'\n",errno,p);
906            else {
907                boolhits=b7bufferp->ndocs; /* b7_hit(cib7p,boolridx,0L,b7setno); */
908                if (booltell) printf("Hits=%"_LD_"\n",boolhits);
909            }
910        }
911        if (p || errno) fatal("Expression execution error");
912
913        /* set# */
914        boolsetno=b7setno;  /* last mfn */
915
916        /* set docsTOTxa - number of docs in Cluster A */
917        docsTOTxA=boolhits;
918
919    } /* mxbool/boolh */
920
921
922    vtimid[ntimes]="set"; time(&vtime[ntimes++]); /* watch */
923
924    /* init tabcntMDL
925    */
926    if (parmloadmdl) { /* always 1 */
927
928        TRMSTRU *trmp;
929        LONGX itrm=ntrms;
930
931        RECSTRU *recp;
932        LONGX irec=nrecs;
933
934        LONGX mfn;
935        char categ[MAXCATLEN+1];
936        DIRSTRU *dirp;
937        int xdir,loop;
938
939        memset(tabcntMDL,0x00,sizeof(tabcntMDL));
940
941        TRMALLOC(itrm,0L); /* do not load .iyp */
942        TERM(itrm,amdldbnp,"C");
943
944        for (mfn=1; ; mfn++) {
945            RECORD(irec,"mydecs",mfn);
946            if (RECrc == RCEOF) break;
947            if (RECrc != RCNORMAL) continue;
948            /* get total records for each group */
949            for (dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++) {
950                if (dirp->tag == MYDECSTAG022) {
951                    memcpy(categ,FIELDP(xdir),dirp->len); categ[dirp->len]='\0';
952                    TERM(itrm,amdldbnp,categ);
953                    if (TRMrc == RCNORMAL) { /* fatal("aotmsa2/TA/tabcntMDL/RCNORMAL"); */
954                        tabcntMDL[mfn]=TRMxytotp;
955#if 0
956printf("+++tabcntGMDL[%"_LD_"]=%"_LD_"\n",v351,tabcntGMDL[v351]);
957getchar();
958#endif
959                    }
960                    break;
961                } /* end tag == 999 */
962            } /* end for dirp */
963        } /* end for mfn */
964
965
966        memset(tabcntGMDL,0x00,sizeof(tabcntGMDL));
967        if (parmgroup) {
968            RECSTRU *recp;
969            LONGX irec=nrecs;
970            LONGX mfn;
971            char x351[6+1];
972            LONGX v351;
973            DIRSTRU *dirp;
974            int xdir,loop;
975
976            for (mfn=1; ; mfn++) {
977                RECORD(irec,"group01.f",mfn);
978                if (RECrc == RCEOF) break;
979                if (RECrc != RCNORMAL) continue;
980                /* get total records for each group */
981#define G01TAG999 999
982#define G01TAG001   1
983                for (dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++) {
984                    if (dirp->tag == G01TAG999) {
985                       LONGX ndocs=0;
986                       char *p=FIELDP(xdir);
987                       int loop;
988                       for (loop=dirp->len; loop--; p++) ndocs=ndocs*10+((int)(*p)-(int)'0');
989                       recfield(x351,irec,G01TAG001,1,""); v351=atol(x351);
990                       tabcntGMDL[v351]=ndocs;
991#if 0
992printf("+++tabcntGMDL[%"_LD_"]=%"_LD_"\n",v351,tabcntGMDL[v351]);
993getchar();
994#endif
995                       break;
996                    } /* end tag == 999 */
997                } /* end for dirp */
998            } /* end for mfn */
999        }
1000
1001        /* VTABV05*/
1002        memset(vcategmfn,0x00,sizeof(vcategmfn));
1003        memset(vtabv05len,0x00,sizeof(vcategmfn)); ntabv05=0;
1004
1005    } /* end tabcntMDL */
1006
1007
1008    /* init mxtb
1009    */
1010    memset(tabcntA,0x00,sizeof(tabcntA));
1011    memset(gtabcntA,0x00,sizeof(gtabcntA));
1012
1013    /* create output
1014    */
1015    recisis0(dbnoutF);
1016    recisis0(dbnoutW);
1017    recisis0(dbnoutD);
1018
1019
1020    vtimid[ntimes]="loop"; time(&vtime[ntimes++]); /* watch */
1021
1022    /*
1023        loop principal
1024    */
1025
1026#define MAXN20 30
1027#define MAXZ20 12 /* hoje=10 (1*3+9*4=39) */
1028#define MAXL20 (MAXZ20*4)
1029
1030#define MAXNVG 30
1031#define MAXN05 30
1032
1033    for (boolh=1; boolh <= boolhits; boolh+=parmloopTA) {
1034
1035        LONGX mfn;
1036        int v351,v351nocc,xdir,loop;
1037        DIRSTRU *dirp;
1038        char area[BUFSIZ];
1039
1040        LONGX vgmfns[MAXNVG];
1041        int nvgs=0;
1042        int ivg;
1043
1044        /* hit processing */
1045
1046        if (boolh == 1) {
1047            hitlistp=(B7HITLIST *)b7bufferp->area;
1048            mfnlistp=hitlistp->mfnlist;
1049        }
1050
1051        /* get next hit */
1052        if (b7bufferp->hcase == BITSTRING)
1053            mfn=b7_hit(cib7p,boolridx,boolh,b7setno);
1054        else
1055            mfn = *mfnlistp; mfnlistp+=parmloopTA;
1056
1057        if (mfn <= 0) fatal("aotmsa2/TA/amdldbnp/hit");
1058
1059        if (parmtrace) printf("+++ hit#%"_LD_" mfn=%"_LD_"\n",boolh,mfn);
1060
1061        RECORD(irec,amdldbnp,mfn);
1062        if (RECrc != RCNORMAL) fatal("aotmsa2/TA/amdldbnp/RCNORMAL");
1063
1064#if MDLPROC
1065#if 0
1066[aot@serverofi test]$ /utl/lind/mx cipar=../bases/cip.cip amdl351
1067mfn=     1
106832701  "m90.mdl/mdltwux^m1"
1069mfn=     2
107032701  "m90.mdl/mdltwux^m2"
1071#endif
1072        if (mdlproc) {
1073#if 0
1074            char *fldp=FIELDP(0),*p;
1075            LONGX xmfn;
1076//prtfields(recp,0);
1077            if (DIRtag(0) != 32701) fatal("aotmsa2/TA/mdlproc/tag");
1078            *(fldp+DIRlen(0))='\0';
1079            p=strchr(fldp,'^');
1080            if (!p) fatal("aotmsa2/TA/mdlproc/mfn");
1081            xmfn=atol(p+2);
1082            if (xmfn < 1) fatal("aotmsa2/TA/mdlproc/xmfn");
1083            p=fldp; *p='M'; p[3]='\0';
1084            //*p='\0';
1085//printf("RECORD %s,%"_LD_"\n",fldp,xmfn);
1086            RECORD(irec,fldp,xmfn);
1087            if (RECrc != RCNORMAL) fatal("aotmsa2/TA/mdlproc/RCNORMAL");
1088//printf("RECORD %"_LD_" ok\n",xmfn);
1089            if (fldupdat(irec,"d370d999")) fatal("aotmsa2/TA/mdlproc/proc1");
1090//prtfields(recp,0);
1091            if (mdlgizmo) {
1092                if (fldupdat(irec,"GTAB130")) fatal("aotmsa2/TA/mdlproc/proc2");
1093//printf("gizmo %"_LD_" ok\n",xmfn);
1094            }
1095//prtfields(recp,0);
1096            if (fldupdat(irec,"Gsplit=351=;")) fatal("aotmsa2/TA/mdlproc/proc3");
1097            MFRmfn=mfn;
1098//prtfields(recp,0);
1099//getchar();
1100#else
1101            if (fldupdat(irec,"Gsplit=351=;")) fatal("aotmsa2/TA/mdlproc/proc3");
1102#endif
1103        }
1104#endif /* MDLPROC */
1105
1106        /* tabulate (v351/) in tabcntA, exploding in gtabcntA
1107        */
1108        /* get a subject descriptor */
1109        v351nocc=0;
1110        for (dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++) {
1111            if (dirp->tag == TAG351) {
1112
1113                int n05=0;
1114                /* tabulate it */
1115                memcpy(area,FIELDP(xdir),dirp->len); area[dirp->len]='\0';
1116                v351=atoi(area);
1117                n05=0;
1118                if (1/*parmgroup*/)  {
1119
1120                    RECSTRU *recp; /* local */
1121                    int xdir,loop;
1122                    DIRSTRU *dirp;
1123                    LONGX v05[MAXN05];
1124
1125                    if (!mydrec) {
1126                        LONGX loadxrf=200000;
1127                        LONGX loadmst=4000000;
1128                        mstsetup("mydecs",loadxrf,loadmst);
1129                        mydrec=nrecs;
1130                    }
1131                    RECORD(mydrec,"mydecs",v351);
1132                    if (RECrc != RCNORMAL) fatal("aotmsa2/TA/mydecs/RCNORMAL");
1133
1134                    /* store v351groups in v05[] from mydecs (v5/) */
1135                    for (dirp=MFRdir, xdir=0, loop=MFRnvf; loop--; dirp++, xdir++) {
1136                        if (dirp->tag == TAG005) {
1137                           LONGX mfn=0;
1138                           char *p=FIELDP(xdir);
1139                           int loop;
1140                           for (loop=dirp->len; loop--; p++) mfn=mfn*10+((int)(*p)-(int)'0');
1141                           if (n05 >= MAXN05) fatal("aotmsa2/TA/mydecs/MAXN05");
1142                           v05[n05++]=mfn;
1143                        } /* end tag == TAG005 */
1144                    } /* end for dirp */
1145
1146                    /* store v05groups in vgmfns[] */
1147                    for (i=0; i<n05; i++) {
1148                        LONGX mfn=v05[i];
1149                        int found;
1150                        for (found=0, ivg=0; ivg < nvgs; ivg++)
1151                            if (mfn == vgmfns[ivg]) { found=1; break; }
1152                        if (!found) {
1153                            if (nvgs >= MAXNVG) fatal("aotmsa2/TA/mydecs/MAXNVG");
1154                            vgmfns[nvgs++]=mfn;
1155                        }
1156                    } /* end for v05[] */
1157
1158                } /* end if (1 parmgroup) */
1159
1160                if (n05) { /* 18/03/2003 */
1161                        if (v351 >= CLASSES) fatal("aotmsa2/CLASSES overflow/v351");
1162                        if (!tabcntA[v351]) ntabs++;
1163                        tabcntA[v351]++;
1164                        v351nocc++;
1165                }
1166
1167            } /* end if (dirp->tag == TAG351) */
1168        } /* end for (dirp=MFRdir, ) */
1169
1170        if (v351nocc) count2++;
1171
1172        /*
1173           tabulate groups
1174        */
1175        for (ivg=0; ivg < nvgs; ivg++) {
1176            LONGX gmfn=vgmfns[ivg];
1177            if (gmfn >= CLASSES) fatal("aotmsa2/CLASSES overflow/gmfn");
1178            if (!gtabcntA[gmfn]) gntabs++;
1179            gtabcntA[gmfn]++;
1180        } /* end for vgmfns[] */
1181
1182
1183        /* .... */
1184
1185        count1++;
1186        if (parmtellTA) if ((count1 % parmtellTA) == 0)
1187          fprintf(stderr,"+++ %"_LD_": %"_LD_"/%d \n",count1,count2,ntabs);
1188
1189    } /* end for (boolh=1; boolh <= boolhits;  ) */
1190
1191    /*
1192    if (booltmpnam[0]) remove(booltmpnam);   / * b72 MFQTHMEM tmp file * /
1193    */
1194
1195
1196
1197    /* run tabfreqF, tabfreqW and tabfreqD
1198    */
1199    if (ntabs) {
1200
1201        /* run tabfreqF
1202        */
1203        vtimid[ntimes]="freqF"; time(&vtime[ntimes++]); /* watch */
1204        if (parmtrace) fprintf(stderr,"+++ ntabs=%d ..\n",ntabs);
1205        if (parmtrace) fprintf(stderr,"+++ running %s ..\n",dbnoutF);
1206        if (!mydrec) mydrec=nrecs;
1207        record(mydrec,"mydecs",0L);
1208
1209        if (rutfreqF(tabcntA,ntabs,mydrec,tabcntArankF,&tabfreqF)) exit(3);
1210
1211        /* run tabfreqW
1212        */
1213        vtimid[ntimes]="freqW"; time(&vtime[ntimes++]); /* watch */
1214        if (parmtrace) fprintf(stderr,"+++ runing %s ..\n",dbnoutW);
1215        if (rutfreqW(tabfreqF,ntabs,(deffmhxp?deffmhxp:amdldbnp),docsTOTxA,docsTOTamdl,tabcntArankF,tabcntArankW,&tabfreqW,tabcntMDL,gtabcntA)) exit(4);
1216
1217        /* run tabfreqD
1218        */
1219        vtimid[ntimes]="freqD"; time(&vtime[ntimes++]); /* watch */
1220        if (parmtrace) fprintf(stderr,"+++ runing %s ..\n",dbnoutD);
1221        if (rutfreqD(tabfreqF,ntabs,mydrec,tabcntArankF,tabcntArankW,tabcntArankD,&tabfreqD,tabcntGMDL, gtabcntA)) exit(5);
1222
1223        /* output tabfreqD
1224        */
1225        vtimid[ntimes]="outD"; time(&vtime[ntimes++]); /* watch */
1226        if (parmtrace) fprintf(stderr,"+++ updating %s ..\n",dbnoutD);
1227        if (outfreqD(ntabs,dbnoutD,tabcntArankF,tabcntArankW,tabfreqD)) exit(6);
1228        /* output tabfreqF
1229        */
1230        vtimid[ntimes]="outF"; time(&vtime[ntimes++]); /* watch */
1231        if (parmtrace) fprintf(stderr,"+++ updating %s ..\n",dbnoutF);
1232        if (outfreqF(ntabs,dbnoutF,tabcntArankW,tabcntArankD,tabfreqF)) exit(7);
1233        /* output tabfreqW
1234        */
1235        vtimid[ntimes]="outW"; time(&vtime[ntimes++]); /* watch */
1236        if (parmtrace) fprintf(stderr,"+++ updating %s ..\n",dbnoutW);
1237        if (outfreqW(ntabs,dbnoutW,docsTOTxA,docsTOTamdl,tabcntArankF,tabcntArankD,tabfreqD,tabfreqW)) exit(8);
1238    }
1239
1240if (ntabs) {
1241
1242    /* log A1
1243    */
1244    if (!parmaid) parmaid="A1";
1245    if (strcmp(parmaid,"A1") == 0) {
1246        char *batchp=envarea;
1247    /* environment */
1248    if (usernamp   ) { sprintf(batchp,"a3300|%s|" , usernamp    ); batchp+=strlen(batchp); }
1249    if (cipfnamp   ) { sprintf(batchp,"a3000|%s|" , cipfnamp    ); batchp+=strlen(batchp); }
1250    if (decsdbnp   ) { sprintf(batchp,"a3001|%s|" , decsdbnp    ); batchp+=strlen(batchp); }
1251    if (amdldbnp   ) { sprintf(batchp,"a3002|%s|" , amdldbnp/**/); batchp+=strlen(batchp); }
1252    if (decs0dbnp  ) { sprintf(batchp,"a3003|%s|" , decs0dbnp   ); batchp+=strlen(batchp); }
1253    if (tmp1dbnp   ) { sprintf(batchp,"a3004|%s|" , tmp1dbnp    ); batchp+=strlen(batchp); }
1254    if (pftfnamp   ) { sprintf(batchp,"a3005|%s|" , pftfnamp    ); batchp+=strlen(batchp); }
1255    if (langp      ) { sprintf(batchp,"a3006|%s|" , langp       ); batchp+=strlen(batchp); }
1256    if (parmloopTA ) { sprintf(batchp,"a3007|%"_LD_"|", parmloopTA  ); batchp+=strlen(batchp); }
1257    if (parmfromDA ) { sprintf(batchp,"a3008|%"_LD_"|", parmfromDA  ); batchp+=strlen(batchp); }
1258    if (parmcountDA) { sprintf(batchp,"a3009|%"_LD_"|", parmcountDA ); batchp+=strlen(batchp); }
1259    if (parmsortp  ) { sprintf(batchp,"a3010|%s|" , parmsortp   ); batchp+=strlen(batchp); }
1260    if (boolqryp   ) { sprintf(batchp,"a3011|%s|" , boolqryp    ); batchp+=strlen(batchp); }
1261    if (boolqryp_new   ) { sprintf(batchp,"a3211|%s|" , boolqryp_new    ); batchp+=strlen(batchp); }
1262    if (boolqryp_3213   ) { sprintf(batchp,"a3213|%s|" , boolqryp_3213    ); batchp+=strlen(batchp); }
1263    if (namedbnp   ) { sprintf(batchp,"a3012|%s|" , namedbnp    ); batchp+=strlen(batchp); }
1264    if (parmqdollar) { sprintf(batchp,"a3013|%d|" , parmqdollar ); batchp+=strlen(batchp); }
1265    if (actionp    ) { sprintf(batchp,"a3014|%s|" , actionp     ); batchp+=strlen(batchp); }
1266/**/
1267                       sprintf(batchp,"a3015|%"_LD_"|", boolsetno   ); batchp+=strlen(batchp);
1268                       sprintf(batchp,"a4001|%d|" , ntabs       ); batchp+=strlen(batchp);
1269/**/
1270        if (1) {
1271        /* add watch */
1272            int hours,mins,secs;
1273            int i;
1274            vtimid[ntimes]="end1"; time(&vtime[ntimes++]); /* watch */
1275            //vtimid[ntimes]="xT";   time(&vtime[ntimes++]); /* watch */
1276            secs=vtime[ntimes-1]-vtime[0];
1277            hours=secs/3600; secs-=hours*3600;
1278            mins=secs/60; secs-=mins*60;
1279            sprintf(batchp,"a3216|%02d:%02d:%02d|",hours,mins,secs); batchp+=strlen(batchp);
1280            for (i=0; i<ntimes-1; i++) {
1281                sprintf(batchp,"a3214|%s|",  vtimid[i]);             batchp+=strlen(batchp);
1282                sprintf(batchp,"a3215|%"_LD_"|", vtime[i+1]-vtime[i]);   batchp+=strlen(batchp);
1283            }
1284            //ntimes--;
1285        }
1286
1287        if (fldupdat(boolridx,envarea)) fatal("aotmsa2/TA/env/fldupdat");
1288        if (recupdat(booldbcrec,boolridx)) fatal("aotmsa2/TA/env/fldupdat");
1289    }
1290
1291    /* done
1292    */
1293    if (parmtellTA)
1294        fprintf(stderr,"aotmsa2: %"_LD_" recs in | %"_LD_" tabs | %d recs out\n",count1,count2,ntabs);
1295
1296} else { /* else if (ntabs) */
1297    actionDA=0;
1298} /* end if (ntabs) */
1299
1300} /* end actionTA */
1301
1302
1303/* =======================         =============          ================== */
1304/* =======================         =============          ================== */
1305
1306
1307if (actionDA) {
1308
1309    /* List tableF/tableW
1310    */
1311
1312#define MFQTAENV   102
1313
1314#define FMTASIZE 32000
1315
1316    FMT_CODE *tabfmtp=NULL;           /* formato para tab= */
1317    LONGX ntabfmts=0;
1318    char fmtspec[BUFSIZ];
1319    char *batchp;
1320    LONGX parmfrom,parmto;
1321    LONGX parmtell=/*0*/parmtellTA;
1322    LONGX mfn1;
1323    char *file1p;
1324    DBXSTRU *dbx1p;
1325
1326    char fmtarea[FMTASIZE+1];
1327    LONGX fmtasize=FMTASIZE;
1328
1329    char *vMFQTQRY0=NULL;
1330    char *vMFQTHITS=NULL;
1331/*nu     char *vMFQTAENV; */
1332    char *p;
1333
1334    char vbreak[2][3];
1335    int nbreak;
1336    char v2992[MAXCATLEN+1];
1337    LONGX mfn351;
1338
1339    LONGX setno=boolsetno;
1340
1341    int ndownf=parmdown;
1342    int ndownw=parmdown;
1343    int ncolors=5;
1344    int kdownf=ndownf/ncolors;
1345    int kdownw=ndownw/ncolors;
1346    float rangef,stepf;
1347    float rangew,stepw;
1348    LONGX freq1,freq2,freq;
1349    float peso1,peso2,peso;
1350    int fcolor=0;
1351    char x999[20];
1352    int wcolor=0;
1353    char x2991[20];
1354
1355    if (parmtrace) printf("+++trace: DA/namedbnp=%s\n",namedbnp);
1356
1357    vtimid[ntimes]="fmt1"; time(&vtime[ntimes++]); /* watch */
1358
1359    if (!booldbcrec) RECORD(booldbcrec=nrecs,namedbnp,0L);
1360    if (!boolridx) boolridx=nrecs;
1361
1362    RECORD(boolridx,namedbnp,setno);
1363
1364    vMFQTQRY0 = recfield(NULL,boolridx,MFQTQRY0,1,"");
1365
1366    vMFQTHITS = recfield(NULL,boolridx,MFQTHITS,1,"");
1367
1368    /* get boolqryp_ from boolridx */
1369    boolqryp      = recfield(NULL,boolridx,3011,1,"");
1370    boolqryp_new  = recfield(NULL,boolridx,3211,1,"");
1371    boolqryp_3213 = recfield(NULL,boolridx,3213,1,"");
1372
1373    /* get booldbn environment  */
1374/*nu     vMFQTAENV = recfield(NULL,boolridx,MFQTAENV,1,""); */
1375    /* p=vMFQTAENV; ... */
1376
1377    /* set master file */
1378    if (parmsortx == 'f') file1p=dbnoutF; /* alternate file is dbnoutW */
1379    if (parmsortx == 'w') file1p=dbnoutW;
1380    if (parmsortx == 'd') file1p=dbnoutD; /* alternate file is dbnoutW */
1381    dbx1p=dbxstorp(file1p);
1382
1383    /* init mydecs
1384    */
1385    if (!mydrec) mydrec=nrecs;
1386    if (!mydtrm) mydtrm=ntrms;
1387    term(mydtrm,"mydecs","!");
1388    record(mydrec,"mydecs",1L);
1389
1390    /* init reading */
1391    if (!irec) irec=nrecs;
1392    RECORD(irec,file1p,0L);
1393    parmto=MF0nxtmfn-1; if (!ntabs) ntabs=parmto;
1394    count1=0;
1395    if (parmsortx == 'd') parmfrom=1;
1396    else {
1397        parmfrom=parmfromDA;
1398        if (parmcountDA) parmto=parmfromDA+parmcountDA-1;
1399        if (parmto > MF0nxtmfn-1) parmto=MF0nxtmfn-1;
1400        count2=parmto-parmfromDA+1;
1401    }
1402
1403    /* environment */
1404    batchp=envarea;
1405    if (cipfnamp   ) { sprintf(batchp,"a3000|%s|" , cipfnamp    ); batchp+=strlen(batchp); }
1406    if (decsdbnp   ) { sprintf(batchp,"a3001|%s|" , decsdbnp    ); batchp+=strlen(batchp); }
1407    if (amdldbnp   ) { sprintf(batchp,"a3002|%s|" , amdldbnp    ); batchp+=strlen(batchp); }
1408    if (decs0dbnp  ) { sprintf(batchp,"a3003|%s|" , decs0dbnp   ); batchp+=strlen(batchp); }
1409    if (tmp1dbnp   ) { sprintf(batchp,"a3004|%s|" , tmp1dbnp    ); batchp+=strlen(batchp); }
1410    if (pftfnamp   ) { sprintf(batchp,"a3005|%s|" , pftfnamp    ); batchp+=strlen(batchp); }
1411    if (langp      ) { sprintf(batchp,"a3006|%s|" , langp       ); batchp+=strlen(batchp); }
1412    if (parmloopTA ) { sprintf(batchp,"a3007|%"_LD_"|", parmloopTA  ); batchp+=strlen(batchp); }
1413    if (parmfromDA ) { sprintf(batchp,"a3008|%"_LD_"|", parmfromDA  ); batchp+=strlen(batchp); }
1414    if (parmcountDA) { sprintf(batchp,"a3009|%"_LD_"|", parmcountDA ); batchp+=strlen(batchp); }
1415    if (parmsortp  ) { sprintf(batchp,"a3010|%s|" , parmsortp   ); batchp+=strlen(batchp); }
1416    if (boolqryp   ) { sprintf(batchp,"a3011|%s|" , boolqryp    ); batchp+=strlen(batchp); }
1417    if (namedbnp   ) { sprintf(batchp,"a3012|%s|" , namedbnp    ); batchp+=strlen(batchp); }
1418    if (parmqdollar) { sprintf(batchp,"a3013|%d|" , parmqdollar ); batchp+=strlen(batchp); }
1419    if (actionp    ) { sprintf(batchp,"a3014|%s|" , actionp     ); batchp+=strlen(batchp); }
1420/**/
1421                       sprintf(batchp,"a3015|%"_LD_"|", setno       ); batchp+=strlen(batchp);
1422                       sprintf(batchp,"a4001|%d|" , ntabs       ); batchp+=strlen(batchp);
1423/**/
1424
1425
1426/* -----------------------------------------------------------------------------
1427v4001 = ntabs
1428
1429v3210[1] = 'A'
1430v3211[1] = Aboolqryp_new
1431v3212 = hits
1432v3213[1] = Aboolqrypdecs
1433
1434p/ v1001='1'
1435  v3214[] = time id
1436  v3215[] = seconds
1437  v3216   = elapsed "%02d:%02d:%02d",hours,mins,secs
1438
1439decs data fields
1440  v3203 = v3
1441  v3222 = v22[1]
1442
1443flag
1444  v3255 = categ in boolqryp
1445*/
1446
1447    if (vMFQTQRY0) {
1448        if (boolqryp_new) {
1449          sprintf(batchp,"a3211|"                      ); batchp+=strlen(batchp);
1450          strcpy(batchp,boolqryp_new); batchp+=strlen(batchp);
1451          sprintf(batchp,"|"                           ); batchp+=strlen(batchp);
1452        }
1453        sprintf(batchp,"a3210|%s|" , "A"             ); batchp+=strlen(batchp);
1454        sprintf(batchp,"a3212|%"_LD_"|", atol(vMFQTHITS) ); batchp+=strlen(batchp);
1455        if (boolqryp_3213) {
1456           sprintf(batchp,"a3213|"                      ); batchp+=strlen(batchp);
1457           strcpy(batchp,boolqryp_3213); batchp+=strlen(batchp);
1458           sprintf(batchp,"|"                           ); batchp+=strlen(batchp);
1459        }
1460    }
1461    /* end of envarea */
1462
1463    /* init summary */
1464    memset(vbreak,0x00,sizeof(vbreak));
1465
1466    /* do it */
1467    for (mfn1=parmfrom/*DA*/; mfn1 <= parmto; mfn1++) {
1468
1469        char tag022[MAXCATLEN+1];
1470        int i22;
1471
1472        /* compile strip CR if CRLF + display format */
1473        if (!tabfmtp) {
1474            /* use fmtarea for actual format specification */
1475            sprintf(fmtspec,"@%s",pftfnamp);
1476            if (!loadfile(NULL,'@',fmtspec,fmtarea,fmtasize,'\0')) {
1477                printf("Content-type: text/plain\n\n");
1478                printf("format error: file %s not found \n",pftfnamp);
1479                exit(12);
1480            }
1481            if (fmt_gener(&tabfmtp,fmtarea)) {
1482                printf("Content-type: text/plain\n\n");
1483                printf("format error: file %s error#%d offset %"_LD_" [%.512s%s]\n",
1484                        pftfnamp,fmt_error,fmt_errof,fmtarea+fmt_errof,"...");
1485                exit(12);
1486            }
1487        }
1488
1489        /* get color limits */
1490        if (parmdown) if ((count1+1) == 1) {
1491            RECORD(irec,dbnoutF,1L);
1492            freq1=atol(recfield(x999,irec,999,1,""));
1493            RECORD(irec,dbnoutF,0L);
1494            freq2=freq1;
1495            if (MF0nxtmfn-1 > 1) {
1496                RECORD(irec,dbnoutF,MF0nxtmfn-1);
1497                freq2=atol(recfield(x999,irec,999,1,""));
1498            }
1499            rangef=freq1-freq2; if (rangef < 0) rangef = -rangef; /* ok */
1500            stepf=(rangef+1)/(float)ncolors;
1501            if (stepf <= 0) { stepf=1; kdownf=1; ndownf=0; }
1502
1503            RECORD(irec,dbnoutW,1L);
1504            peso1=atof(recfield(x2991,irec,2991,1,""));
1505            RECORD(irec,dbnoutW,0L);
1506            peso2=peso1;
1507            if (MF0nxtmfn-1 > 1) {
1508                RECORD(irec,dbnoutW,MF0nxtmfn-1);
1509                peso2=atof(recfield(x2991,irec,2991,1,""));
1510            }
1511            rangew=peso1-peso2; if (rangew < 0) rangew = -rangew; /* ok */
1512            stepw=(rangew+1)/(float)ncolors;
1513            if (stepw <= 0) { stepw=1; kdownw=1; ndownw=0; }
1514        }
1515
1516        /* get record */
1517        RECORD(irec,file1p,mfn1);
1518        if (RECrc != RCNORMAL) fatal("aotmsa2/DA/RCNORMAL");
1519        count1++;
1520        if (parmtrace) printf("+++ mfnDA=%"_LD_"\n",mfn1);
1521
1522        /* process parmsort
1523        */
1524        batchp=fmtarea;
1525        if (file1p == dbnoutW /* parmsortx=='w' */) {
1526/*
1527            LONGX rankf=atol(recfield(fmtarea,irec,2220,1,""));
1528            LONGX rankd=atol(recfield(fmtarea,irec,2220,2,""));
1529            sprintf(batchp,"D2220A2220/%"_LD_"/A2220/%"_LD_"/A2220/%"_LD_"/",rankf,MFRmfn,rankd); batchp+=strlen(batchp);
1530*/
1531        }
1532        else {
1533/*
1534            LONGX rank1=atol(recfield(fmtarea,irec,2220,1,""));
1535*/
1536            LONGX rankw=atol(recfield(fmtarea,irec,2220,2,""));
1537            char *v1f=recfield(fmtarea,irec,1,1,"");
1538            char *v1w=fmtarea+strlen(fmtarea)+1;
1539            RECORD(irec,dbnoutW,rankw); RECdbxp=dbx1p;
1540            recfield(v1w,irec,1,1,"");
1541            if (!*v1f || !*v1w || strcmp(v1f,v1w)) fatal("aotmsa2/DA/join");
1542/*
1543            sprintf(batchp,"D2220A2220/%"_LD_"/A2220/%"_LD_"/",mfn1,MFRmfn); batchp+=strlen(batchp);
1544*/
1545        }
1546
1547        /* process summary */
1548        memset(v2992,0x00,sizeof(v2992));
1549        nbreak=0;
1550        p=recfield(v2992,irec,2992,1,""); /* 1st mesh C/D */
1551        if (memcmp(vbreak[0],p+0,3)) {
1552            memcpy(vbreak[0],p+0,3); nbreak+=1; *vbreak[1]='\0';
1553        }
1554        if (memcmp(vbreak[1],p+4,3)) {
1555            memcpy(vbreak[1],p+4,3); nbreak+=2;
1556        }
1557
1558        if (nbreak) {
1559
1560            if (nbreak & 0x01) {
1561                sprintf(batchp,"A3994/%d/"  ,nbreak&0x01);  batchp+=strlen(batchp);
1562                sprintf(batchp,"A3995/%.3s/",v2992      );  batchp+=strlen(batchp);
1563                if (nbreak & 0x02) {
1564                sprintf(batchp,"A3995/%.7s/",v2992      );  batchp+=strlen(batchp);
1565                }
1566                nbreak=1;
1567            }
1568            else {
1569                nbreak=2;
1570                sprintf(batchp,"A3994/%d/",nbreak       ); batchp+=strlen(batchp);
1571                sprintf(batchp,"A3995//"                ); batchp+=strlen(batchp);
1572                sprintf(batchp,"A3995/%.7s/",v2992      ); batchp+=strlen(batchp);
1573            }
1574
1575        } /* end if (nbreak) */
1576
1577        /* skip records if parmshowzero
1578        */
1579        if (parmshowzero)
1580            if (!nbreak)
1581                if (count1 > 1)
1582                    if (count1 < count2)
1583                        continue;
1584
1585        /* add CGI and +hits data fields
1586        */
1587        sprintf(batchp,"A1001/%"_LD_"/A1002/%"_LD_"/",count1,count2); batchp+=strlen(batchp);
1588
1589        /* add decs data fields
1590        */
1591        mfn351=atol(recfield(batchp,irec,1,1,"")); /* the condition */
1592        sprintf(batchp,"a3203|"                      ); batchp+=strlen(batchp);
1593        RECORD(mydrec,"mydecs",mfn351);
1594        if (RECrc != RCNORMAL) fatal("aotmsa2/DA/mydecs/RCNORMAL");
1595        recfield(batchp,mydrec,DECSTAGNAME(langp),1,"");            batchp+=strlen(batchp);
1596        sprintf(batchp,"|"                           ); batchp+=strlen(batchp);
1597        sprintf(batchp,"a3222|"                      ); batchp+=strlen(batchp);
1598        recfield(batchp,mydrec,MYDECSTAG022,1,"");            batchp+=strlen(batchp);
1599        sprintf(batchp,"|"                           ); batchp+=strlen(batchp);
1600
1601        for (i22=1; recfield(tag022,mydrec,MYDECSTAG022,i22,""); i22++) {
1602          if (!*tag022) break;
1603          for (p=vMFQTQRY0; *p; ) { /* flag categ in boolqryp */
1604            char categ[MAXCATLEN+1];
1605            char *q,*qp;
1606            memset(categ,0x00,sizeof(categ));
1607            for (q=categ, qp=p; *qp; )
1608                if ((*qp >='A' && *qp <= 'Z') || isdigit(*qp) || *qp == '.') *q++ = *qp++;
1609                else break;
1610            if (categ[0]) {
1611                size_t catlen=strlen(categ);
1612                p=qp;
1613                if (strcmp(tag022,categ) == 0) {
1614                    sprintf(batchp,"a3255|y|"                     ); batchp+=strlen(batchp);
1615                    break;
1616                }
1617                else
1618                if (*p == '$') {
1619                  if (strlen(tag022)>catlen && strncmp(tag022,categ,catlen) == 0 ) {
1620                    sprintf(batchp,"a3255|y|"                     ); batchp+=strlen(batchp);
1621                    break;
1622                  }
1623                }
1624            }
1625            else if (*p) p++;
1626          }
1627        }
1628
1629
1630        /* add watch */
1631        if (count1 == 1) {
1632            int hours,mins,secs;
1633            int i;
1634            vtimid[ntimes]="fmt2"; time(&vtime[ntimes++]); /* watch */
1635            secs=vtime[ntimes-1]-vtime[0];
1636            hours=secs/3600; secs-=hours*3600;
1637            mins=secs/60; secs-=mins*60;
1638            sprintf(batchp,"a3216|%02d:%02d:%02d|",hours,mins,secs); batchp+=strlen(batchp);
1639            for (i=0; i<ntimes-1; i++) {
1640                sprintf(batchp,"a3214|%s|",  vtimid[i]);             batchp+=strlen(batchp);
1641                sprintf(batchp,"a3215|%"_LD_"|", vtime[i+1]-vtime[i]);   batchp+=strlen(batchp);
1642            }
1643        }
1644
1645        /* get color */
1646        if (parmdown) {
1647            freq=atol(recfield(x999,irec,999,1,""));
1648            fcolor=(int)(0xFF-ndownf+(freq/stepf)*kdownf);
1649            peso=atof(recfield(x2991,irec,2991,1,""));
1650            wcolor=(int)(0xFF-ndownw+(peso/stepw)*kdownw);
1651            sprintf(batchp,"a1515/%02x/",fcolor);   batchp+=strlen(batchp);
1652            sprintf(batchp,"a1515/%02x/",wcolor);   batchp+=strlen(batchp);
1653        }
1654
1655
1656        /* add/del fields */
1657        if (fldupdat(irec,fmtarea)) fatal("aotmsa2/DA/fldupdat/fmt");
1658        if (fldupdat(irec,envarea)) fatal("aotmsa2/DA/fldupdat/env");
1659
1660        /* apply display format */
1661        if (fmt_inter(tabfmtp,irec,fmtasize,fmtarea,fmtasize) < 0) {
1662            printf("Content-type: text/plain\n\n");
1663            printf("error: %s [format execution error %d]\n",pftfnamp,fmt_error);
1664            exit(21);
1665        }
1666        /* close fmt_ every each MAXTABFMTS calls */
1667        if (++ntabfmts == 1000 /*MAXTABFMTS*/) {
1668            fmt_free(tabfmtp); tabfmtp=(FMT_CODE *)NULL;
1669            ntabfmts=0;
1670        }
1671
1672        /* output format results
1673        */
1674        puts(fmtarea); /* for (left=strlen(fmtarea), p=fmtarea; left; ) .s{ int len=BUFSIZ/2; char c;
1675                            if (len > left) len=left; c=p[len]; p[len]='\0'; puts(p); p[len]=c;
1676                            p+=len; left-=len; } */
1677
1678        if (parmtell) if ((count1 % parmtell) == 0)
1679            fprintf(stderr,"+++ %"_LD_"/%"_LD_" \n",count1,count2);
1680        if (parmtrace)
1681            fprintf(stderr,"+++ %"_LD_"/%"_LD_" \n",count1,count2);
1682
1683    }
1684
1685    vtimid[ntimes]="end2"; time(&vtime[ntimes++]); /* watch */
1686
1687} /* actionDA */
1688
1689
1690/* =======================         =============          ================== */
1691/* =======================         =============          ================== */
1692if (actionDD) {
1693
1694    int errno1=0;
1695    int errno2=0;
1696    char *p1=NULL;
1697    char *p2=NULL;
1698    LONGX decsnxtmfn;
1699    int makqryp=0;
1700
1701    char *dexdbnp=decs0dbnp;
1702    LONGX drec=0L;
1703
1704    /* Search DECS
1705    */
1706    boolsetno=0;
1707    boolhits=0;
1708
1709    /* init reading */
1710    if (!drec) drec=nrecs;
1711    RECORD(drec,dexdbnp,0L);
1712    decsnxtmfn=MF0nxtmfn;
1713
1714    /* will call format even on error and/or expression missing */
1715    count2=1;
1716
1717    /* display MeSH Diseases (cat C$)
1718    */
1719    if (actionDD == 2) {
1720      if (!boolqryp) makqryp=1;
1721      if (boolqryp) if (!*boolqryp) makqryp=1;
1722      if (makqryp) {
1723/*
1724        boolqryp="C01+C02+C03+C04+C05+C06+C07+C08+C09+C10+C11+C12+C13+C14+C15+C16+C17+C18+C19+C20+C21+C22+C23";
1725        boolqryp="CAT1=C$+CAT1=D$";
1726*/
1727        boolqryp="LEVEL=01";
1728        dexdbnp=decsdbnp;
1729      }
1730    }
1731
1732    /*
1733        Search "bool=" parameter
1734    */
1735    if (boolqryp) { /* boolqryp */
1736
1737        LONGX mfn;
1738
1739        LONGX asize=strlen(dexdbnp) +                  /* field MFQTDBN0=11 (may be longer than 128+4+1) */
1740                   strlen(boolqryp) +                 /* the expression */
1741                   2*strlen(boolqryp) +               /* the terms + pseudo operators _1termX+11X */
1742                   BUFSIZ+strlen(dexdbnp) +          /* field MFQSWDBN=20 + a diferent db */
1743                   24*(strlen(B7DELADD)+3*B7UPLEN) +  /* 2 duzias de control fields */  /* DxxAxx|xxx| */
1744                   strlen(boolqryp)+4 +               /* tmpfile .%03x */
1745                   BUFSIZ;                            /* por si las moscas */
1746
1747        char *buffup=loadfile(NULL,'@',"",NULL,asize,'\0');
1748
1749        if (!cib7p) cib7p=b7_cib7(cib7p,ciapip);
1750
1751        /* initialize ridx and b7_xxx() parameters and run b7_run()
1752        */
1753        for (boolridx=nrecs, mfn=1; ; mfn++) { /* get actual maxmfn */
1754            RECORD(boolridx,dexdbnp,mfn);
1755            if (RECrc == RCEOF) fatal(dexdbnp);
1756            if (RECrc == RCNORMAL) break;
1757        }
1758        RECdbxp=NULL;                /* nao usa base de log */
1759        MFRmfn=0L;
1760
1761        /* run b7_exp() / b7_run() / b7_hit(0)
1762        */
1763        p1=b7_exp(cib7p,boolridx,dexdbnp,boolqryp,buffup,NULL,0L,&errno1);
1764        if (p1 || errno1) ; /* printf("Expression syntax error %d: '%s'\n",errno1,p1); */
1765        else {
1766            LONGX bufsiz;
1767            char *hitfnamp="null";
1768            if (booltmpnam[0]) hitfnamp=booltmpnam;
1769            sprintf(buffup,"D%dA%d|%s|",MFQTHMEM,MFQTHMEM,hitfnamp);
1770            if (fldupdat(boolridx,buffup) != NULL) fatal("aotmsa2/DD/fldupdat/boolridx");
1771
1772            /* b7_run faz "trirecp=vrep[tlirec]" */
1773            if (!booltlir) record(booltlir=nrecs,"null",1L);
1774
1775            /* alloc buffer for 40000 hits = 160Kbytes */
1776            bufsiz=CLASSES*sizeof(LONGX);
1777            if (b7bufferp) b7_hbfree(cib7p,&b7bufferp);
1778            b7_hballoc(cib7p,bufsiz,&b7bufferp);
1779
1780            /* run search */
1781            p2=b7_run(cib7p,boolridx,dexdbnp,buffup,sizeof(buffup),
1782                booltell,isisuctab,""/*btch0p*/,booltlir,0L,&errno2);
1783            if (p2 || errno2) ; /* printf("Execution error %d: '%s'\n",errno2,p2); */
1784            else {
1785                boolsetno=b7setno;  /* =1 ??? */
1786                boolhits=b7bufferp->ndocs; /* b7_hit(cib7p,boolridx,0L,b7setno); */
1787                if (booltell) printf("Hits=%"_LD_"\n",boolhits);
1788            }
1789        }
1790        if (p2 || errno2) fatal("Expression execution error");
1791
1792    } /* boolqryp */
1793
1794    /* restore dexdbnp */
1795    dexdbnp=decsdbnp;
1796
1797    /* set number of times format is called */
1798    if (boolhits) count2=boolhits;
1799
1800    if (p1 || errno1 /* || p2 || errno2*/) { ; }
1801
1802    if (1) { /* errno */
1803//#define FMTASIZE 32000
1804        FMT_CODE *tabfmtp=NULL;           /* formato para tab= */
1805        char fmtspec[BUFSIZ];
1806        char *batchp;
1807        char fmtarea[FMTASIZE+1];
1808        LONGX fmtasize=FMTASIZE;
1809
1810#define SORTDECS 1
1811#if SORTDECS
1812typedef struct decs_sort_entry {
1813/*
1814    char categ[MAXCATLEN+1];
1815*/
1816    char name[LE2+LE1+1];
1817    LONGX mfn;
1818} DECS_SORT_ENTRY;
1819        DECS_SORT_ENTRY *sortareap=NULL;
1820        DECS_SORT_ENTRY *sortp;
1821        DECS_SORT_ENTRY *sort_tmp,*ip,*jp;
1822        int i,j,k;
1823        int nsort=0;
1824        sortareap=(DECS_SORT_ENTRY *)realloc(sortareap,sizeof(DECS_SORT_ENTRY)*(boolhits+1));
1825        sortp=sortareap;
1826        sort_tmp=sortareap+boolhits;
1827#endif /* SORTDECS */
1828
1829        count1=0;
1830
1831        /* environment */
1832        batchp=envarea;
1833        if (cipfnamp   ) { sprintf(batchp,"a3000|%s|" , cipfnamp    ); batchp+=strlen(batchp); }
1834        if (decsdbnp   ) { sprintf(batchp,"a3001|%s|" , decsdbnp    ); batchp+=strlen(batchp); }
1835        if (amdldbnp   ) { sprintf(batchp,"a3002|%s|" , amdldbnp    ); batchp+=strlen(batchp); }
1836        if (decs0dbnp  ) { sprintf(batchp,"a3003|%s|" , decs0dbnp   ); batchp+=strlen(batchp); }
1837        if (tmp1dbnp   ) { sprintf(batchp,"a3004|%s|" , tmp1dbnp    ); batchp+=strlen(batchp); }
1838        if (pftfnamp   ) { sprintf(batchp,"a3005|%s|" , pftfnamp    ); batchp+=strlen(batchp); }
1839        if (langp      ) { sprintf(batchp,"a3006|%s|" , langp       ); batchp+=strlen(batchp); }
1840        if (parmloopTA ) { sprintf(batchp,"a3007|%"_LD_"|", parmloopTA  ); batchp+=strlen(batchp); }
1841        if (parmfromDA ) { sprintf(batchp,"a3008|%"_LD_"|", parmfromDA  ); batchp+=strlen(batchp); }
1842        if (parmcountDA) { sprintf(batchp,"a3009|%"_LD_"|", parmcountDA ); batchp+=strlen(batchp); }
1843        if (parmsortp  ) { sprintf(batchp,"a3010|%s|" , parmsortp   ); batchp+=strlen(batchp); }
1844        if (boolqryp   ) { sprintf(batchp,"a3011|%s|" , boolqryp    ); batchp+=strlen(batchp); }
1845        if (namedbnp   ) { sprintf(batchp,"a3012|%s|" , namedbnp    ); batchp+=strlen(batchp); }
1846        if (parmqdollar) { sprintf(batchp,"a3013|%d|" , parmqdollar ); batchp+=strlen(batchp); }
1847        if (actionp    ) { sprintf(batchp,"a3014|%s|" , actionp     ); batchp+=strlen(batchp); }
1848/**/
1849//                           sprintf(batchp,"a3015|%"_LD_"|", setno       ); batchp+=strlen(batchp);
1850//                           sprintf(batchp,"a4001|%d|" , ntabs       ); batchp+=strlen(batchp);
1851/**/
1852        /* end of envarea */
1853
1854        /* compile strip CR if CRLF + display format */
1855        pftfnamp="aotmsa2D.pft";
1856        sprintf(fmtspec,"%s,@%s","if size(s(#))=2 then newline(s(#)*1) fi",pftfnamp);
1857        if (fmt_gener(&tabfmtp,fmtspec)) {
1858            printf("Content-type: text/plain\n\n");
1859            printf("error: %s [format error %d:%s]\n",pftfnamp,fmt_error,fmtspec+fmt_errof);
1860            exit(12);
1861        }
1862
1863
1864        /*
1865            loop decs
1866        */
1867
1868        for (boolh=1; ; boolh++) {
1869
1870            LONGX mfn;
1871
1872            /* hit processing */
1873            if (boolhits) {
1874
1875                if (boolh > boolhits) break;
1876
1877                if (boolh == 1) {
1878                    hitlistp=(B7HITLIST *)b7bufferp->area;
1879                    mfnlistp=hitlistp->mfnlist;
1880                }
1881                if (b7bufferp->hcase == BITSTRING)
1882                    mfn=b7_hit(cib7p,boolridx,boolh,b7setno);
1883                else
1884                    mfn = *mfnlistp; mfnlistp++;
1885
1886                if (mfn <= 0) fatal("aotmsa2/DD/dexdbnp/hit");
1887
1888                if (parmtrace) printf("+++ hit#%"_LD_" mfn=%"_LD_"\n",boolh,mfn);
1889
1890                RECORD(drec,dexdbnp,mfn);
1891                if (RECrc != RCNORMAL) fatal("aotmsa2/DD/dexdbnp/RCNORMAL");
1892            }
1893            else {
1894                RECORD(drec,dexdbnp,mfn=decsnxtmfn);
1895                RECrc=RCNORMAL; MFRstatus=ACTIVE;
1896            }
1897
1898#if SORTDECS
1899            /* just load sort key */
1900/*
1901            recfield(sortp->categ,drec,MYDECSTAG022,iocc,"");
1902            recfield(sortp->name,drec,DECSTAGNAME(langp),1,"");
1903*/
1904            sortp->name[0]='\0';
1905            if ((i=fieldx(drec,DECSTAGNAME(langp),1)) >= 0) {
1906                char *p;
1907                int k=DIRlen(i);
1908                if (k >= sizeof(sortp->name)) k=sizeof(sortp->name)-1;
1909                memcpy(sortp->name,FIELDP(i),k);
1910                sortp->name[k]='\0';
1911                for (p=sortp->name; *p; p++) *p=isisuctab[*p];
1912            }
1913            sortp->mfn=mfn;
1914            sortp++; nsort++;
1915
1916            if (!boolhits) break;
1917
1918        } /* end of read keys */
1919
1920        /* sort keys */
1921        for (k=nsort-1, i=0; i<k; i++) {
1922            ip=sortareap+i;
1923            for (j=i+1; j<nsort; j++) {
1924                jp=sortareap+j;
1925                if (memcmp((void *)ip,(void *)jp,sizeof(DECS_SORT_ENTRY)) > 0) {
1926                    memcpy((void *)sort_tmp,(void *)ip,      sizeof(DECS_SORT_ENTRY));
1927                    memcpy((void *)ip      ,(void *)jp,      sizeof(DECS_SORT_ENTRY));
1928                    memcpy((void *)jp      ,(void *)sort_tmp,sizeof(DECS_SORT_ENTRY));
1929                }
1930            }
1931        }
1932
1933        /* get sorted keys */
1934        for (sortp=sortareap, boolh=1; nsort-- ; boolh++, sortp++) {
1935
1936            LONGX mfn=sortp->mfn;
1937
1938            RECORD(drec,dexdbnp,mfn);
1939            if (RECrc != RCNORMAL) if (boolh > 1) fatal("aotmsa2/DD/dexdbnp/sorted/RCNORMAL");
1940            if (RECtype != TYPEMFR) fatal("aotmsa2/DD/dexdbnp/sorted/TYPEMFR");
1941#endif /* SORTDECS */
1942
1943            count1++;
1944            if (parmtrace) printf("+++ mfnDD=%"_LD_"\n",mfn);
1945
1946            /* process record
1947            */
1948            batchp=fmtarea;
1949
1950            /* add CGI and +hits data fields
1951            */
1952            sprintf(batchp,"A1001/%"_LD_"/A1002/%"_LD_"/",count1,count2); batchp+=strlen(batchp);
1953
1954            /* add decs data fields
1955            */
1956            sprintf(batchp,"a3203|"                      ); batchp+=strlen(batchp);
1957            recfield(batchp,drec,DECSTAGNAME(langp),1,"");            batchp+=strlen(batchp);
1958            sprintf(batchp,"|"                           ); batchp+=strlen(batchp);
1959
1960            if (fldupdat(drec,fmtarea)) fatal("aotmsa2/DD/fldupdat/fmt");
1961            if (fldupdat(drec,envarea)) fatal("aotmsa2/DD/fldupdat/env");
1962
1963            if (fmt_inter(tabfmtp,drec,fmtasize,fmtarea,fmtasize) < 0) {
1964                printf("Content-type: text/plain\n\n");
1965                printf("error: %s [format execution error %d]\n",pftfnamp,fmt_error);
1966                exit(21);
1967            }
1968
1969            /* output format results
1970            */
1971            puts(fmtarea);
1972
1973            if (!boolhits) break;
1974
1975        } /* end for (boolh=1; ;  ) */
1976
1977    } /* errno */
1978
1979} /* end actionDD */
1980
1981/* =======================         =============          ================== */
1982/* =======================         =============          ================== */
1983
1984    /* watch */
1985    time(&vtime[ntimes++]);
1986    if (parmtime) {
1987        struct tm *tp;
1988        char fmt_time[21+1]; /* aaaammdd hhmmss WDAY YDAY */
1989                             /* 1234567890123456 7  8 901 */
1990        int hours,mins,secs;
1991        LONGX time_start=vtime[0];
1992        LONGX time_elapsed;
1993        vtimid[ntimes]="exit"; time(&vtime[ntimes++]); /* watch */
1994        time_elapsed=vtime[ntimes-1];
1995        tp=localtime(&time_elapsed);
1996        sprintf(fmt_time,"%02d/%02d/%02d %02d:%02d:%02d",
1997                           tp->tm_mday,tp->tm_mon+1,tp->tm_year%100,
1998                           tp->tm_hour,tp->tm_min,tp->tm_sec);
1999        fprintf(stderr,"+++ localtime %s \n",fmt_time);
2000        secs=time_elapsed - time_start;
2001        hours=secs/3600; secs-=hours*3600;
2002        mins=secs/60; secs-=mins*60;
2003        sprintf(fmt_time,"%02d:%02d:%02d",hours,mins,secs);
2004        fprintf(stderr,"+++ elapsed %s \n",fmt_time);
2005    }
2006
2007    /* exit
2008    */
2009    if (cib7p) cib7p=b7_cib7_delete(cib7p);
2010#if CIAPI
2011    cisisApplicationDelete(ciapip);
2012    ciapip=NULL;
2013#endif /* CIAPI */
2014
2015    exit(0);
2016}
2017
2018
2019/* =======================         =============          ================== */
2020/* =======================         =============          ================== */
2021
2022#if ANSI
2023int rutfreqF(LONGX *tabcntA, int ntabs, LONGX mydrec, LONGX *tabcntArankF, TABFREQF_ENTRY **tabfreqFp)
2024#else
2025int rutfreqF(tabcntA, ntabs, dbnoutp, mydrec, tabcntArankF, tabfreqFp)
2026LONGX *tabcntA;
2027int ntabs;
2028LONGX mydrec;
2029LONGX *tabcntArankF;
2030TABFREQF_ENTRY **tabfreqFp;
2031#endif
2032{
2033    LONGX mfn;
2034    char buffup[BUFSIZ];
2035    int v351;
2036
2037    LONGX nbytes;
2038    char *p;
2039
2040    TABFREQF_ENTRY *tabfreqF,*tabF;
2041
2042typedef struct outfreqF_sort_entry {
2043    char x999[10];
2044    char categ[MAXCATLEN+1];
2045    char null[1];
2046    char align[2];
2047    LONGX v351;
2048    LONGX freq;
2049} OUTFREQF_SORT_ENTRY;
2050
2051    OUTFREQF_SORT_ENTRY *sort_tab,*sort_tmp,*sortp,*ip,*jp;
2052    int catlen;
2053    int i,j,k;
2054
2055    int keylen=sizeof(sortp->x999)+sizeof(sortp->categ);
2056
2057
2058    /* init tabcntArankF (indexed by DecsMfn)
2059    */
2060    memset(tabcntArankF,0,sizeof(LONGX)*CLASSES);
2061
2062    *tabfreqFp=NULL;
2063    if (!ntabs) return(0);
2064
2065    /* alloc tabfreqF (indexed by rankF)
2066    */
2067    nbytes=sizeof(TABFREQF_ENTRY)*ntabs;
2068    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqF/tabfreqF/ALLOMAXV");
2069    p=(char *)ALLOC((ALLOPARM)(nbytes));
2070    if (p == ALLONULL) fatal("aotmsa2/rutfreqF/tabfreqF/ALLOC");
2071    memset(p,0,nbytes); /* init */
2072    tabfreqF=(TABFREQF_ENTRY *)p;
2073    *tabfreqFp=tabfreqF;
2074
2075    nbytes=sizeof(OUTFREQF_SORT_ENTRY)*ntabs+sizeof(OUTFREQF_SORT_ENTRY);
2076    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqF/sort_tab/ALLOMAXV");
2077    p=(char *)ALLOC((ALLOPARM)(nbytes));
2078    if (p == ALLONULL) fatal("aotmsa2/rutfreqF/sort_tab/ALLOC");
2079    sort_tab=(OUTFREQF_SORT_ENTRY *)p;
2080    sort_tmp=sort_tab+ntabs;
2081
2082    for (mfn=0L, v351=1; mfn<ntabs; v351++) {
2083        if (!tabcntA[v351]) continue;
2084        sortp=sort_tab+mfn;
2085        sprintf(sortp->x999,"%10"_LD_,999999999L-tabcntA[v351]);
2086        if (mydrec) { /* use decs/v20 (mydecs/v22) as 2nd sort key for sortF */
2087            record(mydrec,"mydecs",(LONGX)v351);
2088            recfield(buffup,mydrec,MYDECSTAG022,1,""); if (!*buffup) {
2089                    printf("+++ v351=%"_LD_"\n",(LONGX)v351);
2090                    fatal("aotmsa2/rutfreqF/mydecs/TAG022");
2091            }
2092            catlen=strlen(buffup); if (catlen>sizeof(sortp->categ)) buffup[catlen=sizeof(sortp->categ)]='\0';
2093            memset(buffup+catlen,(int)' ',sizeof(sortp->categ)-catlen);
2094            memcpy(sortp->categ,buffup,sizeof(sortp->categ));
2095        } else memset(sortp->categ,(int)' ',sizeof(sortp->categ));
2096        sortp->null[0]='\0';
2097        sortp->v351=v351;
2098        sortp->freq=tabcntA[v351];
2099        mfn++;
2100    }
2101
2102    /* sort F
2103    */
2104    for (k=ntabs-1, i=0; i<k; i++) {
2105        ip=sort_tab+i;
2106        for (j=i+1; j<ntabs; j++) {
2107            jp=sort_tab+j;
2108            if (memcmp((void *)ip,(void *)jp,keylen) > 0) {
2109                memcpy((void *)sort_tmp,(void *)ip,      sizeof(OUTFREQF_SORT_ENTRY));
2110                memcpy((void *)ip      ,(void *)jp,      sizeof(OUTFREQF_SORT_ENTRY));
2111                memcpy((void *)jp      ,(void *)sort_tmp,sizeof(OUTFREQF_SORT_ENTRY));
2112            }
2113        }
2114    }
2115
2116    /* store tabcntArankF (indexed by DecsMfn) and tabfreqF (indexed by rankF)
2117    */
2118    for (sortp=sort_tab, tabF=tabfreqF, mfn=1L; mfn<=ntabs; mfn++, sortp++, tabF++) {
2119        tabF->v351=sortp->v351;
2120        tabF->freq=sortp->freq;
2121        tabcntArankF[sortp->v351]=mfn;
2122    }
2123
2124    return(0);
2125}
2126
2127
2128#if ANSI
2129int outfreqF(int ntabs, char *dbnoutp, LONGX *tabcntArankW, LONGX *tabcntArankD, TABFREQF_ENTRY *tabfreqF)
2130#else
2131int outfreqF(ntabs, dbnoutp, tabcntArankW, tabcntArankD, tabfreqF)
2132int ntabs;
2133char *dbnoutp;
2134LONGX *tabcntArankW;
2135LONGX *tabcntArankD;
2136TABFREQF_ENTRY *tabfreqF;
2137#endif
2138{
2139    RECSTRU *recp;
2140    LONGX mfn;
2141    char buffup[BUFSIZ],*batchp;
2142    LONGX upirec;
2143    LONGX upcrec;
2144    TABFREQF_ENTRY *tabF;
2145
2146    if (!ntabs) return(0);
2147
2148    /* output tabfreqF (indexed by rankF) and tabcntArankW (indexed by DecsMfn)
2149    */
2150    record(upcrec=nrecs,dbnoutp,0L);
2151    record(upirec=nrecs,dbnoutp,1L);
2152    for (tabF=tabfreqF, mfn=1L; mfn<=ntabs; mfn++, tabF++) {
2153        batchp=buffup;
2154        sprintf(batchp,"A1/%06"_LD_"/A999/%"_LD_"/",tabF->v351,tabF->freq); batchp+=strlen(batchp);
2155        sprintf(batchp,"A2220/%"_LD_"/"    ,mfn                     ); batchp+=strlen(batchp);
2156        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankW[tabF->v351]); batchp+=strlen(batchp);
2157        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankD[tabF->v351]); batchp+=strlen(batchp);
2158        *batchp='\0';
2159        RECORD(upirec,dbnoutp,mfn); MFRstatus=ACTIVE;
2160        if (fldupdat(upirec,buffup)) return(mfn);
2161        recupdat(upcrec,upirec);
2162    }
2163
2164    return(0);
2165}
2166
2167
2168
2169#if ANSI
2170int rutfreqW(TABFREQF_ENTRY *tabfreqF, int ntabs, char *amdlname, LONGX docsTOTxA, LONGX docsTOTamdl, LONGX *tabcntArankF, LONGX *tabcntArankW, TABFREQW_ENTRY **tabfreqWp, LONGX *tabcntMDL, LONGX *gtabcntA)
2171#else
2172int rutfreqW(tabfreqF, ntabs, amdlname, docsTOTxA, docsTOTamdl, tabcntArankF, tabcntArankW, tabfreqWp, tabcntMDL, gtabcntA)
2173TABFREQF_ENTRY *tabfreqF;
2174int ntabs;
2175char *amdlname;
2176LONGX docsTOTxA;    /* v9991[1] = docs de xA - nao vazios */
2177LONGX docsTOTamdl;  /* v9991[2] = docs de amdl */
2178LONGX *tabcntArankF;
2179LONGX *tabcntArankW;
2180TABFREQW_ENTRY **tabfreqWp;
2181LONGX *tabcntMDL;
2182LONGX *gtabcntA;
2183#endif
2184{
2185    LONGX mfn;
2186    int v351;
2187
2188    LONGX nbytes;
2189    char *p;
2190
2191    TABFREQW_ENTRY *tabfreqW,*tabW;
2192    TABFREQF_ENTRY *tabF;
2193
2194typedef struct outfreqW_sort_entry {
2195    char x2991[10];
2196    char xrankF[6];
2197    char null[1];
2198    char align[3];
2199    LONGX v351;
2200    LONGX docsTTxA;         /*  v999[1] = docs de TT em xA */
2201    LONGX docsTTamdl;       /*  v999[2] = docs de TT em amdl = postings de TT em amdl */
2202    float frelTTxA;        /* v1991[1] = frelTTxA = docs de TT em xA / docs de xA */
2203    float frelTTamdl;      /* v1991[2] = frelTTamdl = docs de TT em amdl / docs de amdl */
2204    float pesoTTxA;        /* v2991[1] = frelTTxA / frelTTamdl */
2205//    char pesoTTxAout[4]; /* v2221[1] = 'out' se peso < 1 */
2206} OUTFREQW_SORT_ENTRY;
2207
2208    OUTFREQW_SORT_ENTRY *sort_tab,*sort_tmp,*sortp,*ip,*jp;
2209    int i,j,k;
2210
2211    int keylen=sizeof(sortp->x2991)+sizeof(sortp->xrankF);
2212
2213
2214    /* init tabcntArankW (indexed by DecsMfn)
2215    */
2216    memset(tabcntArankW,0,sizeof(LONGX)*CLASSES);
2217
2218    *tabfreqWp=NULL;
2219    if (!ntabs) return(0);
2220
2221    /* alloc tabfreqW (indexed by rankW)
2222    */
2223    nbytes=sizeof(TABFREQW_ENTRY)*ntabs;
2224    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqW/tabfreqW/ALLOMAXV");
2225    p=(char *)ALLOC((ALLOPARM)(nbytes));
2226    if (p == ALLONULL) fatal("aotmsa2/rutfreqW/tabfreqW/ALLOC");
2227    memset(p,0,nbytes); /* init */
2228    tabfreqW=(TABFREQW_ENTRY *)p;
2229    *tabfreqWp=tabfreqW;
2230
2231    nbytes=sizeof(OUTFREQW_SORT_ENTRY)*ntabs+sizeof(OUTFREQW_SORT_ENTRY);
2232    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqW/sort_tab/ALLOMAXV");
2233    p=(char *)ALLOC((ALLOPARM)(nbytes));
2234    if (p == ALLONULL) fatal("aotmsa2/rutfreqW/sort_tab/ALLOC");
2235    sort_tab=(OUTFREQW_SORT_ENTRY *)p;
2236    sort_tmp=sort_tab+ntabs;
2237
2238
2239    if (!tabcntMDL) fatal("aotmsa2/rutfreqW/tabcntMDL");
2240
2241    for (sortp=sort_tab, tabF=tabfreqF, mfn=1L; mfn<=ntabs; mfn++, tabF++, sortp++) {
2242        v351=tabF->v351;
2243        /* */
2244        sortp->docsTTxA   = tabF->freq;     /* v999[1] = docs de TT em xA */
2245        sortp->docsTTamdl = tabcntMDL[v351];   /*  v999[2] = docs de TT em amdl = postings de TT em amdl */
2246        sortp->frelTTxA   = (docsTOTxA   > 0) ? sortp->docsTTxA   / (float)docsTOTxA   : 0;   /* v1991[1] = frelTTxA = docs de TT em xA / docs de xA */
2247        sortp->frelTTamdl = (docsTOTamdl > 0) ? sortp->docsTTamdl / (float)docsTOTamdl : 0;   /* v1991[2] = frelTTamdl = docs de TT em amdl / docs de amdl */
2248        sortp->pesoTTxA   = (sortp->frelTTamdl > 0)  ? sortp->frelTTxA   / sortp->frelTTamdl  : 0;   /* v2991[1] = frelTTxA / frelTTamdl */
2249        sprintf(sortp->x2991,"%10.3f",999999.999-sortp->pesoTTxA);
2250#define WGTAOT 1
2251#if WGTAOT
2252        if (1) {
2253              double lognum = (double)docsTOTamdl;
2254              double logden = (double)sortp->docsTTamdl;
2255              double logarg = (double)(1+sortp->docsTTxA);
2256              float GLOBALWEIGHT = (float)log(lognum/logden);
2257              float LOCALWEIGHT = (float)log(logarg);
2258              float PRODWEIGHT = LOCALWEIGHT*GLOBALWEIGHT;
2259              sortp->pesoTTxA  = PRODWEIGHT;   /* v2991[1] = log(1+docsTTxA) * log(docsTOTamdl/docsTTamdl) */
2260              //sprintf(sortp->x2991,"%10.3f",999999.999-sortp->pesoTTxA);
2261        }
2262        else {
2263              double lognum = (double)docsTOTamdl-sortp->docsTTamdl;
2264              double logden = (double)sortp->docsTTamdl;
2265              double arg = (double)sortp->docsTTxA/docsTOTxA;
2266              float GLOBALWEIGHT = (float)log(lognum/logden);
2267              float LOCALWEIGHT = (float)(/*0.5+0.5**/arg);
2268              float PRODWEIGHT = LOCALWEIGHT*GLOBALWEIGHT;
2269              sortp->pesoTTxA  = PRODWEIGHT;
2270/*
2271              double lognum = (double)sortp->docsTTamdl+docsTOTxA;
2272              double logden = (double)docsTOTxA;
2273              double logarg = (double)sortp->docsTTxA;
2274              float GLOBALWEIGHT = (float)log(lognum/logden);
2275              float LOCALWEIGHT = (float)log(logarg);
2276              float PRODWEIGHT = LOCALWEIGHT*GLOBALWEIGHT;
2277              sortp->pesoTTxA  = PRODWEIGHT;
2278*/
2279/*
2280              double lognum = (double)docsTOTamdl;
2281              double logden = (double)sortp->docsTTamdl;
2282              double arg = (double)sortp->docsTTxA;
2283              float GLOBALWEIGHT = (float)log(lognum/logden);
2284              float LOCALWEIGHT = (float)arg;
2285              float PRODWEIGHT = LOCALWEIGHT*GLOBALWEIGHT;
2286              sortp->pesoTTxA  = PRODWEIGHT;
2287*/
2288        }
2289#endif
2290        //memcpy(sortp->pesoTTxAout,(frelTTxA < frelTTamdl)?"out":"  ",sizeof(sortp->pesoTTxA)); /* if v1991[1]<v1991[2] then 'a2221|out|' fi */
2291        /* */
2292
2293        sprintf(sortp->xrankF,"%6"_LD_,tabcntArankF[v351]); /* key */
2294        sortp->null[0]='\0';
2295        memset(sortp->align,(int)' ',sizeof(sortp->align));
2296        sortp->v351=v351;
2297    }
2298
2299    /* sort W
2300    */
2301    for (k=ntabs-1, i=0; i<k; i++) {
2302        ip=sort_tab+i;
2303        for (j=i+1; j<ntabs; j++) {
2304            jp=sort_tab+j;
2305            if (memcmp((void *)ip,(void *)jp,keylen) > 0) {
2306                memcpy((void *)sort_tmp,(void *)ip,      sizeof(OUTFREQW_SORT_ENTRY));
2307                memcpy((void *)ip      ,(void *)jp,      sizeof(OUTFREQW_SORT_ENTRY));
2308                memcpy((void *)jp      ,(void *)sort_tmp,sizeof(OUTFREQW_SORT_ENTRY));
2309            }
2310        }
2311    }
2312
2313
2314    /* store tabcntArankW (indexed by DecsMfn) and tabfreqW (indexed by rankW)
2315    */
2316    for (sortp=sort_tab, tabW=tabfreqW, mfn=1L; mfn<=ntabs; mfn++, sortp++, tabW++) {
2317        tabW->v351=sortp->v351;
2318        tabW->docsTTxA=sortp->docsTTxA;       /*  v999[1] = docs de TT em xA */
2319        tabW->docsTTamdl=sortp->docsTTamdl;   /*  v999[2] = docs de TT em amdl = postings de TT em amdl */
2320        tabW->frelTTxA=sortp->frelTTxA;       /* v1991[1] = frelTTxA = docs de TT em xA / docs de xA */
2321        tabW->frelTTamdl=sortp->frelTTamdl;   /* v1991[2] = frelTTamdl = docs de TT em amdl / docs de amdl */
2322        tabW->peso=sortp->pesoTTxA;           /* v2991    = frelTTxA / frelTTamdl */
2323//        strcpy(tabW->pesoTTxAout,(sortp->frelTTxA < sortp->frelTTamdl)?"out":""); /* if v1991[1]<v1991[2] then 'a2221|out|' fi */
2324        tabcntArankW[sortp->v351]=mfn;
2325    }
2326
2327
2328    return(0);
2329}
2330
2331
2332#if ANSI
2333int outfreqW(int ntabs, char *dbnoutp, LONGX docsTOTxA, LONGX docsTOTamdl, LONGX *tabcntArankF, LONGX *tabcntArankD, TABFREQD_ENTRY *tabfreqD, TABFREQW_ENTRY *tabfreqW)
2334#else
2335int outfreqW(ntabs, dbnoutp, docsTOTxA, docsTOTamdl, tabcntArankF, tabcntArankD, tabfreqD, tabfreqW)
2336int ntabs;
2337char *dbnoutp;
2338LONGX docsTOTxA;    /* v9991[1] = docs de xA - nao vazios */
2339LONGX docsTOTamdl;  /* v9991[2] = docs de amdl */
2340LONGX *tabcntArankF;
2341LONGX *tabcntArankD;
2342TABFREQD_ENTRY *tabfreqD;
2343TABFREQW_ENTRY *tabfreqW;
2344#endif
2345{
2346    RECSTRU *recp;
2347    LONGX mfn;
2348    char buffup[BUFSIZ],*batchp;
2349
2350    LONGX upirec;
2351    LONGX upcrec;
2352
2353    TABFREQD_ENTRY *tabD;
2354    LONGX xrankD;
2355
2356    TABFREQW_ENTRY *tabW;
2357
2358    if (!ntabs) return(0);
2359
2360    /* output
2361    */
2362    record(upcrec=nrecs,dbnoutp,0L);
2363    record(upirec=nrecs,dbnoutp,1L);
2364    for (tabW=tabfreqW, mfn=1L; mfn<=ntabs; mfn++, tabW++) {
2365        batchp=buffup;
2366
2367        sprintf(batchp,"A1/%06"_LD_"/"     ,tabW->v351              ); batchp+=strlen(batchp);
2368        sprintf(batchp,"A999/%"_LD_"/"     ,tabW->docsTTxA          ); batchp+=strlen(batchp);
2369        sprintf(batchp,"A999/%"_LD_"/"     ,tabW->docsTTamdl        ); batchp+=strlen(batchp);
2370
2371        sprintf(batchp,"A9991/%"_LD_"/"    ,      docsTOTxA         ); batchp+=strlen(batchp);
2372        sprintf(batchp,"A9991/%"_LD_"/"    ,      docsTOTamdl       ); batchp+=strlen(batchp);
2373
2374        sprintf(batchp,"A1991/%10.8f/" ,tabW->frelTTxA          ); batchp+=strlen(batchp);
2375        sprintf(batchp,"A1991/%10.8f/" ,tabW->frelTTamdl        ); batchp+=strlen(batchp);
2376        sprintf(batchp,"A2991/%5.3f/"  ,tabW->peso              ); batchp+=strlen(batchp);
2377
2378//        if (tabW->pesoTTxAout[0])
2379//      sprintf(batchp,"A2221/%s/"     ,tabW->pesoTTxAout       ); batchp+=strlen(batchp);
2380
2381        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankF[tabW->v351]); batchp+=strlen(batchp);
2382        sprintf(batchp,"A2220/%"_LD_"/"    ,mfn                     ); batchp+=strlen(batchp);
2383        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankD[tabW->v351]); batchp+=strlen(batchp);
2384
2385        xrankD=tabcntArankD[tabW->v351];
2386        tabD=tabfreqD; tabD+=(xrankD-1);
2387        sprintf(batchp,"A2992/%s/"     ,tabD->delca             ); batchp+=strlen(batchp);
2388        sprintf(batchp,"A2993/%"_LD_"/"    ,gtabcntA[tabD->gmfn]    ); batchp+=strlen(batchp);
2389        sprintf(batchp,"A2994/%06"_LD_"/"  ,tabD->gmfn              ); batchp+=strlen(batchp);
2390
2391        *batchp='\0';
2392        RECORD(upirec,dbnoutp,mfn); MFRstatus=ACTIVE;
2393        if (fldupdat(upirec,buffup)) return(mfn);
2394        recupdat(upcrec,upirec);
2395    }
2396
2397    return(0);
2398}
2399
2400
2401
2402#if ANSI
2403int rutfreqD(TABFREQF_ENTRY *tabfreqF, int ntabs, LONGX mydrec, LONGX *tabcntArankF, LONGX *tabcntArankW, LONGX *tabcntArankD, TABFREQD_ENTRY **tabfreqDp, LONGX *tabcntGMDL, LONGX *gtabcntA)
2404#else
2405int rutfreqD(tabfreqF, ntabs, mydrec, tabcntArankF, tabcntArankW, tabcntArankD, tabfreqDp, gtabcntA)
2406TABFREQF_ENTRY *tabfreqF;
2407int ntabs;
2408LONGX mydrec;
2409LONGX *tabcntArankF;
2410LONGX *tabcntArankW;
2411LONGX *tabcntArankD;
2412TABFREQD_ENTRY **tabfreqDp;
2413LONGX *tabcntGMDL;
2414LONGX *gtabcntA;
2415#endif
2416{
2417    LONGX mfn;
2418    int v351;
2419
2420    LONGX nbytes;
2421    char *p;
2422
2423    TABFREQD_ENTRY *tabfreqD,*tabD;
2424    TABFREQF_ENTRY *tabF;
2425
2426typedef struct outfreqD_sort_entry {
2427//    char x2992[10];
2428    char x2992_cat[1]; /* memcpy(,,1) */
2429    char x2993[10];
2430    char x2992[MAXCATLEN+1];
2431    char xrankF[6];
2432    LONGX v351;
2433    LONGX gmfn;
2434//    LONGX delta;
2435} OUTFREQD_SORT_ENTRY;
2436
2437    OUTFREQD_SORT_ENTRY *sort_tab,*sort_tmp,*sortp,*ip,*jp;
2438    int i,j,k;
2439
2440    int keylen=sizeof(sortp->x2992_cat)+sizeof(sortp->x2993)+sizeof(sortp->x2992)+sizeof(sortp->xrankF);
2441
2442
2443    /* init tabcntArankD (indexed by DecsMfn)
2444    */
2445    memset(tabcntArankD,0,sizeof(LONGX)*CLASSES);
2446
2447    *tabfreqDp=NULL;
2448    if (!ntabs) return(0);
2449
2450    /* alloc tabfreqD (indexed by rankD)
2451    */
2452    nbytes=sizeof(TABFREQD_ENTRY)*ntabs;
2453    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqD/tabfreqD/ALLOMAXV");
2454    p=(char *)ALLOC((ALLOPARM)(nbytes));
2455    if (p == ALLONULL) fatal("aotmsa2/rutfreqD/tabfreqD/ALLOC");
2456    memset(p,0,nbytes); /* init */
2457    tabfreqD=(TABFREQD_ENTRY *)p;
2458    *tabfreqDp=tabfreqD;
2459
2460    nbytes=sizeof(OUTFREQD_SORT_ENTRY)*ntabs+sizeof(OUTFREQD_SORT_ENTRY);
2461    if (nbytes >= (LONGX)ALLOMAXV) fatal("aotmsa2/rutfreqD/sort_tab/ALLOMAXV");
2462    p=(char *)ALLOC((ALLOPARM)(nbytes));
2463    if (p == ALLONULL) fatal("aotmsa2/rutfreqD/sort_tab/ALLOC");
2464    sort_tab=(OUTFREQD_SORT_ENTRY *)p;
2465    sort_tmp=sort_tab+ntabs;
2466
2467    for (sortp=sort_tab, tabF=tabfreqF, mfn=1L; mfn<=ntabs; mfn++, tabF++, sortp++) {
2468        v351=tabF->v351;
2469////        sortp->delta=tabcntArankW[v351]-tabcntArankF[v351];
2470////        sprintf(sortp->x2992,"%10"_LD_,555555555-sortp->delta);
2471//        sortp->delta=tabcntGMDL[v351];
2472//        sprintf(sortp->x2992,"%10"_LD_,999999999-sortp->delta);
2473
2474
2475#if 0
2476            (if v20.1='C' or v20.1='D'
2477                then v20,break
2478                else if iocc=1 then v20'<br>' fi
2479             fi
2480            )
2481#endif
2482          if (1) {
2483              DIRSTRU *dirp;
2484              int len,xdir;
2485              RECSTRU *recp;
2486       
2487              RECORD(mydrec,"mydecs",v351); //        recfield(sortp->x2992,mydrec,20,1,"");
2488
2489              for (dirp=MFRdir, xdir=0; xdir < MFRnvf; dirp++, xdir++)
2490                if (dirp->tag == TAG005) {
2491                    int loop;
2492                    LONGX mfn=0;
2493                    p=FIELDP(xdir);
2494                    for (loop=dirp->len; loop--; p++) mfn=mfn*10+((int)(*p)-(int)'0');
2495                    if (mfn > CLASSES) fatal("aotmsa2/rutfreqD/TAG005/CLASSES");
2496                    sprintf(sortp->x2993,"%10"_LD_,999999999L-gtabcntA[mfn]);
2497                    sortp->gmfn=mfn;
2498                    break;
2499                }
2500              for (dirp=MFRdir, xdir=0; xdir < MFRnvf; dirp++, xdir++)
2501                if (dirp->tag == TAG022) {
2502                    p=FIELDP(xdir);
2503                    if (*p == 'C' || *p == 'D') ; else fatal("aotmsa2/rutfreqD/TAG022/CD");
2504                    len=dirp->len; if (len>=sizeof(sortp->x2992)) len=sizeof(sortp->x2992)-1;
2505                    strncpy(sortp->x2992,p,len); sortp->x2992[len]='\0';
2506                    memcpy(sortp->x2992_cat,p,1); /* memcpy(,,1) */
2507                    break;
2508                }
2509          }
2510          sprintf(sortp->xrankF,"%6"_LD_,tabcntArankF[v351]); /* key */
2511          sortp->v351=v351;
2512
2513    } /* end for (sortp=sort_tab) */
2514
2515    /* sort D
2516    */
2517    for (k=ntabs-1, i=0; i<k; i++) {
2518        ip=sort_tab+i;
2519        for (j=i+1; j<ntabs; j++) {
2520            jp=sort_tab+j;
2521            if (memcmp((void *)ip,(void *)jp,keylen) > 0) {
2522                memcpy((void *)sort_tmp,(void *)ip,      sizeof(OUTFREQD_SORT_ENTRY));
2523                memcpy((void *)ip      ,(void *)jp,      sizeof(OUTFREQD_SORT_ENTRY));
2524                memcpy((void *)jp      ,(void *)sort_tmp,sizeof(OUTFREQD_SORT_ENTRY));
2525            }
2526        }
2527    }
2528
2529
2530    /* store tabcntArankD (indexed by DecsMfn) and tabfreqD (indexed by rankD)
2531    */
2532    for (sortp=sort_tab, tabD=tabfreqD, mfn=1L; mfn<=ntabs; mfn++, sortp++, tabD++) {
2533        tabD->v351=sortp->v351;
2534//        tabD->delta=sortp->delta;
2535        memcpy(tabD->delca,sortp->x2992,MAXCATLEN);
2536        tabD->gmfn=sortp->gmfn;
2537        tabcntArankD[sortp->v351]=mfn;
2538    }
2539
2540    return(0);
2541}
2542
2543#if ANSI
2544int outfreqD(int ntabs, char *dbnoutp, LONGX *tabcntArankF, LONGX *tabcntArankW, TABFREQD_ENTRY *tabfreqD)
2545#else
2546int outfreqD(ntabs, dbnoutp, tabcntArankF, tabcntArankW, tabfreqD)
2547int ntabs;
2548char *dbnoutp;
2549LONGX *tabcntArankF;
2550LONGX *tabcntArankW;
2551TABFREQD_ENTRY *tabfreqD;
2552#endif
2553{
2554    RECSTRU *recp;
2555    LONGX mfn;
2556    char buffup[BUFSIZ],*batchp;
2557
2558    LONGX upirec;
2559    LONGX upcrec;
2560
2561    TABFREQD_ENTRY *tabD;
2562
2563    if (!ntabs) return(0);
2564
2565    /* output
2566    */
2567    record(upcrec=nrecs,dbnoutp,0L);
2568    record(upirec=nrecs,dbnoutp,1L);
2569    for (tabD=tabfreqD, mfn=1L; mfn<=ntabs; mfn++, tabD++) {
2570        batchp=buffup;
2571
2572        sprintf(batchp,"A1/%06"_LD_"/"     ,tabD->v351              ); batchp+=strlen(batchp);
2573
2574        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankF[tabD->v351]); batchp+=strlen(batchp);
2575        sprintf(batchp,"A2220/%"_LD_"/"    ,tabcntArankW[tabD->v351]); batchp+=strlen(batchp);
2576        sprintf(batchp,"A2220/%"_LD_"/"    ,mfn                     ); batchp+=strlen(batchp);
2577
2578        *batchp='\0';
2579        RECORD(upirec,dbnoutp,mfn); MFRstatus=ACTIVE;
2580        if (fldupdat(upirec,buffup)) return(mfn);
2581        recupdat(upcrec,upirec);
2582    }
2583
2584    return(0);
2585}
2586
2587
2588#if 0
2589#define MFQTDBN0        11
2590#define MFQTQRY0        12
2591#define MFQTOBJ0        13
2592
2593#define MFQTXCTS        20
2594
2595#define MFQSWTIM        't'
2596#define MFQSWDBN        'd'
2597#define MFQSWQTY        'q'
2598
2599#define MFQTASET        21
2600#define MFQTALCC        22
2601
2602#define MFQTHITS        31
2603#define MFQTHCUR        32
2604#define MFQTHMFN        33
2605#define MFQTHSIZ        34
2606#define MFQTHMEM        35
2607
2608#define OPRNULL         0x01
2609#define OPRXEND         0x02
2610#define PSTLEVEL        0x03
2611#define ACCLEVEL        0x04
2612
2613#define B7UPLEN         9               /* length for b40 numeric fields */
2614#define B7DELADD        "D%dA%d|%09"_LD_"|" /* sprintf format for dir/field */
2615#define B7EDIT1         "%09"_LD_         /* sprintf format for field edit */
2616
2617#define MFQTXTAG        101             /* inverted files prefixes */
2618
2619#endif
2620
2621
2622#if ANSI
2623char *recsfldv(char *areap, char *fldp, FFI fldlen, char *defaultp)
2624#else
2625char *recsfldv(areap,fldp,fldlen,defaultp)
2626char *areap;
2627char *fldp;
2628FFI fldlen;
2629char *defaultp;
2630#endif /* CIAPI_SOURCE */
2631{
2632    FFI n;
2633    unsigned char *p;
2634
2635    p=subfldp(fldp,'v',&fldlen);
2636
2637    if (p) n=fldlen; /* ja' decrementado */
2638    else
2639        if (defaultp)
2640            n=(FFI)strlen((char*)(p=(unsigned char*)defaultp));
2641        else
2642            n=(FFI)strlen((char*)(p=(unsigned char*)"\0"));
2643    if (!areap)
2644        if ((areap=(char *)ALLOC((ALLOPARM)n+1)) == (char *)ALLONULL)
2645            fatal("aotmsa2/recsfldv/ALLOC");
2646    memcpy(areap,p,n); areap[n]='\0';
2647    return(areap);
2648}
2649
2650
2651#if 0
2652                for (tag=0; isdigit(*p); p++) tag=tag*10+(*p-'0');
2653            if (*p) {
2654            freex(srcareap,dirarea);
2655                    return(errp);
2656            }
2657        if (tag) {
2658                for (i=0; i+1 < MFRnvf; i++) {
2659                    if (DIRtag(i) != tag) continue;
2660                    for (j=i+1; j < MFRnvf; j++) {
2661                        if (DIRtag(j) != tag) continue;
2662                            if (memcmp(FIELDP(i),FIELDP(j),DIRlen(i)) > 0) {
2663                                memcpy(tempdir,&MFRdir[i],sizeof(DIRSTRU));
2664                                memcpy(&MFRdir[i],&MFRdir[j],sizeof(DIRSTRU));
2665                                memcpy(&MFRdir[j],tempdir,sizeof(DIRSTRU));
2666                        }
2667                }
2668                }
2669                break;
2670        }
2671#endif
Note: See TracBrowser for help on using the browser.