Source File modules/pr/properties.c

    1    | /***************************************
    2    |   $Revision: 1.9 $
    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                              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   | #include <stdio.h>
    54   | #include <stdlib.h>
    55   | #include <string.h>
    56   |
    57   | #include "memwrap.h"
    58   |
    59   | #define COMMENT_CHARACTER #
    60   | #define MAX_PROPERTIES    1024
    61   |
    62   |
    63   | /*
    64   |  * Type defs
    65   |  */
    66   | /*+ Each property has a +*/
    67   | typedef struct _Property {
    68   |   char *token;                  /*+ Token to be found in properties file. +*/
    69   |   char *value;                  /*+ Value to be found in properties file. +*/
    70   | } *Property;
    71   |
    72   |
    73   | /*
    74   |  * Global Variables
    75   |  */
    76   | /*+ Array of Properties +*/
    77   | Property Properties[MAX_PROPERTIES];
    78   |
    79   | /*+ The number of properties. +*/
    80   | int Prop_count = 0;
    81   |
    82   | /*+ The name of properties file. +*/
    83   | char  *Prop_file_name;
    84   |
    85   |
    86   |
    87   | /* PR_to_string() */
    88   | /*++++++++++++++++++++++++++++++++++++++
    89   |   Returns the properties as a string.
    90   |
    91   |   More:
    92   |   +html+ <PRE>
    93   |   Authors:
    94   |         ottrey
    95   |
    96   |   Pre-Conditions:
    97   |         The properties must be loaded first with load_properties().
    98   |
    99   |   +html+ </PRE><DL COMPACT>
    100  |   +html+ <DT>Online References:
    101  |   +html+ <DD><UL>
    102  |   +html+ </UL></DL>
    103  |
    104  |   ++++++++++++++++++++++++++++++++++++++*/
    105  | char *PR_to_string(void) {
    106  |   char *props;
    107  |   char props_buffer[2048];
    108  |   char tmp_prop[1024];
    109  |   int i=0;
    110  |
    111  |   sprintf(props_buffer, "Properties = { ");
    112  |   for(i=0; i< Prop_count; i++) {
    113  |     sprintf(tmp_prop, "[%s]=\"%s\" ", Properties[i]->token, Properties[i]->value );
    114  |     strcat(props_buffer, tmp_prop);
    115  |   }
    116  |   strcat(props_buffer, "}");
    117  |
    118  |   /*
    119  |   props = (char *)CopyString(props_buffer);
    120  |   */
    121  |   /* props = (char *)calloc(1, strlen(props_buffer)+1); */
    122  |   dieif( wr_malloc((void **)&props, strlen(props_buffer)+1) != UT_OK);
    123  |
    124  |   strcpy(props, props_buffer);
    125  |
    126  |   return props;
    127  | } /* PR_to_string() */
    128  |
    129  | /* purge_properties() */
    130  | /*++++++++++++++++++++++++++++++++++++++
    131  |   Purges the old properties.
    132  |
    133  |   More:
    134  |   +html+ <PRE>
    135  |   Authors:
    136  |         ottrey
    137  |   +html+ </PRE><DL COMPACT>
    138  |   +html+ <DT>Online References:
    139  |   +html+ <DD><UL>
    140  |   +html+   <LI><A HREF="../src/.properties">.properties</A>
    141  |   +html+ </UL></DL>
    142  |
    143  |   ++++++++++++++++++++++++++++++++++++++*/
    144  | static void purge_properties(void) {
    145  |   int i;
    146  |
    147  |   for(i=0; i < Prop_count; i++) {
    148  |     wr_free(Properties[i]->value);
    149  |     wr_free(Properties[i]->token);
    150  |     wr_free(Properties[i]);
    151  |   }
    152  |
    153  |   Prop_count = 0;
    154  | } /* purge_properties() */
    155  |
    156  |
    157  | /* add_property() */
    158  | /*++++++++++++++++++++++++++++++++++++++
    159  |   Adds a new property to the Properties array.
    160  |
    161  |   More:
    162  |   +html+ <PRE>
    163  |   Authors:
    164  |         ottrey
    165  |   +html+ </PRE><DL COMPACT>
    166  |   +html+ <DT>Online References:
    167  |   +html+ <DD><UL>
    168  |   +html+   <LI><A HREF=".properties">.properties</A>
    169  |   +html+ </UL></DL>
    170  |
    171  |   ++++++++++++++++++++++++++++++++++++++*/
    172  | static void add_property(const char *token, const char *value) {
    173  |   Property prop;
    174  |
    175  |   /* prop = (Property)calloc(1, sizeof(struct _Property)); */
    176  |   dieif( wr_calloc((void **)&prop,1, sizeof(struct _Property)) != UT_OK);
    177  |
    178  |   /*
    179  |     prop->token = (char *)CopyString(token);
    180  |   */
    181  |   /* prop->token = (char *)calloc(1, strlen(token)+1); */
    182  |   dieif( wr_malloc((void **)&(prop->token), strlen(token)+1) != UT_OK);
    183  |   strcpy(prop->token, token);
    184  |
    185  |   /*
    186  |   prop->value = (char *)CopyString(value);
    187  |   */
    188  |   /* prop->value = (char *)calloc(1, strlen(value)+1); */
    189  |   dieif( wr_malloc((void **)&(prop->value), strlen(value)+1) != UT_OK);
    190  |   strcpy(prop->value, value);
    191  |
    192  |   Properties[Prop_count] = prop;
    193  |
    194  |   Prop_count++;
    195  |   Properties[Prop_count] = NULL;
    196  | } /* add_property() */
    197  |
    198  |
    199  | /* PR_set() */
    200  | /*++++++++++++++++++++++++++++++++++++++
    201  |   Sets the properties from the properties file.
    202  |
    203  |   More:
    204  |   +html+ <PRE>
    205  |   Authors:
    206  |         ottrey
    207  |   +html+ </PRE><DL COMPACT>
    208  |   +html+ <DT>Online References:
    209  |   +html+ <DD><UL>
    210  |   +html+   <LI><A HREF=".properties">.properties</A>
    211  |   +html+ </UL></DL>
    212  |
    213  |   ++++++++++++++++++++++++++++++++++++++*/
    214  | char *PR_set() {
    215  |   FILE    *prop_file;
    216  |   char    prop_line[1024];
    217  |   char    prop_line_more[1024];
    218  |   char    *eql_ptr;
    219  |   char    *token_ptr;
    220  |   char    *token_e_ptr;
    221  |   char    *value_ptr;
    222  |   char    *value_more_ptr;
    223  |   char    *value_e_ptr;
    224  |   int     token_l, value_l;
    225  |   int     more_lines;
    226  |   char    the_token[64];
    227  |   char    the_value[1024];
    228  |   char    result_buff[256];
    229  |   char    *result;
    230  |
    231  |   prop_file = fopen(Prop_file_name, "r");
    232  |   if (prop_file == NULL) {
    233  |     fprintf(stderr, "Error: Can't find properties file: %s\n", Prop_file_name);
    234  |     sprintf(result_buff, "Error: Can't find properties file: %s", Prop_file_name);
    235  |   }
    236  |   else {
    237  |     purge_properties();
    238  |
    239  |     while (fgets(prop_line, 1024, prop_file) != 0) {
    240  |       if ( (eql_ptr = strchr(prop_line, '=')) != NULL) {
    241  |         /* An "=" was found  */
    242  |
    243  |         token_ptr = prop_line;
    244  |         token_e_ptr = eql_ptr-1;
    245  |
    246  |         /* Trim the trailing spaces/tabs off the token. */
    247  |         while (( *(token_e_ptr) == ' ') || ( *(token_e_ptr) == '\t')) {
    248  |           token_e_ptr--;
    249  |         }
    250  |
    251  |         /* Trim the leading spaces/tabs off the token. */
    252  |         while (( *(token_ptr) == ' ') || ( *(token_ptr) == '\t')) {
    253  |           token_ptr++;
    254  |         }
    255  |
    256  |         /* Skip if it's a comment line. */
    257  |         if (token_ptr[0] == '#' ) {
    258  |           continue;
    259  |         }
    260  |
    261  |         /* Assign the token */
    262  |         token_l = (token_e_ptr - token_ptr) + 1;
    263  |         strncpy(the_token, token_ptr, token_l);
    264  |         the_token[token_l] = '\0';
    265  |
    266  |         value_ptr = eql_ptr+1;
    267  |         value_e_ptr = strchr(prop_line, '\n')-1;
    268  |
    269  |         /* Trim the leading spaces/tabs off the value. */
    270  |         while (( *(value_ptr) == ' ') || ( *(value_ptr) == '\t')) {
    271  |           value_ptr++;
    272  |         }
    273  |
    274  |         /* Trim the trailing spaces/tabs off the value. */
    275  |         while (( *(value_e_ptr) == ' ') || ( *(value_e_ptr) == '\t')) {
    276  |           value_e_ptr--;
    277  |         }
    278  |
    279  |         /* Assign the value */
    280  |         value_l = (value_e_ptr - value_ptr) + 1;
    281  |         strncpy(the_value, value_ptr, value_l);
    282  |         the_value[value_l] = '\0';
    283  |
    284  |         /* If the value goes over the line */
    285  |         if ((value_e_ptr = strrchr(the_value, '\\')) != NULL) {
    286  |           *value_e_ptr = ' ';
    287  |           more_lines = 0;
    288  |           do {
    289  |             if (fgets(prop_line_more, 1024, prop_file) != 0) {
    290  |
    291  |               /* Trim the leading spaces/tabs off the line_more. */
    292  |               value_more_ptr = prop_line_more;
    293  |               while (( *(value_more_ptr) == ' ') || ( *(value_more_ptr) == '\t')) {
    294  |                 value_more_ptr++;
    295  |               }
    296  |
    297  |               /* Trim the trailing spaces/tabs off the value. */
    298  |               if ((value_e_ptr = strrchr(prop_line_more, '\\')) != NULL) {
    299  |                 more_lines = 1;
    300  |                 *value_e_ptr = ' ';
    301  |               }
    302  |               else {
    303  |                 more_lines = 0;
    304  |               }
    305  |               value_e_ptr = strchr(prop_line_more, '\n');
    306  |               *value_e_ptr = ' ';
    307  |               while ((*value_e_ptr == ' ') || (*value_e_ptr == '\t')) {
    308  |                 value_e_ptr--;
    309  |               }
    310  |
    311  |               *(value_e_ptr+1) = '\0';
    312  |               strcat(the_value, value_more_ptr);
    313  |
    314  |             }
    315  |           } while (more_lines == 1);
    316  |
    317  |           value_l = strlen(the_value);
    318  |           the_value[value_l] = '\0';
    319  |         }
    320  |
    321  |         add_property(the_token, the_value);
    322  |       } else {
    323  |         /* Skip this line */
    324  |         ;
    325  |       }
    326  |     }
    327  |
    328  |     /*
    329  |     printf("%s\n", PR_to_string() );
    330  |     */
    331  |
    332  |     fclose(prop_file);
    333  |
    334  |     sprintf(result_buff, "Properties successfully set from %s file.  (%d properties)", Prop_file_name, Prop_count);
    335  |   }
    336  |
    337  |   /*
    338  |   result = (char *)CopyString(result_buff);
    339  |   */
    340  |   /* result = (char *)calloc(1, strlen(result_buff)+1); */
    341  |   dieif( wr_malloc((void **)&result, strlen(result_buff)+1 ) != UT_OK);
    342  |
    343  |   strcpy(result, result_buff);
    344  |
    345  |   return result;
    346  | } /* PR_set() */
    347  |
    348  |
    349  | /* PR_load() */
    350  | /*++++++++++++++++++++++++++++++++++++++
    351  |   Sets the properties file name.  Then sets the properties with a call to set_properties().
    352  |
    353  |   More:
    354  |   +html+ <PRE>
    355  |   Authors:
    356  |         ottrey
    357  |   +html+ </PRE><DL COMPACT>
    358  |   +html+ <DT>Online References:
    359  |   +html+ <DD><UL>
    360  |   +html+   <LI><A HREF=".properties">.properties</A>
    361  |   +html+ </UL></DL>
    362  |
    363  |   ++++++++++++++++++++++++++++++++++++++*/
    364  | void PR_load(const char *prop_file_name) {
    365  |
    366  |   /*
    367  |   Prop_file_name = (char *)CopyString(prop_file_name);
    368  |   */
    369  |   /* Prop_file_name = (char *)calloc(1, strlen(prop_file_name)+1); */
    370  |
    371  |   dieif( wr_malloc((void **)&Prop_file_name,
    372  | 		   strlen(prop_file_name)+1) != UT_OK);
    373  |   strcpy(Prop_file_name, prop_file_name);
    374  |
    375  |   free(PR_set());
    376  |
    377  | } /* PR_load() */
    378  |
    379  |
    380  | /* PR_get_property() */
    381  | /*++++++++++++++++++++++++++++++++++++++
    382  |   Sets the properties file name.  Then sets the properties with a call to set_properties().
    383  |
    384  |   More:
    385  |   +html+ <PRE>
    386  |   Authors:
    387  |         ottrey
    388  |   +html+ </PRE><DL COMPACT>
    389  |   +html+ <DT>Online References:
    390  |   +html+ <DD><UL>
    391  |   +html+   <LI><A HREF=".properties">.properties</A>
    392  |   +html+ </UL></DL>
    393  |
    394  |   ++++++++++++++++++++++++++++++++++++++*/
    395  | char *PR_get_property(const char *token, const char *default_value) {
    396  |   char *value;
    397  |   int   i = 0;
    398  |
    399  |   /* Search through the Properties until the token is found */
    400  |   while (i < Prop_count) {
    401  |     if (strcmp(token, Properties[i]->token) == 0) {
    402  |       break;
    403  |     }
    404  |     i++;
    405  |   }
    406  |
    407  |   if (i == Prop_count) {
    408  |     /* If token not found return the default value */
    409  |     if (default_value == NULL) {
    410  |       strcpy(value, "");
    411  |     } else {
    412  |       /*
    413  |       value = (char *)CopyString(default_value);
    414  |       */
    415  |       /*      value = (char *)calloc(1, strlen(default_value)+1); */
    416  |       dieif( wr_malloc((void **)&value, strlen(default_value)+1) != UT_OK);
    417  |       strcpy(value, default_value);
    418  |     }
    419  |   } else {
    420  |     /* Return the found value */
    421  |     /*
    422  |     value = (char *)CopyString(Properties[i]->value);
    423  |     */
    424  |     /*     value = (char *)calloc(1, strlen(Properties[i]->value)+1); */
    425  |     dieif( wr_malloc((void **)&value, strlen(Properties[i]->value)+1) != UT_OK);
    426  |     strcpy(value, Properties[i]->value);
    427  |   }
    428  |
    429  |   return value;
    430  |
    431  | } /* PR_get_property() */