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