Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / core / params.c
1 /*
2  * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  */
19
20 FILE_LICENCE ( GPL2_OR_LATER );
21
22 /** @file
23  *
24  * Form parameters
25  *
26  */
27
28 #include <stdlib.h>
29 #include <string.h>
30 #include <ipxe/params.h>
31
32 /** List of all parameter lists */
33 static LIST_HEAD ( parameters );
34
35 /**
36  * Free form parameter list
37  *
38  * @v refcnt            Reference count
39  */
40 static void free_parameters ( struct refcnt *refcnt ) {
41         struct parameters *params =
42                 container_of ( refcnt, struct parameters, refcnt );
43         struct parameter *param;
44         struct parameter *tmp;
45
46         DBGC ( params, "PARAMS \"%s\" destroyed\n", params->name );
47
48         /* Free all parameters */
49         list_for_each_entry_safe ( param, tmp, &params->entries, list ) {
50                 list_del ( &param->list );
51                 free ( param );
52         }
53
54         /* Free parameter list */
55         free ( params );
56 }
57
58 /**
59  * Find form parameter list by name
60  *
61  * @v name              Parameter list name (may be NULL)
62  * @ret params          Parameter list, or NULL if not found
63  */
64 struct parameters * find_parameters ( const char *name ) {
65         struct parameters *params;
66
67         list_for_each_entry ( params, &parameters, list ) {
68                 if ( ( params->name == name ) ||
69                      ( strcmp ( params->name, name ) == 0 ) ) {
70                         return params;
71                 }
72         }
73         return NULL;
74 }
75
76 /**
77  * Create form parameter list
78  *
79  * @v name              Parameter list name (may be NULL)
80  * @ret params          Parameter list, or NULL on failure
81  */
82 struct parameters * create_parameters ( const char *name ) {
83         struct parameters *params;
84         size_t name_len;
85         char *name_copy;
86
87         /* Destroy any existing parameter list of this name */
88         params = find_parameters ( name );
89         if ( params ) {
90                 claim_parameters ( params );
91                 params_put ( params );
92         }
93
94         /* Allocate parameter list */
95         name_len = ( name ? ( strlen ( name ) + 1 /* NUL */ ) : 0 );
96         params = zalloc ( sizeof ( *params ) + name_len );
97         if ( ! params )
98                 return NULL;
99         ref_init ( &params->refcnt, free_parameters );
100         name_copy = ( ( void * ) ( params + 1 ) );
101
102         /* Populate parameter list */
103         if ( name ) {
104                 strcpy ( name_copy, name );
105                 params->name = name_copy;
106         }
107         INIT_LIST_HEAD ( &params->entries );
108
109         /* Add to list of parameter lists */
110         list_add_tail ( &params->list, &parameters );
111
112         DBGC ( params, "PARAMS \"%s\" created\n", params->name );
113         return params;
114 }
115
116 /**
117  * Add form parameter
118  *
119  * @v params            Parameter list
120  * @v key               Parameter key
121  * @v value             Parameter value
122  * @ret param           Parameter, or NULL on failure
123  */
124 struct parameter * add_parameter ( struct parameters *params,
125                                    const char *key, const char *value ) {
126         struct parameter *param;
127         size_t key_len;
128         size_t value_len;
129         char *key_copy;
130         char *value_copy;
131
132         /* Allocate parameter */
133         key_len = ( strlen ( key ) + 1 /* NUL */ );
134         value_len = ( strlen ( value ) + 1 /* NUL */ );
135         param = zalloc ( sizeof ( *param ) + key_len + value_len );
136         if ( ! param )
137                 return NULL;
138         key_copy = ( ( void * ) ( param + 1 ) );
139         value_copy = ( key_copy + key_len );
140
141         /* Populate parameter */
142         strcpy ( key_copy, key );
143         param->key = key_copy;
144         strcpy ( value_copy, value );
145         param->value = value_copy;
146
147         /* Add to list of parameters */
148         list_add_tail ( &param->list, &params->entries );
149
150         DBGC ( params, "PARAMS \"%s\" added \"%s\"=\"%s\"\n",
151                params->name, param->key, param->value );
152         return param;
153 }