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