[gimp] pdb: return NULL terminated stringarrays from libgimp PDB wrappers



commit e61b1f7603f424ab759b57c8b8aa3c622924df65
Author: Michael Natterer <mitch gimp org>
Date:   Tue Nov 27 20:50:21 2012 +0100

    pdb: return NULL terminated stringarrays from libgimp PDB wrappers
    
    so they can be freed with g_strfreev().

 libgimp/gimp_pdb.c             |    3 ++-
 libgimp/gimpbrushes_pdb.c      |    3 ++-
 libgimp/gimpbuffer_pdb.c       |    3 ++-
 libgimp/gimpcontext_pdb.c      |    3 ++-
 libgimp/gimpdynamics_pdb.c     |    3 ++-
 libgimp/gimpfonts_pdb.c        |    3 ++-
 libgimp/gimpgradients_pdb.c    |    3 ++-
 libgimp/gimpimage_pdb.c        |    3 ++-
 libgimp/gimpitem_pdb.c         |    3 ++-
 libgimp/gimppalettes_pdb.c     |    3 ++-
 libgimp/gimppaths_pdb.c        |    3 ++-
 libgimp/gimppatterns_pdb.c     |    3 ++-
 libgimp/gimpproceduraldb_pdb.c |    3 ++-
 tools/pdbgen/lib.pl            |   12 ++++++++++--
 14 files changed, 36 insertions(+), 15 deletions(-)
---
diff --git a/libgimp/gimp_pdb.c b/libgimp/gimp_pdb.c
index 7d89eb0..15432be 100644
--- a/libgimp/gimp_pdb.c
+++ b/libgimp/gimp_pdb.c
@@ -217,9 +217,10 @@ gimp_get_parasite_list (gint *num_parasites)
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_parasites = return_vals[1].data.d_int32;
-      parasites = g_new (gchar *, *num_parasites);
+      parasites = g_new (gchar *, *num_parasites + 1);
       for (i = 0; i < *num_parasites; i++)
         parasites[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      parasites[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpbrushes_pdb.c b/libgimp/gimpbrushes_pdb.c
index a640be8..e18b901 100644
--- a/libgimp/gimpbrushes_pdb.c
+++ b/libgimp/gimpbrushes_pdb.c
@@ -96,9 +96,10 @@ gimp_brushes_get_list (const gchar *filter,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_brushes = return_vals[1].data.d_int32;
-      brush_list = g_new (gchar *, *num_brushes);
+      brush_list = g_new (gchar *, *num_brushes + 1);
       for (i = 0; i < *num_brushes; i++)
         brush_list[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      brush_list[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpbuffer_pdb.c b/libgimp/gimpbuffer_pdb.c
index f7ad5cb..b28aac4 100644
--- a/libgimp/gimpbuffer_pdb.c
+++ b/libgimp/gimpbuffer_pdb.c
@@ -67,9 +67,10 @@ gimp_buffers_get_list (const gchar *filter,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_buffers = return_vals[1].data.d_int32;
-      buffer_list = g_new (gchar *, *num_buffers);
+      buffer_list = g_new (gchar *, *num_buffers + 1);
       for (i = 0; i < *num_buffers; i++)
         buffer_list[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      buffer_list[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpcontext_pdb.c b/libgimp/gimpcontext_pdb.c
index 1e41d93..c60e9ee 100644
--- a/libgimp/gimpcontext_pdb.c
+++ b/libgimp/gimpcontext_pdb.c
@@ -165,9 +165,10 @@ gimp_context_list_paint_methods (gint    *num_paint_methods,
   if (success)
     {
       *num_paint_methods = return_vals[1].data.d_int32;
-      *paint_methods = g_new (gchar *, *num_paint_methods);
+      *paint_methods = g_new (gchar *, *num_paint_methods + 1);
       for (i = 0; i < *num_paint_methods; i++)
         (*paint_methods)[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      (*paint_methods)[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpdynamics_pdb.c b/libgimp/gimpdynamics_pdb.c
index 39db28d..1fa8b8b 100644
--- a/libgimp/gimpdynamics_pdb.c
+++ b/libgimp/gimpdynamics_pdb.c
@@ -98,9 +98,10 @@ gimp_dynamics_get_list (const gchar *filter,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_dynamics = return_vals[1].data.d_int32;
-      dynamics_list = g_new (gchar *, *num_dynamics);
+      dynamics_list = g_new (gchar *, *num_dynamics + 1);
       for (i = 0; i < *num_dynamics; i++)
         dynamics_list[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      dynamics_list[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpfonts_pdb.c b/libgimp/gimpfonts_pdb.c
index 7753af2..1e35910 100644
--- a/libgimp/gimpfonts_pdb.c
+++ b/libgimp/gimpfonts_pdb.c
@@ -93,9 +93,10 @@ gimp_fonts_get_list (const gchar *filter,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_fonts = return_vals[1].data.d_int32;
-      font_list = g_new (gchar *, *num_fonts);
+      font_list = g_new (gchar *, *num_fonts + 1);
       for (i = 0; i < *num_fonts; i++)
         font_list[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      font_list[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpgradients_pdb.c b/libgimp/gimpgradients_pdb.c
index ab0c596..8078435 100644
--- a/libgimp/gimpgradients_pdb.c
+++ b/libgimp/gimpgradients_pdb.c
@@ -96,9 +96,10 @@ gimp_gradients_get_list (const gchar *filter,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_gradients = return_vals[1].data.d_int32;
-      gradient_list = g_new (gchar *, *num_gradients);
+      gradient_list = g_new (gchar *, *num_gradients + 1);
       for (i = 0; i < *num_gradients; i++)
         gradient_list[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      gradient_list[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpimage_pdb.c b/libgimp/gimpimage_pdb.c
index fc2b00b..18a0cf8 100644
--- a/libgimp/gimpimage_pdb.c
+++ b/libgimp/gimpimage_pdb.c
@@ -3109,9 +3109,10 @@ gimp_image_get_parasite_list (gint32  image_ID,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_parasites = return_vals[1].data.d_int32;
-      parasites = g_new (gchar *, *num_parasites);
+      parasites = g_new (gchar *, *num_parasites + 1);
       for (i = 0; i < *num_parasites; i++)
         parasites[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      parasites[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpitem_pdb.c b/libgimp/gimpitem_pdb.c
index 4858263..efb19db 100644
--- a/libgimp/gimpitem_pdb.c
+++ b/libgimp/gimpitem_pdb.c
@@ -1005,9 +1005,10 @@ gimp_item_get_parasite_list (gint32  item_ID,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_parasites = return_vals[1].data.d_int32;
-      parasites = g_new (gchar *, *num_parasites);
+      parasites = g_new (gchar *, *num_parasites + 1);
       for (i = 0; i < *num_parasites; i++)
         parasites[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      parasites[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimppalettes_pdb.c b/libgimp/gimppalettes_pdb.c
index 3864b3d..ce76eab 100644
--- a/libgimp/gimppalettes_pdb.c
+++ b/libgimp/gimppalettes_pdb.c
@@ -94,9 +94,10 @@ gimp_palettes_get_list (const gchar *filter,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_palettes = return_vals[1].data.d_int32;
-      palette_list = g_new (gchar *, *num_palettes);
+      palette_list = g_new (gchar *, *num_palettes + 1);
       for (i = 0; i < *num_palettes; i++)
         palette_list[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      palette_list[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimppaths_pdb.c b/libgimp/gimppaths_pdb.c
index b4ea471..6d70752 100644
--- a/libgimp/gimppaths_pdb.c
+++ b/libgimp/gimppaths_pdb.c
@@ -64,9 +64,10 @@ gimp_path_list (gint32  image_ID,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_paths = return_vals[1].data.d_int32;
-      path_list = g_new (gchar *, *num_paths);
+      path_list = g_new (gchar *, *num_paths + 1);
       for (i = 0; i < *num_paths; i++)
         path_list[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      path_list[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimppatterns_pdb.c b/libgimp/gimppatterns_pdb.c
index cc817fb..36514b6 100644
--- a/libgimp/gimppatterns_pdb.c
+++ b/libgimp/gimppatterns_pdb.c
@@ -96,9 +96,10 @@ gimp_patterns_get_list (const gchar *filter,
   if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
     {
       *num_patterns = return_vals[1].data.d_int32;
-      pattern_list = g_new (gchar *, *num_patterns);
+      pattern_list = g_new (gchar *, *num_patterns + 1);
       for (i = 0; i < *num_patterns; i++)
         pattern_list[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      pattern_list[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/libgimp/gimpproceduraldb_pdb.c b/libgimp/gimpproceduraldb_pdb.c
index e5d6ba7..a7e1d19 100644
--- a/libgimp/gimpproceduraldb_pdb.c
+++ b/libgimp/gimpproceduraldb_pdb.c
@@ -162,9 +162,10 @@ gimp_procedural_db_query (const gchar   *name,
   if (success)
     {
       *num_matches = return_vals[1].data.d_int32;
-      *procedure_names = g_new (gchar *, *num_matches);
+      *procedure_names = g_new (gchar *, *num_matches + 1);
       for (i = 0; i < *num_matches; i++)
         (*procedure_names)[i] = g_strdup (return_vals[2].data.d_stringarray[i]);
+      (*procedure_names)[i] = NULL;
     }
 
   gimp_destroy_params (return_vals, nreturn_vals);
diff --git a/tools/pdbgen/lib.pl b/tools/pdbgen/lib.pl
index 93df898..c777c8e 100644
--- a/tools/pdbgen/lib.pl
+++ b/tools/pdbgen/lib.pl
@@ -265,7 +265,10 @@ CODE
 		my $arg = $arg_types{$type};
 		my $var;
 	    
-		my $ch = ""; my $cf = "";
+		my $ch = ""; my $cf = ""; my $numvarplus = "";
+		if ($type =~ /stringarray/) {
+		    $numvarplus = ' + 1';
+		}
 		if ($type =~ /^string(array)?/) {
 		    $ch = 'g_strdup (';
 		    $cf = ')';
@@ -312,7 +315,7 @@ CODE
 
 		    $return_marshal .= <<NEW . (($ch || $cf) ? <<CP1 : <<CP2);
       $numvar = return_vals[$numpos].data.d_$numtype;
-      $var = g_new ($datatype, $numvar);
+      $var = g_new ($datatype, $numvar$numvarplus);
 NEW
       for (i = 0; i < $numvar; i++)
         $dh$_->{name}$df\[i] = ${ch}return_vals[$argc].data.d_$type\[i]${cf};
@@ -321,6 +324,11 @@ CP1
               return_vals[$argc].data.d_$type,
               $numvar * sizeof ($datatype));
 CP2
+                    if ($type =~ /stringarray/) {
+			$return_marshal .= <<FINISH
+      $dh$_->{name}$df\[i] = NULL;
+FINISH
+		    }
 		    $out->{headers} = "#include <string.h>\n" unless ($ch || $cf);
                 }
 		else {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]