1    | /***************************************
2    |   $Revision: 1.12 $
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,2002               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) {
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) {
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) {
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() {
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) {
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) {
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() */