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