key_value.c revision bdd62c531bbdea115a3a7e71bba91c19dd319cc4
1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copyright 2008 Google Inc. 359d709d503bab6e2b61931737e662dd293b40578ccornelius * 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License"); 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * you may not use this file except in compliance with the License. 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * You may obtain a copy of the License at 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * http://www.apache.org/licenses/LICENSE-2.0 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS, 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * See the License for the specific language governing permissions and 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * limitations under the License. 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stddef.h> 1759d709d503bab6e2b61931737e662dd293b40578ccornelius#include <stdlib.h> 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h> 1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef struct KeyValue { 2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho unsigned int key; 2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char* value; 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} KeyValue; 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic KeyValue *key_values = NULL; 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic unsigned int number_of_key_values = 0; 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid set_key_values(KeyValue * const new_key_values, 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const unsigned int new_number_of_key_values) { 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru key_values = new_key_values; 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru number_of_key_values = new_number_of_key_values; 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Compare two key members of KeyValue structures. 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint key_value_compare_keys(const void *a, const void *b) { 3659d709d503bab6e2b61931737e662dd293b40578ccornelius return (int)((KeyValue*)a)->key - (int)((KeyValue*)b)->key; 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Search an array of key value pairs for the item with the specified value. 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruKeyValue* find_item_by_value(const char * const value) { 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru unsigned int i; 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (i = 0; i < number_of_key_values; i++) { 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (strcmp(key_values[i].value, value) == 0) { 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return &key_values[i]; 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return NULL; 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Sort an array of key value pairs by key. 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid sort_items_by_key() { 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru qsort(key_values, number_of_key_values, sizeof(*key_values), 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru key_value_compare_keys); 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru