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