|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.