aboutsummaryrefslogtreecommitdiffstats
path: root/metis/ccnx/forwarder/metis/config/metis_SymbolicNameTable.c
diff options
context:
space:
mode:
Diffstat (limited to 'metis/ccnx/forwarder/metis/config/metis_SymbolicNameTable.c')
-rw-r--r--metis/ccnx/forwarder/metis/config/metis_SymbolicNameTable.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/metis/ccnx/forwarder/metis/config/metis_SymbolicNameTable.c b/metis/ccnx/forwarder/metis/config/metis_SymbolicNameTable.c
new file mode 100644
index 00000000..f6c50688
--- /dev/null
+++ b/metis/ccnx/forwarder/metis/config/metis_SymbolicNameTable.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <config.h>
+#include <ctype.h>
+
+#include <LongBow/runtime.h>
+#include <parc/algol/parc_Memory.h>
+#include <parc/algol/parc_HashCodeTable.h>
+#include <parc/algol/parc_Hash.h>
+
+#include <ccnx/forwarder/metis/config/metis_SymbolicNameTable.h>
+
+struct metis_symblic_name_table {
+ PARCHashCodeTable *symbolicNameTable;
+};
+
+// ========================================================================================
+// symbolic name table functions
+
+static bool
+_symbolicNameEquals(const void *keyA, const void *keyB)
+{
+ return (strcasecmp((const char *) keyA, (const char *) keyB) == 0);
+}
+
+static HashCodeType
+_symbolicNameHash(const void *keyA)
+{
+ const char *str = (const char *) keyA;
+ size_t length = strlen(str);
+ return parcHash32_Data(str, length);
+}
+
+// ========================================================================================
+
+MetisSymbolicNameTable *
+metisSymbolicNameTable_Create(void)
+{
+ MetisSymbolicNameTable *table = parcMemory_Allocate(sizeof(MetisSymbolicNameTable));
+
+ if (table) {
+ // key = char *
+ // value = uint32_t *
+ table->symbolicNameTable = parcHashCodeTable_Create(_symbolicNameEquals, _symbolicNameHash, parcMemory_DeallocateImpl, parcMemory_DeallocateImpl);
+ }
+
+ return table;
+}
+
+void
+metisSymbolicNameTable_Destroy(MetisSymbolicNameTable **tablePtr)
+{
+ MetisSymbolicNameTable *table = *tablePtr;
+ parcHashCodeTable_Destroy(&table->symbolicNameTable);
+ parcMemory_Deallocate((void **) &table);
+ *tablePtr = NULL;
+}
+
+static char *
+_createKey(const char *symbolicName)
+{
+ char *key = parcMemory_StringDuplicate(symbolicName, strlen(symbolicName));
+
+ // convert key to upper case
+ char *p = key;
+
+ // keeps looping until the first null
+ while ((*p = toupper(*p))) {
+ p++;
+ }
+ return key;
+}
+
+bool
+metisSymbolicNameTable_Exists(MetisSymbolicNameTable *table, const char *symbolicName)
+{
+ assertNotNull(table, "Parameter table must be non-null");
+ assertNotNull(symbolicName, "Parameter symbolicName must be non-null");
+
+ char *key = _createKey(symbolicName);
+ bool found = (parcHashCodeTable_Get(table->symbolicNameTable, key) != NULL);
+ parcMemory_Deallocate((void **) &key);
+ return found;
+}
+
+void
+metisSymbolicNameTable_Remove(MetisSymbolicNameTable *table, const char *symbolicName)
+{
+ assertNotNull(table, "Parameter table must be non-null");
+ assertNotNull(symbolicName, "Parameter symbolicName must be non-null");
+
+ char *key = _createKey(symbolicName);
+ parcHashCodeTable_Del(table->symbolicNameTable, key);
+ parcMemory_Deallocate((void **) &key);
+
+}
+
+bool
+metisSymbolicNameTable_Add(MetisSymbolicNameTable *table, const char *symbolicName, unsigned connid)
+{
+ assertNotNull(table, "Parameter table must be non-null");
+ assertNotNull(symbolicName, "Parameter symbolicName must be non-null");
+ assertTrue(connid < UINT32_MAX, "Parameter connid must be less than %u", UINT32_MAX);
+
+ char *key = _createKey(symbolicName);
+
+ uint32_t *value = parcMemory_Allocate(sizeof(uint32_t));
+ *value = connid;
+
+ bool success = parcHashCodeTable_Add(table->symbolicNameTable, key, value);
+ if (!success) {
+ parcMemory_Deallocate((void **) &key);
+ parcMemory_Deallocate((void **) &value);
+ }
+
+ return success;
+}
+
+unsigned
+metisSymbolicNameTable_Get(MetisSymbolicNameTable *table, const char *symbolicName)
+{
+ assertNotNull(table, "Parameter table must be non-null");
+ assertNotNull(symbolicName, "Parameter symbolicName must be non-null");
+
+ unsigned connid = UINT32_MAX;
+
+ char *key = _createKey(symbolicName);
+
+ uint32_t *value = parcHashCodeTable_Get(table->symbolicNameTable, key);
+ if (value) {
+ connid = *value;
+ }
+
+ parcMemory_Deallocate((void **) &key);
+ return connid;
+}
+