1 /************************************************************************
2 ************************************************************************
4 Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
5 ---------------------------------------------------------------------
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 ************************************************************************
20 ************************************************************************/
25 #include "compatibility.hh"
28 #include "sigprint.hh"
29 #include "sigtyperules.hh"
30 #include "privatise.hh"
33 /*****************************************************************************
34 privatise : compile a list of signals
35 *****************************************************************************/
37 static Tree
makePrivatisationKey(const Tree
& t
);
38 static Tree
makePrivatisationLabel(const Tree
& exp
);
40 static Tree
privatisation (const Tree
& k
, const Tree
& t
);
41 static Tree
computePrivatisation (const Tree
& k
, const Tree
& t
);
42 static Tree
labelize(const Tree
& label
, const Tree
& exp
);
45 Tree
privatise(const Tree
& t
)
48 return privatisation(makePrivatisationKey(t
), t
);
52 // -- implementation -----------------
54 static Tree
makePrivatisationKey(const Tree
& t
)
57 snprintf(name
, 256, "PRIVATISE %p : ", (CTree
*)t
);
58 return tree(unique(name
));
61 static Tree
makePrivatisationLabel(const Tree
& t
)
64 snprintf(name
, 256, "OWNER IS %p : ", (CTree
*)t
);
65 return tree(unique(name
));
69 // -- implementation -----------------
71 static Tree
privatisation (const Tree
& k
, const Tree
& t
)
75 if (t
->arity() == 0) {
78 } else if (getProperty(t
, k
, v
)) {
79 /* Terme deja visité. La propriété nous indique
80 la version privatisée ou nil si elle est identique
83 return isNil(v
) ? t
: v
;
86 /* Calcul du terme privatisé et mis à jour
87 de la propriété. Nil indique que le terme
88 privatisé est identique à celui de depart
89 (pour eviter les boucles avec les compteurs
92 v
= computePrivatisation(k
,t
);
94 setProperty(t
, k
, v
);
96 setProperty(t
, k
, nil
);
102 static Tree
computePrivatisation(const Tree
& k
, const Tree
& exp
)
104 Tree tbl
, size
, idx
, wrt
, content
, id
, var
, body
;
106 if ( isSigWRTbl(exp
, id
, tbl
, idx
, wrt
) ) {
107 /* Ce qui ne peut pas être partagé, ce sont les
108 tables dans lesquelles on ecrit. Pour cela
109 on leur donne un label unique
113 labelize( makePrivatisationLabel(exp
), privatisation(k
, tbl
) ),
114 privatisation(k
, idx
),
115 privatisation(k
, wrt
) );
117 } else if ( isSigTable(exp
, id
, size
, content
) ) {
118 /* Rien à privatiser dans une table (car size est
119 censée etre une expression entiere)
123 } else if ( isSigGen(exp
, content
) ) {
124 /* On ne visite pas les contenus des tables
126 printf("erreur 1 dans computePrivatisation\n");
129 } else if ( isRec(exp
, var
, body
) ) {
130 /* On ne visite pas les contenus des tables
132 setProperty(exp
, k
, nil
);
133 return rec(var
, privatisation(k
,body
));
136 /* On parcours les autres arbres en privatisant les branches
138 int n
= exp
->arity();
145 privatisation(k
, exp
->branch(0)) );
149 privatisation(k
, exp
->branch(0)),
150 privatisation(k
, exp
->branch(1)) );
154 privatisation(k
, exp
->branch(0)),
155 privatisation(k
, exp
->branch(1)),
156 privatisation(k
, exp
->branch(2)) );
160 privatisation(k
, exp
->branch(0)),
161 privatisation(k
, exp
->branch(1)),
162 privatisation(k
, exp
->branch(2)),
163 privatisation(k
, exp
->branch(3)) );
165 printf("erreur 2 dans computePrivatisation\n");
168 printf("situation anormale dans computePrivatisation\n");
172 static Tree
labelize(const Tree
& newid
, const Tree
& exp
)
174 Tree tbl
, size
, idx
, wrt
, content
, oldid
;
176 if ( isSigWRTbl(exp
, oldid
, tbl
, idx
, wrt
) ) {
177 /* Ce qui ne peut pas être partagé, ce sont les
178 tables dans lesquelles on ecrit. Pour cela
179 on leur donne un label unique
181 return sigWRTbl(newid
, tbl
, idx
, wrt
);
183 } else if ( isSigTable(exp
, oldid
, size
, content
) ) {
184 /* Rien à privatiser dans une table (car size est
185 censée etre une expression entiere)
187 return sigTable(newid
, size
, content
);
191 printf("erreur labelize\n");