198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou/****************************************************************************** 298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * 398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * Copyright (C) 2015 Google, Inc. 498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * 598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * Licensed under the Apache License, Version 2.0 (the "License"); 698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * you may not use this file except in compliance with the License. 798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * You may obtain a copy of the License at: 898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * 998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * http://www.apache.org/licenses/LICENSE-2.0 1098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * 1198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * Unless required by applicable law or agreed to in writing, software 1298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * distributed under the License is distributed on an "AS IS" BASIS, 1398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * See the License for the specific language governing permissions and 1598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * limitations under the License. 1698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou * 1798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou ******************************************************************************/ 1898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#define LOG_TAG "hash_map_utils" 1998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 2098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#include "osi/include/hash_map_utils.h" 2198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 2298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#include <assert.h> 2398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#include <string.h> 2498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 2598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#include "osi/include/allocator.h" 2698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#include "osi/include/hash_functions.h" 2798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#include "osi/include/hash_map.h" 2898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#include "osi/include/log.h" 2998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou#include "osi/include/osi.h" 3098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 3198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Choustatic bool string_equals(const void *key_a, const void *key_b); 3298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Choustatic bool dump_entry(hash_map_entry_t *entry, UNUSED_ATTR void *context); 3398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 3498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Choustatic const size_t BUCKETS_NUM = 5; 3598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 3698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chouhash_map_t *hash_map_utils_new_from_string_params(const char *params) { 3798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou assert(params != NULL); 3898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 3998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou hash_map_t *map = hash_map_new(BUCKETS_NUM, hash_function_string, osi_free, 4098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou osi_free, string_equals); 4198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou if (!map) 4298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou return NULL; 4398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 4498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou char *str = osi_strdup(params); 4598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou if (!str) 4698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou return NULL; 4798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 4898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou LOG_VERBOSE(LOG_TAG, "%s: source string: '%s'", __func__, str); 4998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 5098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou // Parse |str| and add extracted key-and-value pair(s) in |map|. 5198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou int items = 0; 5298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou char *tmpstr; 5398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou char *kvpair = strtok_r(str, ";", &tmpstr); 5498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou while (kvpair && *kvpair) { 5598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou char *eq = strchr(kvpair, '='); 5698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 5798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou if (eq == kvpair) 5898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou goto next_pair; 5998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 6098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou char *key; 6198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou char *value; 6298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou if (eq) { 6398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou key = osi_strndup(kvpair, eq - kvpair); 6498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 6598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou // The increment of |eq| moves |eq| to the beginning of the value. 6698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou ++eq; 6798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou value = (*eq != '\0') ? osi_strdup(eq) : osi_strdup(""); 6898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou } else { 6998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou key = osi_strdup(kvpair); 7098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou value = osi_strdup(""); 7198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou } 7298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 7398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou hash_map_set(map, key, value); 7498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 7598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou items++; 7698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chounext_pair: 7798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou kvpair = strtok_r(NULL, ";", &tmpstr); 7898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou } 7998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 8098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou if (!items) 8198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou LOG_VERBOSE(LOG_TAG, "%s: no items found in string\n", __func__); 8298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 8398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou osi_free(str); 8498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou return map; 8598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou} 8698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 8798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chouvoid hash_map_utils_dump_string_keys_string_values(hash_map_t *map) { 8898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou if (!map) { 8998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou LOG_VERBOSE( LOG_TAG, "%s: the given map is NULL\n", __func__); 9098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou return; 9198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou } 9298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou hash_map_foreach(map, dump_entry, NULL); 9398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou} 9498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 9598a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Choustatic bool string_equals(const void *key_a, const void *key_b) { 9698a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou return !strcmp(key_a, key_b); 9798a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou} 9898a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou 9998a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Choustatic bool dump_entry(hash_map_entry_t *entry, UNUSED_ATTR void *context) { 10098a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou hash_map_entry_t *hash_map_entry = (hash_map_entry_t *)entry; 10198a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou LOG_INFO(LOG_TAG, "key: '%s' value: '%s'\n", (char *)hash_map_entry->key, 10298a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou (char *)hash_map_entry->data); 10398a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou return true; 10498a9641e77a247e5ba9a7f263066058d17e2b0a0Miao Chou} 105