BSD 4 development
[unix-history] / usr / src / lib / libI77uc / dofio.c
CommitLineData
55162a5a
BJ
1/*
2 * fortran format executer
3 */
4
5#include "fio.h"
6#include "fmt.h"
7
8#define DO(x) if(n=x) err(n>0?errflag:endflag,n,dfio)
9#define STKSZ 10
10int cnt[STKSZ],ret[STKSZ],cp,rp;
11char *dfio = "dofio";
12
13en_fio()
14{ ftnint one=1;
15 return(do_fio(&one,NULL,0l));
16}
17
18do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
19{ struct syl *p;
20 int n,i,more;
21 more = *number;
22 for(;;)
23 switch(type_f((p= &syl[pc])->op))
24 {
25 case NED:
26 DO((*doned)(p,ptr))
27 pc++;
28 break;
29 case ED:
30 if(ptr==NULL)
31 { DO((*doend)('\n'))
32 return(OK);
33 }
34 if(cnt[cp]<=0)
35 { cp--;
36 pc++;
37 break;
38 }
39 if(!more) return(OK);
40 DO((*doed)(p,ptr,len))
41 cnt[cp]--;
42 ptr += len;
43 more--;
44 break;
45 case STACK: /* repeat count */
46 if(++cp==STKSZ) err(errflag,100,"too many nested ()")
47 cnt[cp]=p->p1;
48 pc++;
49 break;
50 case RET: /* open paren */
51 if(++rp==STKSZ) err(errflag,100,"too many nested ()")
52 ret[rp]=p->p1;
53 pc++;
54 break;
55 case GOTO: /* close paren */
56 if(--cnt[cp]<=0)
57 { cp--;
58 rp--;
59 pc++;
60 }
61 else pc = ret[rp--] + 1;
62 break;
63 case REVERT: /* end of format */
64 if(ptr==NULL)
65 { DO((*doend)('\n'))
66 return(OK);
67 }
68 if(!more) return(OK);
69 rp=cp=0;
70 pc = p->p1;
71 DO((*dorevert)())
72 break;
73 case COLON:
74#ifndef KOSHER
75 case DOLAR: /*** NOT STANDARD FORTRAN ***/
76#endif
77 if (ptr == NULL)
78 { DO((*doend)((char)p->p1))
79 return(OK);
80 }
81 if (!more) return(OK);
82 pc++;
83 break;
84#ifndef KOSHER
85 case SU: /*** NOT STANDARD FORTRAN ***/
86#endif
87 case SS:
88 case SP:
89 case S: cplus = p->p1;
90 signit = p->p2;
91 pc++;
92 break;
93 case P:
94 scale = p->p1;
95 pc++;
96 break;
97#ifndef KOSHER
98 case R: /*** NOT STANDARD FORTRAN ***/
99 radix = p->p1;
100 pc++;
101 break;
102#endif
103 case BN:
104 case BZ:
105 cblank = p->p1;
106 pc++;
107 break;
108 default:
109 err(errflag,100,"impossible code")
110 }
111}
112
113fmt_bg()
114{
115 cp=rp=pc=cursor=0;
116 cnt[0]=ret[0]=0;
117}
118
119type_f(n)
120{
121#ifdef debug
122 fprintf(stderr," pc=%d, cnt[%d]=%d, ret[%d]=%d, op=%d\n",
123 pc,cp,cnt[cp],rp,ret[rp],n); /*for debug*/
124#endif
125 switch(n)
126 {
127 case X: /* non-editing specifications */
128 case SLASH:
129 case APOS: case H:
130 case T: case TL: case TR:
131 return(NED);
132
133 case F: /* editing conversions */
134 case I: case IM:
135 case A: case AW:
136 case L:
137 case E: case EE: case D: case DE:
138 case G: case GE:
139 return(ED);
140
141 default: return(n);
142 }
143}