Fix more memleaks (gui module):
Simon Lipp [Thu, 4 Jun 2009 13:29:22 +0000 (15:29 +0200)]
helpbrowser, progressionbar, toolbar, uicontrol, uigetfont, waitbar,
x_choice, x_choose_modeless, x_dialog and x_mdialog

scilab/modules/gui/sci_gateway/c/sci_helpbrowser.c
scilab/modules/gui/sci_gateway/c/sci_progressionbar.c
scilab/modules/gui/sci_gateway/c/sci_toolbar.c
scilab/modules/gui/sci_gateway/c/sci_uicontrol.c
scilab/modules/gui/sci_gateway/c/sci_uigetfont.c
scilab/modules/gui/sci_gateway/c/sci_waitbar.c
scilab/modules/gui/sci_gateway/c/sci_x_choice.c
scilab/modules/gui/sci_gateway/c/sci_x_choose_modeless.c
scilab/modules/gui/sci_gateway/c/sci_x_dialog.c
scilab/modules/gui/sci_gateway/c/sci_x_mdialog.c

index e2376b6..a14588e 100644 (file)
@@ -17,6 +17,7 @@
 #include "Scierror.h"
 #include "getPropertyAssignedValue.h"
 #include "sciprint.h"
+#include "freeArrayOfString.h"
 /*--------------------------------------------------------------------------*/
 int sci_helpbrowser(char *fname,unsigned long fname_len)
 {
@@ -63,12 +64,15 @@ int sci_helpbrowser(char *fname,unsigned long fname_len)
           GetRhsVar(2, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &languageAdr);
           if (nbRow*nbCol != 1)
             {
+              if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
+              freeArrayOfString(languageAdr, nbRow*nbCol);
               Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
               return FALSE;
             }
         }
       else
         {
+          if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
           Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
           return FALSE;
         }
@@ -80,7 +84,9 @@ int sci_helpbrowser(char *fname,unsigned long fname_len)
       else
         {
           launchHelpBrowser(getStringMatrixFromStack((size_t)helpAdr), nbRowHelp*nbColHelp, getStringMatrixFromStack((size_t)languageAdr)[0]);
+          freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
         }
+      freeArrayOfString(languageAdr, nbRow*nbCol);
     }
   else if (Rhs == 4)
     {
@@ -89,12 +95,15 @@ int sci_helpbrowser(char *fname,unsigned long fname_len)
           GetRhsVar(2, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &keywordAdr);
           if (nbRow*nbCol != 1)
             {
+              if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
+              freeArrayOfString(keywordAdr, nbRow * nbCol);
               Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
               return FALSE;
             }
         }
       else
         {
+          if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
           Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
           return FALSE;
         }
@@ -104,12 +113,17 @@ int sci_helpbrowser(char *fname,unsigned long fname_len)
           GetRhsVar(3, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &languageAdr);
           if (nbRow*nbCol != 1)
             {
+              if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
+              freeArrayOfString(keywordAdr, 1);
+              freeArrayOfString(languageAdr, nbRow * nbCol);
               Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 3);
               return FALSE;
             }
         }
       else
         {
+          if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
+          freeArrayOfString(keywordAdr, 1);
           Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 3);
           return FALSE;
         }
@@ -119,12 +133,18 @@ int sci_helpbrowser(char *fname,unsigned long fname_len)
           GetRhsVar(4, MATRIX_OF_BOOLEAN_DATATYPE, &nbRow, &nbCol, &fullTextAdr);
           if (nbRow*nbCol != 1)
             {
+              if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
+              freeArrayOfString(keywordAdr, 1);
+              freeArrayOfString(languageAdr, 1);
               Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), fname, 4);
               return FALSE;
             }
         }
       else
         {
+          if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
+          freeArrayOfString(keywordAdr, 1);
+          freeArrayOfString(languageAdr, 1);
           Scierror(999, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 4);
           return FALSE;
         }
@@ -136,7 +156,10 @@ int sci_helpbrowser(char *fname,unsigned long fname_len)
       else
         {
           searchKeyword(getStringMatrixFromStack((size_t)helpAdr), nbRowHelp*nbColHelp, getStringMatrixFromStack((size_t)keywordAdr)[0], getStringMatrixFromStack((size_t)languageAdr)[0], *istk(fullTextAdr)==1);
+          if (helpAdr) freeArrayOfString(helpAdr, nbRowHelp*nbColHelp);
         }
+      freeArrayOfString(keywordAdr, 1);
+      freeArrayOfString(languageAdr, 1);
     }
   else
     {
index 9981adb..abee161 100644 (file)
@@ -17,6 +17,7 @@
 #include "Scierror.h"
 #include "getPropertyAssignedValue.h"
 #include "HandleManagement.h"
+#include "freeArrayOfString.h"
 
 #include "InitProgressionBar.h"
 /*--------------------------------------------------------------------------*/
@@ -69,6 +70,7 @@ int sci_progressionbar(char *fname,unsigned long fname_len)
           pPROGRESSIONBAR_FEATURE(pObj)->hashMapIndex = waitbarID;
           setWaitBarIndeterminateMode(waitbarID, TRUE);
           setWaitBarMessage(waitbarID, getStringMatrixFromStack((size_t)messageAdr), nbColMessage*nbRowMessage);
+          freeArrayOfString(messageAdr, nbColMessage*nbRowMessage);
         }
       else
         {
@@ -97,6 +99,7 @@ int sci_progressionbar(char *fname,unsigned long fname_len)
           waitbarID = pPROGRESSIONBAR_FEATURE(pObj)->hashMapIndex;
           setWaitBarValue(waitbarID, 0); /* Update */
           setWaitBarMessage(waitbarID, getStringMatrixFromStack((size_t)messageAdr), nbColMessage*nbRowMessage);
+          freeArrayOfString(messageAdr, nbColMessage*nbRowMessage);
        }
       else
         {
index 1e03a1c..ad51736 100644 (file)
@@ -21,6 +21,7 @@
 #include "ObjectStructure.h"
 #include "HandleManagement.h"
 #include "GetProperty.h"
+#include "freeArrayOfString.h"
 #if _MSC_VER
   #include "strdup_windows.h"
 #endif
@@ -104,6 +105,7 @@ int sci_toolbar(char *fname,unsigned long l)
           GetRhsVar(2,MATRIX_OF_STRING_DATATYPE,&nbRow,&nbCol,&param);
           if (nbRow*nbCol != 1)
             {
+              freeArrayOfString(param, nbRow*nbCol);
               Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
               return FALSE;
             }
@@ -111,9 +113,11 @@ int sci_toolbar(char *fname,unsigned long l)
           if ( (strcmp(param[0],"off")==0) || (strcmp(param[0],"on")==0) )
             {
               setToolbarVisible(figNum, strcmp(param[0],"on")==0);
+              freeArrayOfString(param, nbRow*nbCol);
             }
           else
             {
+              freeArrayOfString(param, nbRow*nbCol);
               Scierror(999, _("%s: Wrong value for input argument #%d: '%s' or '%s' expected.\n"), fname, 2, "on", "off");
               return FALSE;
             }
index b8ce180..cd1f057 100644 (file)
@@ -35,6 +35,7 @@
 #include "WindowList.h" /* getFigureFromIndex */
 #include "Widget.h" /* requestWidgetFocus */
 #include "SetUicontrolPosition.h"
+#include "freeArrayOfString.h"
 /*--------------------------------------------------------------------------*/
 #define NBPROPERTIES 26
 #define MAXPROPERTYNAMELENGTH 20
@@ -363,6 +364,7 @@ int sci_uicontrol(char *fname, unsigned long fname_len)
                         {
                           GetRhsVar(propertiesValuesIndices[inputIndex],MATRIX_OF_STRING_DATATYPE,&nbRow,&nbCol,&stkAdrForStrings);
                           setStatus = callSetProperty(sciGetPointerFromHandle(GraphicHandle), (size_t)stkAdrForStrings, sci_strings, nbRow, nbCol, (char*)propertiesNames[inputIndex]);
+                          freeArrayOfString(stkAdrForStrings, nbRow*nbCol);
                         }
                       else
                         {
index 72c60bd..4e62557 100644 (file)
@@ -16,6 +16,7 @@
 #include "Scierror.h"
 #include "CallFontChooser.h"
 #include "getPropertyAssignedValue.h"
+#include "freeArrayOfString.h"
 
 /*--------------------------------------------------------------------------*/
 int sci_uigetfont(char *fname,unsigned long fname_len)
@@ -25,6 +26,7 @@ int sci_uigetfont(char *fname,unsigned long fname_len)
   int nbRow = 0, nbCol = 0;
 
   char **fontNameAdr = NULL;
+  int fontNameSize = 0;
   int fontSizeAdr = 0;
   int boldAdr = 0;
   int italicAdr = 0;
@@ -43,8 +45,10 @@ int sci_uigetfont(char *fname,unsigned long fname_len)
     if (VarType(1) == sci_strings) 
       {
         GetRhsVar(1, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &fontNameAdr);
-        if (nbRow*nbCol != 1)
+        fontNameSize = nbRow*nbCol;
+        if (fontNameSize != 1)
           {
+            freeArrayOfString(fontNameAdr, fontNameSize);
             Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
             return FALSE;
           }
@@ -64,12 +68,14 @@ int sci_uigetfont(char *fname,unsigned long fname_len)
           GetRhsVar(2, MATRIX_OF_DOUBLE_DATATYPE, &nbRow, &nbCol, &fontSizeAdr);
           if (nbRow*nbCol!=1)
             {
+              freeArrayOfString(fontNameAdr, fontNameSize);
               Scierror(999, _("%s: Wrong size for input argument #%d: A real expected.\n"), fname, 2);
               return FALSE;
             }
         }
       else
         {
+          freeArrayOfString(fontNameAdr, fontNameSize);
           Scierror(999, _("%s: Wrong type for input argument #%d: A real expected.\n"), fname, 2);
           return FALSE;
         }
@@ -83,6 +89,7 @@ int sci_uigetfont(char *fname,unsigned long fname_len)
           GetRhsVar(3,MATRIX_OF_BOOLEAN_DATATYPE,&nbRow,&nbCol,&boldAdr);
           if (nbRow*nbCol != 1)
             {
+              freeArrayOfString(fontNameAdr, fontNameSize);
               Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), fname, 3);
               return FALSE;
             }
@@ -90,6 +97,7 @@ int sci_uigetfont(char *fname,unsigned long fname_len)
         }
       else
         {
+          freeArrayOfString(fontNameAdr, fontNameSize);
           Scierror(999, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 3);
           return FALSE;
         }
@@ -103,6 +111,7 @@ int sci_uigetfont(char *fname,unsigned long fname_len)
           GetRhsVar(4,MATRIX_OF_BOOLEAN_DATATYPE,&nbRow,&nbCol,&italicAdr);
           if (nbRow*nbCol != 1)
             {
+              freeArrayOfString(fontNameAdr, fontNameSize);
               Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), fname, 4);
               return FALSE;
             }
@@ -110,6 +119,7 @@ int sci_uigetfont(char *fname,unsigned long fname_len)
         }
       else
         {
+          freeArrayOfString(fontNameAdr, fontNameSize);
           Scierror(999, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 4);
           return FALSE;
         }
@@ -217,6 +227,7 @@ int sci_uigetfont(char *fname,unsigned long fname_len)
   LhsVar(4) = Rhs+4;
   
   C2F(putlhsvar)();
+  freeArrayOfString(fontNameAdr, fontNameSize);
   return TRUE;
 }
 /*--------------------------------------------------------------------------*/
index e1f7601..418ad64 100644 (file)
@@ -17,6 +17,7 @@
 #include "Scierror.h"
 #include "getPropertyAssignedValue.h"
 #include "HandleManagement.h"
+#include "freeArrayOfString.h"
 
 #include "InitWaitBar.h"
 /*--------------------------------------------------------------------------*/
@@ -75,6 +76,7 @@ int sci_waitbar(char *fname,unsigned long fname_len)
       else if (messageAdr != 0)
         {
           setWaitBarMessage(waitbarID, getStringMatrixFromStack((size_t)messageAdr), nbColMessage*nbRowMessage);
+          freeArrayOfString(messageAdr, nbColMessage*nbRowMessage);
         }
     }
   else if (Rhs==2)
@@ -97,6 +99,7 @@ int sci_waitbar(char *fname,unsigned long fname_len)
 
           setWaitBarValue(waitbarID, (int)(getDoubleFromStack(fractionAdr) * 100));
           setWaitBarMessage(waitbarID, getStringMatrixFromStack((size_t)messageAdr), nbColMessage*nbRowMessage);
+          freeArrayOfString(messageAdr, nbColMessage*nbRowMessage);
        }
       else if (VarType(1) == sci_matrix && VarType(2) == sci_handles) /* waitbar(x,winId) */
         {
@@ -136,6 +139,7 @@ int sci_waitbar(char *fname,unsigned long fname_len)
 
           waitbarID = pWAITBAR_FEATURE(pObj)->hashMapIndex;
           setWaitBarMessage(waitbarID, getStringMatrixFromStack((size_t)messageAdr), nbColMessage*nbRowMessage);
+          freeArrayOfString(messageAdr, nbColMessage*nbRowMessage);
         }
       else
         {
@@ -175,12 +179,14 @@ int sci_waitbar(char *fname,unsigned long fname_len)
           GetRhsVar(3, GRAPHICAL_HANDLE_DATATYPE, &nbRow, &nbCol, &handleAdr);
           if (nbRow*nbCol != 1)
             {
+              freeArrayOfString(messageAdr, nbColMessage*nbRowMessage);
               Scierror(999, _("%s: Wrong size for input argument #%d: A '%s' handle expected.\n"), fname, 3, "Waitbar");
               return FALSE;
             }
         }
       else
         {
+          freeArrayOfString(messageAdr, nbColMessage*nbRowMessage);
           Scierror(999, _("%s: Wrong type for input argument #%d: A '%s' handle expected.\n"), fname, 3, "Waitbar");
           return FALSE;
         }
@@ -191,6 +197,7 @@ int sci_waitbar(char *fname,unsigned long fname_len)
 
       setWaitBarValue(waitbarID, (int)(getDoubleFromStack(fractionAdr) * 100));
       setWaitBarMessage(waitbarID, getStringMatrixFromStack((size_t)messageAdr), nbColMessage*nbRowMessage);
+      freeArrayOfString(messageAdr, nbColMessage*nbRowMessage);
     }
 
   if (Lhs == 1)
index f38051d..207f907 100644 (file)
@@ -18,6 +18,7 @@
 #include "CallMessageBox.h"
 #include "getPropertyAssignedValue.h"
 #include "Scierror.h"
+#include "freeArrayOfString.h"
 
 /*--------------------------------------------------------------------------*/
 int C2F(sci_x_choice)(char *fname,unsigned long fname_len)
@@ -82,17 +83,20 @@ int C2F(sci_x_choice)(char *fname,unsigned long fname_len)
 
   /* Message */
   setMessageBoxMultiLineMessage(messageBoxID, getStringMatrixFromStack((size_t)labelsAdr), nbCol*nbRow);
-    
+  freeArrayOfString(labelsAdr, nbRow*nbCol);
+
   /* READ THE LABELS */
   if (VarType(3) ==  sci_strings)
     {
       GetRhsVar(3,MATRIX_OF_STRING_DATATYPE,&nbRowLineLabels,&nbColLineLabels,&lineLabelsAdr);
       if (nbRow !=1 && nbCol !=1)
       {
+        freeArrayOfString(lineLabelsAdr, nbRowLineLabels*nbColLineLabels);
         Scierror(999, _("%s: Wrong size for input argument #%d: Vector of strings expected.\n"), fname, 3);
         return FALSE;
       }
       setMessageBoxLineLabels(messageBoxID, getStringMatrixFromStack((size_t)lineLabelsAdr), nbColLineLabels*nbRowLineLabels);
+      freeArrayOfString(lineLabelsAdr, nbRowLineLabels*nbColLineLabels);
     }
   else 
     {
index a857e45..e6f3f59 100644 (file)
@@ -16,6 +16,7 @@
 #include "CallMessageBox.h"
 #include "Scierror.h"
 #include "getPropertyAssignedValue.h"
+#include "freeArrayOfString.h"
 /*--------------------------------------------------------------------------*/
 int C2F(sci_x_choose_modeless)(char *fname,unsigned long fname_len)
 {
@@ -51,6 +52,7 @@ int C2F(sci_x_choose_modeless)(char *fname,unsigned long fname_len)
     }
   else
     {
+      freeArrayOfString(itemsAdr, nbColItems*nbRowItems);
       Scierror(999, _("%s: Wrong type for input argument #%d: Vector of strings expected.\n"), fname, 2);
       return FALSE;
     }
@@ -67,6 +69,9 @@ int C2F(sci_x_choose_modeless)(char *fname,unsigned long fname_len)
   /* Modality */
   setMessageBoxModal(messageBoxID, FALSE);
     
+  freeArrayOfString(itemsAdr, nbColItems*nbRowItems);
+  freeArrayOfString(messageAdr, nbCol*nbRow);
+    
   if (Rhs == 3)
     {
       if (VarType(3) ==  sci_strings)
@@ -74,6 +79,7 @@ int C2F(sci_x_choose_modeless)(char *fname,unsigned long fname_len)
           GetRhsVar(3,MATRIX_OF_STRING_DATATYPE,&nbRow,&nbCol,&buttonLabelAdr);
           if (nbRow*nbCol != 1)
           {
+            freeArrayOfString(buttonLabelAdr, nbRow*nbCol);
             Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 3);
             return FALSE;
           }
@@ -85,6 +91,7 @@ int C2F(sci_x_choose_modeless)(char *fname,unsigned long fname_len)
         }
 
       setMessageBoxButtonsLabels(messageBoxID, getStringMatrixFromStack((size_t)buttonLabelAdr), nbCol*nbRow);
+      freeArrayOfString(buttonLabelAdr, nbRow*nbCol);
     }
 
   /* Display it and wait for a user input */
index 0b6cbc7..3736481 100644 (file)
@@ -17,6 +17,7 @@
 #include "CallMessageBox.h"
 #include "Scierror.h"
 #include "getPropertyAssignedValue.h"
+#include "freeArrayOfString.h"
 /*--------------------------------------------------------------------------*/
 int C2F(sci_x_dialog)(char *fname,unsigned long fname_len)
 {
@@ -53,6 +54,7 @@ int C2F(sci_x_dialog)(char *fname,unsigned long fname_len)
   setMessageBoxTitle(messageBoxID, _("Scilab Input Value Request"));
   /* Message */
   setMessageBoxMultiLineMessage(messageBoxID, getStringMatrixFromStack((size_t)labelsAdr), nbCol*nbRow);
+  freeArrayOfString(labelsAdr, nbCol*nbRow);
     
   if (Rhs == 2)
     {
@@ -67,6 +69,7 @@ int C2F(sci_x_dialog)(char *fname,unsigned long fname_len)
         }
 
       setMessageBoxInitialValue(messageBoxID, getStringMatrixFromStack((size_t)initialValueAdr), nbCol*nbRow);
+      freeArrayOfString(initialValueAdr, nbCol*nbRow);
     }
 
   /* Display it and wait for a user input */
index 9755af9..a9bc85f 100644 (file)
@@ -17,6 +17,7 @@
 #include "CallMessageBox.h"
 #include "getPropertyAssignedValue.h"
 #include "Scierror.h"
+#include "freeArrayOfString.h"
 /*--------------------------------------------------------------------------*/
 int C2F(sci_x_mdialog)(char *fname,unsigned long fname_len)
 {
@@ -58,6 +59,7 @@ int C2F(sci_x_mdialog)(char *fname,unsigned long fname_len)
   setMessageBoxTitle(messageBoxID, _("Scilab Multiple Values Request"));
   /* Message */
   setMessageBoxMultiLineMessage(messageBoxID, getStringMatrixFromStack((size_t)labelsAdr), nbCol*nbRow);
+  freeArrayOfString(labelsAdr, nbCol*nbRow);
     
   /* READ THE LINE LABELS */
   if (VarType(2) ==  sci_strings)
@@ -69,6 +71,7 @@ int C2F(sci_x_mdialog)(char *fname,unsigned long fname_len)
         return FALSE;
       }
       setMessageBoxLineLabels(messageBoxID, getStringMatrixFromStack((size_t)lineLabelsAdr), nbColLineLabels*nbRowLineLabels);
+      freeArrayOfString(lineLabelsAdr, nbColLineLabels*nbRowLineLabels);
     }
   else 
     {
@@ -88,6 +91,7 @@ int C2F(sci_x_mdialog)(char *fname,unsigned long fname_len)
               return FALSE;
             }
           setMessageBoxDefaultInput(messageBoxID, getStringMatrixFromStack((size_t)defaultValuesAdr), nbColDefaultValues*nbRowDefaultValues);
+          freeArrayOfString(defaultValuesAdr, nbColDefaultValues*nbRowDefaultValues);
         }
       else
         {
@@ -98,6 +102,7 @@ int C2F(sci_x_mdialog)(char *fname,unsigned long fname_len)
               return FALSE;
             }
           setMessageBoxColumnLabels(messageBoxID, getStringMatrixFromStack((size_t)columnLabelsAdr), nbColColumnLabels*nbRowColumnLabels);
+          freeArrayOfString(columnLabelsAdr, nbColColumnLabels*nbRowColumnLabels);
        }
     }
   else 
@@ -118,6 +123,7 @@ int C2F(sci_x_mdialog)(char *fname,unsigned long fname_len)
               return FALSE;
             }
           setMessageBoxDefaultInput(messageBoxID, getStringMatrixFromStack((size_t)defaultValuesAdr), nbColDefaultValues*nbRowDefaultValues);
+          freeArrayOfString(defaultValuesAdr, nbColDefaultValues*nbRowDefaultValues);
         }
       else 
         {