ide;debugger; (#1030) fix new memory leaks.
[sdk] / ide / src / debugger / Debugger.ec
index 16ca2a2..c5228f8 100644 (file)
@@ -170,55 +170,26 @@ public char * StripQuotes2(char * string, char * output)
 // String Escape Copy
 static void strescpy(char * d, char * s)
 {
-   int j, k;
-   j = k = 0;
-   while(s[j])
+   int j = 0, k = 0;
+   char ch;
+   while((ch = s[j]))
    {
-      switch(s[j])
+      switch(ch)
       {
-         case '\n':
-            d[k] = '\\';
-            d[++k] = 'n';
-            break;
-         case '\t':
-            d[k] = '\\';
-            d[++k] = 't';
-            break;
-         case '\a':
-            d[k] = '\\';
-            d[++k] = 'a';
-            break;
-         case '\b':
-            d[k] = '\\';
-            d[++k] = 'b';
-            break;
-         case '\f':
-            d[k] = '\\';
-            d[++k] = 'f';
-            break;
-         case '\r':
-            d[k] = '\\';
-            d[++k] = 'r';
-            break;
-         case '\v':
-            d[k] = '\\';
-            d[++k] = 'v';
-            break;
-         case '\\':
-            d[k] = '\\';
-            d[++k] = '\\';
-            break;
-         case '\"':
-            d[k] = '\\';
-            d[++k] = '\"';
-            break;
-         default:
-            d[k] = s[j];
+         case '\n': d[k] = '\\'; d[++k] = 'n'; break;
+         case '\t': d[k] = '\\'; d[++k] = 't'; break;
+         case '\a': d[k] = '\\'; d[++k] = 'a'; break;
+         case '\b': d[k] = '\\'; d[++k] = 'b'; break;
+         case '\f': d[k] = '\\'; d[++k] = 'f'; break;
+         case '\r': d[k] = '\\'; d[++k] = 'r'; break;
+         case '\v': d[k] = '\\'; d[++k] = 'v'; break;
+         case '\\': d[k] = '\\'; d[++k] = '\\'; break;
+         case '\"': d[k] = '\\'; d[++k] = '\"'; break;
+         default: d[k] = s[j];
       }
-      ++j;
-      ++k;
+      j++, k++;
    }
-   d[k] = s[j];
+   d[k] = '\0';
 }
 
 static char * CopyUnescapedSystemPath(char * p)
@@ -255,54 +226,33 @@ static char * CopyUnescapedString(char * s)
 
 static void struscpy(char * d, char * s)
 {
-   int j, k;
-   j = k = 0;
-   while(s[j])
+   int j = 0, k = 0;
+   char ch;
+   while((ch = s[j]))
    {
-      switch(s[j])
+      switch(ch)
       {
          case '\\':
             switch(s[++j])
             {
-               case 'n':
-                  d[k] = '\n';
-                  break;
-               case 't':
-                  d[k] = '\t';
-                  break;
-               case 'a':
-                  d[k] = '\a';
-                  break;
-               case 'b':
-                  d[k] = '\b';
-                  break;
-               case 'f':
-                  d[k] = '\f';
-                  break;
-               case 'r':
-                  d[k] = '\r';
-                  break;
-               case 'v':
-                  d[k] = '\v';
-                  break;
-               case '\\':
-                  d[k] = '\\';
-                  break;
-               case '\"':
-                  d[k] = '\"';
-                  break;
-               default:
-                  d[k] = '\\';
-                  d[++k] = s[j];
+               case 'n': d[k] = '\n'; break;
+               case 't': d[k] = '\t'; break;
+               case 'a': d[k] = '\a'; break;
+               case 'b': d[k] = '\b'; break;
+               case 'f': d[k] = '\f'; break;
+               case 'r': d[k] = '\r'; break;
+               case 'v': d[k] = '\v'; break;
+               case '\\': d[k] = '\\'; break;
+               case '\"': d[k] = '\"'; break;
+               default: d[k] = '\\'; d[++k] = s[j];
             }
             break;
          default:
             d[k] = s[j];
       }
-      ++j;
-      ++k;
+      j++, k++;
    }
-   d[k] = s[j];
+   d[k] = '\0';
 }
 
 static char * StripBrackets(char * string)
@@ -397,11 +347,9 @@ static bool TokenizeListItem(char * string, DebugListItem item)
       *equal = '\0';
       equal++;
       item.value = equal;
-      equal = null;
       return true;
    }
-   else
-      return false;
+   return false;
 }
 
 static bool CheckCommandAvailable(const char * command)
@@ -430,6 +378,7 @@ static bool CheckCommandAvailable(const char * command)
                if(fl.stats.attribs.isFile && !fstrcmp(fl.name, name))
                {
                   available = true;
+                  fl.Stop();
                   break;
                }
             }
@@ -607,6 +556,7 @@ class Debugger
                   if(bp)
                      _dpl2(_dpct, dplchan::debuggerBreakpoints, 0, "gdb stopped by a breakpoint: ", bp.type, "(", s=bp.CopyLocationString(false), ")"); delete s;
                }
+               delete bpReport;
             }
 #endif
          }
@@ -846,8 +796,8 @@ class Debugger
       event = none;
       breakType = none;
 
-      stopItem = null;
-      bpItem = null;
+      delete stopItem;
+      delete bpItem;
       activeFrame = 0;
 
       bpRunToCursor = null;
@@ -1777,6 +1727,8 @@ class Debugger
                _dpl2(_dpct, dplchan::gdbProtoUnknown, 0, "breakpoint member (", item.name, "=", item.value, ") is unheard of");
          }
       }
+      delete bpTokens;
+      delete item;
       return bp;
    }
 
@@ -1979,6 +1931,7 @@ class Debugger
                   if(bp.bp)
                      _dpl(0, "problem");
 #endif
+                  delete bp.bp;
                   bp.bp = GdbDataBreakpoint { };
                }
             }
@@ -1993,6 +1946,7 @@ class Debugger
       {
          GdbCommand(false, "-break-delete %s", bp.bp.number);
          bp.inserted = false;
+         delete bp.bp;
          bp.bp = { };
       }
    }
@@ -2055,6 +2009,7 @@ class Debugger
                bpItem.multipleBPs.Free();
                delete bpItem.multipleBPs;
             }
+            delete bp.bp;
             bp.bp = bpItem;
             bpItem = null;
             bp.inserted = (bp.bp && bp.bp.number && strcmp(bp.bp.number, "0"));
@@ -3415,6 +3370,7 @@ class Debugger
                      if(bpItem)
                         _dpl(0, "problem");
 #endif
+                     delete bpItem;
                      bpItem = ParseBreakpoint(item.value, outTokens);
                      //breakType = bpValidation;
                   }
@@ -3978,6 +3934,7 @@ class Debugger
             DirExpression targetDirExp = prj.GetTargetDir(currentCompiler, prj.config, bitDepth);
             strcpy(prjTargetPath, prj.topNode.path);
             PathCat(prjTargetPath, targetDirExp.dir);
+            delete targetDirExp;
             prjTargetFile[0] = '\0';
             prj.CatTargetFileName(prjTargetFile, currentCompiler, prj.config);
             PathCat(prjTargetPath, prjTargetFile);
@@ -4587,6 +4544,8 @@ class GdbDataBreakpoint : struct
       delete at;
       if(multipleBPs) multipleBPs.Free();
       delete multipleBPs;
+      delete number;
+      delete fullname;
    }
 
    ~GdbDataBreakpoint()