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