Source File pr/properties.c

    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() */