Moved SILC id utility functions from utility library.
[runtime.git] / lib / silccore / silcid.h
index e6a595c62fc6056c75cd5f511eafabd6183e4f44..9f8c84e7dcb278484276968430248a3da91836ce 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2006 Pekka Riikonen
+  Copyright (C) 1997 - 2008 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -82,7 +82,7 @@ typedef SilcUInt16 SilcIdType;
  *
  * SOURCE
  */
-typedef struct {
+typedef struct SilcIDIPStruct {
   unsigned char data[16];      /* IP data (in MSB first order) */
   SilcUInt8 data_len;          /* Length of the data (4 or 16) */
 } SilcIDIP;
@@ -104,7 +104,7 @@ typedef struct {
  *
  * SOURCE
  */
-typedef struct {
+typedef struct SilcServerIDStruct {
   SilcIDIP ip;                 /* n bit IP address */
   SilcUInt16 port;             /* 16 bit port */
   SilcUInt16 rnd;              /* 16 bit random number */
@@ -127,7 +127,7 @@ typedef struct {
  *
  * SOURCE
  */
-typedef struct {
+typedef struct SilcClientIDStruct {
   SilcIDIP ip;                                 /* n bit IP address */
   unsigned char rnd;                           /* 8 bit random number */
   unsigned char hash[CLIENTID_HASH_LEN];       /* 88 bit MD5 hash */
@@ -150,7 +150,7 @@ typedef struct {
  *
  * SOURCE
  */
-typedef struct {
+typedef struct SilcChannelIDStruct {
   SilcIDIP ip;                 /* n bit IP address */
   SilcUInt16 port;             /* 16 bit port */
   SilcUInt16 rnd;              /* 16 bit random number */
@@ -172,7 +172,7 @@ typedef struct {
  *
  * SOURCE
  */
-typedef struct {
+typedef struct SilcIDStruct {
   union {
     SilcServerID server_id;
     SilcChannelID channel_id;
@@ -184,6 +184,26 @@ typedef struct {
 
 /* Macros */
 
+/****d* silccore/SilcIDAPI/SILC_ID_GET_ID
+ *
+ * NAME
+ *
+ *    #define SILC_ID_GET_ID ...
+ *
+ * DESCRIPTION
+ *
+ *    Returns the ID type specific pointer from the SilcID structure.  As
+ *    the SilcID is able to house all types of IDs this macro can be used
+ *    to get the specific ID from the structure by its type.
+ *
+ * SOURCE
+ */
+#define SILC_ID_GET_ID(id)                                             \
+  ((id).type == SILC_ID_CLIENT  ? (void *)&(id).u.client_id :          \
+   (id).type == SILC_ID_SERVER  ? (void *)&(id).u.server_id :          \
+   (void *)&(id).u.channel_id)
+/***/
+
 /****d* silccore/SilcIDAPI/SILC_ID_COMPARE
  *
  * NAME
@@ -472,6 +492,22 @@ SilcBool silc_id_id2str(const void *id, SilcIdType type,
 SilcBool silc_id_str2id(const unsigned char *id, SilcUInt32 id_len,
                        SilcIdType type, void *ret_id, SilcUInt32 ret_id_size);
 
+/****f* silccore/SilcIDAPI/silc_id_str2id2
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_id_str2id2(const unsigned char *id, SilcUInt32 id_len,
+ *                             SilcIdType type, SilcID *ret_id);
+ *
+ * DESCRIPTION
+ *
+ *    Same as silc_id_str2id but returns the ID into SilcID structure in
+ *    `ret_id' pointer.  This does not allocate any memory.
+ *
+ ***/
+SilcBool silc_id_str2id2(const unsigned char *id, SilcUInt32 id_len,
+                        SilcIdType type, SilcID *ret_id);
+
 /****f* silccore/SilcIDAPI/silc_id_get_len
  *
  * SYNOPSIS
@@ -499,4 +535,81 @@ SilcUInt32 silc_id_get_len(const void *id, SilcIdType type);
  ***/
 void *silc_id_dup(const void *id, SilcIdType type);
 
+/****f* silccore/SilcIDAPI/silc_hash_id
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_hash_id(void *key, void *user_context);
+ *
+ * DESCRIPTION
+ *
+ *    Hash a ID. The `user_context' is the ID type.  Can be used with
+ *    SilcHashTable.
+ *
+ ***/
+SilcUInt32 silc_hash_id(void *key, void *user_context);
+
+/****f* silccore/SilcIDAPI/silc_hash_client_id_hash
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_hash_client_id_hash(void *key, void *user_context)
+ *
+ * DESCRIPTION
+ *
+ *    Hash Client ID's hash.  Can be used with SilcHashTable.
+ *
+ ***/
+SilcUInt32 silc_hash_client_id_hash(void *key, void *user_context);
+
+/****f* silccore/SilcIDAPI/silc_hash_id_compare
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_hash_id_compare(void *key1, void *key2,
+ *                                  void *user_context);
+ *
+ * DESCRIPTION
+ *
+ *    Compares two ID's. May be used as SilcHashTable comparison function.
+ *    The Client ID's compares only the hash of the Client ID not any other
+ *    part of the Client ID. Other ID's are fully compared.  Can be
+ *    used with SilcHashTable.
+ *
+ ***/
+SilcBool silc_hash_id_compare(void *key1, void *key2, void *user_context);
+
+/****f* silccore/SilcIDAPI/silc_hash_id_compare_full
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_hash_id_compare_full(void *key1, void *key2,
+ *                                       void *user_context)
+ *
+ * DESCRIPTION
+ *
+ *    Compares two ID's. May be used as SilcHashTable comparison function.
+ *    To compare full ID's instead of only partial, like the
+ *    silc_hash_id_compare does, use this function.  Can be used with
+ *    SilcHashTable.
+ *
+ ***/
+SilcBool silc_hash_id_compare_full(void *key1, void *key2, void *user_context);
+
+/****f* silccore/SilcIDAPI/silc_hash_client_id_compare
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_hash_client_id_compare(void *key1, void *key2,
+ *                                         void *user_context);
+ *
+ * DESCRIPTION
+ *
+ *    Compare two Client ID's entirely and not just the hash from the ID.
+ *    Can be used with SilcHashTable.
+ *
+ ***/
+SilcBool silc_hash_client_id_compare(void *key1, void *key2,
+                                    void *user_context);
+
 #endif