declare init66_ in err.c. DLW
[unix-history] / usr / src / usr.bin / f77 / libI77 / dofio.c
CommitLineData
b21e4053 1/*
c8c7f341 2char 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
12int cnt[STKSZ],ret[STKSZ],cp,rp;
13char *dfio = "dofio";
14
15en_fio()
16{ ftnint one=1;
c8c7f341 17 return(do_fio(&one,NULL,0L));
b21e4053
DW
18}
19
20do_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
115fmt_bg()
116{
117 cp=rp=pc=cursor=0;
118 cnt[0]=ret[0]=0;
119}
120
121type_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}