Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/libsaio/CoreHash.c

1/*
2 * CoreHash usage example
3 *
4 */
5
6#include "libsaio.h"
7#include "bootstruct.h"
8#include "pci.h"
9#include "platform.h"
10#include "cpu.h"
11#include "CoreHash.h"
12
13
14#ifndef DEBUG_PLATFORM
15#define DEBUG_PLATFORM 0
16#endif
17
18#if DEBUG_PLATFORM
19#define DBG(x...)printf(x)
20#else
21#define DBG(x...)
22#endif
23
24char *gboardproduct = NULL;
25char *gPlatformName = NULL;
26char *gRootDevice = NULL;
27
28typedef enum envtype {
29 kEnvPtr = 0,
30 kEnvValue = 1
31} envtype;
32
33struct env_struct {
34 CoreHashHeader
35unsigned long value;
36void * ptr;
37 enum envtype Type;
38};
39
40// CoreHash Declarations
41CHInitStr(env_struct)
42CHUnInit(env_struct)
43
44static void CopyVarPtr (struct env_struct *var, void* ptr, size_t size);
45static struct env_struct *find_env(const char *name);
46static void _re_set_env_copy(struct env_struct *var , void* ptr,size_t size);
47struct env_struct *platform_env = NULL;
48
49static void CopyVarPtr (struct env_struct *var, void* ptr, size_t size)
50{
51 var->ptr = malloc(size);
52 memcpy(var->ptr, ptr, size);
53}
54
55static struct env_struct *find_env(const char *name) {
56
57 return env_struct_FindStrVar(name,platform_env);
58}
59
60static void _re_set_env_copy(struct env_struct *var , void* ptr,size_t size) {
61
62if (var->Type == kEnvPtr) {
63return ;
64}
65
66 if (var->ptr) {
67 free(var->ptr);
68 var->ptr = NULL;
69 }
70
71 CopyVarPtr(var, ptr, size);
72
73return;
74}
75
76void re_set_env_copy(const char *name , void* ptr,size_t size) {
77struct env_struct *var;
78
79var = find_env(name);
80if (!var|| (var->Type == kEnvPtr)) {
81printf("Unable to find environement variable %s\n",name);
82return ;
83}
84
85 _re_set_env_copy(var , ptr, size);
86
87return;
88}
89
90static void _set_env(const char *name, unsigned long value, enum envtype Type, void* ptr, size_t size ) {
91 struct env_struct *var;
92
93 var = env_struct_NewStrVar(name, &platform_env);
94if (!var) {
95return;
96}
97 if (Type == kEnvPtr) {
98 CopyVarPtr( var, ptr, size);
99 }
100 else if (Type == kEnvValue)
101 var->value = value;
102 else
103 return;
104
105 var->Type = Type;
106
107}
108
109/* Warning: set_env will create a new variable each time it will be called,
110 * if you want to set again an existing variable, please use safe_set_env or re_set_env .
111 * NOTE: If you set several times the "same variable" by using this function,
112 * the HASH_COUNT will grow up,
113 * but hopefully find_env will return the last variable that you have set with the same name
114 * ex: set_env("test",10);
115 * set_env("test",20);
116 *
117 * HASH_COUNT will be equal to 2, get_env("test") will return 20
118 *
119 * safe_set_env("test",10);
120 * safe_set_env("test",20);
121 *
122 * HASH_COUNT will be equal to 1, get_env("test") will return 20
123 *
124 * set_env("test",10);
125 * re_set_env("test",20);
126 *
127 * HASH_COUNT will be equal to 1, get_env("test") will return 20
128 *
129 */
130void set_env(const char *name, unsigned long value ) {
131 _set_env(name, value, kEnvValue,0,0);
132}
133
134void set_env_copy(const char *name, void * ptr, size_t size ) {
135 _set_env(name, 0, kEnvPtr,ptr,size);
136}
137
138unsigned long get_env_var(const char *name) {
139struct env_struct *var;
140
141var = find_env(name);
142if (!var) {
143printf("Unable to find environement variable %s\n",name);
144return 0;
145}
146
147 if (var->Type != kEnvValue) {
148 printf("Variable %s is not a value\n",name);
149 return 0;
150 }
151
152return var->value;
153
154}
155
156unsigned long get_env(const char *name) {
157
158return get_env_var(name);
159
160}
161
162void * get_env_ptr(const char *name) {
163struct env_struct *var;
164
165var = find_env(name);
166if (!var) {
167printf("Unable to get environement ptr variable %s\n",name);
168return 0;
169}
170
171 if (var->Type != kEnvPtr) {
172 printf("Variable %s is not a ptr\n",name);
173 return 0;
174 }
175
176return var->ptr;
177
178}
179
180/* If no specified variable exist, safe_set_env will create one, else it only modify the value */
181static void _safe_set_env(const char *name, unsigned long long value, enum envtype Type, void* ptr, size_t size )
182{
183struct env_struct *var;
184
185var = find_env(name);
186
187 if (!var) {
188 if (Type == kEnvPtr) {
189 _set_env(name, 0, kEnvPtr,ptr,size);
190 }
191 else if (Type == kEnvValue) {
192 _set_env(name, value, kEnvValue,0,0);
193 }
194 }
195 else if (var->Type != Type) {
196 return;
197}
198 else {
199 if (Type == kEnvValue)
200 var->value = value;
201 else if (Type == kEnvPtr)
202 _re_set_env_copy(var,ptr,size);
203 }
204
205return;
206}
207
208void safe_set_env_copy(const char *name , void * ptr, size_t size ) {
209
210 _safe_set_env(name, 0, kEnvPtr,ptr,size);
211
212return;
213}
214
215void safe_set_env(const char *name , unsigned long value) {
216
217 _safe_set_env(name, value, kEnvValue,0,0);
218
219return;
220}
221
222void re_set_env(const char *name , unsigned long value) {
223struct env_struct *var;
224
225var = find_env(name);
226if (!var || (var->Type != kEnvValue)/* kEnvPtr currently unsupported */) {
227printf("Unable to reset environement value variable %s\n",name);
228return ;
229}
230
231 var->value = value;
232
233return;
234}
235
236void unset_env(const char *name) {
237env_struct_DeleteStrVar(name, platform_env);
238}
239
240void free_platform_env(void) {
241 env_struct_DeleteAll(platform_env );
242}

Archive Download this file

Revision: 1887