OSDN Git Service

Merge tree-ssa-20020619-branch into mainline.
[pf3gnuchains/gcc-fork.git] / libbanshee / engine / term-var.c
1 /*
2  * Copyright (c) 2000-2001
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  */
30
31 #include <stdio.h>
32 #include <regions.h>
33 #include <assert.h>
34 #include "ufind.h"
35 #include "term-var.h"
36
37 DECLARE_UFIND(tv_elt,gen_e)
38  
39 DEFINE_UFIND(tv_elt,gen_e)
40
41 DEFINE_LIST(term_var_list,term_var)
42
43 struct term_var
44 {
45 #ifdef NONSPEC
46   sort_kind sort;
47 #endif
48   int type;
49   stamp st;
50   gen_e_list pending;
51   const char *name;
52   tv_elt elt;
53 };
54
55 static term_var make_var(region r, const char *name, stamp st)
56 {
57   term_var result = ralloc(r, struct term_var);
58   gen_e info = (gen_e) result;
59
60   result->type = VAR_TYPE;
61   result->st = st;
62   result->pending = new_gen_e_list(r);
63   result->name = name ? rstrdup(r,name) : "fv";
64   result->elt = new_tv_elt(r,info);
65
66   return result;
67 }
68
69 term_var tv_fresh(region r, const char *name)
70 {
71   return make_var(r,name,stamp_fresh());
72 }
73
74 term_var tv_fresh_small(region r, const char *name)
75 {
76   return make_var(r,name,stamp_fresh_small());
77 }
78
79 term_var tv_fresh_large(region r, const char *name)
80 {
81   return make_var(r,name,stamp_fresh_large());
82 }
83
84 static term_var tv_get_v_ecr(term_var v)
85 {
86   term_var ecr = (term_var)tv_get_ecr(v);
87   assert (ecr->type == VAR_TYPE); /* this is a hack, but should be ok */
88
89   return ecr;
90 }
91
92 const char *tv_get_name(term_var v)
93 {
94   return tv_get_v_ecr(v)->name;
95 }
96
97 gen_e_list tv_get_pending(term_var v)
98 {
99   return tv_get_v_ecr(v)->pending;
100 }
101
102 void tv_add_pending(term_var v,gen_e e)
103 {
104   gen_e_list_cons(e,tv_get_v_ecr(v)->pending);
105 }
106
107 void tv_unify(term_var v, gen_e e)
108 {
109   tv_elt_update(v->elt,e);
110   
111   assert(tv_get_ecr(v) == e);
112 }
113
114 static gen_e tv_combine(gen_e e1, gen_e e2)
115 {
116   term_var v1 = (term_var)e1,
117     v2 = (term_var)e2;
118   
119   if (! (v1 == v2) )
120     gen_e_list_append(tv_get_pending(v1), tv_get_pending(v2));
121   
122   return e1;
123 }
124
125 void tv_unify_vars(term_var v1, term_var v2)
126 {
127   tv_elt_unify(tv_combine,v1->elt, v2->elt);
128 }
129
130 gen_e tv_get_ecr(term_var v)
131 {
132   return tv_elt_get_info(v->elt);
133 }