Commit | Line | Data |
---|---|---|
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 | |
10 | int cnt[STKSZ],ret[STKSZ],cp,rp; | |
11 | char *dfio = "dofio"; | |
12 | ||
13 | en_fio() | |
14 | { ftnint one=1; | |
15 | return(do_fio(&one,NULL,0l)); | |
16 | } | |
17 | ||
18 | do_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 | ||
113 | fmt_bg() | |
114 | { | |
115 | cp=rp=pc=cursor=0; | |
116 | cnt[0]=ret[0]=0; | |
117 | } | |
118 | ||
119 | type_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 | } |