OSSP CVS Repository

ossp - Check-in [3702]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 3702
Date: 2004-Jan-06 21:43:34 (local)
2004-Jan-06 20:43:34 (UTC)
User:rse
Branch:
Comment: implement uuid_compare function
Tickets:
Inspections:
Files:
ossp-pkg/uuid/uuid.c      1.1 -> 1.2     51 inserted, 3 deleted

ossp-pkg/uuid/uuid.c 1.1 -> 1.2

--- uuid.c       2004/01/06 20:14:28     1.1
+++ uuid.c       2004/01/06 20:43:34     1.2
@@ -135,11 +135,59 @@
     return UUID_RC_OK;
 }
 
-uuid_rc_t uuid_compare(uuid_t *uuid, uuid_t *uuid2, int *result)
+uuid_rc_t uuid_compare(uuid_t *a, uuid_t *b, int *result)
 {
-    if (uuid == NULL || uuid2 == NULL || result == NULL)
+    int r;
+
+    if (result == NULL)
         return UUID_RC_ARG;
-    /* FIXME */
+
+    /* deal with NULL or equal pointers. */
+    if (a == b) {
+        *result = 0;
+        return UUID_RC_OK;
+    }
+    if (a == NULL && b == NULL) {
+        *result = 0;
+        return UUID_RC_OK;
+    }
+    if (a == NULL) {
+        *result = ((uuid_isnull(b, &r), r) ? 0 : -1);
+        return UUID_RC_OK;
+    }
+    if (b == NULL) {
+        *result = ((uuid_isnull(a, &r), r) ? 0 : 1);
+        return UUID_RC_OK;
+    }
+
+    /* we have to compare the hard way. */
+    if (a->time_low != b->time_low) {
+        *result = ((a->time_low < b->time_low) ? -1 : 1);
+        return UUID_RC_OK;
+    }
+    if ((r = (int)a->time_mid - (int)b->time_mid) != 0) {
+        *result = ((r < 0) ? -1 : 1);
+        return UUID_RC_OK;
+    }
+    if ((r = (int)a->time_hi_and_version - (int)b->time_hi_and_version) != 0) {
+        *result = ((r < 0) ? -1 : 1);
+        return UUID_RC_OK;
+    }
+    if ((r = (int)a->clock_seq_hi_and_reserved - (int)b->clock_seq_hi_and_reserved) != 0) {
+        *result = ((r < 0) ? -1 : 1);
+        return UUID_RC_OK;
+    }
+    if ((r = (int)a->clock_seq_low - (int)b->clock_seq_low) != 0) {
+        *result = ((r < 0) ? -1 : 1);
+        return UUID_RC_OK;
+    }
+    if ((r = memcmp(a->node, b->node, sizeof(a->node))) != 0) {
+        *result = ((r < 0) ? -1 : 1);
+        return UUID_RC_OK;
+    }
+
+    /* else the keys are equal */
+    *result = 0;
     return UUID_RC_OK;
 }
 

CVSTrac 2.0.1