12487Sdlw /* 2*19917Slibs char id_dofio[] = "@(#)dofio.c 1.8"; 32487Sdlw * 42487Sdlw * fortran format executer 52487Sdlw */ 62487Sdlw 72487Sdlw #include "fio.h" 82585Sdlw #include "format.h" 92487Sdlw 102487Sdlw #define DO(x) if(n=x) err(n>0?errflag:endflag,n,dfio) 11*19917Slibs #define DO_F(x) if(n=x) err_f(n>0?errflag:endflag,n,dfio) 12*19917Slibs #define err_f(f,n,s) {if(f) return(dof_err(n)); else fatal(n,s);} 132487Sdlw #define STKSZ 10 142487Sdlw int cnt[STKSZ],ret[STKSZ],cp,rp; 152487Sdlw char *dfio = "dofio"; 1618014Slibs int used_data; 172487Sdlw 182487Sdlw en_fio() 192487Sdlw { ftnint one=1; 204054Sdlw return(do_fio(&one,NULL,0L)); 212487Sdlw } 222487Sdlw 2317977Slibs /* OP_TYPE_TAB is defined in format.h, 2417977Slibs it is NED for X,SLASH,APOS,H,TL,TR,T 2517977Slibs ED for I,IM,F,E,EE,D,DE,G,GE,L,A,AW 2617977Slibs and returns op for other values 2717977Slibs */ 2817977Slibs static int optypes[] = { OP_TYPE_TAB }; 2917967Slibs static int rep_count, in_mid; 3017967Slibs 312487Sdlw do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; 322487Sdlw { struct syl *p; 3317977Slibs int n,i,more,optype; 342487Sdlw more = *number; 3517977Slibs for(;;) { 3617977Slibs if( (optype = ((p= &syl_ptr[pc])->op)) > LAST_TERM ) 37*19917Slibs err_f(errflag,F_ERFMT,"impossible code"); 3817977Slibs #ifdef DEBUG 3917977Slibs fprintf(stderr," pc=%d, cnt[%d]=%d, ret[%d]=%d, op=%d\n", 4017977Slibs pc,cp,cnt[cp],rp,ret[rp],optype); /*for debug*/ 4117977Slibs #endif 4217977Slibs switch(optypes[optype]) 4317977Slibs { 4417977Slibs case NED: 45*19917Slibs DO_F((*doned)(p,ptr)) 462487Sdlw pc++; 472487Sdlw break; 4817977Slibs case ED: 4917967Slibs if(in_mid == NO) rep_count = p->rpcnt; 5017967Slibs in_mid = YES; 5117967Slibs while (rep_count > 0 ) { 5217967Slibs if(ptr==NULL) 5317967Slibs { DO((*doend)('\n')) 542487Sdlw return(OK); 5517967Slibs } 5617967Slibs if(!more) return(OK); 5718014Slibs used_data = YES; 58*19917Slibs DO_F((*doed)(p,ptr,len)) 5917967Slibs ptr += len; 6017967Slibs more--; 6117967Slibs rep_count--; 622487Sdlw } 6317967Slibs pc++; 6417967Slibs in_mid = NO; 652487Sdlw break; 6617977Slibs case STACK: /* repeat count */ 67*19917Slibs if(++cp==STKSZ) err_f(errflag,F_ERFMT,"too many nested ()") 682487Sdlw cnt[cp]=p->p1; 692487Sdlw pc++; 702487Sdlw break; 7117977Slibs case RET: /* open paren */ 72*19917Slibs if(++rp==STKSZ) err_f(errflag,F_ERFMT,"too many nested ()") 732487Sdlw ret[rp]=p->p1; 742487Sdlw pc++; 752487Sdlw break; 7617977Slibs case GOTO: /* close paren */ 772487Sdlw if(--cnt[cp]<=0) 782487Sdlw { cp--; 792487Sdlw rp--; 802487Sdlw pc++; 812487Sdlw } 822487Sdlw else pc = ret[rp--] + 1; 832487Sdlw break; 8417977Slibs case REVERT: /* end of format */ 852487Sdlw if(ptr==NULL) 862487Sdlw { DO((*doend)('\n')) 872487Sdlw return(OK); 882487Sdlw } 892487Sdlw if(!more) return(OK); 90*19917Slibs if( used_data == NO ) err_f(errflag,F_ERFMT,"\nNo more editing terms in format"); 9118014Slibs used_data = NO; 922487Sdlw rp=cp=0; 932487Sdlw pc = p->p1; 942487Sdlw DO((*dorevert)()) 952487Sdlw break; 9617977Slibs case COLON: 972487Sdlw #ifndef KOSHER 9817977Slibs case DOLAR: /*** NOT STANDARD FORTRAN ***/ 992487Sdlw #endif 1002487Sdlw if (ptr == NULL) 1012487Sdlw { DO((*doend)((char)p->p1)) 1022487Sdlw return(OK); 1032487Sdlw } 1042487Sdlw if (!more) return(OK); 1052487Sdlw pc++; 1062487Sdlw break; 1072487Sdlw #ifndef KOSHER 10817977Slibs case SU: /*** NOT STANDARD FORTRAN ***/ 1092487Sdlw #endif 11017977Slibs case SS: 11117977Slibs case SP: 11217977Slibs case S: cplus = p->p1; 1132487Sdlw signit = p->p2; 1142487Sdlw pc++; 1152487Sdlw break; 11617977Slibs case P: 1172487Sdlw scale = p->p1; 1182487Sdlw pc++; 1192487Sdlw break; 1202487Sdlw #ifndef KOSHER 12117977Slibs case R: /*** NOT STANDARD FORTRAN ***/ 1222487Sdlw radix = p->p1; 1232487Sdlw pc++; 1242487Sdlw break; 12517977Slibs case B: /*** NOT STANDARD FORTRAN ***/ 12617877Sdlw if (external) cblank = curunit->ublnk; 12717877Sdlw else cblank = 0; /* blank = 'NULL' */ 12817877Sdlw pc++; 12917877Sdlw break; 1302487Sdlw #endif 13117977Slibs case BNZ: 1322487Sdlw cblank = p->p1; 1332487Sdlw pc++; 1342487Sdlw break; 13517977Slibs default: 136*19917Slibs err_f(errflag,F_ERFMT,"impossible code") 13717977Slibs } 1382487Sdlw } 1392487Sdlw } 1402487Sdlw 1412487Sdlw fmt_bg() 1422487Sdlw { 14317967Slibs in_mid = NO; 1442487Sdlw cp=rp=pc=cursor=0; 1452487Sdlw cnt[0]=ret[0]=0; 14618014Slibs used_data = NO; 1472487Sdlw } 148*19917Slibs 149*19917Slibs static 150*19917Slibs dof_err(n) 151*19917Slibs { 152*19917Slibs if( reading==YES && external==YES && sequential==YES) donewrec(); 153*19917Slibs return(errno=n); 154*19917Slibs } 155