You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2014/01/09 17:25:23 UTC
svn commit: r1556858 -
/incubator/celix/trunk/framework/private/src/properties.c
Author: pnoltes
Date: Thu Jan 9 16:25:22 2014
New Revision: 1556858
URL: http://svn.apache.org/r1556858
Log:
updated properties for additional escape characters
Modified:
incubator/celix/trunk/framework/private/src/properties.c
Modified: incubator/celix/trunk/framework/private/src/properties.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/properties.c?rev=1556858&r1=1556857&r2=1556858&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/properties.c (original)
+++ incubator/celix/trunk/framework/private/src/properties.c Thu Jan 9 16:25:22 2014
@@ -27,6 +27,7 @@
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
+#include "celixbool.h"
#include "properties.h"
#include "utils.h"
@@ -45,7 +46,95 @@ void properties_destroy(properties_pt pr
hashMap_destroy(properties, false, false);
}
-properties_pt properties_load(char * filename) {
+properties_pt properties_load(char *filename) {
+ properties_pt props = properties_create();
+ FILE *file = fopen ( filename, "r" );
+
+ char line[1024];
+ char key[1024];
+ char value[1024];
+ bool precedingCharIsBackslash = false;
+ bool isComment = false;
+ int valueStart = 0;
+ int linePos = 0;
+ int outputPos = 0;
+ char *output = NULL;
+
+
+ while ( fgets ( line, sizeof line, file ) != NULL ) {
+
+ linePos = 0;
+ precedingCharIsBackslash = false;
+ isComment = false;
+ output = NULL;
+ outputPos = 0;
+ key[0] = '\0';
+ value[0] = '\0';
+
+ while (line[linePos] != '\0') {
+ if (line[linePos] == ' ' || line[linePos] == '\t') {
+ if (output == NULL) {
+ //ignore
+ linePos+=1;
+ continue;
+ } else {
+ output[outputPos++] = line[linePos];
+ }
+ } else {
+ if (output == NULL) {
+ output = key;
+ }
+ }
+ if (line[linePos] == '=' || line[linePos] == ':' || line[linePos] == '#' || line[linePos] == '!') {
+ if (precedingCharIsBackslash) {
+ //escaped special character
+ output[outputPos++] = line[linePos];
+ } else {
+ if (line[linePos] == '#' || line[linePos] == '!') {
+ if (outputPos == 0) {
+ isComment = true;
+ break;
+ } else {
+ output[outputPos++] = line[linePos];
+ }
+ } else { // = or :
+ if (output == value) { //already have a seperator
+ output[outputPos++] =line[linePos];
+ } else {
+ output[outputPos++] = '\0';
+ output = value;
+ outputPos = 0;
+ }
+ }
+ }
+ } else if (line[linePos] == '\\') {
+ if (precedingCharIsBackslash) { //double backslash -> backslash
+ output[outputPos++] = '\\';
+ }
+ precedingCharIsBackslash = !precedingCharIsBackslash;
+ } else { //normal character
+ precedingCharIsBackslash = false;
+ output[outputPos++] = line[linePos];
+ }
+ linePos+=1;
+ }
+ if (output != NULL) {
+ output[outputPos] = '\0';
+ }
+
+ if (!isComment) {
+ printf("putting 'key'/'value' '%s'/'%s' in properties\n", utils_stringTrim(key), utils_stringTrim(value));
+ hashMap_put(props, strdup(utils_stringTrim(key)), strdup(utils_stringTrim(value)));
+ }
+ }
+
+ fclose(file);
+
+ return props;
+}
+
+/*
+properties_pt properties_load_tmp(char * filename) {
properties_pt props = properties_create();
FILE *file = fopen ( filename, "r" );
@@ -95,6 +184,7 @@ properties_pt properties_load(char * fil
free(cont);
return props;
}
+*/
/**
* Header is ignored for now, cannot handle comments yet