root/trunk/mxrel.c

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

essage first commit

Line 
1/* ------------------------------ mxrel.c --------------------------------- */
2
3#include <stdio.h>
4#include <string.h>
5#include <ctype.h>
6
7#if 1
8#if CIAPI
9#include "ciapi.h"   /* CISIS Interface API header file -
10                  includes cisis, implements cirun.h and ci*.c using ci*.?pp */
11
12#if !MXFUN
13extern void *ciapip;
14#endif /* MXFUN */
15
16#else /* CIAPI */
17#include "cisis.h"                  /* CISIS Interface */
18#endif /* CIAPI */
19#include "mx.h"                     /* MX Program header file */
20#else
21#include "\cisis\include\cisis.h"   /* CISIS Interface header file */
22#include "\cisis\mx\mx.h"           /* MX Program header file */
23#endif
24
25/* ========================== mp_scan/mp_edit ============================= */
26
27int mp_scan(xmxp,gidbnp,specp)
28void *xmxp;
29char *gidbnp;
30char *specp;
31{
32
33    if (mp_n >= MAXNPPP) fatal("MAXNPPP");
34
35    mp_pgmp[mp_n]=(FMT_CODE *)NULL;
36   
37#if 1 //BEFORE20060309
38    mp_areap=loadfile(gidbnp,'@',specp,mp_areap,fmtasize+1,'\0'); //alloc 1 vez
39    if (!mp_areap) fatal(specp);                      // perde mp_areap se erro
40#else
41    if (!mj_n) {
42        mp_areap=loadfile(NULL,'@',"",NULL,fmtasize+1,'\0');     //alloc
43        if (!mp_areap) fatal("mp_scan/ALLOC");
44    }
45    if (!loadfile(gidbnp,'@',specp,mp_areap,fmtasize+1,'\0')) fatal(specp);
46#endif
47
48    if (parmtrace) {
49        printf("+++ proc=%c",OPENFCHR); printf("%s",mp_areap);
50        printf("%c ..",CLOSFCHR); if (getchar() != '\n') return(1);
51    }
52
53    if (fmt_gener(&mp_pgmp[mp_n],mp_areap)) fatal(specp+fmt_errof);
54
55    mp_n++;
56    return(0);
57}
58
59int mp_edit(xmxp,irec,i1,i2)
60void *xmxp;
61LONGX irec;
62int i1;
63int i2;
64{
65    int ippp;
66    LONGX lns;
67    UBYTE *p;
68    RECSTRU *recp;
69#define MXRELPROC 1
70#if MXRELPROC
71    UBYTE c;
72    LONGX ld,x,xnocc;
73    UWORD tag1,tag2;
74#endif
75
76    recp=vrecp[irec];
77
78    for (ippp=i1; ippp <= i2; ippp++) {
79
80        *mp_areap = '\0';                       /* call format */
81        lns=fmt_inter(mp_pgmp[ippp],irec,fmtasize,mp_areap,fmtasize);
82#if BEFORE20010213
83#else
84        if (lns < 0) fatal("mx/proc/format execution error");
85#endif
86
87        if (parmtrace)
88            printf("+++ proc=%"_LD_"=%s.\n",lns,mp_areap);
89
90#if MXRELPROC
91        if (mp_areap[0] == '.' && toupper(mp_areap[1]) == 'A') {
92            for (p=mp_areap+2, ld=0; *p; p++)
93                if (isdigit(*p)) ld=10*ld+(int)*p-(int)'0';
94                else break;
95            tag1=(UWORD)ld;
96            if (!tag1) fatal(mp_areap);
97            c= *p;
98            switch (c) {
99            case '+':
100            case '-':
101                for (p++, ld=0; *p; p++)
102                    if (isdigit(*p)) ld=10*ld+(int)*p-(int)'0';
103                    else break;
104                tag2=(UWORD)ld;
105                if (!tag2) fatal(mp_areap);
106                if (*p) fatal(mp_areap);
107                p=mp_areap;
108                sprintf(p,"D%"_LD_,(LONGX)tag1); p+=strlen(p);
109                for (xnocc=nocc(irec,tag2), x=1; x <= xnocc; x++) {
110                    sprintf(p,"A%"_LD_"/%"_LD_"/",(LONGX)tag1,(c == '+')?x:xnocc-x+1);
111                    p+=strlen(p);
112                }
113                break;
114            default:
115                fatal(mp_areap);
116            }
117        }
118#endif
119        if ((p=fldupdat(irec,mp_areap)) != NULL)
120            fatal(p);
121
122        if (parmtrace)
123            prtfields(recp,MFRmfn);
124    }
125    return(0);
126}
127
128
129int mp_free(xmxp)
130void *xmxp;
131{
132    while (mp_n--) {
133        if (mp_pgmp[mp_n]) 
134            { fmt_free(mp_pgmp[mp_n]); mp_pgmp[mp_n]=(FMT_CODE *)NULL; }
135    }
136    if (mp_areap) { FREE(mp_areap); mp_areap=(char *)NULL; }
137    mp_n=0;
138    return(0);
139}
140
141
142/* ====================== mj_scan/mj_edit/mj_join ========================= */
143
144int mj_scan(xmxp,gidbnp,dbnamp,specp,parmjchk)
145void *xmxp;
146char *gidbnp;
147char *dbnamp;
148char *specp;
149int parmjchk;
150{
151    char *p;
152    UWORD tag,tag1,tag2;
153    LONGX n1,n2;
154    MJ_TAGS *mj_tagp;
155    MJ_STWS *mj_stwp;
156    char dbname[CIMPL+1];
157    int nstws;
158
159    if (isiswctot <= 0) fatal("mj_scan/isiswctot");
160
161    strcpy(dbname,dbnamp);
162
163    if (mj_n >= MAXNJJJ)
164        fatal("MAXNJJJ");
165
166    mj_vtagp[mj_n]=(MJ_TAGS *)NULL;
167    mj_vstwp[mj_n]=(MJ_STWS *)NULL;
168    mj_pgmp[mj_n]=(FMT_CODE *)NULL;
169    mj_ridx[mj_n]=0;
170    mj_plustag[mj_n]=0; /* AOT 23/04/2005 */
171
172    mj_pjchk[mj_n]=parmjchk;
173
174    for (p=dbname; *p; p++) { /* for p=dbname */
175        if (*p == '+') {
176            *p++ = '\0';
177            mj_stwp=(MJ_STWS *)loadstw(gidbnp,p,(char *)NULL,0L,&nstws);
178            if (!mj_stwp) fatal(p);
179            if (parmtrace) printf("+++ nstws=%d\n",nstws);
180            mj_vstwp[mj_n]=mj_stwp;
181            break;
182        }
183    } /* end for p=dbname */
184
185    mj_tagp=NULL;
186    mj_vtagp[mj_n]=NULL;
187    for (p=dbname; *p; p++) { /* for p=dbname */
188        if (*p == ':') { /* AOT 23/04/2005 */
189            *p++ = '\0';
190            while isdigit(*p) {
191                mj_plustag[mj_n]=mj_plustag[mj_n]*10+((int)(*p)-(int)'0');
192                *p++ = '\0';
193            }
194            if (parmtrace && mj_plustag[mj_n]) {
195                printf("+++ plustag=%"_LD_"\n",mj_plustag[mj_n]);
196            }
197        } /* end AOT 23/04/2005 */
198        if (*p == ',') {
199            *p++ = '\0';
200            mj_tagp=(MJ_TAGS *)ALLOC((ALLOPARM)sizeof(MJ_TAGS));
201            if (mj_tagp == (MJ_TAGS *)ALLONULL)
202                fatal("mj_scan/ALLOC");
203            mj_vtagp[mj_n]=mj_tagp;
204            memset(mj_tagp->tagv,0x00,sizeof(MJ_TAGS));
205            while (*p) {
206                if (sscanf(p,"%"_LD_"/%"_LD_,&n1,&n2) == 2) {
207                    tag1=n1; tag2=n2; /* UWORD */
208                    if (tag1 > tag2) fatal(p);
209                    while (*p != '/') p++; p++;
210                    while (isdigit(*p)) p++;
211                    for (tag=tag1; tag <= tag2; tag++)
212                        if (tag < MAXVTAG) mj_tagp->tagv[tag]=tag;
213                    if (*p == ',') if (*(p+1)) p++;
214                    continue;
215                }
216                if (sscanf(p,"%"_LD_":%"_LD_,&n1,&n2) == 2) {
217                    tag1=n1; tag2=n2; /* UWORD */
218                    while (*p != ':') p++; p++;
219                    while (isdigit(*p)) p++;
220                    if (tag2 < MAXVTAG) mj_tagp->tagv[tag2]=tag1;
221                    if (*p == ',') if (*(p+1)) p++;
222                    continue;
223                }
224                if (sscanf(p,"%"_LD_,&n1) == 1) {
225                    tag=n1; /* UWORD */
226                    while (isdigit(*p)) p++;
227                    if (tag < MAXVTAG) mj_tagp->tagv[tag]=tag;
228                    if (*p == ',') if (*(p+1)) p++;
229                    continue;
230                }
231                fatal(p);
232            }
233            break;
234        }
235    } /* end for p=dbname */
236    if (parmtrace && mj_tagp) {
237        for (tag=0; tag < MAXVTAG; tag++)
238            if (mj_tagp->tagv[tag])
239                printf("+++ tag=%d tagv=%d\n",tag,mj_tagp->tagv[tag]);
240    }
241
242    mj_ridx[mj_n]=nrecs;
243    if (parmjchk) {
244#if BEFORE20010109
245        recallok(mj_ridx[mj_n],MAXMFRL);   /* alloc */
246#else
247        recallok(mj_ridx[mj_n],rec_maxmfrl);   /* alloc */
248#endif
249        VRECdbxp(mj_ridx[mj_n]) = dbxstorp(dbname);
250        VRECtype(mj_ridx[mj_n]) = TYPEMFR;
251    }
252    else {
253        mstsetup(dbname,parmload,parmload);
254        record(mj_ridx[mj_n],dbname,1L);   /* alloc and setup */
255    }
256
257    if (!mj_n) {
258        if (parmjchk)
259            trmalloc(mj_tidx=ntrms,0L);                         /* posting() */
260        else
261            trmalloc(mj_tidx=ntrms,IFBSIZ);
262        if ((mj_areap=(char *)ALLOC((ALLOPARM)(MJASIZE+1))) 
263                        == (char *)ALLONULL) fatal("mj_areap");
264#if BEFORE20010109
265        if ((mj_buffup=(char *)ALLOC((ALLOPARM)(BUFFUPL))) == (char *)ALLONULL)
266#else
267        if ((mj_buffup=(char *)ALLOC((ALLOPARM)mx_buplen)) == (char *)ALLONULL)
268#endif
269            fatal("mj_buffup");
270    }
271
272    if (!loadfile(gidbnp,'@',specp,mj_areap,MJASIZE,'\0')) fatal(specp); /* tmp */
273
274    if (fmt_gener(&mj_pgmp[mj_n],mj_areap)) fatal(specp+fmt_errof);
275
276    if (parmtrace) {
277        printf("+++ join=%c",OPENFCHR);
278        printf("%s",mj_areap); printf("%c ..",CLOSFCHR);
279        if (getchar() != '\n') return(2);
280    }
281
282    mj_n++;
283    return(0);
284}
285
286int mj_edit(xmxp,ridx,i1,i2,tagoff,areapp)
287void *xmxp;
288LONGX ridx;
289int i1;
290int i2;
291int tagoff;
292char **areapp;
293{
294    int ijjj;
295    LONGX lns;
296    char *p,*keyp,*q,word[LE2+1],*sp;
297    int wn,k,isstw,wocc,wcnt,wood;
298    MJ_STWS *mj_stwp;
299
300    for (ijjj=i1; ijjj <= i2; ijjj++) {
301        mj_stwp=mj_vstwp[ijjj];
302        *mj_areap = '\0';                       /* call format */
303        lns=fmt_inter(mj_pgmp[ijjj],ridx,(LONGX)MJASIZE,mj_areap,(LONGX)MJASIZE);
304#if BEFORE20010213
305#else
306        if (lns < 0) fatal("mx/join/format execution error");
307#endif
308
309        if (parmtrace)
310            printf("+++ join=%"_LD_"=%s.\n",lns,mj_areap);
311
312        if (areapp) {
313            *areapp=mj_areap;
314            return(0);
315        }
316
317        for (wocc=0, p=keyp=mj_areap; *keyp; ) {
318            if (*p != '\r')
319                if (*p != '\n')
320                    if (*p) {
321                        p++;
322                        continue;
323                    }
324
325            wocc++;
326
327            while (*p == '\r' || *p == '\n') {
328                *p++ = '\0';
329            }
330
331            if (mj_stwp) {
332                for (wcnt=0, q=keyp, wn=0; ; ) {
333                    if (wn >= LE2) for(; isiswctab[*q]; ) q++;
334                    if (isiswctab[*q]) {
335                        word[wn++] = *q++;
336                        if (*q)
337                            continue;
338                    }
339                    word[wn] = '\0';
340                    while (!isiswctab[*q]) if (!*q) break; else q++;
341                    wood = (wn > LE1) ? 2 : 1;
342                    wcnt++;
343                    if (parmtrace) {
344                        printf("+++ word[%d,%d]=%s\n",wocc,wcnt,word);
345                    }
346                    isstw=0;
347                    if (wood == 1)
348                        for (sp=mj_stwp; *sp; sp+=LE1+1) {
349                            k=memcmp(sp,word,wn+1);
350                            if (k > 0) break;
351                            if (k < 0) continue;
352                            isstw=1; break;
353                        }
354                    if (!isstw) mj_join(xmxp,ridx,ijjj,word,tagoff,wood,wocc,wcnt);
355                    if (!*q) break;
356                    wn=0;
357                }
358            }
359            else {
360                wood = (strlen(keyp) > LE1) ? 2 : 1;
361                mj_join(xmxp,ridx,ijjj,keyp,tagoff,wood,wocc,0);
362            }
363            keyp=p;
364        }
365
366    }
367    return(0);
368}
369
370
371#define FDLM '\n'
372
373int mj_join(xmxp,ridx,ijjj,keyp,tagoff,wood,wocc,wcnt)
374void *xmxp;
375LONGX ridx;
376int ijjj;
377char *keyp;
378int tagoff;
379int wood;
380int wocc;
381int wcnt;
382{
383    RECSTRU *recp;
384    TRMSTRU *trmp;
385
386    int dirloop,xdir,rc;
387    LONGX pmfn,left,x;
388    char *p,*batchp;
389    UWORD tag;
390    MJ_TAGS *mj_tagp;
391    int parmjchk;
392#if JOINALL
393    LONGX joined=0L;
394#endif
395
396    parmjchk=mj_pjchk[ijjj];
397
398    recp=vrecp[mj_ridx[ijjj]]; rc=RCEOF;
399    trmp=vtrmp[mj_tidx]; pmfn=0L;
400
401    if (*keyp) {
402        p=keyp;
403        if (toupper(*p++) == 'M')
404            if (toupper(*p++) == 'F')
405                if (toupper(*p++) == 'N') {
406                    pmfn=atol(p+1);     /* MFN=val or MFN val or etc */
407                }
408        if (pmfn == 0L) {
409            if (parmjchk)
410                invsetup(RDBname,parmload,parmload,-1L); /* jchk= (don't open .ifp) */
411            else
412                invsetup(RDBname,parmload,parmload,parmload); /* join= */
413
414            term(mj_tidx,RDBname,keyp);
415
416            if (TRMrc == RCNORMAL) {
417                if (parmjchk)
418                    pmfn=1L;                                    /* posting() */
419                else
420                    pmfn=posting(mj_tidx,1L);
421            }
422        }
423        if (parmtrace)
424            printf("+++ term=%s=%s: mfn=%"_LD_"\n",RDBname,keyp,pmfn);
425    }
426
427    batchp=mj_buffup; left=mx_buplen;   /* single fldupdat() */
428
429#if JOINALL
430LOOPMFN:
431#endif
432    if (pmfn > 0L) {
433        if (parmjchk) {
434            rc=RCNORMAL;
435            if (fldupdat(mj_ridx[ijjj],"D*") != NULL)
436                fatal("parmjchk/fldupdat");
437            VMFRmfn(mj_ridx[ijjj])=pmfn;
438        }
439        else 
440            rc=VRECrc(record(mj_ridx[ijjj],RDBname,pmfn));
441        if (parmtrace) {
442            printf("mj_ridx=%"_LD_" RDBname=%s pmfn=%"_LD_" rc=%d\n",
443                mj_ridx[ijjj],RDBname,pmfn,rc);
444            prtfields(vrecp[mj_ridx[ijjj]],pmfn);
445        }
446    }
447
448    if (tagoff) {
449        if (left <= MINBJJJ) fatal(keyp);
450        sprintf(batchp,"A%6"_LD_"%c%s^l%d^k",
451            (LONGX)(tagoff+ijjj+1),FDLM,RDBname,wood);
452        batchp+=(x=strlen(batchp)); left-=x;
453        x=strlen(keyp);
454        if (left <= (x+MINBJJJ)) fatal(keyp);
455        memcpy(batchp,keyp,x); batchp+=x; left-=x;
456        if (wocc) {
457            if (left <= MINBJJJ) fatal(keyp);
458            sprintf(batchp,"^o%d",wocc);
459            batchp+=(x=strlen(batchp)); left-=x;
460        }
461        if (wcnt) {
462            if (left <= MINBJJJ) fatal(keyp);
463            sprintf(batchp,"^c%d",wcnt);
464            batchp+=(x=strlen(batchp)); left-=x;
465        }
466        *batchp++ = FDLM; left--;
467    }
468
469    if (parmjchk < 0) {
470        if (tagoff) {
471            if (parmjchk == -1 && rc != RCNORMAL) {
472                *(batchp-1)='\0';
473                printf("%"_LD_"^j%s\n",VMFRmfn(ridx),mj_buffup+1+6+1);
474            }
475            if (parmjchk == -2 && rc == RCNORMAL) {
476                *(batchp-1)='\0';
477                printf("%"_LD_"^j%s\n",VMFRmfn(ridx),mj_buffup+1+6+1);
478            }
479        }
480        return(0);
481    }
482
483    if (rc == RCNORMAL) {
484
485        if (tagoff) {
486            batchp--; left++;
487            if (left <= MINBJJJ) fatal(keyp);
488            sprintf(batchp,"^m%"_LD_"%c",MFRmfn,FDLM);
489            batchp+=(x=strlen(batchp)); left-=x;
490        }
491
492        mj_tagp=mj_vtagp[ijjj];
493
494        for (xdir=0, dirloop=MFRnvf; dirloop--; xdir++) {
495
496            tag=DIRtag(xdir);
497
498            if (mj_tagp) {
499                if (tag >= MAXVTAG) continue;
500                tag=mj_tagp->tagv[tag];
501                if (tag <= 0) continue;
502                if (parmtrace)
503                    printf("+++ %s %"_LD_" (%d) - tag=%d tagv=%d\n",
504                        RDBname,MFRmfn,MFRnvf,tag,mj_tagp->tagv[tag]);
505            }
506            if (left <= MINBJJJ) fatal(keyp);
507            sprintf(batchp,"H%"_LD_" %"_LD_" ",(LONGX)tag+mj_plustag[ijjj],(LONGX)DIRlen(xdir));
508            batchp+=(x=strlen(batchp)); left-=x;
509            if (left <= (x=DIRlen(xdir))) fatal(keyp);
510            memcpy(batchp,FIELDP(xdir),x); batchp+=x; left-=x;
511        }
512#if JOINALL
513        if (!parmjchk)
514            while ((pmfn=posting(mj_tidx,TRMpost+1)) > 0)
515                if (VRECrc(record(mj_ridx[ijjj],RDBname,pmfn)) == RCNORMAL) {
516                    if (mj_jmax)
517                        if (++joined >= mj_jmax) break;
518                    if (parmtrace)
519                        printf("+++ post=%s=%s: mfn=%"_LD_"\n",RDBname,keyp,pmfn);
520                    goto LOOPMFN;
521                }
522#endif
523    }
524
525    *batchp = '\0';
526    if ((p=fldupdat(ridx,mj_buffup)) != NULL)
527        fatal(p);
528
529    return(0);
530}
531
532int mj_free(xmxp)
533void *xmxp;
534{
535    while (mj_n--) {
536        if (mj_vtagp[mj_n]) { FREE(mj_vtagp[mj_n]); mj_vtagp[mj_n]=(MJ_TAGS *)NULL; }
537        if (mj_vstwp[mj_n]) { FREE(mj_vstwp[mj_n]); mj_vstwp[mj_n]=(MJ_STWS *)NULL; }
538        if (mj_pgmp[mj_n]) { fmt_free(mj_pgmp[mj_n]); mj_pgmp[mj_n]=(FMT_CODE *)NULL; }
539        if (mj_ridx[mj_n]) {
540#if CIAPI
541            FREE(vrecp[mj_ridx[mj_n]]); vrecp[mj_ridx[mj_n]]=NULL; nrecs-=1;
542#else /* CIAPI */
543            FREE(vrecp[mj_ridx[mj_n]]); vrecp[mj_ridx[mj_n]]=NULL; nrecs--;
544#endif /* CIAPI */
545        }
546    }
547    if (mj_tidx) {
548#if CIAPI
549            FREE(vtrmp[mj_tidx]); vtrmp[mj_tidx]=NULL; ntrms-=1;
550#else /* CIAPI */
551            FREE(vtrmp[mj_tidx]); vtrmp[mj_tidx]=NULL; ntrms--;
552#endif /* CIAPI */
553    }
554    if (mj_areap) { FREE(mj_areap); mj_areap=(char *)NULL; }
555    if (mj_buffup) { FREE(mj_buffup); mj_buffup=(char *)NULL; }
556    mj_n=0;
557    return(0);
558}
Note: See TracBrowser for help on using the browser.