root/trunk/mdl2ir.c

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

essage first commit

Line 
1/* mdl2ir.c    -   NLM Medlars II Unit-Records to CDS/ISIS
2
3   uso: mdl2ir <filin> [create=]<dbnout> [CAN/QAL]
4              [skip=[b=]n] [count=n] [tell=n] [test=1] [REPLACE] [+DP]
5
6        <filin>:    arquivo de entrada
7
8        <dbnout>:   database de saida
9
10        CAN:        rec_id = CAN
11        QAL:        rec_id = QAL
12
13        [skip=n]:   Para saltar n registros antes do processamento
14                    ou, se skip=b=n, para saltar n bytes
15
16        [count=n]:  Para processar no maximo n registros
17
18        [tell=n]:   Para avisar a cada n registros logicos processados
19
20        [REPLACE]:  Para ler fitas Maint SOF
21
22        [+DP]:      Para gravar <filin>|anoP|dpurecs|urecs|count em mdl2ir.log
23
24    Autor:  ccmdl0/AOT
25            BRM, 07/06/89
26    Alter:  MYB/AOT, 16/05/91
27            1. Parametro REPLACE
28            AOT, 23/02/94
29            1. Parametro +DP
30
31
32----------------------------------------------------------- */
33
34
35#include <stdio.h>
36#include <string.h>
37
38#include "cisis.h"      /* CISIS Interface */
39#include "cirun.h"      /* runtime area and defines by AOT */
40
41#define TRACE     0
42#define TRACEA    0
43#define TRACEL    0
44#define TRACER    0
45
46#if SWAPPED
47#define MBUFSIZ 8192
48#else
49#define MBUFSIZ 32768
50#endif
51
52int fx;
53int nxleft,ixleft;
54unsigned char buffin[MBUFSIZ];            /* readvbf */
55int lastleft = 0;
56
57
58unsigned char buffgo[MBUFSIZ];            /* readvbf */
59unsigned char *ibuf = buffgo;
60
61
62unsigned char buffup[MBUFSIZ];            /* fldupdat */
63
64LONGX count=0;
65LONGX urecs=0;
66LONGX marcfirst=1;
67LONGX marclast=0;
68
69typedef struct urstru {
70    unsigned char rec_id[3];
71    unsigned char recfm;
72    unsigned char status[2];
73    short reclen;
74    LONGX seq_no;
75    unsigned char data[1];
76} URECORD;
77
78#define VRHSIZ (sizeof(URECORD)-1)
79
80typedef struct datdir {
81    short noc;
82    short data_ptr;
83    short len_oc[1];
84} DATDIR;
85
86typedef struct eltdir {
87    short eltype;
88    short occur_ptr;
89} ELTDIR;
90
91typedef struct trailer {
92    short anoc;
93    short anel;
94} TRAILER;
95
96
97#define TRAILSIZE       sizeof(TRAILER)
98
99
100#define URIDC           0xc3                            /* EBCDIC Up 'C' */
101#define URIDI           0xc9                            /* EBCDIC Up 'I' */
102#define URIDT           0xe3                            /* EBCDIC Up 'T' */
103
104#define URIDA           0xc1                            /* EBCDIC Up 'A' */
105#define URIDN           0xd5                            /* EBCDIC Up 'N' */
106
107#define URIDQ           0xd8                            /* EBCDIC Up 'Q' */
108#define URIDL           0xd3                            /* EBCDIC Up 'L' */
109
110unsigned char uridc = URIDC;
111unsigned char uridi = URIDI;
112unsigned char uridt = URIDT;
113int badurids = 0;
114
115#define URTYPE          0xe4                            /* EBCDIC Up 'U' */
116
117URECORD *urp;
118DATDIR *datdirp;
119ELTDIR *eltdirp;
120TRAILER *trailerp;
121
122short anelleft;
123short occurleft;
124short ioc;
125unsigned char *fldp;
126
127int replace;                                            /* REPLACE switch */
128
129#define REPLOFF         60                              /* REPLACE offset */
130#define REPLTAGUI       18                              /* first UI field */
131#define REPLTAGST       56                              /* status field */
132
133FILE *fout=NULL;                /* arquivo a mais */
134FILE *fplog=NULL;               /* +DP */
135LONGX dpurecs=0L;
136int dpareal=0;
137int dpxdir=EOF;
138char dparea[BUFSIZ];
139
140#define NLMTAGDP        354     /* A640 [aaaammdd: A650=650] */
141
142/* prototypes */
143#if ANSI
144int readraw(char *ibuf);
145int readx(char *xbuf, int xbufsize);
146#else
147int readraw();
148int readx();
149#endif
150
151void main(argc,argv)
152
153int argc;
154char *argv[];
155
156{
157    RECSTRU *recp; /* mandatory for defines REC RDB MF0 MFR DIR, FIELDP */
158
159    LONGX crec,irec,nxtmfn;
160    char *dbnp,*batchp;
161    int rc;
162
163    int n1;
164    off_t parmskpb;
165    LONGX parmcount,parmtell;
166    int parmtest;
167
168    unsigned char *p;
169
170    int i,n,loop;
171
172
173    if (argc < 3) {
174        printf("%s",cicopyr("Utility MDL/MDL2IR"));
175        printf("\n");
176        printf("mdl2ir <filin> [create=]<dbnout>");
177        printf(" [CAN/QAL]\n");
178        printf("      [skip=[b=]n] [count=n] [tell=n] [test=1] [REPLACE]");
179        printf(" [+DP]\n");
180        exit(1);
181    }
182
183    if ((fx=open(argv[1],O_RDONLY|O_BINARY)) == -1) fatal(argv[1]);
184
185    dbnp=argv[2];
186
187
188
189    parmskpb=0; parmcount=999999999L;
190    parmtell=0; parmtest=0; replace=0;
191
192    for (i=3; i<argc; i++) {
193
194        if (!strncmp(argv[i],"skip=b=",7)) {
195            p=argv[i]+7;
196            if ((sscanf(p,"%"_LD_,&parmskpb)) != 1) fatal(argv[i]);
197            if (parmskpb) 
198                printf("+++ skip=%"_LD_" bytes\n",parmskpb);
199        }
200        else
201        if (!strncmp(argv[i],"count=",6)) {
202            p=argv[i]+6;
203            if ((sscanf(p,"%"_LD_,&parmcount)) != 1) fatal(argv[i]);
204            printf("+++ count=%"_LD_" lrecs\n",parmcount);
205        }
206        else
207        if (!strncmp(argv[i],"tell=",5)) {
208            p=argv[i]+5;
209            if ((sscanf(p,"%"_LD_,&parmtell)) != 1) fatal(argv[i]);
210        }
211        else
212        if (!strncmp(argv[i],"test=",5)) {
213            p=argv[i]+5;
214            if ((sscanf(p,"%d",&parmtest)) != 1) fatal(argv[i]);
215        }
216        else
217        if (!strcmp(argv[i],"CAN")) {
218            uridc = URIDC;
219            uridi = URIDA;
220            uridt = URIDN;
221            printf("+++ mdl2ir for CANCERLIT\n");
222        }
223        else
224        if (!strcmp(argv[i],"QAL")) {
225            uridc = URIDQ;
226            uridi = URIDA;
227            uridt = URIDL;
228            printf("+++ mdl2ir for VOCABULARY\n");
229        }
230        else
231        if (!strcmp(argv[i],"REPLACE")) {
232            replace = 1;
233            printf("+++ mdl2ir for Maint SOF\n");
234        }
235        else
236        if (!strcmp(argv[i],"+DP")) {
237            if ((fplog=fopen("mdl2ir.log","w")) == NULL) fatal("mdl2ir.log");
238            printf("+++ mdl2ir.log\n");
239            memset(dparea,'0',dpareal=4); dparea[dpareal]='\0';
240        }
241        else
242            fatal(argv[i]);
243    }
244
245    /*
246        processa parametros
247    */
248    LSEEK64(fx,parmskpb,0);
249
250    /*
251        inicializa readraw e faz primeira leitura
252    */
253    nxleft=0;
254    n1=readraw(ibuf);
255   
256    if (n1 == EOF) fatal(argv[1]);
257    count++;
258
259
260    /*
261        inicializa bases de dados
262    */
263    if (strncmp(dbnp,"create=",7) == 0) {
264        rc=recisis0((dbnp+=7));
265        /* printf("+++ recisis0=%d\n",rc); */
266    }
267
268    RECORD((crec=0L),dbnp,0L);
269    nxtmfn=MF0nxtmfn;
270    RECORD((irec=crec+1),dbnp,nxtmfn);
271
272
273    /*
274        loop principal
275    */
276    while (n1 != EOF && count <= parmcount) {
277
278        urp = (replace) ? (URECORD *)(ibuf+REPLOFF) : (URECORD *)ibuf;
279        batchp=buffup;
280
281#if TRACE
282printf("ibuf=%p urp=%p",ibuf,urp);
283getchar();
284#endif
285
286#if SWAPPED
287p=(unsigned char *)(&urp->reclen);
288urp->reclen=((*p)<<8)+(*(p+1));
289#endif
290
291/*      if (urp->rec_id[0] != uridc ||
292            urp->rec_id[1] != uridi ||
293            urp->rec_id[2] != uridt ||
294*/
295        if (urp->recfm != URTYPE || TRACE) {
296            fprintf(stderr,"+++ %"_LD_"/%"_LD_" recs \n",urecs,count);
297            printf("+++ id=%02x%02x%02x fm=%02x st=%02x%02x len=%d\n",
298                urp->rec_id[0],urp->rec_id[1],urp->rec_id[2],
299                urp->recfm,
300                urp->status[0],urp->status[1],
301                urp->reclen);
302            if (urp->recfm != URTYPE)
303                if (++badurids > 50)
304                    fatal("badurids");
305            goto NEWREC_LAB;
306        }
307
308        badurids=0;
309        urecs++;
310        if (parmtest) {
311            sprintf(batchp,
312                "A1#%02x%02x%02x#A2#%02x#A3#%02x%02x#A4#%5d#",
313                urp->rec_id[0],urp->rec_id[1],urp->rec_id[2],
314                urp->recfm,
315                urp->status[0],urp->status[1],
316                urp->reclen);
317            batchp+=strlen(batchp);
318        }
319
320        if (replace) {
321            sprintf(batchp,
322                "A%d#%.8s#A%d#%.2s#",
323                REPLTAGUI,ibuf,
324                REPLTAGST,urp->status);
325            batchp+=strlen(batchp);
326        }
327
328        trailerp=(TRAILER *)(&urp->rec_id[0] + urp->reclen - TRAILSIZE);
329
330#if SWAPPED
331p=(unsigned char *)(&trailerp->anoc);
332trailerp->anoc=((*p)<<8)+(*(p+1));
333p=(unsigned char *)(&trailerp->anel);
334trailerp->anel=((*p)<<8)+(*(p+1));
335#endif
336
337        if (trailerp->anoc < trailerp->anel || TRACE) {
338            printf("*** count=%"_LD_" anoc=%d anel=%d\n",
339                count,
340                trailerp->anoc,
341                trailerp->anel);
342            if (trailerp->anoc < trailerp->anel)
343                goto NEWREC_LAB;
344        }
345
346
347        eltdirp=(ELTDIR *)(trailerp); eltdirp-=(anelleft=trailerp->anel);
348
349        for (; anelleft; eltdirp++, anelleft--) {
350
351#if SWAPPED
352p=(unsigned char *)(&eltdirp->eltype);
353eltdirp->eltype=((*p)<<8)+(*(p+1));
354p=(unsigned char *)(&eltdirp->occur_ptr);
355eltdirp->occur_ptr=((*p)<<8)+(*(p+1));
356#endif
357
358            datdirp=(DATDIR *)(&urp->rec_id[0] + eltdirp->occur_ptr);
359
360#if SWAPPED
361p=(unsigned char *)(&datdirp->noc);
362datdirp->noc=((*p)<<8)+(*(p+1));
363p=(unsigned char *)(&datdirp->data_ptr);
364datdirp->data_ptr=((*p)<<8)+(*(p+1));
365#endif
366            occurleft=datdirp->noc;
367
368
369            fldp=(unsigned char *)(&urp->rec_id[0] + datdirp->data_ptr);
370
371            for (ioc=0; occurleft; ioc++, occurleft--) {
372#if SWAPPED
373p=(unsigned char *)(&datdirp->len_oc[ioc]);
374datdirp->len_oc[ioc]=((*p)<<8)+(*(p+1));
375#endif
376                sprintf(batchp,"A%d%c",eltdirp->eltype,0x01);
377                batchp+=strlen(batchp);
378
379                for (p=fldp, loop=datdirp->len_oc[ioc]; loop--; p++) {
380#if TRACEA
381putchar(*p);
382#endif
383                    if (*p < 0x40) {    /* ebcdic space */
384                        printf("*** count=%"_LD_" tag=%d occ=%d chr#%d/%d=%02x\n",
385                            count,eltdirp->eltype,ioc+1,
386                            datdirp->len_oc[ioc],
387                            datdirp->len_oc[ioc]-loop,
388                            *p);
389                        if (loop < 0) fatal("mdl2ir/invalid MDL data");
390                        *batchp++ = 0x40;
391                    }
392                    else
393                        *batchp++ = *p;
394                }
395                *batchp++ = 0x01;
396#if TRACEA
397putchar('\n');
398#endif
399                fldp+=datdirp->len_oc[ioc];
400            }
401        }
402
403
404        *batchp=NULL;
405
406        MFRmfn=nxtmfn++;
407        MFRmfrl=LEADER;
408        MFRmfbwb=0; MFRmfbwp=0;
409        MFRbase=LEADER;
410        MFRnvf=0;
411        MFRstatus=ACTIVE;
412
413        RECtype=TYPEMFR;
414        RECrc=RCNORMAL;
415
416        p=fldupdat(irec,buffup);
417        if (p) {
418            printf("*** count=%"_LD_"\n",count);
419            printf("+++ fldupdat='%s'\n",p);
420            fatal("fldupdat");
421        }
422#if TRACEL
423 printf("Leader - %"_LD_,%d,%"_LD_,%d,%d,%d,%d\n",
424  MFRmfn,MFRmfrl,MFRmfbwb,MFRmfbwp,MFRbase,
425  MFRnvf,MFRstatus);
426#endif
427
428        rc=recupdat(crec,irec);
429        if (rc) {
430            printf("*** count=%"_LD_"\n",count);
431            printf("+++ recupdat=%d\n",rc);
432            fatal("recupdat");
433        }
434
435        dpurecs++;
436        if (fplog) {
437            dpxdir=fieldx(irec,NLMTAGDP,1);
438            if (dpxdir < 0) {
439                sprintf(buffup,"A%d#0000#",NLMTAGDP);
440                if (fldupdat(irec,buffup)) fatal(buffup);
441                dpxdir=fieldx(irec,NLMTAGDP,1);
442            }
443            else {
444                for (p=FIELDP(dpxdir), loop=DIRlen(dpxdir); loop--; p++)
445                    *p = (char )((int)*p - 0xF0 + (int)'0'); /* EBCDIC '0' */
446            }
447            if (urecs == 1) {
448                dpareal=DIRlen(dpxdir); if (dpareal > 4) dpareal=4;
449                memcpy(dparea,FIELDP(dpxdir),dpareal); dparea[dpareal]='\0';
450            }
451        }
452
453
454
455NEWREC_LAB:
456        n1 = readraw(ibuf);
457
458        if (fplog && (dpxdir >= 0 || n1 == EOF)) {
459            if (n1 == EOF) n=1;
460            else
461                if (DIRlen(dpxdir) < 4) n=1;
462                else n=memcmp(FIELDP(dpxdir),dparea,4);
463            if (n) {
464#if 0
465                fprintf(fplog,"%s|",argv[1]);
466                fprintf(fplog,"%s|",argv[3]+7);
467#else
468                fprintf(fplog,"%s|",dbnp);
469#endif
470                for (p=dparea, loop=dpareal; loop--; p++)
471                    fprintf(fplog,"%c",*p);
472                marclast=count - 1;
473                if (n1 == EOF) marclast++;
474                fprintf(fplog,"|%"_LD_"|ur=%"_LD_"|lr=%"_LD_"\n",dpurecs,marcfirst,marclast);
475                dpareal=DIRlen(dpxdir); if (dpareal > 4) dpareal=4;
476                memcpy(dparea,FIELDP(dpxdir),dpareal); dparea[dpareal]='\0';
477                dpurecs=0L;
478                marcfirst=marclast + 1;
479
480
481            }
482        }
483        dpxdir=EOF;
484
485        if (n1 > 0) {
486            count++;
487            if (parmtell)
488                if (!(count % parmtell))
489                  fprintf(stderr,"+++ %"_LD_"/%"_LD_" recs\n",urecs,count);
490        }
491
492    }
493
494    if (count > parmcount)
495        count--;
496
497
498    printf("mdl2ir: %"_LD_" unit records     \n",urecs);
499    printf("       %"_LD_" logical records\n",count);
500
501    exit(0);
502}
503
504
505
506int readraw(ibuf)
507char *ibuf;
508{
509    int n1,reclen;
510    URECORD *rp;
511
512#if SWAPPED
513    unsigned char *p;
514#endif
515#if TRACER
516printf("+++ readraw \n");
517#endif
518
519    rp=(URECORD *)ibuf;
520
521        n1=readx(ibuf,VRHSIZ);
522        if (n1 ==  EOF) return(n1);
523        if (n1 < VRHSIZ) {
524            fprintf(stderr,"count: %"_LD_"\n",count);
525            fprintf(stderr,"n1: %d\n",n1);
526            fatal("readraw/header length");
527        }
528
529#if SWAPPED
530        p=(unsigned char *)(&rp->reclen);
531        reclen=((*p)<<8)+(*(p+1));
532#else
533        reclen=rp->reclen;
534#endif
535
536#if TRACER
537printf("+++ readraw - reclen=%d \n",reclen);
538#endif
539        if (reclen < VRHSIZ || reclen > MBUFSIZ) {
540            fprintf(stderr,"count: %"_LD_"\n",count);
541            fprintf(stderr,"reclen: %d\n",reclen);
542            fatal("readraw/block length");
543        }
544
545
546    n1=readx(ibuf+VRHSIZ,reclen-VRHSIZ);
547    if (n1 < reclen-VRHSIZ) {
548        fprintf(stderr,"count: %"_LD_"\n",count);
549        fprintf(stderr,"reclen/n1: %d/%d\n",reclen,n1);
550        fatal("readraw/read");
551    }
552
553    n1=reclen;
554   
555    return(n1);
556}
557
558
559int readx(xbuf,xbufsize)
560char *xbuf;
561int xbufsize;
562{
563    int nx,n;
564
565    if (nxleft >= xbufsize) {
566        nx=xbufsize;
567        memcpy(xbuf,&buffin[ixleft],xbufsize);
568        nxleft-=xbufsize;
569        ixleft+=xbufsize;
570    }
571    else {
572        nx=nxleft;
573        memcpy(xbuf,&buffin[ixleft],nx);
574        nxleft=read(fx,buffin,MBUFSIZ);
575        ixleft=0;
576        if (nx+nxleft) {
577            n=xbufsize-nx;
578            if (nxleft < n) {
579                fprintf(stderr,"count: %"_LD_"\n",count);
580                fprintf(stderr,"xbufsize: %d\n",xbufsize);
581                fprintf(stderr,"nx: %d\n",nx);
582                fatal("readx/more bytes expected");
583            }
584            memcpy(&xbuf[nx],buffin,n);
585            nx+=n;
586            nxleft-=n;
587            ixleft+=n;
588        }
589        else {
590            memset(xbuf,0xff,xbufsize);
591            nx=EOF;
592        }
593    }
594
595    return(nx);
596}
597
Note: See TracBrowser for help on using the browser.