## modules/pr/properties.c

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. PR_to_string
2. purge_properties
3. add_property
4. PR_set
5. PR_load
6. PR_get_property

       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) {
         /* [<][>][^][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() */

/* [<][>][^][v][top][bottom][index][help] */