|
|
1.1 root 1: /* Copyright Bell Telephone Laboratories Whippany, N.J.
2:
3: * ***********************************
4: * ***********************************
5: * ************ FOR-NEXT *************
6: * *** R. B. Drake WH 8C-005 X4163 ***
7: * **** Fri Aug 24 17:27:09 1979 *****
8: * ***********************************
9: * ***********************************
10:
11: */
12: /* "@(#) for.c: V 1.2 3/4/81" */
13:
14: #include "bas.h"
15: extern int singflg;
16: extern int rof;
17: extern int singst;
18: int bflag,forflg,forcnt,cflag;
19: _for()
20: {
21: extern int nxt,stpflg;
22: extern char *eoexpr,*ptr,*curptr;
23: char *save,c,*sav1;
24: char nam[5];
25: double evalx(),final,step,var,round;
26: int i,savno;
27: forflg++; /* mark for in progress for break */
28: for(i=0;(c=expr[i]) != '\15' && c != '\0' && i < 4;i++)
29: nam[i]=c;
30: nam[i]=0;
31: if(!(nam[0] == 'e' && nam[1] == 'v')) /* if not an infinite loop */
32: {
33: step = 1; /* default value for step */
34: let(); /* handle the initial value expression */
35: if(*eoexpr++ != '\004') /* make sure its a to */
36: {
37: error(inst.thing.linno,9);
38: forflg=bflag=0;
39: return(-1);
40: }
41: final=evalx(eoexpr); /*evaluate the "to" expression */
42: if(*eoexpr == '\005') /* see if step is present */
43: {
44: eoexpr++;
45: step=evalx(eoexpr);
46: }
47: round=step/2;
48: }
49: if(singflg == 1) /* if single stepping */
50: if(singwt() < 0)
51: {
52: singflg=stpflg=0;
53: forflg--;
54: return(0);
55: }
56: save = ptr;
57: savno = inst.thing.linno;
58: while(fetch(-1,&ptr) == 0 && stpflg == 0)
59: {
60: if(inst.thing.linno == singst)
61: singflg = 1;
62: if(inst.thing.opcode.lobyte == nxt)
63: {
64: if(bflag)
65: {
66: if(forcnt != 0)
67: {
68: forcnt--;
69: continue;
70: }
71: }
72: if(singflg == 1)
73: {
74: sav1 = expr;
75: prin();
76: expr = sav1;
77: }
78: if(strcmp(nam,expr) != 0)
79: {
80: ptr=curptr;
81: forflg--;
82: return(0);
83: }
84: if(cflag) /* if the continue flag is set */
85: {
86: if(cflag == 1)
87: cflag = 0;
88: else
89: {
90: cflag--;
91: forflg--;
92: return(0);
93: }
94: }
95: if(bflag) /* if the break flag is set */
96: {
97: bflag--;
98: forflg--;
99: return(0);
100: }
101: if(!(nam[0] == 'e' && nam[1] == 'v'))
102: {
103: getvar(expr,&var);
104: var += step;
105: if(step > 0)
106: {
107: if(var > final + round) /* if all done */
108: {
109: forflg--;
110: return(0);
111: }
112: }
113: else
114: if(var < final+round)
115: {
116: forflg--;
117: return(0);
118: }
119: putvar(expr,var);
120: }
121: ptr = save;
122: if(singflg == 1)
123: if(singwt() < 0)
124: {
125: singflg=stpflg=0;
126: forflg--;
127: return(0);
128: }
129: continue;
130: }
131: if(singflg == 1) /* if single stepping */
132: {
133: if(singex() < 0)
134: {
135: singflg = 0;
136: forflg--;
137: return(0);
138: }
139: }
140: else
141: {
142: if(bflag || cflag)
143: {
144: if(inst.thing.opcode.lobyte == rof) /* if a for */
145: forcnt++;
146: continue;
147: }
148: if(bascall(inst.thing.opcode.lobyte) != 0)
149: {
150: forflg=0;
151: return(-1);
152: }
153: }
154: }
155: forflg--;
156: if(!stpflg)
157: error(savno,48);
158: return(0);
159: }
160: next()
161: {
162: error(inst.thing.linno,18);
163: return(-1);
164: }
165: brake() /*set the break flag */
166: {
167: setflg(&bflag);
168: return(0);
169: }
170: cont() /* set the continue flag */
171: {
172: setflg(&cflag);
173: return(0);
174: }
175:
176: setflg(flg)
177: int *flg;
178: {
179: if(forflg == 0) /* if no for in progress */
180: {
181: error(inst.thing.linno,47);
182: return(-1); /* fatal */
183: }
184: if(expr[0] != '\0') /* if there is an expression */
185: *flg = evalx(expr);
186: else
187: *flg = 1;
188: return(0);
189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.