You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
/*
Categories of SET subcommands:
- data input: BLANKS, DECIMAL, FORMAT.
+ data input: BLANKS, DECIMAL, FORMAT, EPOCH.
program input: ENDCMD, NULLINE.
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
+#include <time.h>
#include "alloc.h"
#include "command.h"
#include "lexer.h"
#include "var.h"
#include "format.h"
#include "copyleft.h"
-#include "random.h"
#include "signal.h"
static double set_blanks=SYSMIS;
+static int set_epoch = -1;
+
static struct fmt_spec set_format={FMT_F,8,2};
static struct set_cust_currency set_cc[5];
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;
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;
echo=echo:on/off;
eject=eject:on/off;
endcmd=string "x==1" "one character long";
+ epoch=custom;
errorbreak=errbrk:on/off;
errors=errors:on/off/terminal/listing/both/none;
format=custom;
listing=custom;
log=custom;
lowres=lores:auto/on/off;
- lpi=integer "x>0" "% must be greater than 0";
+ lpi=integer "x>0" "%s must be greater than 0";
menus=menus:standard/extended;
messages=messages:on/off/terminal/listing/both/none;
mexpand=mexp:on/off;
return aux_stc_custom_listing(cmd);
}
+static int
+aux_stc_custom_epoch(struct cmd_set *cmd UNUSED)
+{
+ msg (MM, _("EPOCH is %d"), get_epoch ());
+ return 0;
+}
+
static int
aux_stc_custom_format(struct cmd_set *cmd UNUSED)
{
static int
aux_stc_custom_seed(struct cmd_set *cmd UNUSED)
{
- msg(MM, "%ld",set_seed);
return 0;
}
return 0;
if (set_pager)
free (set_pager);
- set_pager = xstrdup (ds_value (&tokstr));
+ set_pager = xstrdup (ds_c_str (&tokstr));
lex_get ();
}
return 1;
#else /* USE_INTERNAL_PAGER */
- if (match_id (OFF))
+ if (lex_match_id ("OFF"))
return 1;
msg (SW, "External pagers not supported.");
return 0;
return 1;
}
+/* Parses the EPOCH subcommand, which controls the epoch used for
+ parsing 2-digit years. */
+static int
+stc_custom_epoch (struct cmd_set *cmd UNUSED)
+{
+ lex_match ('=');
+ if (lex_match_id ("AUTOMATIC"))
+ set_epoch = -1;
+ else if (lex_is_integer ())
+ {
+ int new_epoch = lex_integer ();
+ lex_get ();
+ if (new_epoch < 1500)
+ {
+ msg (SE, _("EPOCH must be 1500 or later."));
+ return 0;
+ }
+ set_epoch = new_epoch;
+ }
+ else
+ {
+ lex_error (_("expecting AUTOMATIC or year"));
+ return 0;
+ }
+
+ return 1;
+}
+
static int
stc_custom_length (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;
}
set_journaling = 0;
if (token == T_STRING)
{
- set_journal = xstrdup (ds_value (&tokstr));
+ set_journal = xstrdup (ds_c_str (&tokstr));
lex_get ();
}
return 1;
static char term_buffer[16384];
#endif
- /* Workable defaults before we determine the real terminal size. */
- set_viewwidth = 79;
- set_viewlength = 24;
-
-
+ set_viewwidth = -1;
+ set_viewlength = -1;
#if __DJGPP__ || __BORLANDC__
{
/* This code stolen from termcap.info, though modified. */
termtype = getenv ("TERM");
if (!termtype)
- msg (FE, _("Specify a terminal type with `setenv TERM <yourtype>'."));
+ msg (FE, _("Specify a terminal type with the TERM environment variable."));
success = tgetent (term_buffer, termtype);
if (success <= 0)
}
else
{
- set_viewlength = tgetnum ("li");
- set_viewwidth = tgetnum ("co") - 1;
+ /* NOTE: Do not rely upon tgetnum returning -1 if the value is
+ not available. It's supposed to do it, but not all platforms
+ do (eg Cygwin) .
+ */
+ if ( -1 != tgetnum("li"))
+ set_viewlength = tgetnum ("li");
+
+ if ( -1 != tgetnum("co"))
+ set_viewwidth = tgetnum ("co") - 1;
}
}
-#else
- {
- char *s;
+#endif /* HAVE_LIBTERMCAP */
/* Try the environment variables */
- s = getenv("COLUMNS");
- if ( s ) set_viewwidth = atoi(s);
+ if ( -1 == set_viewwidth )
+ {
+ char *s = getenv("COLUMNS");
+ if ( s ) set_viewwidth = atoi(s);
+ }
- s = getenv("LINES");
- if ( s ) set_viewlength = atoi(s);
- }
-#endif /* !HAVE_LIBTERMCAP */
+ if ( -1 == set_viewwidth )
+ {
+ char *s = getenv("LINES");
+ if ( s ) set_viewlength = atoi(s);
+ }
+
+
+ /* Last resort. Use hard coded values */
+ if ( 0 > set_viewwidth ) set_viewwidth = 79;
+ if ( 0 > set_viewlength ) set_viewlength = 24;
}
/* 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)
{
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;
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
{
- char *pager;
+ const char *pager = getenv ("STAT_PAGER");
- pager = getenv ("STAT_PAGER");
- if (!pager) set_pager = getenv ("PAGER");
+ if (!pager)
+ {
+ const char *p = getenv ("PAGER");
+
+ if ( p != NULL )
+ set_pager = xstrdup (p);
+ else
+ set_pager = 0;
+ }
+
if (pager)
set_pager = xstrdup (pager);
return (cmd.dec == STC_DOT ? '.' : ',');
}
+int
+get_epoch (void)
+{
+ if (set_epoch < 0)
+ {
+ time_t t = time (0);
+ struct tm *tm = localtime (&t);
+ if (tm != NULL)
+ set_epoch = (tm->tm_year + 1900) - 69;
+ else
+ set_epoch = 2000 - 69;
+ }
+
+ return set_epoch;
+}
char
get_grouping(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
int
get_mxloops(void)
{
- return cmd.n_mxloops;
+ return cmd.n_mxloops[0];
}
int
size_t
get_max_workspace(void)
{
- return cmd.n_workspace;
+ return cmd.n_workspace[0];
}
double
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)
+{
+ if (rng == NULL)
+ set_rng (random_seed ());
+ return rng;
+}
+
+static void
+set_rng (unsigned long seed)
{
- int result = 0;
+ rng = gsl_rng_alloc (gsl_rng_mt19937);
+ if (rng == NULL)
+ out_of_memory ();
+ gsl_rng_set (rng, seed);
+}
- *seed = set_seed ;
+static unsigned long
+random_seed (void)
+{
+ return time (0);
+}
- if ( seed_flag )
- result = 1;
-
- seed_flag = 0;
+static int global_algorithm = ENHANCED;
+static int cmd_algorithm = ENHANCED;
+static int *algorithm = &global_algorithm;
- return result;
-
+static int syntax = ENHANCED;
+
+/* Set the algorithm option globally */
+void
+set_algorithm(int x)
+{
+ global_algorithm = x;
+}
+
+/* Set the algorithm option for this command only */
+void
+set_cmd_algorithm(int x)
+{
+ cmd_algorithm = x;
+ algorithm = &cmd_algorithm;
+}
+
+/* Unset the algorithm option for this command */
+void
+unset_cmd_algorithm(void)
+{
+ algorithm = &global_algorithm;
+}
+
+/* Return the current algorithm setting */
+int
+get_algorithm(void)
+{
+ return *algorithm;
+}
+
+/* Set the syntax option */
+void
+set_syntax(int x)
+{
+ syntax = x;
+}
+
+/* Get the current syntax setting */
+int
+get_syntax(void)
+{
+ return syntax;
}