xref: /csrg-svn/usr.bin/f77/libI77/dofio.c (revision 18014)
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