modules/pr/properties.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- PR_to_string
- purge_properties
- add_property
- PR_set
- PR_load
- PR_get_property
1 /***************************************
2 $Revision: 1.11 $
3
4 Properties module (pr) - this _should_ eventually get merged in with the
5
6 Status: NOT REVUED, NOT TESTED
7
8 +html+ <DL COMPACT>
9 +html+ <DT>Online References:
10 +html+ <DD><UL>
11 +html+ <LI><A HREF=".properties">.properties</A>
12 +html+ </UL>
13 +html+ </DL>
14 +html+ <PRE>
15 Instructions for use:
16
17 To get a property:
18 use the PR_get_property("Property.name") function from your other code.
19 +html+ </PRE>
20
21 ******************/ /******************
22 Filename : properties.c
23 Description : Provides a hash table of tokens and their values.
24 Author : ottrey@ripe.net
25 Date : 04/03/1999
26 OSs Tested : Solaris, BSDI, Linux
27 Input Files : .properties
28 Related Modules : Used in conjunction with the constants module.
29 Problems :
30 To Do : Fix up handling multi-lined properties.
31 : PR_set() could be cleaned up a little.
32 Comments :
33 ******************/ /******************
34 Copyright (c) 1999,2000,2001 RIPE NCC
35
36 All Rights Reserved
37
38 Permission to use, copy, modify, and distribute this software and its
39 documentation for any purpose and without fee is hereby granted,
40 provided that the above copyright notice appear in all copies and that
41 both that copyright notice and this permission notice appear in
42 supporting documentation, and that the name of the author not be
43 used in advertising or publicity pertaining to distribution of the
44 software without specific, written prior permission.
45
46 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
47 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
48 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
49 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
50 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
51 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
52 ***************************************/
53
54 #include "rip.h"
55
56 #include <stdio.h>
57 #include <stdlib.h>
58 #include <string.h>
59 #include <glib.h>
60
61 #define COMMENT_CHARACTER #
62 #define MAX_PROPERTIES 1024
63
64
65 /*
66 * Type defs
67 */
68 /*+ Each property has a +*/
69 typedef struct _Property {
70 char *token; /*+ Token to be found in properties file. +*/
71 char *value; /*+ Value to be found in properties file. +*/
72 } *Property;
73
74
75 /*
76 * Global Variables
77 */
78 /*+ Array of Properties +*/
79 Property Properties[MAX_PROPERTIES];
80
81 /*+ The number of properties. +*/
82 int Prop_count = 0;
83
84 /*+ The name of properties file. +*/
85 char *Prop_file_name;
86
87
88
89 /* PR_to_string() */
90 /*++++++++++++++++++++++++++++++++++++++
91 Returns the properties as a string.
92
93 More:
94 +html+ <PRE>
95 Authors:
96 ottrey
97
98 Pre-Conditions:
99 The properties must be loaded first with load_properties().
100
101 +html+ </PRE><DL COMPACT>
102 +html+ <DT>Online References:
103 +html+ <DD><UL>
104 +html+ </UL></DL>
105
106 ++++++++++++++++++++++++++++++++++++++*/
107 char *PR_to_string(void) {
/* [<][>][^][v][top][bottom][index][help] */
108 char *props;
109 GString *tmp;
110 int i=0;
111
112 tmp = g_string_new("Properties = { ");
113 for(i=0; i< Prop_count; i++) {
114 g_string_sprintfa(tmp, "[%s]=\"%s\" ",
115 Properties[i]->token, Properties[i]->value );
116 }
117 g_string_append_c(tmp, '}');
118
119 props = UT_strdup(tmp->str);
120 g_string_free(tmp, TRUE);
121
122 return props;
123 } /* PR_to_string() */
124
125 /* purge_properties() */
126 /*++++++++++++++++++++++++++++++++++++++
127 Purges the old properties.
128
129 More:
130 +html+ <PRE>
131 Authors:
132 ottrey
133 +html+ </PRE><DL COMPACT>
134 +html+ <DT>Online References:
135 +html+ <DD><UL>
136 +html+ <LI><A HREF="../src/.properties">.properties</A>
137 +html+ </UL></DL>
138
139 ++++++++++++++++++++++++++++++++++++++*/
140 static void purge_properties(void) {
/* [<][>][^][v][top][bottom][index][help] */
141 int i;
142
143 for(i=0; i < Prop_count; i++) {
144 UT_free(Properties[i]->value);
145 UT_free(Properties[i]->token);
146 UT_free(Properties[i]);
147 }
148
149 Prop_count = 0;
150 } /* purge_properties() */
151
152
153 /* add_property() */
154 /*++++++++++++++++++++++++++++++++++++++
155 Adds a new property to the Properties array.
156
157 More:
158 +html+ <PRE>
159 Authors:
160 ottrey
161 +html+ </PRE><DL COMPACT>
162 +html+ <DT>Online References:
163 +html+ <DD><UL>
164 +html+ <LI><A HREF=".properties">.properties</A>
165 +html+ </UL></DL>
166
167 ++++++++++++++++++++++++++++++++++++++*/
168 static void add_property(const char *token, const char *value) {
/* [<][>][^][v][top][bottom][index][help] */
169 Property prop;
170
171 prop = (Property)UT_calloc(1, sizeof(struct _Property));
172
173 prop->token = UT_strdup(token);
174 prop->value = UT_strdup(value);
175
176 Properties[Prop_count] = prop;
177
178 Prop_count++;
179 Properties[Prop_count] = NULL;
180 } /* add_property() */
181
182
183 /* PR_set() */
184 /*++++++++++++++++++++++++++++++++++++++
185 Sets the properties from the properties file.
186
187 More:
188 +html+ <PRE>
189 Authors:
190 ottrey
191 +html+ </PRE><DL COMPACT>
192 +html+ <DT>Online References:
193 +html+ <DD><UL>
194 +html+ <LI><A HREF=".properties">.properties</A>
195 +html+ </UL></DL>
196
197 ++++++++++++++++++++++++++++++++++++++*/
198 char *PR_set() {
/* [<][>][^][v][top][bottom][index][help] */
199 FILE *prop_file;
200 char prop_line[1024];
201 char prop_line_more[1024];
202 char *eql_ptr;
203 char *token_ptr;
204 char *token_e_ptr;
205 char *value_ptr;
206 char *value_more_ptr;
207 char *value_e_ptr;
208 int token_l, value_l;
209 int more_lines;
210 char the_token[64];
211 char the_value[1024];
212 char result_buff[256];
213
214 prop_file = fopen(Prop_file_name, "r");
215 if (prop_file == NULL) {
216 fprintf(stderr, "Error: Can't find properties file: %s\n", Prop_file_name);
217 sprintf(result_buff, "Error: Can't find properties file: %s", Prop_file_name);
218 }
219 else {
220 purge_properties();
221
222 while (fgets(prop_line, 1024, prop_file) != 0) {
223 if ( (eql_ptr = strchr(prop_line, '=')) != NULL) {
224 /* An "=" was found */
225
226 token_ptr = prop_line;
227 token_e_ptr = eql_ptr-1;
228
229 /* Trim the trailing spaces/tabs off the token. */
230 while (( *(token_e_ptr) == ' ') || ( *(token_e_ptr) == '\t')) {
231 token_e_ptr--;
232 }
233
234 /* Trim the leading spaces/tabs off the token. */
235 while (( *(token_ptr) == ' ') || ( *(token_ptr) == '\t')) {
236 token_ptr++;
237 }
238
239 /* Skip if it's a comment line. */
240 if (token_ptr[0] == '#' ) {
241 continue;
242 }
243
244 /* Assign the token */
245 token_l = (token_e_ptr - token_ptr) + 1;
246 strncpy(the_token, token_ptr, token_l);
247 the_token[token_l] = '\0';
248
249 value_ptr = eql_ptr+1;
250 value_e_ptr = strchr(prop_line, '\n')-1;
251
252 /* Trim the leading spaces/tabs off the value. */
253 while (( *(value_ptr) == ' ') || ( *(value_ptr) == '\t')) {
254 value_ptr++;
255 }
256
257 /* Trim the trailing spaces/tabs off the value. */
258 while (( *(value_e_ptr) == ' ') || ( *(value_e_ptr) == '\t')) {
259 value_e_ptr--;
260 }
261
262 /* Assign the value */
263 value_l = (value_e_ptr - value_ptr) + 1;
264 strncpy(the_value, value_ptr, value_l);
265 the_value[value_l] = '\0';
266
267 /* If the value goes over the line */
268 if ((value_e_ptr = strrchr(the_value, '\\')) != NULL) {
269 *value_e_ptr = ' ';
270 more_lines = 0;
271 do {
272 if (fgets(prop_line_more, 1024, prop_file) != 0) {
273
274 /* Trim the leading spaces/tabs off the line_more. */
275 value_more_ptr = prop_line_more;
276 while (( *(value_more_ptr) == ' ') || ( *(value_more_ptr) == '\t')) {
277 value_more_ptr++;
278 }
279
280 /* Trim the trailing spaces/tabs off the value. */
281 if ((value_e_ptr = strrchr(prop_line_more, '\\')) != NULL) {
282 more_lines = 1;
283 *value_e_ptr = ' ';
284 }
285 else {
286 more_lines = 0;
287 }
288 value_e_ptr = strchr(prop_line_more, '\n');
289 *value_e_ptr = ' ';
290 while ((*value_e_ptr == ' ') || (*value_e_ptr == '\t')) {
291 value_e_ptr--;
292 }
293
294 *(value_e_ptr+1) = '\0';
295 strcat(the_value, value_more_ptr);
296
297 }
298 } while (more_lines == 1);
299
300 value_l = strlen(the_value);
301 the_value[value_l] = '\0';
302 }
303
304 add_property(the_token, the_value);
305 } else {
306 /* Skip this line */
307 ;
308 }
309 }
310
311 /*
312 printf("%s\n", PR_to_string() );
313 */
314
315 fclose(prop_file);
316
317 sprintf(result_buff, "Properties successfully set from %s file. (%d properties)", Prop_file_name, Prop_count);
318 }
319
320 return UT_strdup(result_buff);
321 } /* PR_set() */
322
323
324 /* PR_load() */
325 /*++++++++++++++++++++++++++++++++++++++
326 Sets the properties file name. Then sets the properties with a call to set_properties().
327
328 More:
329 +html+ <PRE>
330 Authors:
331 ottrey
332 +html+ </PRE><DL COMPACT>
333 +html+ <DT>Online References:
334 +html+ <DD><UL>
335 +html+ <LI><A HREF=".properties">.properties</A>
336 +html+ </UL></DL>
337
338 ++++++++++++++++++++++++++++++++++++++*/
339 void PR_load(const char *prop_file_name) {
/* [<][>][^][v][top][bottom][index][help] */
340
341 Prop_file_name = UT_strdup(prop_file_name);
342 UT_free(PR_set());
343
344 } /* PR_load() */
345
346
347 /* PR_get_property() */
348 /*++++++++++++++++++++++++++++++++++++++
349 Sets the properties file name. Then sets the properties with a call to set_properties().
350
351 More:
352 +html+ <PRE>
353 Authors:
354 ottrey
355 +html+ </PRE><DL COMPACT>
356 +html+ <DT>Online References:
357 +html+ <DD><UL>
358 +html+ <LI><A HREF=".properties">.properties</A>
359 +html+ </UL></DL>
360
361 ++++++++++++++++++++++++++++++++++++++*/
362 char *PR_get_property(const char *token, const char *default_value) {
/* [<][>][^][v][top][bottom][index][help] */
363 char *value;
364 int i = 0;
365
366 /* Search through the Properties until the token is found */
367 while (i < Prop_count) {
368 if (strcmp(token, Properties[i]->token) == 0) {
369 break;
370 }
371 i++;
372 }
373
374 if (i == Prop_count) {
375 /* If token not found return the default value */
376 if (default_value == NULL) {
377 value = UT_strdup("");
378 } else {
379 value = UT_strdup(default_value);
380 }
381 } else {
382 /* Return the found value */
383 value = UT_strdup(Properties[i]->value);
384 }
385
386 return value;
387
388 } /* PR_get_property() */