xref: /csrg-svn/usr.bin/f77/libI77/dofio.c (revision 47943)
1*47943Sbostic /*-
2*47943Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47943Sbostic  * All rights reserved.
42487Sdlw  *
5*47943Sbostic  * %sccs.include.proprietary.c%
623068Skre  */
723068Skre 
8*47943Sbostic #ifndef lint
9*47943Sbostic static char sccsid[] = "@(#)dofio.c	5.3 (Berkeley) 04/12/91";
10*47943Sbostic #endif /* not lint */
11*47943Sbostic 
1223068Skre /*
132487Sdlw  * fortran format executer
142487Sdlw  */
152487Sdlw 
162487Sdlw #include "fio.h"
172585Sdlw #include "format.h"
182487Sdlw 
192487Sdlw #define DO(x)	if(n=x) err(n>0?errflag:endflag,n,dfio)
2019917Slibs #define DO_F(x)	if(n=x) err_f(n>0?errflag:endflag,n,dfio)
2119917Slibs #define err_f(f,n,s)	{if(f) return(dof_err(n)); else fatal(n,s);}
222487Sdlw #define STKSZ 10
2320984Slibs LOCAL int cnt[STKSZ],ret[STKSZ],cp,rp;
2420984Slibs LOCAL char *dfio = "dofio";
2518014Slibs int used_data;
262487Sdlw 
en_fio()272487Sdlw en_fio()
282487Sdlw {	ftnint one=1;
294054Sdlw 	return(do_fio(&one,NULL,0L));
302487Sdlw }
312487Sdlw 
3217977Slibs /* OP_TYPE_TAB is defined in format.h,
3317977Slibs 		  it is NED for X,SLASH,APOS,H,TL,TR,T
3417977Slibs 		  ED  for I,IM,F,E,EE,D,DE,G,GE,L,A,AW
3517977Slibs 		  and returns op for other values
3617977Slibs  */
3733086Sbostic LOCAL int optypes[] = OP_TYPE_TAB;
3820984Slibs LOCAL int rep_count, in_mid;
3917967Slibs 
do_fio(number,ptr,len)402487Sdlw do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
412487Sdlw {	struct syl *p;
4217977Slibs 	int n,i,more,optype;
432487Sdlw 	more = *number;
4417977Slibs 	for(;;) {
4517977Slibs 	  if( (optype = ((p= &syl_ptr[pc])->op)) > LAST_TERM )
4619917Slibs 		err_f(errflag,F_ERFMT,"impossible code");
4717977Slibs #ifdef DEBUG
4817977Slibs 	  fprintf(stderr," pc=%d, cnt[%d]=%d, ret[%d]=%d, op=%d\n",
4917977Slibs 		pc,cp,cnt[cp],rp,ret[rp],optype); /*for debug*/
5017977Slibs #endif
5117977Slibs 	  switch(optypes[optype])
5217977Slibs 	  {
5317977Slibs 	  case NED:
5419917Slibs 		DO_F((*doned)(p,ptr))
552487Sdlw 		pc++;
562487Sdlw 		break;
5717977Slibs 	  case ED:
5817967Slibs 		if(in_mid == NO) rep_count = p->rpcnt;
5917967Slibs 		in_mid = YES;
6017967Slibs 		while (rep_count > 0 ) {
6117967Slibs 		    if(ptr==NULL)
6217967Slibs 		    {	DO((*doend)('\n'))
632487Sdlw 			return(OK);
6417967Slibs 		    }
6517967Slibs 		    if(!more) return(OK);
6618014Slibs 		    used_data = YES;
6719917Slibs 		    DO_F((*doed)(p,ptr,len))
6817967Slibs 		    ptr += len;
6917967Slibs 		    more--;
7017967Slibs 		    rep_count--;
712487Sdlw 		}
7217967Slibs 		pc++;
7317967Slibs 		in_mid = NO;
742487Sdlw 		break;
7517977Slibs 	  case STACK:		/* repeat count */
7619917Slibs 		if(++cp==STKSZ) err_f(errflag,F_ERFMT,"too many nested ()")
772487Sdlw 		cnt[cp]=p->p1;
782487Sdlw 		pc++;
792487Sdlw 		break;
8017977Slibs 	  case RET:		/* open paren */
8119917Slibs 		if(++rp==STKSZ) err_f(errflag,F_ERFMT,"too many nested ()")
822487Sdlw 		ret[rp]=p->p1;
832487Sdlw 		pc++;
842487Sdlw 		break;
8517977Slibs 	  case GOTO:		/* close paren */
862487Sdlw 		if(--cnt[cp]<=0)
872487Sdlw 		{	cp--;
882487Sdlw 			rp--;
892487Sdlw 			pc++;
902487Sdlw 		}
912487Sdlw 		else pc = ret[rp--] + 1;
922487Sdlw 		break;
9317977Slibs 	  case REVERT:		/* end of format */
942487Sdlw 		if(ptr==NULL)
952487Sdlw 		{	DO((*doend)('\n'))
962487Sdlw 			return(OK);
972487Sdlw 		}
982487Sdlw 		if(!more) return(OK);
9919917Slibs 		if( used_data == NO ) err_f(errflag,F_ERFMT,"\nNo more editing terms in format");
10018014Slibs 		used_data = NO;
1012487Sdlw 		rp=cp=0;
1022487Sdlw 		pc = p->p1;
1032487Sdlw 		DO((*dorevert)())
1042487Sdlw 		break;
10517977Slibs 	  case COLON:
1062487Sdlw #ifndef KOSHER
10717977Slibs 	  case DOLAR:				/*** NOT STANDARD FORTRAN ***/
1082487Sdlw #endif
1092487Sdlw 		if (ptr == NULL)
1102487Sdlw 		{	DO((*doend)((char)p->p1))
1112487Sdlw 			return(OK);
1122487Sdlw 		}
1132487Sdlw 		if (!more) return(OK);
1142487Sdlw 		pc++;
1152487Sdlw 		break;
1162487Sdlw #ifndef KOSHER
11717977Slibs 	  case SU:				/*** NOT STANDARD FORTRAN ***/
1182487Sdlw #endif
11917977Slibs 	  case SS:
12017977Slibs 	  case SP:
12117977Slibs 	  case S: cplus = p->p1;
1222487Sdlw 		signit = p->p2;
1232487Sdlw 		pc++;
1242487Sdlw 		break;
12517977Slibs 	  case P:
1262487Sdlw 		scale = p->p1;
1272487Sdlw 		pc++;
1282487Sdlw 		break;
1292487Sdlw #ifndef KOSHER
13017977Slibs 	  case R:					/*** NOT STANDARD FORTRAN ***/
1312487Sdlw 		radix = p->p1;
1322487Sdlw 		pc++;
1332487Sdlw 		break;
13417977Slibs 	  case B:					/*** NOT STANDARD FORTRAN ***/
13517877Sdlw 		if (external) cblank = curunit->ublnk;
13617877Sdlw 		else cblank = 0;		/* blank = 'NULL' */
13717877Sdlw 		pc++;
13817877Sdlw 		break;
1392487Sdlw #endif
14017977Slibs 	  case BNZ:
1412487Sdlw 		cblank = p->p1;
1422487Sdlw 		pc++;
1432487Sdlw 		break;
14417977Slibs 	  default:
14519917Slibs 		err_f(errflag,F_ERFMT,"impossible code")
14617977Slibs 	  }
1472487Sdlw 	}
1482487Sdlw }
1492487Sdlw 
fmt_bg()1502487Sdlw fmt_bg()
1512487Sdlw {
15217967Slibs 	in_mid = NO;
1532487Sdlw 	cp=rp=pc=cursor=0;
1542487Sdlw 	cnt[0]=ret[0]=0;
15518014Slibs 	used_data = NO;
1562487Sdlw }
15719917Slibs 
15820984Slibs LOCAL
dof_err(n)15919917Slibs dof_err(n)
16019917Slibs {
16119917Slibs 	if( reading==YES && external==YES && sequential==YES) donewrec();
16219917Slibs 	return(errno=n);
16319917Slibs }
164