12487Sdlw /* 2*17967Slibs char id_dofio[] = "@(#)dofio.c 1.5"; 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"; 142487Sdlw 152487Sdlw en_fio() 162487Sdlw { ftnint one=1; 174054Sdlw return(do_fio(&one,NULL,0L)); 182487Sdlw } 192487Sdlw 20*17967Slibs static int rep_count, in_mid; 21*17967Slibs 222487Sdlw do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; 232487Sdlw { struct syl *p; 242487Sdlw int n,i,more; 252487Sdlw more = *number; 262487Sdlw for(;;) 27*17967Slibs switch(type_f((p= &syl_ptr[pc])->op)) 282487Sdlw { 292487Sdlw case NED: 302487Sdlw DO((*doned)(p,ptr)) 312487Sdlw pc++; 322487Sdlw break; 332487Sdlw case ED: 34*17967Slibs if(in_mid == NO) rep_count = p->rpcnt; 35*17967Slibs in_mid = YES; 36*17967Slibs while (rep_count > 0 ) { 37*17967Slibs if(ptr==NULL) 38*17967Slibs { DO((*doend)('\n')) 392487Sdlw return(OK); 40*17967Slibs } 41*17967Slibs if(!more) return(OK); 42*17967Slibs DO((*doed)(p,ptr,len)) 43*17967Slibs ptr += len; 44*17967Slibs more--; 45*17967Slibs rep_count--; 462487Sdlw } 47*17967Slibs pc++; 48*17967Slibs in_mid = NO; 492487Sdlw break; 502487Sdlw case STACK: /* repeat count */ 512585Sdlw if(++cp==STKSZ) err(errflag,F_ERFMT,"too many nested ()") 522487Sdlw cnt[cp]=p->p1; 532487Sdlw pc++; 542487Sdlw break; 552487Sdlw case RET: /* open paren */ 562585Sdlw if(++rp==STKSZ) err(errflag,F_ERFMT,"too many nested ()") 572487Sdlw ret[rp]=p->p1; 582487Sdlw pc++; 592487Sdlw break; 602487Sdlw case GOTO: /* close paren */ 612487Sdlw if(--cnt[cp]<=0) 622487Sdlw { cp--; 632487Sdlw rp--; 642487Sdlw pc++; 652487Sdlw } 662487Sdlw else pc = ret[rp--] + 1; 672487Sdlw break; 682487Sdlw case REVERT: /* end of format */ 692487Sdlw if(ptr==NULL) 702487Sdlw { DO((*doend)('\n')) 712487Sdlw return(OK); 722487Sdlw } 732487Sdlw if(!more) return(OK); 742487Sdlw rp=cp=0; 752487Sdlw pc = p->p1; 762487Sdlw DO((*dorevert)()) 772487Sdlw break; 782487Sdlw case COLON: 792487Sdlw #ifndef KOSHER 802487Sdlw case DOLAR: /*** NOT STANDARD FORTRAN ***/ 812487Sdlw #endif 822487Sdlw if (ptr == NULL) 832487Sdlw { DO((*doend)((char)p->p1)) 842487Sdlw return(OK); 852487Sdlw } 862487Sdlw if (!more) return(OK); 872487Sdlw pc++; 882487Sdlw break; 892487Sdlw #ifndef KOSHER 902487Sdlw case SU: /*** NOT STANDARD FORTRAN ***/ 912487Sdlw #endif 922487Sdlw case SS: 932487Sdlw case SP: 942487Sdlw case S: cplus = p->p1; 952487Sdlw signit = p->p2; 962487Sdlw pc++; 972487Sdlw break; 982487Sdlw case P: 992487Sdlw scale = p->p1; 1002487Sdlw pc++; 1012487Sdlw break; 1022487Sdlw #ifndef KOSHER 1032487Sdlw case R: /*** NOT STANDARD FORTRAN ***/ 1042487Sdlw radix = p->p1; 1052487Sdlw pc++; 1062487Sdlw break; 10717877Sdlw case B: /*** NOT STANDARD FORTRAN ***/ 10817877Sdlw if (external) cblank = curunit->ublnk; 10917877Sdlw else cblank = 0; /* blank = 'NULL' */ 11017877Sdlw pc++; 11117877Sdlw break; 1122487Sdlw #endif 11317877Sdlw case BNZ: 1142487Sdlw cblank = p->p1; 1152487Sdlw pc++; 1162487Sdlw break; 1172487Sdlw default: 1182585Sdlw err(errflag,F_ERFMT,"impossible code") 1192487Sdlw } 1202487Sdlw } 1212487Sdlw 1222487Sdlw fmt_bg() 1232487Sdlw { 124*17967Slibs in_mid = NO; 1252487Sdlw cp=rp=pc=cursor=0; 1262487Sdlw cnt[0]=ret[0]=0; 1272487Sdlw } 1282487Sdlw 1292487Sdlw type_f(n) 1302487Sdlw { 1312487Sdlw #ifdef DEBUG 1322487Sdlw fprintf(stderr," pc=%d, cnt[%d]=%d, ret[%d]=%d, op=%d\n", 1332487Sdlw pc,cp,cnt[cp],rp,ret[rp],n); /*for debug*/ 1342487Sdlw #endif 1352487Sdlw switch(n) 1362487Sdlw { 1372487Sdlw case X: /* non-editing specifications */ 1382487Sdlw case SLASH: 1392487Sdlw case APOS: case H: 1402487Sdlw case T: case TL: case TR: 1412487Sdlw return(NED); 1422487Sdlw 1432487Sdlw case F: /* editing conversions */ 1442487Sdlw case I: case IM: 1452487Sdlw case A: case AW: 1462487Sdlw case L: 1472487Sdlw case E: case EE: case D: case DE: 1482487Sdlw case G: case GE: 1492487Sdlw return(ED); 1502487Sdlw 1512487Sdlw default: return(n); 1522487Sdlw } 1532487Sdlw } 154