1 /*  Part of XPCE --- The SWI-Prolog GUI toolkit
2 
3     Author:        Jan Wielemaker and Anjo Anjewierden
4     E-mail:        jan@swi.psy.uva.nl
5     WWW:           http://www.swi.psy.uva.nl/projects/xpce/
6     Copyright (c)  1985-2002, University of Amsterdam
7     All rights reserved.
8 
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions
11     are met:
12 
13     1. Redistributions of source code must retain the above copyright
14        notice, this list of conditions and the following disclaimer.
15 
16     2. Redistributions in binary form must reproduce the above copyright
17        notice, this list of conditions and the following disclaimer in
18        the documentation and/or other materials provided with the
19        distribution.
20 
21     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25     COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32     POSSIBILITY OF SUCH DAMAGE.
33 */
34 
35 #define INLINE_UTILITIES 1
36 #include <h/kernel.h>
37 #include <h/interface.h>
38 
39 static int	host_handles;		/* # handles */
40 static long	itf_symbols;		/* # symbols */
41 
42 #define SizeOfSymbol ((size_t)(intptr_t)(&(((PceITFSymbol)NULL)->handle[host_handles])))
43 
44 		/********************************
45 		*            SYMBOLS		*
46 		********************************/
47 
48 PceITFSymbol
newSymbol(Any obj,Name name)49 newSymbol(Any obj, Name name)
50 { PceITFSymbol s = alloc(SizeOfSymbol);
51   int n;
52 
53   s->object = obj;
54   s->name   = name;
55 
56   for( n=0; n < host_handles; n++ )
57     s->handle[n] = NULL;
58 
59   itf_symbols++;
60 
61   return s;
62 }
63 
64 
65 		/********************************
66 		*         CREATE/DELETE		*
67 		********************************/
68 
69 void
deleteAssoc(Any obj)70 deleteAssoc(Any obj)
71 { if ( isObject(obj) && onFlag(obj, F_ASSOC) )
72   { PceITFSymbol symbol = getMemberHashTable(ObjectToITFTable, obj);
73     if ( symbol )
74     { symbol->object = NULL;
75       deleteHashTable(ObjectToITFTable, obj);
76       clearFlag(obj, F_ASSOC);
77     }
78   }
79 }
80 
81 
82 void
newAssoc(Name name,Any obj)83 newAssoc(Name name, Any obj)
84 { PceITFSymbol symbol;
85   Any old;
86 
87   if ( (old = getObjectAssoc(name)) )
88     deleteAssoc(old);
89   deleteAssoc(obj);
90 
91   if ( onFlag(name, F_ITFNAME) )
92   { symbol = getMemberHashTable(NameToITFTable, name);
93     symbol->object = obj;
94     appendHashTable(ObjectToITFTable, obj, symbol);
95     setFlag(obj, F_ASSOC);
96   } else
97   { symbol = newSymbol(obj, name);
98 
99     setFlag(name, F_ITFNAME);
100     if ( isObject(obj) )
101       setFlag(obj, F_ASSOC);
102 
103     appendHashTable(ObjectToITFTable, obj,  symbol);
104     appendHashTable(NameToITFTable,   name, symbol);
105   }
106 
107   if ( isObject(obj) )
108     lockObj(obj);
109 }
110 
111 
112 Any
getObjectAssoc(Name name)113 getObjectAssoc(Name name)
114 { if ( onFlag(name, F_ITFNAME) )
115   { PceITFSymbol symbol = getMemberHashTable(NameToITFTable, name);
116     return symbol->object;
117   }
118 
119   fail;
120 }
121 
122 
123 Name
getNameAssoc(Any obj)124 getNameAssoc(Any obj)
125 { if ( (isObject(obj) && onFlag(obj, F_ASSOC)) )
126   { PceITFSymbol symbol = getMemberHashTable(ObjectToITFTable, obj);
127     return symbol->name;
128   }
129 
130   fail;
131 }
132 
133 
134 status
renameAssoc(Name old,Name new)135 renameAssoc(Name old, Name new)
136 { Any obj = getObjectAssoc(old);
137 
138   if ( obj != FAIL )
139   { newAssoc(new, obj);
140     succeed;
141   }
142 
143   fail;
144 }
145 
146 
147 status
forSomeAssoc(Code code)148 forSomeAssoc(Code code)
149 { for_hash_table(ObjectToITFTable, s,
150 		 { PceITFSymbol symbol = s->value;
151 
152 		   if ( symbol->object )
153 		     forwardCodev(code, 1, (Any *) (&symbol->name));
154 		 });
155   succeed;
156 }
157 
158 
159 		/********************************
160 		*            SPECIALS           *
161 		*********************************/
162 
163 void
initAssoc(int handles)164 initAssoc(int handles)
165 { int n;
166 
167   host_handles = handles;
168 
169   ObjectToITFTable = createHashTable(toInt(1024), NAME_none);
170   NameToITFTable   = createHashTable(toInt(1024), NAME_none);
171 
172   newAssoc(NAME_ObjectToItfTable, ObjectToITFTable);
173   newAssoc(NAME_NameToItfTable,   NameToITFTable);
174 
175   for(n=0; n<host_handles; n++)
176     HandleToITFTables[n] = createHashTable(toInt(64), NAME_none);
177 }
178 
179 
180