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