summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2004-01-11 00:51:10 +0000
committerSergey Udaltsov <svu@gnome.org>2004-01-11 00:51:10 +0000
commit476b2173a53161b5694185d7231bb593b2c1dc00 (patch)
treebf9cdd8a48f75687a506c1ab3e52ffecfd7a4536
parent38dc7b519ac5039e9788bf76cc74e649a5344735 (diff)
downloadlibxklavier-476b2173a53161b5694185d7231bb593b2c1dc00.tar.gz
One extra function to compare configurations
-rw-r--r--libxklavier/xklavier_config.h12
-rw-r--r--libxklavier/xklavier_props.c36
2 files changed, 46 insertions, 2 deletions
diff --git a/libxklavier/xklavier_config.h b/libxklavier/xklavier_config.h
index 5087314..f59988b 100644
--- a/libxklavier/xklavier_config.h
+++ b/libxklavier/xklavier_config.h
@@ -365,12 +365,12 @@ extern "C"
/**
* @defgroup xklconfig XklConfigRec management utilities
- * Little utilities for initing/destroying/resetting XklConfigRec.
+ * Little utilities for managing XklConfigRec.
* @{
*/
/**
- * Initializes the record (actually, fills it with 0-s
+ * Initializes the record (actually, fills it with 0-s)
* @param data is a record to initialize
*/
extern void XklConfigRecInit( XklConfigRecPtr data );
@@ -387,6 +387,14 @@ extern "C"
*/
extern void XklConfigRecDestroy( XklConfigRecPtr data );
+/**
+ * Compares the records
+ * @param data1 is a record to compare
+ * @param data2 is another record
+ * @return True if records are same
+ */
+ extern Bool XklConfigRecEquals( XklConfigRecPtr data1, XklConfigRecPtr data2 );
+
/** @} */
#ifdef __cplusplus
diff --git a/libxklavier/xklavier_props.c b/libxklavier/xklavier_props.c
index 5fb861c..53aaab8 100644
--- a/libxklavier/xklavier_props.c
+++ b/libxklavier/xklavier_props.c
@@ -19,6 +19,42 @@ void XklConfigRecInit( XklConfigRecPtr data )
memset( ( void * ) data, 0, sizeof( XklConfigRec ) );
}
+static Bool PtrsEqual( char* p1, char* p2 )
+{
+ if ( p1 == NULL && p2 == NULL )
+ return True;
+ if ( ( p1 == NULL && p2 != NULL ) ||
+ ( p1 != NULL && p2 == NULL ) )
+ return False;
+ return !strcmp( p1, p2 );
+}
+
+static Bool ListsEqual( int numItems1, char** items1,
+ int numItems2, char** items2 )
+{
+ int i;
+ if ( numItems1 != numItems2 )
+ return False;
+ for( i = numItems1; --i >= 0; )
+ if ( !PtrsEqual( *items1++ , *items2++ ) )
+ return False;
+ return True;
+}
+
+Bool XklConfigRecEquals( XklConfigRecPtr data1, XklConfigRecPtr data2 )
+{
+ if ( !PtrsEqual( data1->model, data2->model ) )
+ return False;
+ if ( !ListsEqual( data1->numLayouts, data1->layouts,
+ data2->numLayouts, data2->layouts ) )
+ return False;
+ if ( !ListsEqual( data1->numVariants, data1->variants,
+ data2->numVariants, data2->variants ) )
+ return False;
+ return ListsEqual( data1->numOptions, data1->options,
+ data2->numOptions, data2->options );
+}
+
void XklConfigRecDestroy( XklConfigRecPtr data )
{
int i;