2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: SmXrm.c /main/4 1995/10/30 09:39:33 rswiston $ */
25 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
26 * (c) Copyright 1993, 1994 International Business Machines Corp. *
27 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
28 * (c) Copyright 1993, 1994 Novell, Inc. *
30 /*************************************<+>*************************************
31 *****************************************************************************
35 ** Project: DT Session Manager (dtsession)
39 ** This file contains routines to manage an Xrm database
41 ** SmXrmSubtract() - subtract source_db from target_db and return result_db
43 *****************************************************************************
44 *************************************<+>*************************************/
50 #include <X11/Intrinsic.h>
52 const XrmQuark empty = NULLQUARK;
54 struct smSubtractState {
55 XrmDatabase source_db;
56 XrmDatabase target_db;
57 XrmDatabase result_db;
58 XrmBindingList target_bindings;
59 XrmQuarkList target_quarks;
64 static void _PrintDbEntry(
72 static Bool _CompareBindingQuarkList(
73 XrmBindingList bindings1,
75 XrmBindingList bindings2,
76 XrmQuarkList quarks2);
77 static Bool _SmCompareSourceAndTarget(
79 XrmBindingList bindings,
81 XrmRepresentation *type,
84 static Bool _SmEnumerateSource(
86 XrmBindingList bindings,
88 XrmRepresentation *type,
94 #define _PrintDbEntry(a,b,c,d,e)
98 /*************************************<->*************************************
100 * _CompareBindingQuarkList()
104 * Compare two binding quark lists and return True if the same
108 * bindings1 - list1 bindings
109 * quarks1 - list1 bindings
110 * bindings2 - list2 bindings
111 * quarks2 - list2 bindings
118 * same - True if binding quark list is the same, False otherwise
123 *************************************<->***********************************/
126 Bool _CompareBindingQuarkList(
127 XrmBindingList bindings1,
128 XrmQuarkList quarks1,
129 XrmBindingList bindings2,
130 XrmQuarkList quarks2)
136 * loop through quarks in list1
138 while (quarks1[i] != NULLQUARK)
141 * compare quark in list1 to same element in list2 and
142 * break out of loop if they differ.
144 if (quarks2[i] == NULLQUARK || quarks2[i] != quarks1[i])
148 * quarks for this level compare, now compare bindings
150 if (bindings1[i] != bindings2[i])
156 if (quarks1[i] == NULLQUARK && quarks2[i] == NULLQUARK)
159 * all quarks and bindings in list1 and list2 compare
167 /*************************************<->*************************************
173 * Print an Xrm database entry (DEBUG only)
177 * leader - leading string
178 * bindings - binding list
179 * quarks - quark list
180 * type - element type
181 * value - element value
192 *************************************<->***********************************/
198 XrmBindingList bindings,
200 XrmRepresentation *type,
206 FILE *fp = fopen ("/tmp/dtsession.xrm", "a");
208 str = XrmQuarkToString(type);
210 fprintf(fp, "%8s ", leader);
213 while ( quarks[i] != NULLQUARK )
215 str = XrmQuarkToString(quarks[i]);
216 fprintf(fp, "%s", str);
218 if (quarks[i] != NULLQUARK)
220 fprintf(fp, bindings[i] == XrmBindLoosely ? "*" : ".");
223 fprintf(fp, ": %s\n",value->addr);
228 /*************************************<->*************************************
230 * _SmCompareSourceAndTarget()
234 * Xrm Enum callback that compares the current database element to the
235 * current target element.
239 * db - source database
240 * bindings - binding list
241 * quarks - quark list
242 * type - element type
243 * value - element value
244 * closure - pointer to smSubtractState data
251 * result - True if same, False if different
256 *************************************<->***********************************/
259 Bool _SmCompareSourceAndTarget(
261 XrmBindingList bindings,
263 XrmRepresentation *type,
267 struct smSubtractState *state = (struct smSubtractState *)closure;
270 _PrintDbEntry("source", bindings, quarks, type, value);
272 if (_CompareBindingQuarkList(bindings, quarks,
273 state->target_bindings, state->target_quarks))
281 /*************************************<->*************************************
283 * _SmEnumerateSource()
287 * Xrm Enum callback that enumerates the source database for comparison
288 * against the current target element.
292 * db - target database
293 * bindings - binding list
294 * quarks - quark list
295 * type - element type
296 * value - element value
297 * closure - pointer to smSubtractState data
304 * result - always False
309 *************************************<->***********************************/
312 Bool _SmEnumerateSource(
314 XrmBindingList bindings,
316 XrmRepresentation *type,
320 struct smSubtractState *state = (struct smSubtractState *)closure;
323 _PrintDbEntry("target", bindings, quarks, type, value);
326 * Enumerate source database and compare each element to current
327 * target bindings and quarks.
329 state->target_bindings = bindings;
330 state->target_quarks = quarks;
331 if (XrmEnumerateDatabase(state->source_db, &empty, &empty, XrmEnumAllLevels,
332 _SmCompareSourceAndTarget, closure) == False)
335 * Target bindings and quarks don't match any element in source database,
336 * so copy target element to result db.
338 _PrintDbEntry("nomatch", bindings, quarks, type, value);
339 XrmQPutResource(&state->result_db, bindings, quarks, *type, value);
344 /*************************************<->*************************************
346 * SmXrmSubtractDatabase()
350 * Subtracts source database from target database and returns
351 * the result database.
355 * source_db - source database
356 * target_db - target database
363 * result_db - result database
368 *************************************<->***********************************/
371 * Subtracts source database from target database and returns
372 * the result database.
376 SmXrmSubtractDatabase(
377 XrmDatabase source_db,
378 XrmDatabase target_db)
380 struct smSubtractState state;
383 * return if source or target db not specified
385 if (source_db == NULL || target_db == NULL)
391 state.source_db = source_db;
392 state.target_db = target_db;
393 state.result_db = NULL;
396 * populate result db by looping through target and
397 * copying elements that don't also exist in source db
399 XrmEnumerateDatabase(state.target_db, &empty, &empty, XrmEnumAllLevels,
400 _SmEnumerateSource, (XPointer)&state);
402 return(state.result_db);