-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenvironc3a.c
More file actions
104 lines (98 loc) · 2.32 KB
/
environc3a.c
File metadata and controls
104 lines (98 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* environ.c */
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utils/environ.h"
#include "iimp.tab.h"
#include "utils/bilquad.h"
/*---------------------allocation memoire----------------------------*/
char *Idalloc()
{
return((char *)malloc(MAXIDENT*sizeof(char)));
}
ENV Envalloc()
{
return((ENV)malloc(sizeof(struct cellenv)));
}
/*-------------------------------------------------------------------*/
/*-----------------------------environnements------------------------*/
/* initialise l'environnement *prho par var=0 */
/* la chaine var est copiee dans l' environnement */
int initenv(ENV *prho,char *var)
{ENV pos, newcell;
pos=rech(var,*prho);/* adresse de la cellule contenant var */
if (pos == NULL)
/*on insere var en tete de envrnt*/
{ newcell=Envalloc();
newcell->ID=Idalloc();
strcpy(newcell->ID,var);
newcell->VAL=0;
newcell->SUIV=*prho;
*prho=newcell;
return (EXIT_SUCCESS);
}
else
{
return(EXIT_FAILURE);
}
}
/* retourne (arg1 op arg2) */
int eval(int op, int arg1, int arg2)
{switch(op)
{case Pl:
return(arg1 + arg2);
case Mo:
return(arg1 - arg2);
case Mu:
return(arg1 * arg2);
default:
return(0);
}
return(0);
}
/* retourne l'adresse de la cellule contenant chaine. NULL si la chaine est absente */
ENV rech(char *chaine, ENV listident)
{if (listident!=NULL)
{if (listident->ID && strcmp(listident->ID,chaine)==0)
{return listident;}
else
return rech(chaine,listident->SUIV);
}
else
return NULL;
}
/* affecte val a la variable var , dans rho */
int affect(ENV rho, char *var, int val)
{ENV pos;
pos=rech(var,rho);/* adresse de la cellule contenant var */
if (pos != NULL)
{(pos->VAL)=val;
return(EXIT_SUCCESS);
}
else
return(EXIT_FAILURE);
}
/* affiche l'environnement */
int ecrire_env(ENV rho)
{ if (rho==NULL)
{printf("fin d' environnement \n");
return(EXIT_SUCCESS);}
else
{
if(rho->ID)
printf("variable %s valeur %d \n",rho->ID,rho->VAL);
ecrire_env(rho->SUIV);
return(EXIT_SUCCESS);
};
}
/* valeur de var dans rho */
int valch(ENV rho, char *var)
{ENV pos;
pos=rech(var,rho);/* adresse de la cellule contenant var */
if (pos != NULL)
return(pos->VAL);
else
return(0);
}