Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <stdio.h>
2
#include <stdlib.h>
3
#include "pic.h"
4
#include "y.tab.h"
5
 
6
#define	SLOP	1.001
7
 
8
typedef struct {
9
	char	*var;	/* index variable */
10
	double	to;	/* limit */
11
	double	by;
12
	int	op;	/* operator */
13
	char	*str;	/* string to push back */
14
} For;
15
 
16
For	forstk[10];	/* stack of for loops */
17
For	*forp = forstk;	/* pointer to current top */
18
 
19
void	setfval(char *, double);
20
void	nextfor(void);
21
 
22
void forloop(char *var, double from, double to, int op,
23
	double by, char *str)	/* set up a for loop */
24
{
25
	dprintf("# for %s from %g to %g by %c %g \n",
26
		var, from, to, op, by);
27
	if (++forp >= forstk+10)
28
		ERROR "for loop nested too deep" FATAL;
29
	forp->var = var;
30
	forp->to = to;
31
	forp->op = op;
32
	forp->by = by;
33
	forp->str = str;
34
	setfval(var, from);
35
	nextfor();
36
	unput('\n');
37
}
38
 
39
void nextfor(void)	/* do one iteration of a for loop */
40
{
41
	/* BUG:  this should depend on op and direction */
42
	if (getfval(forp->var) > SLOP * forp->to) {	/* loop is done */
43
		free(forp->str);
44
		if (--forp < forstk)
45
			ERROR "forstk popped too far" FATAL;
46
	} else {		/* another iteration */
47
		pushsrc(String, "\nEndfor\n");
48
		pushsrc(String, forp->str);
49
	}
50
}
51
 
52
void endfor(void)	/* end one iteration of for loop */
53
{
54
	struct symtab *p = lookup(forp->var);
55
 
56
	switch (forp->op) {
57
	case '+':
58
	case ' ':
59
		p->s_val.f += forp->by;
60
		break;
61
	case '-':
62
		p->s_val.f -= forp->by;
63
		break;
64
	case '*':
65
		p->s_val.f *= forp->by;
66
		break;
67
	case '/':
68
		p->s_val.f /= forp->by;
69
		break;
70
	}
71
	nextfor();
72
}
73
 
74
char *ifstat(double expr, char *thenpart, char *elsepart)
75
{
76
	dprintf("if %g then <%s> else <%s>\n", expr, thenpart, elsepart? elsepart : "");
77
	if (expr) {
78
		unput('\n');
79
		pushsrc(Free, thenpart);
80
		pushsrc(String, thenpart);
81
		unput('\n');
82
  		if (elsepart)
83
			free(elsepart);
84
		return thenpart;	/* to be freed later */
85
	} else {
86
		free(thenpart);
87
		if (elsepart) {
88
			unput('\n');
89
			pushsrc(Free, elsepart);
90
			pushsrc(String, elsepart);
91
			unput('\n');
92
		}
93
		return elsepart;
94
	}
95
}