Author: carnold
Date: Wed Jun 18 08:42:24 2008
New Revision: 669204

URL: http://svn.apache.org/viewvc?rev=669204&view=rev
Log:
Escape sequences not recognized in property files

Modified:
    logging/log4cxx/trunk/src/changes/changes.xml
    logging/log4cxx/trunk/src/main/cpp/properties.cpp
    logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp
    logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties

Modified: logging/log4cxx/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/changes/changes.xml?rev=669204&r1=669203&r2=669204&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/changes/changes.xml (original)
+++ logging/log4cxx/trunk/src/changes/changes.xml Wed Jun 18 08:42:24 2008
@@ -43,6 +43,7 @@
 <action issue="LOGCXX-288">Unnecessary trailing semi-colons after LOG4CXX_INFO 
et al in docs, examples and tests.<action>
 <action issue="LOGCXX-291">Tab characters are not recognized in property 
files.<action>
 <action issue="LOGCXX-292">Value continuation does not properly handle CRLF in 
property files.<action>
+<action issue="LOGCXX-293">Escape sequences not recognized in property 
files.<action>
 </release>
 <release version="0.10.0" date="2008-04-03" description="First Apache release">
 <action issue="LOGCXX-2">logger.h includes config.h</action>

Modified: logging/log4cxx/trunk/src/main/cpp/properties.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/properties.cpp?rev=669204&r1=669203&r2=669204&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/properties.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/properties.cpp Wed Jun 18 08:42:24 2008
@@ -106,28 +106,35 @@
                         case KEY_ESCAPE:
                                 switch(c)
                                 {
-                                case 0x09: // '\t'
-                                case 0x20: // ' '
-                                case 0x3A: // ':'
-                                case 0x3D: // '='
-                                case 0x5C: // '\\'
-                                        key.append(1, c);
+                                case 0x74: // 't'
+                                        key.append(1, 0x09);
+                                        lexemType = KEY;
+                                        break;
+
+                                case 0x6E: // 'n'
+                                        key.append(1, 0x0A);
                                         lexemType = KEY;
-                                        if (!get(in, c))
-                                                finished = true;
                                         break;
 
+                                case 0x72: // 'r'
+                                        key.append(1, 0x0D);
+                                        lexemType = KEY;
+                                        break;
+                                
                                 case 0x0A: // '\n'
                                         lexemType = KEY_CONTINUE;
-                                        if (!get(in, c))
-                                                finished = true;
                                         break;
 
                                 case 0x0D: // '\r'
                                         lexemType = KEY_CONTINUE2;
-                                        if (!get(in, c))
-                                                finished = true;
                                         break;
+                                        
+                                default:
+                                        key.append(1, c);
+                                        lexemType = KEY;
+                                }
+                                if (!get(in, c)) {
+                                    finished = true;
                                 }
                                 break;
 
@@ -209,32 +216,35 @@
                         case ELEMENT_ESCAPE:
                                 switch(c)
                                 {
-                                case 0x09: // '\t'
-                                case 0x20: // ' '
+                                case 0x74: // 't'
+                                        element.append(1, 0x09);
+                                        lexemType = ELEMENT;
+                                        break;
+
                                 case 0x6E: // 'n'
+                                        element.append(1, 0x0A);
+                                        lexemType = ELEMENT;
+                                        break;
+
                                 case 0x72: // 'r'
-                                case 0x27: // '\''
-                                case 0x5C: // '\\'
-                                case 0x22: // '\"'
-                                case 0x3A: // ':'
-                                default:
-                                        element.append(1, c);
+                                        element.append(1, 0x0D);
                                         lexemType = ELEMENT;
-                                        if (!get(in, c))
-                                                finished = true;
                                         break;
 
                                 case 0x0A: // '\n'
                                         lexemType = ELEMENT_CONTINUE;
-                                        if (!get(in, c))
-                                                finished = true;
                                         break;
 
                                 case 0x0D: // '\r'
                                         lexemType = ELEMENT_CONTINUE2;
-                                        if (!get(in, c))
-                                                finished = true;
                                         break;
+                                default:
+                                        element.append(1, c);
+                                        lexemType = ELEMENT;
+                                        break;
+                                }
+                                if (!get(in, c)) {
+                                    finished = true;
                                 }
                                 break;
 
@@ -329,7 +339,6 @@
 {
         LogString oldValue((*properties)[key]);
         (*properties)[key] = value;
-        //tcout << ASCII_STR("setting property key=") << key << ASCII_STR(", 
value=") << value << std::endl;
         return oldValue;
 }
 

Modified: logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp?rev=669204&r1=669203&r2=669204&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp (original)
+++ logging/log4cxx/trunk/src/test/cpp/helpers/propertiestestcase.cpp Wed Jun 
18 08:42:24 2008
@@ -36,6 +36,12 @@
                 LOGUNIT_TEST(testTab6);
                 LOGUNIT_TEST(testTab7);
                 LOGUNIT_TEST(testCRLF1);
+                LOGUNIT_TEST(testEscT1);
+                LOGUNIT_TEST(testEscT2);
+                LOGUNIT_TEST(testEscN1);
+                LOGUNIT_TEST(testEscN2);
+                LOGUNIT_TEST(testEscR1);
+                LOGUNIT_TEST(testEscR2);
         LOGUNIT_TEST_SUITE_END();
 
 public:
@@ -139,7 +145,7 @@
         }
 
         /**
-         *  Test tab in value continuation, see LOGCXX-291.
+         *  Test tab in value continuation, see LOGCXX-292.
         */
         void testCRLF1() {
           FileInputStreamPtr propFile(
@@ -150,6 +156,97 @@
           LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("continuedvalue")), 
actual);
         }
 
+    /**
+     *  Test tab as escaped within key, see LOGCXX-293.
+    */
+    void testEscT1()  {
+      FileInputStreamPtr propFile(
+        new 
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+      Properties properties;
+      properties.load(propFile);
+      LogString key(LOG4CXX_STR("propertiestestcase.esct1"));
+      key.append(1, 0x09);
+      LogString actual(properties.getProperty(key));
+      LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("key contains tab")), actual);
+    }
+
+
+
+    /**
+     *  Test tab escaped in value, see LOGCXX-293.
+    */
+    void testEscT2()  {
+      FileInputStreamPtr propFile(
+        new 
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+      Properties properties;
+      properties.load(propFile);
+      LogString 
actual(properties.getProperty(LOG4CXX_STR("propertiestestcase.esct2")));
+      LogString expected(1, 0x09);
+      expected.append(LOG4CXX_STR(" in value"));
+      LOGUNIT_ASSERT_EQUAL(expected, actual);
+    }
+
+    /**
+     *  Test \n within key, see LOGCXX-293.
+    */
+    void testEscN1()  {
+      FileInputStreamPtr propFile(
+        new 
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+      Properties properties;;
+      properties.load(propFile);
+      LogString key(LOG4CXX_STR("propertiestestcase.escn1"));
+      key.append(1, 0x0A);
+      LogString actual(properties.getProperty(key));
+      LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("key contains lf")), actual);
+    }
+
+
+
+    /**
+     *  Test \n in value, see LOGCXX-293.
+    */
+    void testEscN2()  {
+      FileInputStreamPtr propFile(
+        new 
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+      Properties properties;
+      properties.load(propFile);
+      LogString 
actual(properties.getProperty(LOG4CXX_STR("propertiestestcase.escn2")));
+      LogString expected(1, 0x0A);
+      expected.append(LOG4CXX_STR(" in value"));
+      LOGUNIT_ASSERT_EQUAL(expected, actual);
+    }
+
+    /**
+     *  Test \r within key, see LOGCXX-293.
+    */
+    void testEscR1()  {
+      FileInputStreamPtr propFile(
+        new 
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+      Properties properties;
+      properties.load(propFile);
+      LogString key(LOG4CXX_STR("propertiestestcase.escr1"));
+      key.append(1, 0x0D);
+      LogString actual(properties.getProperty(key));
+      LOGUNIT_ASSERT_EQUAL(LogString(LOG4CXX_STR("key contains cr")), actual);
+    }
+
+
+
+    /**
+     *  Test \r in value, see LOGCXX-293.
+    */
+    void testEscR2()  {
+      FileInputStreamPtr propFile(
+        new 
FileInputStream(LOG4CXX_STR("input/propertiestestcase.properties")));
+      Properties properties;
+      properties.load(propFile);
+      LogString 
actual(properties.getProperty(LOG4CXX_STR("propertiestestcase.escr2")));
+      LogString expected(1, 0x0D);
+      expected.append(LOG4CXX_STR(" in value"));
+      LOGUNIT_ASSERT_EQUAL(expected, actual);
+    }
+
+
 };
 
 

Modified: 
logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties
URL: 
http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties?rev=669204&r1=669203&r2=669204&view=diff
==============================================================================
--- 
logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties 
(original)
+++ 
logging/log4cxx/trunk/src/test/resources/input/propertiestestcase.properties 
Wed Jun 18 08:42:24 2008
@@ -24,3 +24,9 @@
        value
 propertiestestcase.crlf1=continued\
  value
+propertiestestcase.esct1\t=key contains tab
+propertiestestcase.esct2=\t in value
+propertiestestcase.escn1\n=key contains lf
+propertiestestcase.escn2=\n in value
+propertiestestcase.escr1\r=key contains cr
+propertiestestcase.escr2=\r in value


Reply via email to