Plugged some memory leaks.
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 19 Nov 2004 06:06:21 +0000 (06:06 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 19 Nov 2004 06:06:21 +0000 (06:06 +0000)
13 files changed:
src/ChangeLog
src/ascii.c
src/error.c
src/frequencies.q
src/getline.c
src/glob.c
src/glob.h
src/lexer.c
src/lexer.h
src/output.c
src/output.h
src/q2c.c
src/settings.h

index 88dd8b6e8b2222e06b3dd2a0b3500d8fea730770..dbf1f89cadfe05750f7185a1eed6fcff5cbfb711 100644 (file)
@@ -1,3 +1,10 @@
+John Darrington <john@darrington.wattle.id.au>
+
+       * settings.h set.c glob.[ch] frequencies.q q2c.c error.c lexer.[ch] 
+          output.[ch] getline.c 
+
+          Plugged some memory leaks
+
 Mon Nov 15 23:47:40 2004  Ben Pfaff  <blp@gnu.org>
 
        Adopt GSL random number generators, paving the way for providing
index 6fa1573be050ae5ade4cf94ad947f03be6f8a266..4a30663fa452df1fa9ef46e24708e87940a71fd7 100644 (file)
@@ -187,16 +187,26 @@ struct ascii_driver_ext
 static int postopen (struct file_ext *);
 static int preclose (struct file_ext *);
 
+static struct outp_option_info *option_info;
+
 static int
 ascii_open_global (struct outp_class *this UNUSED)
 {
+  option_info = xmalloc ( sizeof (struct outp_option_info ) ) ;
+  option_info->initial = 0;
+  option_info->options = 0;
   return 1;
 }
 
 
+static unsigned char *s=0;
 static int
 ascii_close_global (struct outp_class *this UNUSED)
 {
+  free(option_info->initial);
+  free(option_info->options);
+  free(option_info);
+  free(s);
   return 1;
 }
 
@@ -456,7 +466,6 @@ static struct outp_option option_tab[] =
     {"squeeze", boolean_arg, 2},
     {"", 0, 0},
   };
-static struct outp_option_info option_info;
 
 static void
 ascii_option (struct outp_driver *this, const char *key,
@@ -484,7 +493,7 @@ ascii_option (struct outp_driver *this, const char *key,
       return;
     }
 
-  cat = outp_match_keyword (key, option_tab, &option_info, &subcat);
+  cat = outp_match_keyword (key, option_tab, option_info, &subcat);
   switch (cat)
     {
     case 0:
@@ -1518,10 +1527,10 @@ output_lines (struct outp_driver *this, int first, int count)
     }
 }
 
+
 static int
 ascii_close_page (struct outp_driver *this)
 {
-  static unsigned char *s;
   static int s_len;
 
   struct ascii_driver_ext *x = this->ext;
@@ -1610,8 +1619,13 @@ ascii_close_page (struct outp_driver *this)
   memcpy (cp, ls_c_str (&x->ops[OPS_FORMFEED]), ff_len);
   if ( x->paginate ) 
          output_string (this, s, &s[total_len]);
+
   if (line_p != line_buf && !commit_line_buf (this))
+    {
+    free(s);
+    s=0;
     return 0;
+    }
 
   this->page_open = 0;
   return 1;
index 2e012b4bedea3768ad51a1be265789d654e219df..e062f5ccf428febb1f24d5a993b0264dbe8d675d 100644 (file)
@@ -223,9 +223,13 @@ err_hcf (int success)
 {
   terminating = 1;
 
+  lex_done();
   getl_uninitialize ();
 
+  free(file_loc);
   outp_done ();
+  done_glob();
+
 
   exit (success ? EXIT_SUCCESS : EXIT_FAILURE);
 }
index 8393819c0a0d2bda5a33eb722ac8267a1e3945b0..649f09cd82a4ef1e1924e7262a6ee341f1a02f40 100644 (file)
@@ -319,6 +319,8 @@ internal_cmd_frequencies (void)
   /* Do it! */
   procedure_with_splits (precalc, calc, postcalc, NULL);
 
+  free_frequencies(&cmd);
+
   return CMD_SUCCESS;
 }
 
index a5b0148e1dedb4203d7b736079c057a2387b85f1..21fdc5243d372649c0a19183bb31dae378cb3efa 100644 (file)
@@ -85,6 +85,8 @@ getl_uninitialize (void)
   if (history_file)
     write_history (history_file);
 #endif
+  ds_destroy (&getl_buf);
+  ds_destroy (&getl_include_path);
 }
 
 /* Returns a string that represents the directory that the syntax file
index 9b4f93c4e62fa5adac77728994a391dcef7018a5..457be8ace071b856fff5cd17d5fc5dd94d14bd16 100644 (file)
@@ -180,6 +180,15 @@ init_glob (int argc UNUSED, char **argv)
   get_date ();
 }
 
+void
+done_glob(void)
+{
+  dict_destroy(default_dict);
+  free(logfn);
+  done_settings();
+  ds_destroy (&tokstr);
+}
+
 static void
 get_date (void)
 {
index 254b3cdd7708b14c7ca5db5e2e6883dc91c8d406..91b702779126fea09788a21f5096e637fffc002c 100644 (file)
@@ -21,5 +21,6 @@
 #define INCLUDED_GLOB_H 1
 
 void init_glob (int argc UNUSED, char **argv);
+void done_glob (void);
 
 #endif /* glob.h */
index e72f7f1bc6f11ac5e5efde7123751ba5d2c47b54..e573bbb7818f9b3cce8d07fe9edd9b930c8936bc 100644 (file)
@@ -99,6 +99,13 @@ lex_init (void)
   if (!lex_get_line ())
     unexpected_eof ();
 }
+
+void
+lex_done (void)
+{
+  ds_destroy(&put_tokstr);
+}
+
 \f
 /* Common functions. */
 
index 1561d79319c15ddcd7dc12d8a391ac1de34f3ecd..0028128167557fd0b07fb0ac8bc92609df1171a8 100644 (file)
@@ -78,6 +78,7 @@ extern struct string tokstr;
 
 /* Initialization. */
 void lex_init (void);
+void lex_done (void);
 
 /* Common functions. */
 void lex_get (void);
index e33172e21d39c50e4bb54f309d02beb0a9faa2f2..f517ada0286959e03526f855fda6a4044bbc2347 100644 (file)
@@ -442,12 +442,20 @@ destroy_list (struct outp_driver ** dl)
 int
 outp_done (void)
 {
+  struct outp_driver_class_list *n = outp_class_list ; 
 #if GLOBAL_DEBUGGING
   if (iterating_driver_list)
     reentrancy ();
 #endif
   destroy_list (&outp_driver_list);
 
+  while (n) 
+    {
+      struct outp_driver_class_list *next = n->next;
+      free(n);
+      n = next;
+    }
+
   return 1;
 }
 
index bcd093284fdf72538f5cb96c7d28bc2cb61b407d..4b31f050b1ca3712581ffa8147e8876670ff4fc7 100644 (file)
@@ -228,9 +228,6 @@ struct outp_driver_class_list
     struct outp_driver_class_list *next;
   };
 
-/* List of known output driver classes. */
-extern struct outp_driver_class_list *outp_class_list;
-
 /* List of configured output drivers. */
 extern struct outp_driver *outp_driver_list;
 
index 0ffc79f0ea10d4b2356d6f8ce2cc6d3eb6bf9077..5d188bbcedd1a04ca10b89d272aa45a5f8fbe693 100644 (file)
--- a/src/q2c.c
+++ b/src/q2c.c
@@ -2062,7 +2062,10 @@ dump_free (int persistent)
              dump (0, "free (p->s_%s);", st_lower (sbc->name));
              break;
            case SBC_DBL_LIST:
-             dump (0, "subc_list_double_destroy(p->dl_%s);", st_lower (sbc->name));
+             dump (0, "int i;");
+             dump (1, "for(i = 0; i < MAXLISTS ; ++i)");
+             dump (0, "subc_list_double_destroy(&p->dl_%s[i]);", st_lower (sbc->name));
+             outdent();
              break;
            default:
              break;
index 4c196b7e5f98a0b341982d46f808ca0c4a54adc2..74e81b5e7018f48657a5697577c07fb7d14ad91e 100644 (file)
@@ -139,6 +139,7 @@ int get_viewlength(void);
 int get_viewwidth(void);
 
 void init_settings(void) ;
+void done_settings(void) ;
 
 /* Whether pspp can erase and overwrite files */
 int safer_mode(void);