xref: /csrg-svn/usr.bin/f77/libI77/dofio.c (revision 17967)
12487Sdlw /*
2*17967Slibs char id_dofio[] = "@(#)dofio.c	1.5";
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";
142487Sdlw 
152487Sdlw en_fio()
162487Sdlw {	ftnint one=1;
174054Sdlw 	return(do_fio(&one,NULL,0L));
182487Sdlw }
192487Sdlw 
20*17967Slibs static int rep_count, in_mid;
21*17967Slibs 
222487Sdlw do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
232487Sdlw {	struct syl *p;
242487Sdlw 	int n,i,more;
252487Sdlw 	more = *number;
262487Sdlw 	for(;;)
27*17967Slibs 	switch(type_f((p= &syl_ptr[pc])->op))
282487Sdlw 	{
292487Sdlw 	case NED:
302487Sdlw 		DO((*doned)(p,ptr))
312487Sdlw 		pc++;
322487Sdlw 		break;
332487Sdlw 	case ED:
34*17967Slibs 		if(in_mid == NO) rep_count = p->rpcnt;
35*17967Slibs 		in_mid = YES;
36*17967Slibs 		while (rep_count > 0 ) {
37*17967Slibs 		    if(ptr==NULL)
38*17967Slibs 		    {	DO((*doend)('\n'))
392487Sdlw 			return(OK);
40*17967Slibs 		    }
41*17967Slibs 		    if(!more) return(OK);
42*17967Slibs 		    DO((*doed)(p,ptr,len))
43*17967Slibs 		    ptr += len;
44*17967Slibs 		    more--;
45*17967Slibs 		    rep_count--;
462487Sdlw 		}
47*17967Slibs 		pc++;
48*17967Slibs 		in_mid = NO;
492487Sdlw 		break;
502487Sdlw 	case STACK:		/* repeat count */
512585Sdlw 		if(++cp==STKSZ) err(errflag,F_ERFMT,"too many nested ()")
522487Sdlw 		cnt[cp]=p->p1;
532487Sdlw 		pc++;
542487Sdlw 		break;
552487Sdlw 	case RET:		/* open paren */
562585Sdlw 		if(++rp==STKSZ) err(errflag,F_ERFMT,"too many nested ()")
572487Sdlw 		ret[rp]=p->p1;
582487Sdlw 		pc++;
592487Sdlw 		break;
602487Sdlw 	case GOTO:		/* close paren */
612487Sdlw 		if(--cnt[cp]<=0)
622487Sdlw 		{	cp--;
632487Sdlw 			rp--;
642487Sdlw 			pc++;
652487Sdlw 		}
662487Sdlw 		else pc = ret[rp--] + 1;
672487Sdlw 		break;
682487Sdlw 	case REVERT:		/* end of format */
692487Sdlw 		if(ptr==NULL)
702487Sdlw 		{	DO((*doend)('\n'))
712487Sdlw 			return(OK);
722487Sdlw 		}
732487Sdlw 		if(!more) return(OK);
742487Sdlw 		rp=cp=0;
752487Sdlw 		pc = p->p1;
762487Sdlw 		DO((*dorevert)())
772487Sdlw 		break;
782487Sdlw 	case COLON:
792487Sdlw #ifndef KOSHER
802487Sdlw 	case DOLAR:				/*** NOT STANDARD FORTRAN ***/
812487Sdlw #endif
822487Sdlw 		if (ptr == NULL)
832487Sdlw 		{	DO((*doend)((char)p->p1))
842487Sdlw 			return(OK);
852487Sdlw 		}
862487Sdlw 		if (!more) return(OK);
872487Sdlw 		pc++;
882487Sdlw 		break;
892487Sdlw #ifndef KOSHER
902487Sdlw 	case SU:				/*** NOT STANDARD FORTRAN ***/
912487Sdlw #endif
922487Sdlw 	case SS:
932487Sdlw 	case SP:
942487Sdlw 	case S: cplus = p->p1;
952487Sdlw 		signit = p->p2;
962487Sdlw 		pc++;
972487Sdlw 		break;
982487Sdlw 	case P:
992487Sdlw 		scale = p->p1;
1002487Sdlw 		pc++;
1012487Sdlw 		break;
1022487Sdlw #ifndef KOSHER
1032487Sdlw 	case R:					/*** NOT STANDARD FORTRAN ***/
1042487Sdlw 		radix = p->p1;
1052487Sdlw 		pc++;
1062487Sdlw 		break;
10717877Sdlw 	case B:					/*** NOT STANDARD FORTRAN ***/
10817877Sdlw 		if (external) cblank = curunit->ublnk;
10917877Sdlw 		else cblank = 0;		/* blank = 'NULL' */
11017877Sdlw 		pc++;
11117877Sdlw 		break;
1122487Sdlw #endif
11317877Sdlw 	case BNZ:
1142487Sdlw 		cblank = p->p1;
1152487Sdlw 		pc++;
1162487Sdlw 		break;
1172487Sdlw 	default:
1182585Sdlw 		err(errflag,F_ERFMT,"impossible code")
1192487Sdlw 	}
1202487Sdlw }
1212487Sdlw 
1222487Sdlw fmt_bg()
1232487Sdlw {
124*17967Slibs 	in_mid = NO;
1252487Sdlw 	cp=rp=pc=cursor=0;
1262487Sdlw 	cnt[0]=ret[0]=0;
1272487Sdlw }
1282487Sdlw 
1292487Sdlw type_f(n)
1302487Sdlw {
1312487Sdlw #ifdef DEBUG
1322487Sdlw 	fprintf(stderr," pc=%d, cnt[%d]=%d, ret[%d]=%d, op=%d\n",
1332487Sdlw 		pc,cp,cnt[cp],rp,ret[rp],n); /*for debug*/
1342487Sdlw #endif
1352487Sdlw 	switch(n)
1362487Sdlw 	{
1372487Sdlw 	case X:			/* non-editing specifications */
1382487Sdlw 	case SLASH:
1392487Sdlw 	case APOS: case H:
1402487Sdlw 	case T: case TL: case TR:
1412487Sdlw 				return(NED);
1422487Sdlw 
1432487Sdlw 	case F:			/* editing conversions */
1442487Sdlw 	case I: case IM:
1452487Sdlw 	case A: case AW:
1462487Sdlw 	case L:
1472487Sdlw 	case E: case EE: case D: case DE:
1482487Sdlw 	case G: case GE:
1492487Sdlw 				return(ED);
1502487Sdlw 
1512487Sdlw 	default: return(n);
1522487Sdlw 	}
1532487Sdlw }
154