Hi folks,
Our Apparatus Framework Configtool (http://apfw.sourceforge.net/) is based on 
the eCos Configtool. Thanks a lot for this great tool. For the next release we 
have merged the new sources of the the eCos configtool to our version and fixed 
some bugs, which crashed the application.  However, this is the patch which 
includes the bugfixes for the eCos Configtool (wxWidgets version). This patch 
changes the behavior of the path handling, so be careful. I build the 
Configtool with cygwin 1.7 on Windows 7.
Maybe some future patches will follow.

kind regards,
Simon Maurer


Index: host/tools/configtool/common/common/build.cxx
===================================================================
--- host/tools/configtool/common/common/build.cxx                (revision 1819)
+++ host/tools/configtool/common/common/build.cxx             (revision 1831)
@@ -92,7 +92,7 @@
                }
                return output;
 }
-
+/*
 #if defined(_WIN32) || defined(__CYGWIN__)
 // convert a filepath into a vector of path components
 static void path_to_vector (std::string input, std::vector <std::string> & 
output) {
@@ -150,19 +150,21 @@
     return input;
 #endif
 }
-
+*/
 // convert a DOS filepath to a Cygwin filepath
 std::string cygpath (const std::string input) {
 #if defined(_WIN32) || defined(__CYGWIN__)
-              // remove spaces from the DOS filepath
-              const std::string path = nospace_path (input);
-              std::string output;
+    // remove spaces from the DOS filepath
+    //const std::string path = nospace_path (input);
+    /* all strings which are used in build.cxx coming from 
ecUtils::NativeToPosixPath. This function rmoves spaces in the path.
+      Makefile doesn't work with paths containing spaces*/
+    std::string output;

-              // convert the DOS filepath to Cygwin notation using Cygwin if 
available
+
+    //std::string strCygdrive("/cygdrive");
+    std::string strCygdrive("/");
 #if defined(__CYGWIN__) && (ECOS_USE_CYGDRIVE == 0)
-              char buffer [MAX_PATH + 1];
-              cygwin_conv_to_posix_path (path.c_str (), buffer);
-              output = buffer;
+    output = input;
 #else

 #if ECOS_USE_CYGDRIVE == 1
@@ -201,19 +203,23 @@
         RegCloseKey(hKey);
     }
 #endif
-    strCygdrive = strCygdrive + "/";
+    //strCygdrive = strCygdrive + "/";

-              for (unsigned int n = 0; n < path.size (); n++) { // for each 
char
-                              if ((1 == n) && (':' == path [n])) { // if a DOS 
logical drive letter is present
-                                             output = strCygdrive + (const 
char) tolower(path [0]); // convert to Cygwin notation
-                              } else {
-                                             output += ('\\' == path [n]) ? 
'/' : path [n]; // convert backslash to slash
-                              }
-              }
+    for (unsigned int n = 0; n < input.size (); n++) { // for each char
+        if ((1 == n) && (':' == input [n])) { // if a DOS logical drive letter 
is present
+            output = strCygdrive + output; // convert to Cygwin notation
+        } else {
+            output += ('\\' == input [n]) ? '/' : input [n]; // convert 
backslash to slash
+        }
+    }
 #elif ECOS_USE_CYGDRIVE == 2
     // Convert to c:/foo/bar notation
-              for (unsigned int n = 0; n < path.size (); n++) { // for each 
char
-                                             output += ('\\' == path [n]) ? 
'/' : path [n]; // convert backslash to slash
+
+    char buffer[PATH_MAX];
+    cygwin_conv_to_win32_path(input.c_str(), buffer);
+
+    for (unsigned int n = 0; n < sizeof(buffer) && buffer[n] != '\0'; n++) { 
// for each char
+        output += ('\\' == buffer [n]) ? '/' : buffer [n]; // convert 
backslash to slash
                }
 #elif ECOS_USE_CYGDRIVE == 3
     // Convert to /ecos-x notation, assuming that this mount point will be 
created
@@ -221,39 +227,36 @@

     std::string output1;

-    if (path.size() > 1 && path[1] == ':')
-    {
+    if (input.size() > 1 && input[1] == ':') {
         output1 = "/ecos-";
-        output1 += tolower(path[0]);
+        output1 += tolower(input[0]);
         output1 += "/";

         // Append the rest of the path
-        if (path.size() > 2)
-        {
+        if (input.size() > 2) {
             unsigned int n = 2;
             unsigned int i;

-            if (path[n] == '\\' || path[n] == '/')
+            if (input[n] == '\\' || input[n] == '/')
                 n ++;

-            for (i = n; i < path.size(); i++)
-                output1 += path[i];
+            for (i = n; i < input.size(); i++)
+                output1 += input[i];
         }
-    }
-    else
-        output1 = path;
+    } else
+        output1 = input;

     for (unsigned int n = 0; n < output1.size (); n++) { // for each char
                output += ('\\' == output1 [n]) ? '/' : output1 [n]; // convert 
backslash to slash
                }
 #else
-              for (unsigned int n = 0; n < path.size (); n++) { // for each 
char
-                              if ((1 == n) && (':' == path [n])) { // if a DOS 
logical drive letter is present
-                                             output = "//" + output; // 
convert to Cygwin notation
-                              } else {
-                                             output += ('\\' == path [n]) ? 
'/' : path [n]; // convert backslash to slash
-                              }
-              }
+    for (unsigned int n = 0; n < input.size (); n++) { // for each char
+        if ((1 == n) && (':' == input [n])) { // if a DOS logical drive letter 
is present
+            output = "//" + output; // convert to Cygwin notation
+        } else {
+            output += ('\\' == input [n]) ? '/' : input [n]; // convert 
backslash to slash
+        }
+    }
 #endif
     // ECOS_USE_CYGDRIVE
 #endif
Index: host/tools/configtool/standalone/wxwin/configtooldoc.cpp
===================================================================
--- host/tools/configtool/standalone/wxwin/configtooldoc.cpp             
(revision 1819)
+++ host/tools/configtool/standalone/wxwin/configtooldoc.cpp          (revision 
1831)
@@ -1158,11 +1158,11 @@
                 delete pItem;
             } else if (bNowLoaded) {// if the package should be loaded
                 const wxString strVersion(dlg.GetVersion (strPackageName));
-                if (bPreviouslyLoaded) { // if the package is already loaded
+                if (bPreviouslyLoaded && (m_items.Find(pItem) != NULL)) { // 
if the package is already loaded
                     CdlTransactionCallback::set_callback_fn (NULL); // avoid 
value refresh attempts during load/unload
                     bChanged|=pItem->ChangeVersion(strVersion);
                     CdlTransactionCallback::set_callback_fn 
(CdlTransactionHandler); // restore value refresh
-                } else {
+                } else if (!bPreviouslyLoaded) {
                     // the package was not loaded but should now be loaded
                     //TRACE (_T("Loading package %s\n"), strMacroName);
                     try
Index: host/tools/configtool/standalone/wxwin/ecutils.cpp
===================================================================
--- host/tools/configtool/standalone/wxwin/ecutils.cpp            (revision 
1819)
+++ host/tools/configtool/standalone/wxwin/ecutils.cpp         (revision 1831)
@@ -55,6 +55,7 @@
 #include "ecutils.h"
 #include "wx/listctrl.h"
 #include "wx/stream.h"
+#include "wx/vector.h"

 #include <float.h> // for DBL_DIG macro
 #include <sys/types.h>
@@ -258,6 +259,56 @@
 }
 #endif

+#if defined(__CYGWIN__)
+WX_DECLARE_VECTOR(wxString, StringVector);
+
+// convert a filepath into a vector of path components
+static void path_to_vector (wxString input, StringVector & output) {
+             wxString component;
+             output.clear ();
+
+             for (unsigned int n = 0; n < input.size (); n++) { // for each 
char in the path
+                             if (('/' == input [n]) || ('\\' == input [n])) { 
// if char is a directory separator
+                                            output.push_back (component); // 
add path component to output vector
+                                            component.erase (); // clear path 
component string
+                             } else { // char is not a separator
+                                            component += input [n]; // add 
char to path component string
+                             }
+             }
+             output.push_back (component); // add final path component to 
output vector
+}
+
+// eliminate spaces from a DOS filepath by substituting the
+// short form of path components containing spaces
+wxString nospace_path (const wxString input) {
+    // split the path into a vector of path components
+    StringVector long_path_vector;
+    path_to_vector (input, long_path_vector);
+
+    // convert the path to its short form and split
+    // the result into a vector of path components
+    char buffer [MAX_PATH + 1];
+    GetShortPathNameA (input.c_str (), buffer, sizeof (buffer));
+    StringVector short_path_vector;
+    path_to_vector (buffer, short_path_vector);
+
+    // append the short or long form of each path component to the output 
string as appropriate
+    wxString output;
+    for (unsigned int n = 0; n < long_path_vector.size (); n++) { // for each 
component of the path
+        if ((long_path_vector [n].Find (' ') != wxNOT_FOUND) && (n < 
short_path_vector.size ())) { // if there is a space in the path component
+            output += short_path_vector [n]; // add the short form of the path 
component
+        } else { // there is no space in the path component
+            output += long_path_vector [n]; // add the long form of the path 
component
+        }
+        output += '\\'; // add a directory separator
+    }
+    output.resize (output.size () - 1); // remove the trailing separator
+
+    return output;
+}
+#endif
+
+
 const wxString ecUtils::NativeToPosixPath(const wxString & native)
 {
 #ifdef __CYGWIN__
@@ -266,7 +317,8 @@
     else
     {
         wxString posix;
-        cygwin_conv_to_posix_path(native.c_str(), posix.GetWriteBuf(PATH_MAX + 
1));
+        posix = nospace_path (native); // replace any directories containing 
spaces with the short path variant
+        cygwin_conv_to_posix_path(posix.c_str(), posix.GetWriteBuf(PATH_MAX + 
1));
         posix.UngetWriteBuf();
         return posix;
     }
Index: host/tools/configtool/standalone/wxwin/configitem.cpp
===================================================================
--- host/tools/configtool/standalone/wxwin/configitem.cpp    (revision 1819)
+++ host/tools/configtool/standalone/wxwin/configitem.cpp (revision 1831)
@@ -714,33 +714,19 @@

     wxGetApp().GetTreeCtrl()->Delete(GetTreeItem());

-#if wxCHECK_VERSION(2, 6, 0)
     wxNode* node = pDoc->GetItems().GetFirst();
     while (node)
     {
         ecConfigItem* item = wxDynamicCast(node->GetData(), ecConfigItem);
-        if (package == item->GetOwnerPackage() && item != this)
-        {
-            item->SetTreeItem(wxTreeItemId()); // Make sure we can't attempt 
to paint it
-            item->SetCdlItem(NULL); // Make sure we can't access stale data
-            delete item; // Delete the item itself
-        }
+        //delete item removes itself from the list; => node points to a 
deallocated memmory
         node = node->GetNext();
-    }
-#else
-    wxNode* node = pDoc->GetItems().First();
-    while (node)
-    {
-        ecConfigItem* item = wxDynamicCast(node->Data(), ecConfigItem);
         if (package == item->GetOwnerPackage() && item != this)
         {
-            item->SetTreeItem(wxTreeItemId()); // Make sure we can't attempt 
to paint it
+            //item->SetTreeItem(wxTreeItemId()); // Make sure we can't attempt 
to paint it
             item->SetCdlItem(NULL); // Make sure we can't access stale data
             delete item; // Delete the item itself
         }
-        node = node->Next();
     }
-#endif

     const wxString strMacroName(GetMacro());
     //TRACE (wxT("Unloading package %s\n"), strMacroName);
Index: host/tools/configtool/standalone/wxwin/aboutdlg.h
===================================================================
--- host/tools/configtool/standalone/wxwin/aboutdlg.h            (revision 1819)
+++ host/tools/configtool/standalone/wxwin/aboutdlg.h         (revision 1831)
@@ -74,7 +74,7 @@
  * that's already been destroyed)
  */

-class WXDLLEXPORT ecSplashScreen: public wxSplashScreen
+class ecSplashScreen: public wxSplashScreen
 {
 public:
     ecSplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, 
wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const 
wxSize& size = wxDefaultSize, long style = 
wxSIMPLE_BORDER|wxFRAME_FLOAT_ON_PARENT);
Index: host/tools/configtool/standalone/wxwin/makefile.gnu
===================================================================
--- host/tools/configtool/standalone/wxwin/makefile.gnu       (revision 1819)
+++ host/tools/configtool/standalone/wxwin/makefile.gnu    (revision 1831)
@@ -45,30 +45,49 @@
 CTBUILDDIR=$(shell pwd)
 ECOSSRCDIR=$(INSTALLDIR)/src
 CTDIR=$(ECOSSRCDIR)/tools/configtool/standalone/wxwin
+
+ifneq (,$(findstring CYGWIN, $(shell uname)))
 TCLDIR=TCLDIR_use_system
+else
+  TCLDIRINC=/usr/include/tcl
+  TCLDIRLIB=/usr/lib
+endif
+
 USEEXPERIMENTALCODE=1

-EXTRACPPFLAGS=\
+ifneq (,$(findstring CYGWIN, $(shell uname)))
+  EXTRACPPFLAGS=-I$(TCLDIR)/include
+else
+  EXTRACPPFLAGS=-I$(TCLDIRINC)
+endif
+
+EXTRACPPFLAGS+= \
   -I$(TCLDIR)/include \
   -I$(INSTALLDIR)/include \
   -I$(ECOSSRCDIR)/tools/configtool/common/common \
   -I$(ECOSSRCDIR)/tools/Utils/common \
   -I$(ECOSSRCDIR)/tools/ecostest/common \
   -DecUSE_EXPERIMENTAL_CODE=$(USEEXPERIMENTALCODE)
-EXTRALDFLAGS=-L$(TCLDIR)/lib -L$(INSTALLDIR)/lib -lcdl -lcyginfra -ltcl
+
+ifneq (,$(findstring CYGWIN, $(shell uname)))
+  EXTRALDFLAGS=-L$(TCLDIR)/lib -L$(INSTALLDIR)/lib -lcdl -ltcl
+else
+  EXTRALDFLAGS=-L$(TCLDIRLIB) -L$(INSTALLDIR)/lib -lcdl -ltcl
+endif

+
 ifneq (,$(findstring CYGWIN, $(shell uname)))
   PROGRAM=configtool.exe
-  CPPFLAGS=`$(WXDIR)/bin/wx-config --cppflags` -D_WIN32 -D__WIN32__ -DSTRICT 
-D__USE_W32_SOCKETS
-  LDFLAGS=`$(WXDIR)/bin/wx-config --libs std,gizmos` -lshlwapi 
-Wl,--subsystem,windows
+  CPPFLAGS=`$(WXDIR)/wx-config --static=yes --cppflags` -D_WIN32 -D__WIN32__ 
-DSTRICT -D__USE_W32_SOCKETS
+  LDFLAGS=`$(WXDIR)/wx-config --static=yes --libs std,gizmos` -lwsock32 
-lcyginfra -lshlwapi -Wl,--subsystem,windows
   EXTRAOBJECTS=$(CTBUILDDIR)/configtoolres.o
-  RCFLAGS=`$(WXDIR)/bin/wx-config --cppflags`
+  RCFLAGS=`$(WXDIR)/wx-config --static=yes --cppflags`
 else
   PROGRAM=configtool
-  CPPFLAGS=`$(WXDIR)/bin/wx-config --cppflags`
-  LDFLAGS=`$(WXDIR)/bin/wx-config --libs std,gizmos`
+  CPPFLAGS=`$(WXDIR)/wx-config --cppflags`
+  LDFLAGS=`$(WXDIR)/wx-config --libs std,gizmos`
   EXTRAOBJECTS=
-  RCFLAGS=`$(WXDIR)/bin/wx-config --cppflags`
+  RCFLAGS=`$(WXDIR)/wx-config --cppflags`
 endif

 ifeq "$(DEBUG)" ""
Index: host/tools/configtool/standalone/wxwin/configtree.cpp
===================================================================
--- host/tools/configtool/standalone/wxwin/configtree.cpp    (revision 1819)
+++ host/tools/configtool/standalone/wxwin/configtree.cpp (revision 1831)
@@ -699,8 +699,8 @@
         wxString msg;
         msg.Printf("Popping at %d x %d", pt.x, pt.y);
         wxLogDebug(msg);
-
-        
wxGetApp().GetHelpController().DisplayTextPopup(item->GetDescription(), 
wxGetMousePosition());
+        if(wxGetApp().HasHelpController())
+            
wxGetApp().GetHelpController().DisplayTextPopup(item->GetDescription(), 
wxGetMousePosition());
     }
     else
         event.Skip();
Index: host/tools/ecostest/common/eCosTestPlatform.cpp
===================================================================
--- host/tools/ecostest/common/eCosTestPlatform.cpp            (revision 1819)
+++ host/tools/ecostest/common/eCosTestPlatform.cpp         (revision 1831)
@@ -30,6 +30,9 @@
 #include "eCosTestUtils.h"
 #include "eCosTrace.h"

+#include <limits.h>
+
+
 std::vector<CeCosTestPlatform> CeCosTestPlatform::arPlatforms;

 const CeCosTestPlatform *CeCosTestPlatform::Get(LPCTSTR psz)

Reply via email to