]> gitweb.hamatoma.de Git - crepublib/commitdiff
bug fixing
authorhama <hama@siduction.net>
Wed, 28 Jan 2015 23:49:41 +0000 (00:49 +0100)
committerhama <hama@siduction.net>
Wed, 28 Jan 2015 23:49:41 +0000 (00:49 +0100)
base/ReByteBuffer.cpp
base/ReProgramArgs.cpp
base/ReStringList.cpp
cunit/cuReProgramArgs.cpp
cunit/testall.cpp
os/ReDirTools.cpp
os/ReDirTools.hpp
os/ReTraverser.hpp

index c61d1eb407951fa3c08ab5f8b51a0311077e355a..0e2583288cf0726d3cce6fc272a63b70b267769e 100644 (file)
@@ -562,7 +562,7 @@ bool ReByteBuffer::splice(size_t ix, size_t replacedLength,
 
                Byte* start = m_buffer + ix;
                Byte* tail = start + replacedLength;
-               size_t lengthTail = m_length - ix;
+               size_t lengthTail = m_length - ix - replacedLength;
 
                if (length <= replacedLength){
                        // The sequence will not be longer:
index e00ff4779aa622c3bce05869a03efc5e847466c7..7a2c2e703a1eddd7166b53b9ef885d58c57d4550 100644 (file)
@@ -55,8 +55,12 @@ ReProgramArgs::ReProgramArgs(const char* usageList[], const char* examples[])
        m_lastError()
 {
        m_properties.setCapacity(64, 64*8, 64*1024);
+       ReByteBuffer line;
        for (const char** argv = usageList; *argv != NULL; argv++){
-               m_usage.add(-1, *argv, -1);
+               line.set(*argv);
+               if (line.endsWith("\n"))
+                       line.setLength(line.length() - 1);
+               m_usage.append(line.str());
        }
        if (examples != NULL){
                for (const char** argv = examples; *argv != NULL; argv++){
@@ -91,7 +95,7 @@ ReProgramArgs::ReProgramArgs(const char* usageString, const char* examples)
 {
        m_usage.split(usageString, '\n');
        if (examples != NULL){
-               if (strstr(examples, "$0") != NULL)
+               if (strstr(examples, "$0") == NULL)
                        m_examples.split(examples, '\n');
                else{
                        ReByteBuffer line;
index f13a5ea3d47627953f72b51bb36fa03c7445891f..acd9d7cbf784f96021d3ac507b0f3a2c21ff7c14 100644 (file)
@@ -55,7 +55,7 @@ ReStringList& ReStringList::append(const ReByteBuffer& source, Tag tagOf){
  */
 ReStringList& ReStringList::append(const ReStringList& source){
        for (size_t ii = 0; ii < source.count(); ii++)
-               add(-1, source.strOf(ii), source.strLengthOf(ii), source.tagOf(ii));
+               add(-1, source.strOf(ii), source.sizeOf(ii), source.tagOf(ii));
        return *this;
 }
 /** @brief Inserts a string at a given index.
index 327bbe1a1bf9207b9b7ca8bd32f7689f112ef3c8..692d4caf6516650087bea0a5ed8bc2c7c0b1f65a 100644 (file)
@@ -36,8 +36,8 @@ private:
     }
     void createExpectedShortHelp(const char* filename){
                createFile(filename,
-"test <opts> <args>This tests the usage of ReProgramArg\n"
-"This tests the usage of ReProgramArg\n"
+"test <opts> <args>\n"
+"This tests the usage of ReProgramArgs\n"
 "\n"
 "<options>:\n"
 "-B  or --boolval2\n"
@@ -59,8 +59,8 @@ private:
 "-u<not empty string>  or --string2=<not empty string> Default value: 'undef'\n"
 "   This 2nd string must be non empty\n"
 "Example(s):\n"
-"$0 -b+ -B- file dir\ttest of an exampl+++ Not really an error!\n"
-"\ttest of an exampl+++ Not really an error!\n"
+"? -b+ -B- file dir\n"
+"\ttest of an example\n"
 "+++ Not really an error!\n"
                );
     }
@@ -132,8 +132,8 @@ private:
     }
     void createExpectedLongHelp(const char* filename){
                createFile(filename,
-"test <opts> <argsThis tests the usage of ReProgramArg\n"
-"This tests the usage of ReProgramArg\n"
+"test <opts> <args>\n"
+"This tests the usage of ReProgramArgs\n"
 "\n"
 "<options>:\n"
 "--boolval2\n"
index 2d9cb084ea5ebd9271365f75ad9bd54f44d6e540..277bd6ec0f7a04dd2d05d3e4afec861021f994a8 100644 (file)
@@ -13,6 +13,9 @@
 #endif
 
 void testBase(){
+       extern void testReProgramArgs(void);
+       testReProgramArgs();
+
        extern void testReTestUnit();
        //testReTestUnit();
        extern void testReByteBuffer();
index 7f4c6a187e16faa844e42b1cd78ce863f250cf42..f85e1115c051e98cefe01c11fcc0d175b5da46bb 100644 (file)
@@ -173,7 +173,9 @@ void ReDirOptions::addStandardFilterOptions(){
             "If the first character is '-' the pattern is a 'not pattern':\n"
             "A directory will be entered if at least one of the positive patterns\n"
             "and none of the 'not patterns' matches\n"
-            "examples: ';*;-*/.git/' ',*/cache/,*/temp/"),
+            "examples:\n"
+            "';*/music/;pic*' enters music and xy/Music and PIC and pictures but not xy/pic and img\n"
+                       "';*;-*/.git;.hg' ignores .git and xy/z/.git and .ht, but enters xy/.hg"),
                'P', "path-pattern", false, NULL);
     m_programArgs.addString("nodepattern",
         i18n("a list of patterns for the basename (name without path) separated by ';'\n"
@@ -430,6 +432,7 @@ void ReDirOptions::help(const char* errorMessage, const char* message2) const{
     m_programArgs.help(msg.str(), false, stdout);
     exit(1);
 }
+
 /**
  * Checks the correctness of the standard filter options.
  * 
@@ -468,6 +471,43 @@ void ReDirOptions::initCompoundUsage(size_t size){
     memset(m_compoundUsage, 0, size);
     m_countCompoundUsage = count;
 }
+
+/**
+ * Optimizes the path patterns.
+ *
+ * For all patterns of the list:
+ * <ul><li>remove a trailing "\" and "\*"</li>
+ * <li>change "*\xy" to "*\xy" and "xy" (finds xy in the root directory)</li>
+ * <li>replaces "/" with the os specific path separator</li>
+ * </ul>
+ *
+ * @param buffer       the pattern list as string, e.g. ";*;-cache"
+ */
+void ReDirOptions::optimizePathPattern(ReByteBuffer& buffer){
+       ReStringList list;
+       ReStringList rootList;
+       list.split(buffer.str() + 1, buffer.str()[0]);
+       buffer.replaceAll(OS_SEPARATOR, 1, "/", 1);
+       ReByteBuffer item;
+       for (int ix = 0; ix < list.count(); ix++){
+               item.set(list.strOf(ix), -1);
+               if (item.endsWith("/*"))
+                       item.setLength(item.length() - 2);
+               if (item.endsWith("/"))
+                       item.setLength(item.length() - 1);
+               bool notAnchored = item.startsWith("*/") || item.startsWith("-*/");
+               item.replaceAll("/", 1, OS_SEPARATOR, 1);
+               list.replace(ix, item.str());
+               if (notAnchored){
+                       item.remove(item.str()[0] == '-' ? 1 : 0, 2);
+                       rootList.append(item.str(), 0);
+               }
+       }
+       if (rootList.count() > 0)
+               list.append(rootList);
+       item.set(buffer.str(), 1);
+       list.join(item.str(), buffer);
+}
 /**
  * Sets the standard filter options given by the program arguments.
  *
@@ -494,6 +534,7 @@ void ReDirOptions::setFilterFromProgramArgs(ReDirEntryFilter_t& filter){
     }
     if (m_programArgs.getString("pathpattern", buffer)[0] != '\0'){
         checkPatternList(buffer.str());
+               optimizePathPattern(buffer);
         m_pathPatterns.set(buffer.str());
         filter.m_pathPatterns = &m_pathPatterns;
     }
index a9ea3e9e0cfeb8679a958e9e39c04d2408d622a8..1532aa82aac4e554178784cdb874c664d195627c 100644 (file)
@@ -41,6 +41,8 @@ public:
     ReProgramArgs& programArgsChangeable()
     { return m_programArgs; }
     void setFilterFromProgramArgs(ReDirEntryFilter_t& filter);
+protected:
+    void optimizePathPattern(ReByteBuffer& buffer);
 protected:
     ReProgramArgs m_programArgs;
     RePatternList m_nodePatterns;
index 90f562f10e0687f276032b3b8926d84ad891ac81..9c4244b503fd4cd82dfa4ef3ab3a066fdb3f14ee 100644 (file)
@@ -155,8 +155,10 @@ protected:
        * @return                       <code>true</code>: the subdir will be processed<br>
        *                                       <code>false</code>: do not enter this subdir
        */
-       inline bool isAllowedDir(const ReByteBuffer& path, const char* node){
-               bool rc = m_dirPatterns->match(ReByteBuffer(path).append(node).str());
+       inline bool isAllowedDir(ReByteBuffer& path, const char* node){
+               int ix = path.length();
+               bool rc = m_dirPatterns->match(path.append(node));
+               path.setLength(ix);
                return rc;
        }
 protected: