12487Sdlw /* 223068Skre * Copyright (c) 1980 Regents of the University of California. 323068Skre * All rights reserved. The Berkeley software License Agreement 423068Skre * specifies the terms and conditions for redistribution. 52487Sdlw * 6*33086Sbostic * @(#)dofio.c 5.2 12/21/87 723068Skre */ 823068Skre 923068Skre /* 102487Sdlw * fortran format executer 112487Sdlw */ 122487Sdlw 132487Sdlw #include "fio.h" 142585Sdlw #include "format.h" 152487Sdlw 162487Sdlw #define DO(x) if(n=x) err(n>0?errflag:endflag,n,dfio) 1719917Slibs #define DO_F(x) if(n=x) err_f(n>0?errflag:endflag,n,dfio) 1819917Slibs #define err_f(f,n,s) {if(f) return(dof_err(n)); else fatal(n,s);} 192487Sdlw #define STKSZ 10 2020984Slibs LOCAL int cnt[STKSZ],ret[STKSZ],cp,rp; 2120984Slibs LOCAL char *dfio = "dofio"; 2218014Slibs int used_data; 232487Sdlw 242487Sdlw en_fio() 252487Sdlw { ftnint one=1; 264054Sdlw return(do_fio(&one,NULL,0L)); 272487Sdlw } 282487Sdlw 2917977Slibs /* OP_TYPE_TAB is defined in format.h, 3017977Slibs it is NED for X,SLASH,APOS,H,TL,TR,T 3117977Slibs ED for I,IM,F,E,EE,D,DE,G,GE,L,A,AW 3217977Slibs and returns op for other values 3317977Slibs */ 34*33086Sbostic LOCAL int optypes[] = OP_TYPE_TAB; 3520984Slibs LOCAL int rep_count, in_mid; 3617967Slibs 372487Sdlw do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; 382487Sdlw { struct syl *p; 3917977Slibs int n,i,more,optype; 402487Sdlw more = *number; 4117977Slibs for(;;) { 4217977Slibs if( (optype = ((p= &syl_ptr[pc])->op)) > LAST_TERM ) 4319917Slibs err_f(errflag,F_ERFMT,"impossible code"); 4417977Slibs #ifdef DEBUG 4517977Slibs fprintf(stderr," pc=%d, cnt[%d]=%d, ret[%d]=%d, op=%d\n", 4617977Slibs pc,cp,cnt[cp],rp,ret[rp],optype); /*for debug*/ 4717977Slibs #endif 4817977Slibs switch(optypes[optype]) 4917977Slibs { 5017977Slibs case NED: 5119917Slibs DO_F((*doned)(p,ptr)) 522487Sdlw pc++; 532487Sdlw break; 5417977Slibs case ED: 5517967Slibs if(in_mid == NO) rep_count = p->rpcnt; 5617967Slibs in_mid = YES; 5717967Slibs while (rep_count > 0 ) { 5817967Slibs if(ptr==NULL) 5917967Slibs { DO((*doend)('\n')) 602487Sdlw return(OK); 6117967Slibs } 6217967Slibs if(!more) return(OK); 6318014Slibs used_data = YES; 6419917Slibs DO_F((*doed)(p,ptr,len)) 6517967Slibs ptr += len; 6617967Slibs more--; 6717967Slibs rep_count--; 682487Sdlw } 6917967Slibs pc++; 7017967Slibs in_mid = NO; 712487Sdlw break; 7217977Slibs case STACK: /* repeat count */ 7319917Slibs if(++cp==STKSZ) err_f(errflag,F_ERFMT,"too many nested ()") 742487Sdlw cnt[cp]=p->p1; 752487Sdlw pc++; 762487Sdlw break; 7717977Slibs case RET: /* open paren */ 7819917Slibs if(++rp==STKSZ) err_f(errflag,F_ERFMT,"too many nested ()") 792487Sdlw ret[rp]=p->p1; 802487Sdlw pc++; 812487Sdlw break; 8217977Slibs case GOTO: /* close paren */ 832487Sdlw if(--cnt[cp]<=0) 842487Sdlw { cp--; 852487Sdlw rp--; 862487Sdlw pc++; 872487Sdlw } 882487Sdlw else pc = ret[rp--] + 1; 892487Sdlw break; 9017977Slibs case REVERT: /* end of format */ 912487Sdlw if(ptr==NULL) 922487Sdlw { DO((*doend)('\n')) 932487Sdlw return(OK); 942487Sdlw } 952487Sdlw if(!more) return(OK); 9619917Slibs if( used_data == NO ) err_f(errflag,F_ERFMT,"\nNo more editing terms in format"); 9718014Slibs used_data = NO; 982487Sdlw rp=cp=0; 992487Sdlw pc = p->p1; 1002487Sdlw DO((*dorevert)()) 1012487Sdlw break; 10217977Slibs case COLON: 1032487Sdlw #ifndef KOSHER 10417977Slibs case DOLAR: /*** NOT STANDARD FORTRAN ***/ 1052487Sdlw #endif 1062487Sdlw if (ptr == NULL) 1072487Sdlw { DO((*doend)((char)p->p1)) 1082487Sdlw return(OK); 1092487Sdlw } 1102487Sdlw if (!more) return(OK); 1112487Sdlw pc++; 1122487Sdlw break; 1132487Sdlw #ifndef KOSHER 11417977Slibs case SU: /*** NOT STANDARD FORTRAN ***/ 1152487Sdlw #endif 11617977Slibs case SS: 11717977Slibs case SP: 11817977Slibs case S: cplus = p->p1; 1192487Sdlw signit = p->p2; 1202487Sdlw pc++; 1212487Sdlw break; 12217977Slibs case P: 1232487Sdlw scale = p->p1; 1242487Sdlw pc++; 1252487Sdlw break; 1262487Sdlw #ifndef KOSHER 12717977Slibs case R: /*** NOT STANDARD FORTRAN ***/ 1282487Sdlw radix = p->p1; 1292487Sdlw pc++; 1302487Sdlw break; 13117977Slibs case B: /*** NOT STANDARD FORTRAN ***/ 13217877Sdlw if (external) cblank = curunit->ublnk; 13317877Sdlw else cblank = 0; /* blank = 'NULL' */ 13417877Sdlw pc++; 13517877Sdlw break; 1362487Sdlw #endif 13717977Slibs case BNZ: 1382487Sdlw cblank = p->p1; 1392487Sdlw pc++; 1402487Sdlw break; 14117977Slibs default: 14219917Slibs err_f(errflag,F_ERFMT,"impossible code") 14317977Slibs } 1442487Sdlw } 1452487Sdlw } 1462487Sdlw 1472487Sdlw fmt_bg() 1482487Sdlw { 14917967Slibs in_mid = NO; 1502487Sdlw cp=rp=pc=cursor=0; 1512487Sdlw cnt[0]=ret[0]=0; 15218014Slibs used_data = NO; 1532487Sdlw } 15419917Slibs 15520984Slibs LOCAL 15619917Slibs dof_err(n) 15719917Slibs { 15819917Slibs if( reading==YES && external==YES && sequential==YES) donewrec(); 15919917Slibs return(errno=n); 16019917Slibs } 161