12487Sdlw /* 2*18014Slibs char id_dofio[] = "@(#)dofio.c 1.7"; 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) 112487Sdlw #define STKSZ 10 122487Sdlw int cnt[STKSZ],ret[STKSZ],cp,rp; 132487Sdlw char *dfio = "dofio"; 14*18014Slibs int used_data; 152487Sdlw 162487Sdlw en_fio() 172487Sdlw { ftnint one=1; 184054Sdlw return(do_fio(&one,NULL,0L)); 192487Sdlw } 202487Sdlw 2117977Slibs /* OP_TYPE_TAB is defined in format.h, 2217977Slibs it is NED for X,SLASH,APOS,H,TL,TR,T 2317977Slibs ED for I,IM,F,E,EE,D,DE,G,GE,L,A,AW 2417977Slibs and returns op for other values 2517977Slibs */ 2617977Slibs static int optypes[] = { OP_TYPE_TAB }; 2717967Slibs static int rep_count, in_mid; 2817967Slibs 292487Sdlw do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; 302487Sdlw { struct syl *p; 3117977Slibs int n,i,more,optype; 322487Sdlw more = *number; 3317977Slibs for(;;) { 3417977Slibs if( (optype = ((p= &syl_ptr[pc])->op)) > LAST_TERM ) 3517977Slibs err(errflag,F_ERFMT,"impossible code"); 3617977Slibs #ifdef DEBUG 3717977Slibs fprintf(stderr," pc=%d, cnt[%d]=%d, ret[%d]=%d, op=%d\n", 3817977Slibs pc,cp,cnt[cp],rp,ret[rp],optype); /*for debug*/ 3917977Slibs #endif 4017977Slibs switch(optypes[optype]) 4117977Slibs { 4217977Slibs case NED: 432487Sdlw DO((*doned)(p,ptr)) 442487Sdlw pc++; 452487Sdlw break; 4617977Slibs case ED: 4717967Slibs if(in_mid == NO) rep_count = p->rpcnt; 4817967Slibs in_mid = YES; 4917967Slibs while (rep_count > 0 ) { 5017967Slibs if(ptr==NULL) 5117967Slibs { DO((*doend)('\n')) 522487Sdlw return(OK); 5317967Slibs } 5417967Slibs if(!more) return(OK); 55*18014Slibs used_data = YES; 5617967Slibs DO((*doed)(p,ptr,len)) 5717967Slibs ptr += len; 5817967Slibs more--; 5917967Slibs rep_count--; 602487Sdlw } 6117967Slibs pc++; 6217967Slibs in_mid = NO; 632487Sdlw break; 6417977Slibs case STACK: /* repeat count */ 652585Sdlw if(++cp==STKSZ) err(errflag,F_ERFMT,"too many nested ()") 662487Sdlw cnt[cp]=p->p1; 672487Sdlw pc++; 682487Sdlw break; 6917977Slibs case RET: /* open paren */ 702585Sdlw if(++rp==STKSZ) err(errflag,F_ERFMT,"too many nested ()") 712487Sdlw ret[rp]=p->p1; 722487Sdlw pc++; 732487Sdlw break; 7417977Slibs case GOTO: /* close paren */ 752487Sdlw if(--cnt[cp]<=0) 762487Sdlw { cp--; 772487Sdlw rp--; 782487Sdlw pc++; 792487Sdlw } 802487Sdlw else pc = ret[rp--] + 1; 812487Sdlw break; 8217977Slibs case REVERT: /* end of format */ 832487Sdlw if(ptr==NULL) 842487Sdlw { DO((*doend)('\n')) 852487Sdlw return(OK); 862487Sdlw } 872487Sdlw if(!more) return(OK); 88*18014Slibs if( used_data == NO ) err(errflag,F_ERFMT,"\nNo more editing terms in format"); 89*18014Slibs used_data = NO; 902487Sdlw rp=cp=0; 912487Sdlw pc = p->p1; 922487Sdlw DO((*dorevert)()) 932487Sdlw break; 9417977Slibs case COLON: 952487Sdlw #ifndef KOSHER 9617977Slibs case DOLAR: /*** NOT STANDARD FORTRAN ***/ 972487Sdlw #endif 982487Sdlw if (ptr == NULL) 992487Sdlw { DO((*doend)((char)p->p1)) 1002487Sdlw return(OK); 1012487Sdlw } 1022487Sdlw if (!more) return(OK); 1032487Sdlw pc++; 1042487Sdlw break; 1052487Sdlw #ifndef KOSHER 10617977Slibs case SU: /*** NOT STANDARD FORTRAN ***/ 1072487Sdlw #endif 10817977Slibs case SS: 10917977Slibs case SP: 11017977Slibs case S: cplus = p->p1; 1112487Sdlw signit = p->p2; 1122487Sdlw pc++; 1132487Sdlw break; 11417977Slibs case P: 1152487Sdlw scale = p->p1; 1162487Sdlw pc++; 1172487Sdlw break; 1182487Sdlw #ifndef KOSHER 11917977Slibs case R: /*** NOT STANDARD FORTRAN ***/ 1202487Sdlw radix = p->p1; 1212487Sdlw pc++; 1222487Sdlw break; 12317977Slibs case B: /*** NOT STANDARD FORTRAN ***/ 12417877Sdlw if (external) cblank = curunit->ublnk; 12517877Sdlw else cblank = 0; /* blank = 'NULL' */ 12617877Sdlw pc++; 12717877Sdlw break; 1282487Sdlw #endif 12917977Slibs case BNZ: 1302487Sdlw cblank = p->p1; 1312487Sdlw pc++; 1322487Sdlw break; 13317977Slibs default: 1342585Sdlw err(errflag,F_ERFMT,"impossible code") 13517977Slibs } 1362487Sdlw } 1372487Sdlw } 1382487Sdlw 1392487Sdlw fmt_bg() 1402487Sdlw { 14117967Slibs in_mid = NO; 1422487Sdlw cp=rp=pc=cursor=0; 1432487Sdlw cnt[0]=ret[0]=0; 144*18014Slibs used_data = NO; 1452487Sdlw } 146