## 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.8 $
       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) {
         /* [<][>][^][v][top][bottom][index][help] */
     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) {
         /* [<][>][^][v][top][bottom][index][help] */
     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) {
         /* [<][>][^][v][top][bottom][index][help] */
     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() {
         /* [<][>][^][v][top][bottom][index][help] */
     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) {
         /* [<][>][^][v][top][bottom][index][help] */
     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   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) {
         /* [<][>][^][v][top][bottom][index][help] */
     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() */

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