This is the mail archive of the ecos-devel@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

ConfigTool


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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]