|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)dofio.c 5.2 12/21/87
7: */
8:
9: /*
10: * fortran format executer
11: */
12:
13: #include "fio.h"
14: #include "format.h"
15:
16: #define DO(x) if(n=x) err(n>0?errflag:endflag,n,dfio)
17: #define DO_F(x) if(n=x) err_f(n>0?errflag:endflag,n,dfio)
18: #define err_f(f,n,s) {if(f) return(dof_err(n)); else fatal(n,s);}
19: #define STKSZ 10
20: LOCAL int cnt[STKSZ],ret[STKSZ],cp,rp;
21: LOCAL char *dfio = "dofio";
22: int used_data;
23:
24: en_fio()
25: { ftnint one=1;
26: return(do_fio(&one,NULL,0L));
27: }
28:
29: /* OP_TYPE_TAB is defined in format.h,
30: it is NED for X,SLASH,APOS,H,TL,TR,T
31: ED for I,IM,F,E,EE,D,DE,G,GE,L,A,AW
32: and returns op for other values
33: */
34: LOCAL int optypes[] = OP_TYPE_TAB;
35: LOCAL int rep_count, in_mid;
36:
37: do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
38: { struct syl *p;
39: int n,i,more,optype;
40: more = *number;
41: for(;;) {
42: if( (optype = ((p= &syl_ptr[pc])->op)) > LAST_TERM )
43: err_f(errflag,F_ERFMT,"impossible code");
44: #ifdef DEBUG
45: fprintf(stderr," pc=%d, cnt[%d]=%d, ret[%d]=%d, op=%d\n",
46: pc,cp,cnt[cp],rp,ret[rp],optype); /*for debug*/
47: #endif
48: switch(optypes[optype])
49: {
50: case NED:
51: DO_F((*doned)(p,ptr))
52: pc++;
53: break;
54: case ED:
55: if(in_mid == NO) rep_count = p->rpcnt;
56: in_mid = YES;
57: while (rep_count > 0 ) {
58: if(ptr==NULL)
59: { DO((*doend)('\n'))
60: return(OK);
61: }
62: if(!more) return(OK);
63: used_data = YES;
64: DO_F((*doed)(p,ptr,len))
65: ptr += len;
66: more--;
67: rep_count--;
68: }
69: pc++;
70: in_mid = NO;
71: break;
72: case STACK: /* repeat count */
73: if(++cp==STKSZ) err_f(errflag,F_ERFMT,"too many nested ()")
74: cnt[cp]=p->p1;
75: pc++;
76: break;
77: case RET: /* open paren */
78: if(++rp==STKSZ) err_f(errflag,F_ERFMT,"too many nested ()")
79: ret[rp]=p->p1;
80: pc++;
81: break;
82: case GOTO: /* close paren */
83: if(--cnt[cp]<=0)
84: { cp--;
85: rp--;
86: pc++;
87: }
88: else pc = ret[rp--] + 1;
89: break;
90: case REVERT: /* end of format */
91: if(ptr==NULL)
92: { DO((*doend)('\n'))
93: return(OK);
94: }
95: if(!more) return(OK);
96: if( used_data == NO ) err_f(errflag,F_ERFMT,"\nNo more editing terms in format");
97: used_data = NO;
98: rp=cp=0;
99: pc = p->p1;
100: DO((*dorevert)())
101: break;
102: case COLON:
103: #ifndef KOSHER
104: case DOLAR: /*** NOT STANDARD FORTRAN ***/
105: #endif
106: if (ptr == NULL)
107: { DO((*doend)((char)p->p1))
108: return(OK);
109: }
110: if (!more) return(OK);
111: pc++;
112: break;
113: #ifndef KOSHER
114: case SU: /*** NOT STANDARD FORTRAN ***/
115: #endif
116: case SS:
117: case SP:
118: case S: cplus = p->p1;
119: signit = p->p2;
120: pc++;
121: break;
122: case P:
123: scale = p->p1;
124: pc++;
125: break;
126: #ifndef KOSHER
127: case R: /*** NOT STANDARD FORTRAN ***/
128: radix = p->p1;
129: pc++;
130: break;
131: case B: /*** NOT STANDARD FORTRAN ***/
132: if (external) cblank = curunit->ublnk;
133: else cblank = 0; /* blank = 'NULL' */
134: pc++;
135: break;
136: #endif
137: case BNZ:
138: cblank = p->p1;
139: pc++;
140: break;
141: default:
142: err_f(errflag,F_ERFMT,"impossible code")
143: }
144: }
145: }
146:
147: fmt_bg()
148: {
149: in_mid = NO;
150: cp=rp=pc=cursor=0;
151: cnt[0]=ret[0]=0;
152: used_data = NO;
153: }
154:
155: LOCAL
156: dof_err(n)
157: {
158: if( reading==YES && external==YES && sequential==YES) donewrec();
159: return(errno=n);
160: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.