Fixed a whole lot more memory leaks.
[pspp-builds.git] / src / set.q
index 3c1b38d5af50f77170c22efbae9cae1b33fb53f4..120606fb66eddc3822a1f370fda4f5c9c42778fe 100644 (file)
--- a/src/set.q
+++ b/src/set.q
@@ -64,6 +64,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <stdlib.h>
+#include <time.h>
 #include "alloc.h"
 #include "command.h"
 #include "lexer.h"
@@ -74,7 +75,6 @@
 #include "var.h"
 #include "format.h"
 #include "copyleft.h"
-#include "random.h"
 
 #include "signal.h"
 
@@ -106,8 +106,7 @@ static int set_listing=1;
 static char *set_pager=0;
 #endif /* !USE_INTERNAL_PAGER */
 
-static unsigned long set_seed;
-static int seed_flag=0;
+static gsl_rng *rng;
 
 static int long_view=0;
 int set_testing_mode=0;
@@ -122,6 +121,9 @@ static void set_routing (int q, int *setting);
 
 static int set_ccx (const char *cc_string, struct set_cust_currency * cc,
                    int cc_name);
+static void set_rng (unsigned long);
+static unsigned long random_seed (void);
+
 /* (specification)
    "SET" (stc_):
      automenu=automenu:on/off;
@@ -301,7 +303,6 @@ aux_stc_custom_results(struct cmd_set *cmd UNUSED)
 static int
 aux_stc_custom_seed(struct cmd_set *cmd UNUSED)
 {
-  msg(MM, "%ld",set_seed);
   return 0;
 }
 
@@ -704,15 +705,14 @@ stc_custom_seed (struct cmd_set *cmd UNUSED)
 {
   lex_match ('=');
   if (lex_match_id ("RANDOM"))
-    set_seed = random_seed();
+    set_rng (random_seed ());
   else
     {
       if (!lex_force_num ())
        return 0;
-      set_seed = tokval;
+      set_rng (tokval);
       lex_get ();
     }
-  seed_flag = 1;
 
   return 1;
 }
@@ -1051,6 +1051,22 @@ set_viewport(int sig_num UNUSED)
 
 /* Public functions */
 
+void
+done_settings(void)
+{
+  if ( rng ) 
+    gsl_rng_free (rng);
+  free (set_pager);
+  free (set_journal);
+
+  free (cmd.s_endcmd);
+  free (cmd.s_prompt);
+  free (cmd.s_cprompt);
+  free (cmd.s_dprompt);
+}
+
+
+
 void
 init_settings(void)
 {
@@ -1063,8 +1079,8 @@ init_settings(void)
   cmd.safe = STC_OFF;
 
   cmd.dec = STC_DOT;
-  cmd.n_cpi = 6;
-  cmd.n_lpi = 10;
+  cmd.n_cpi[0] = 6;
+  cmd.n_lpi[0] = 10;
   cmd.echo = STC_OFF;
   cmd.more = STC_ON;
   cmd.headers = STC_YES;
@@ -1080,10 +1096,10 @@ init_settings(void)
   set_journal = xstrdup ("pspp.jnl");
   set_journaling = 1;
 
-  cmd.n_mxwarns = 100;
-  cmd.n_mxerrs = 100;
-  cmd.n_mxloops = 1;
-  cmd.n_workspace = 4L * 1024 * 1024;
+  cmd.n_mxwarns[0] = 100;
+  cmd.n_mxerrs[0] = 100;
+  cmd.n_mxloops[0] = 1;
+  cmd.n_workspace[0] = 4L * 1024 * 1024;
 
 
 #if !USE_INTERNAL_PAGER
@@ -1211,13 +1227,13 @@ get_undefined(void)
 int
 get_mxwarns(void)
 {  
-  return cmd.n_mxwarns;
+  return cmd.n_mxwarns[0];
 }
 
 int
 get_mxerrs(void)
 {
-  return cmd.n_mxerrs;
+  return cmd.n_mxerrs[0];
 }
 
 int
@@ -1235,7 +1251,7 @@ get_printback(void)
 int
 get_mxloops(void)
 {
-  return cmd.n_mxloops;
+  return cmd.n_mxloops[0];
 }
 
 int
@@ -1260,7 +1276,7 @@ get_endcmd(void)
 size_t
 get_max_workspace(void)
 {
-  return cmd.n_workspace;
+  return cmd.n_workspace[0];
 }
 
 double
@@ -1313,26 +1329,28 @@ get_pager(void)
   return set_pager;
 }
 
-/* Return 1 if the seed has been set since the last time this function
-   was called.
-   Fill the value pointed to by seed with the seed .
-*/
-int
-seed_is_set(unsigned long *seed)
+gsl_rng *
+get_rng (void)
 {
-  int result = 0;
-
-  *seed = set_seed ;
-
-  if ( seed_flag ) 
-    result = 1;
-  
-  seed_flag = 0;
+  if (rng == NULL)
+    set_rng (random_seed ());
+  return rng;
+}
 
-  return result;
-    
+static void
+set_rng (unsigned long seed) 
+{
+  rng = gsl_rng_alloc (gsl_rng_mt19937);
+  if (rng == NULL)
+    out_of_memory ();
+  gsl_rng_set (rng, seed);
 }
 
+static unsigned long
+random_seed (void) 
+{
+  return time (0);
+}
 
 static int global_algorithm = ENHANCED;
 static int cmd_algorithm = ENHANCED;