root/trunk/dx0.c

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

essage first commit

Line 
1/* dx0.c    -   converte arquivos B-3700 (sem lf's)
2                para carga no unify (dlm's e lf's)
3                (originalmente...)
4
5   uso: dx0 <filin> <filout> <lrecl> [modo=dat]
6            [pc1] [r1x]n1 [=s1] ... [pck] [rkx]nk [=sk]
7            [numera[=n]] [duplo[=n]] [skip=[b=]n] [count=n]
8
9        <filin>:    arquivo de entrada
10
11        <filout>:   arquivo de saida, com os dados de entrada
12                    reformatados em arquivos tipo UNI (|,LF)
13                    de acordo com os parametros de chamada
14
15        <lrecl>:    tamanho do registro de entrada
16
17        [modo]:     modo=dat para nao gravar tipo UNI e sim DAT
18                    (sem delimitador entre campos, nem LF final)
19
20        [pci]:      posicionamento de coluna para extracao:
21
22                    c   -   numero da coluna
23
24        [rix]ni:    especificacao dos campos que serao gravados:
25
26                    r   -   numero de repeticoes (default=1)
27                    n   -   numero de bytes do campo
28
29                    ex: 1 1 2 35x1
30                        especifica 38 campos consecutivos: dois
31                        de um byte, um de dois bytes e trinta e
32                        cinco de um byte, a partir da coluna 1
33                   
34                    Se r=0, entao os n bytes especificados em 0xn
35                    serao apenas saltados, ie, nao regravados em
36                    <filout>
37
38        [=si]:      especificacao de literal a ser gravado como
39                    continuacao do campo anterior (ie, sem dlm apos
40                    campo anterior) e, ainda, sem o dlm apos a
41                    movimentacao do literal:
42
43                    s   -   string
44
45                    ex: =1      para gravar o string 1
46                        =abc    para gravar o string abc
47                        =" "    para gravar um branco
48                        ="|s|"  para gravar um campo .uni com s
49                        =LF     para gravar um '\n'
50
51        [numera]:   Gera, no final de cada registro, um contador
52                    de registros em 6 bytes, a partir de 1
53
54                    Se usado numera=n, entao o valor inicial do
55                    contador sera' n
56
57        [duplo]:    Para checar presenca de pares de registros de
58                    de entrada de k=<lrecl>/2 bytes sendo o byte 0
59                    numerico e o byte k nao numerico ou, se usado
60                    duplo=n, os n bytes a partir do byte k nao nu-
61                    mericos (uso: INC987)
62
63        [skip=n]:   Para saltar n registros antes do processamento
64                    ou, se skip=b=n, para saltar n bytes
65
66        [count=n]:  Para processar no maximo n registros
67
68
69    Autor:  datuni0.c02/AOT
70            FCC, 12/08/87
71
72    Alter:  AOT, 12/08/87
73            1. opcao numera=n
74            2. opcao duplo=n
75    Alter:  AOT/YRA, 13/08/87
76            1. opcao modo=dat
77    Alter:  AOT/YRA, 12/01/88
78            1. opcao =string
79    Alter:  AOT/WA, 20/01/88
80            1. opcao skip=n
81            2. opcao count=n
82    Alter:  AOT/WA, 17/05/88
83            1. opcao skip=b=n
84    Alter:  AOT, 30/11/88
85            1. dx0
86    Alter:  AOT/AARG, 23/04/99
87            1. opcao tell=n
88    Alter:  AOT, 14/08/2001
89            1. cicopyr()
90----------------------------------------------------------- */
91
92
93#include <stdio.h>
94#include <string.h>
95#include "cisis.h"
96#include "cirun.h"
97
98#define CHAR UBYTE
99
100#define MODOP 0644  /* dono: LG, grupo: L, outros: L */
101
102#define MBUFSIZ 8192
103
104CHAR bufin[MBUFSIZ];            /* readbsiz */
105CHAR ibuf1[MBUFSIZ];
106CHAR *ibuf = ibuf1;
107int ibufsize;
108int f1,n1left,i1left,n1recl;
109
110CHAR bufout[MBUFSIZ];           /* writbsiz*/
111CHAR obuf1[MBUFSIZ];
112CHAR *obuf = obuf1;
113int obufsize;
114int f2=0,n2free,i2free=0; /* AOT, 14/08/2001 */
115
116CHAR sbuf[MBUFSIZ];
117CHAR *sptr = sbuf;
118int lastdlm;
119int fdup;
120
121LONGX count,countx;
122
123                                  /* "0123456789abcdef" */
124unsigned char ebctoasc[16][16+1] = { "!!!!!!!!! !!!!!!",
125                                     "!!!!!!!!!!!!!##!",
126                                     "!!!!!!!!!!!!!!!!",
127                                     "!!!!!!!!!!!!!!!!",
128                                     " !!!!!!!!![.<(+!",
129                                     "&^^^!!!!!!!$*);^",
130                                     "-/!!!!!!!!!,%_>?",
131                                     "!!!!!!!!!`:#@'=\"",
132                                     "^abcdefghi!!!!!!",
133                                     "!jklmnopqr!!!\"!!",
134                                     "!~stuvwxyz!!![!!",
135                                     "!!!!!!!!!!!!!]!!",
136                                     "{ABCDEFGHI!!!!!!",
137                                     "}JKLMNOPQR!!!!!!",
138                                     "\\!STUVWXYZ!!!!!!",
139                                     "0123456789!!!!!!" };
140int parmconv;
141
142LONGX parmtell=1000L;
143
144#if ANSI
145void erro(CHAR *s1, CHAR *s2);
146int readbsiz(void);
147void writbsiz(void);
148void breakout(void);
149#else
150void erro();
151int readbsiz();
152void writbsiz();
153void breakout();
154#endif
155
156main(argc,argv)
157
158int argc;
159char *argv[];
160
161{
162    int n1;
163
164    int parmlrecl;
165
166    LONGX parmskip,parmskib,parmcount;
167
168    static int ndats;
169    static CHAR *vdatptr[256];
170    static int  vdatsiz[256];
171    static CHAR *voutptr[256];
172
173    static int nstrs;
174    static CHAR *sdatptr[256];
175    static int  sdatsiz[256];
176    static CHAR *soutptr[256];
177
178    CHAR *idatptr,*odatptr,*pnumer,*pfinal,*p,*q;
179
180    int i,r,n,l,nd;
181    int k;
182
183    int znumer,zduplo,zmodat;
184    int dupnn;
185    LONGX cnumer;
186    CHAR *dup1,*dup2;
187
188
189    if (argc < 5) {
190        printf("%s",cicopyr("Utility AOT/DX0"));
191        printf("\n");
192        printf("dx0 <filin> <filout> <lrecl> [modo=dat] [pc1] [r1x]n1 [=s] .. \n");
193        printf("    [numera[=n]] [ebcdic] [skip=[b=]n] [count=n] [tell=n] \n");
194        printf("\n");
195        exit(1);
196    }
197
198#if PC
199    if ((f1=open(argv[1],O_RDONLY | O_BINARY)) == -1)
200#else
201    if ((f1=open(argv[1],O_RDONLY           )) == -1)
202#endif
203        erro("impossivel abrir o arquivo ",argv[1]);
204
205#if PC
206    if ((f2=open(argv[2],O_WRONLY|O_BINARY|O_CREAT|O_TRUNC,MODOP)) == -1)
207#else
208    if ((f2=creat(argv[2],MODOP)) == -1)
209#endif
210        erro("impossivel criar o arquivo ",argv[2]);
211
212    if ((sscanf(argv[3],"%d",&parmlrecl)) != 1)
213        erro("parametro lrecl invalido",NULL);
214    if (parmlrecl > MBUFSIZ)
215        erro("parametro lrecl maior do que o previsto",NULL);
216
217
218    ndats=0;
219    nstrs=0; lastdlm=0;
220    obufsize=0;
221    idatptr=ibuf;
222    zmodat=0;
223    znumer=0;
224    zduplo=0;
225
226    parmskip=0; parmskib=0; parmcount=999999999; parmconv=0;
227
228    for (i=4;i<argc;i++) {
229        if (!strcmp(argv[i],"ebcdic")) {
230            parmconv=1;
231            printf("+++conversao ebcdic/ascii\n");
232        }
233        else
234        if (!strcmp(argv[i],"modo=dat")) {
235            zmodat=1;
236            if (i > 4)
237                erro("esperava modo=dat como 4. argumento",NULL);
238            printf("+++gravacao da saida em modo DAT\n");
239        }
240        else
241        if (!strncmp(argv[i],"numera",6)) {
242            znumer=1;
243            cnumer=1;
244            p=argv[i]+6;
245            if (*p) {
246                if (*p != '=')
247                    erro("esperava 'numera='",NULL);
248                if ((sscanf(++p,"%"_LD_,&cnumer)) != 1)
249                    erro("valor inicial de numera invalido",NULL);
250            }
251            printf("+++saida sera' numerada a partir de %"_LD_"\n",cnumer);
252        }
253        else
254        if (!strncmp(argv[i],"duplo",5)) {
255            if (parmlrecl%2)
256                erro("opcao 'duplo' incompativel com <lrecl>",NULL);
257            zduplo=parmlrecl/2;
258            dupnn=1;
259            p=argv[i]+5;
260            if (*p) {
261                if (*p != '=')
262                    erro("esperava 'duplo='",NULL);
263                if ((sscanf(++p,"%d",&dupnn)) != 1)
264                    erro("valor de duplo= nao numerico",NULL);
265                if (dupnn > zduplo)
266                    erro("valor de duplo= invalido",NULL);
267            }
268            printf("+++saida dupla de %d bytes (1+%d)\n",zduplo,dupnn);
269        }
270        else
271        if (!strncmp(argv[i],"skip",4)) {
272            p=argv[i]+4;
273            if (*p) {
274                if (*p != '=')
275                    erro("esperava 'skip='",NULL);
276                q=p;
277                if (*++q == 'b' && *++q == '=') {
278                    if ((sscanf(++q,"%"_LD_,&parmskib)) != 1)
279                        erro("valor de skip=b invalido",NULL);
280                }
281                else
282                    if ((sscanf(++p,"%"_LD_,&parmskip)) != 1)
283                        erro("valor de skip invalido",NULL);
284            }
285            if (parmskip)
286                printf("+++skip=%"_LD_" registros de %d bytes\n",parmskip,parmlrecl);
287            if (parmskib)
288                printf("+++skip=%"_LD_" bytes\n",parmskib);
289        }
290        else
291        if (!strncmp(argv[i],"count",5)) {
292            p=argv[i]+5;
293            if (*p) {
294                if (*p != '=')
295                    erro("esperava 'count='",NULL);
296                if ((sscanf(++p,"%"_LD_,&parmcount)) != 1)
297                    erro("valor de count invalido",NULL);
298            }
299            printf("+++count=%"_LD_" registros de %d bytes\n",parmcount,parmlrecl);
300        }
301        else
302        if (!strncmp(argv[i],"tell",4)) {
303            p=argv[i]+4;
304            if (*p) {
305                if (*p != '=')
306                    erro("esperava 'tell='",NULL);
307                if ((sscanf(++p,"%"_LD_,&parmtell)) != 1)
308                    erro("valor de tell invalido",NULL);
309            }
310        }
311        else
312
313            if (*argv[i] == 'p') {
314                if ((sscanf(argv[i]+1,"%d",&k)) != 1)
315                    erro("parametro invalido ",argv[i]);
316                idatptr = ibuf+k-1;
317            }
318            else 
319            if (*argv[i] == '=') {
320                p=argv[i]+1;
321                if (!strcmp(p,"LF"))
322                    strcpy(sptr,"\n");
323                else
324                    strcpy(sptr,p);
325                p=sptr; n=strlen(p); sptr+=n; sptr++; /* NULL */
326                if (lastdlm)
327                    obufsize--; /* p/ mover sobre dlm anterior */
328                printf("+++string '%s' em +%d(%d)\n",p,obufsize,n);
329                sdatptr[nstrs]=p;
330                soutptr[nstrs]=obuf+obufsize;
331                sdatsiz[nstrs]=n;
332                nstrs++; obufsize+=n; lastdlm=0;
333            }
334            else {
335                r=1;
336                if ((sscanf(argv[i],"%dx%d",&r,&n)) != 2) {
337                    r=1;
338                    if ((sscanf(argv[i],"%d",&n)) != 1) 
339                        erro("parametro invalido ",argv[i]);
340                    }
341                if (r == 0)
342                    idatptr+=n;
343                else
344                    for (l=1;l<=r;l++) {
345                        if (idatptr+n > &ibuf[parmlrecl])
346                            erro("parametro <lrecl> foi ultrapassado por ",argv[i]);
347                        vdatptr[ndats]=idatptr;
348                        vdatsiz[ndats]=n;
349                        voutptr[ndats]=obuf+obufsize;
350                        ndats++;
351                        idatptr+=n;
352                        obufsize+=n;
353                        if (zmodat) {
354                            lastdlm=0;  /* false */
355                        }
356                        else {
357                            obufsize++; /* | ou LF */
358                            lastdlm=1;  /* true */
359                        }
360                    }
361            }
362    }
363
364
365    /*
366        processa skip
367    */
368    LSEEK64(f1,parmskib+parmskip*(LONGX)parmlrecl,0);
369
370    /*
371        inicializa readbsiz e faz primeira leitura
372    */
373    n1left=0;
374    ibufsize=parmlrecl;
375    n1=readbsiz();
376    if (n1 != EOF)
377        count++;
378
379    /*
380        inicializa writbufz
381    */
382    n2free=MBUFSIZ;
383
384    /*
385        trata znumer
386    */
387    pnumer=NULL;
388    if (znumer) {
389        pnumer=obuf+obufsize;
390        obufsize+=6;
391        if (!zmodat)
392            if (lastdlm)
393                obufsize++;
394    }
395
396    /*
397        trata LF final
398    */
399    pfinal=NULL;
400    if (!zmodat)
401        if (lastdlm)
402            pfinal=obuf+obufsize-1;
403        else {
404            pfinal=obuf+obufsize;
405            obufsize++;
406        }
407
408
409    /*
410        trata zduplo
411    */
412    if (zduplo) {
413        dup1=ibuf;
414        dup2=ibuf+zduplo;
415        if ((fdup=creat("dx0.dup",MODOP)) == -1)
416            erro("impossivel criar o arquivo ","dx0.dup");
417        count++;
418    }
419
420
421    /*
422        loop principal
423    */
424    while (n1 != EOF && count <= parmcount) {
425
426        if (zmodat) 
427            for (nd=0;nd<ndats;nd++) {
428                idatptr=vdatptr[nd];
429                odatptr=voutptr[nd];
430                n=vdatsiz[nd];
431                while (n--)
432                    *odatptr++ = *idatptr++;
433            }
434        else
435            for (nd=0;nd<ndats;nd++) {
436                idatptr=vdatptr[nd];
437                odatptr=voutptr[nd];
438                n=vdatsiz[nd];
439                while (n--)
440                    *odatptr++ = *idatptr++;
441                *odatptr++ = '|';
442            }
443
444        for (nd=0;nd<nstrs;nd++) {
445            idatptr=sdatptr[nd];
446            odatptr=soutptr[nd];
447            n=sdatsiz[nd];
448            while (n--)
449                *odatptr++ = *idatptr++;
450        }
451
452        if (pnumer)
453            sprintf(pnumer,"%06"_LD_,cnumer);
454
455        if (pfinal) 
456            *pfinal='\n';
457
458
459        if (zduplo) {
460
461            p=dup2;
462            i=dupnn;
463            while (i--)
464                if (*p < '0' || *p > '9') {
465                    p=0;
466                    break;
467                }
468                else
469                    p++;
470           
471            if (*dup1 >= '0' && *dup1 <= '9' && p == 0) {
472                writbsiz();
473                n1=readbsiz();
474                if (n1 > 0) {
475                    count+=2;
476                    cnumer++;
477                }
478            }
479            else {
480                write(fdup,obuf,obufsize);
481                countx++;
482                strncpy(dup1,dup2,zduplo);
483                ibuf=dup2; ibufsize=zduplo;
484                n1=readbsiz();
485                if (n1 > 0) {
486                    n1+=zduplo;
487                    count++;
488                }
489                ibuf=dup1; ibufsize=zduplo+zduplo;
490            }
491        }
492
493        else {
494            writbsiz();
495            n1=readbsiz();
496            if (n1 > 0) {
497                count++;
498                cnumer++;
499            }
500        }
501
502        if (parmtell) if (!(count % parmtell))
503            fprintf(stdout,
504                "+++processados: %"_LD_" registros de %d bytes\n",
505                ((zduplo)?count>>1:count),parmlrecl);
506    }
507
508    breakout();
509
510    if (count > parmcount)
511        count--;
512
513    fprintf(stdout,
514        "dx0: %"_LD_" registros processados\n",count);
515
516    if (zduplo)
517        fprintf(stdout,
518            "     %"_LD_" registros nao duplos\n",countx);
519
520    if (znumer)
521        fprintf(stdout,
522            "     registros numerados ate' %06"_LD_"\n",cnumer);
523
524    exit(0);
525}
526
527
528int readbsiz()                                                  /*
529--- ---------                                                   */
530
531{
532    int n1,i,j;
533    CHAR *p,*q;
534    int loop;
535
536    if (n1left >= ibufsize) {
537        n1=ibufsize;
538/*0     strncpy(ibuf,&bufin[i1left],ibufsize); */
539        for (p=ibuf, q=bufin+i1left, loop=ibufsize; loop--; )  *p++ = *q++;
540        n1left-=ibufsize;
541        i1left+=ibufsize;
542    }
543    else {
544        n1=n1left;
545/*0     strncpy(ibuf,&bufin[i1left],n1); */
546        for (p=ibuf, q=bufin+i1left, loop=n1; loop--; )  *p++ = *q++;
547        n1left=read(f1,bufin,MBUFSIZ);
548        i1left=0;
549        if (n1+n1left) {
550            n1recl=ibufsize-n1;
551            if (n1left < n1recl) {
552                fprintf(stdout,"count: %"_LD_"\n",count);
553                fprintf(stdout,"ibufsize: %d\n",ibufsize);
554                fprintf(stdout,"n1: %d\n",n1);
555                erro("esperava mais bytes no arquivo de entrada",NULL);
556                }
557/*0         strncpy(&ibuf[n1],bufin,n1recl); */
558            for (p=ibuf+n1, q=bufin, loop=n1recl; loop--; )  *p++ = *q++;
559            n1+=n1recl;
560            n1left-=n1recl;
561            i1left+=n1recl;
562        }
563        else
564            n1=EOF;
565    }
566
567    if (parmconv) {
568/* for (q=ibuf, loop=ibufsize; loop--; q++)
569putchar(*q); */
570        for (q=ibuf, loop=ibufsize; loop--; q++) {
571            i=((*q)>>4);
572            j=((*q)&0x0F);
573            *q = ebctoasc[i][j];
574        }
575/* for (q=ibuf, loop=ibufsize; loop--; q++)
576putchar(*q);
577getchar(); */
578    }
579
580    return(n1);
581}
582
583
584void writbsiz()                                                          /*
585---------                                                           */
586
587{
588    int n2;
589    CHAR *p,*q;
590    int loop;
591
592/*+++
593    write(f2,obuf,obufsize);
594    return;
595+++*/
596
597    if (n2free >= obufsize) {
598/*0     strncpy(&bufout[i2free],obuf,obufsize); */
599        for (p=bufout+i2free, q=obuf, loop=obufsize; loop--; )  *p++ = *q++;
600        n2free-=obufsize;
601        i2free+=obufsize;
602    }
603    else {
604/*0     strncpy(&bufout[i2free],obuf,n2free); */
605        for (p=bufout+i2free, q=obuf, loop=n2free; loop--; )  *p++ = *q++;
606        n2=write(f2,bufout,MBUFSIZ);
607        if (n2 < MBUFSIZ)
608            erro("writbsiz - ","erro na gravacao");
609        i2free=obufsize-n2free;
610/*0     strncpy(bufout,&obuf[n2free],i2free); */
611        for (p=bufout, q=obuf+n2free, loop=i2free; loop--; )  *p++ = *q++;
612        n2free=MBUFSIZ-i2free;
613    }
614}
615
616
617void breakout()                                                      /*
618---------                                                       */
619
620{
621    int n2;
622
623/*+++
624    return;
625+++*/
626
627    if (i2free) if (f2) { /* AOT, 14/08/2001 */
628        n2=write(f2,bufout,i2free);
629        if (n2 < i2free)
630            erro("breakout - ","erro na gravacao");
631    }
632}
633
634
635void erro(s1,s2)     /* imprime mensagem de erro e morre */
636CHAR *s1,*s2;
637{
638    fprintf(stderr,
639        "dx0: %s%s\n",s1,s2);
640
641    breakout();
642
643    exit(1);
644}
Note: See TracBrowser for help on using the browser.