/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <errno.h>
#include <stdlib.h>
#include <time.h>
+#include <unistd.h>
+#include "gl/vasnprintf.h"
+
+#include "data/casereader.h"
#include "data/data-in.h"
#include "data/data-out.h"
#include "data/dataset.h"
#include "language/lexer/lexer.h"
#include "libpspp/compiler.h"
#include "libpspp/copyleft.h"
+#include "libpspp/temp-file.h"
+#include "libpspp/version.h"
#include "libpspp/float-format.h"
#include "libpspp/i18n.h"
#include "libpspp/integer-format.h"
/* (specification)
"SET" (stc_):
blanks=custom;
- block=string "x==1" "one character long";
- boxstring=string "x==3 || x==11" "3 or 11 characters long";
+ block=string;
+ boxstring=string;
case=size:upper/uplow;
cca=string;
ccb=string;
ccd=string;
cce=string;
compression=compress:on/off;
- cpi=integer "x>0" "%s must be greater than 0";
+ cpi=integer;
decimal=dec:dot/comma;
epoch=custom;
errors=custom;
format=custom;
headers=headers:no/yes/blank;
highres=hires:on/off;
- histogram=string "x==1" "one character long";
+ histogram=string;
include=inc:on/off;
journal=custom;
log=custom;
length=custom;
locale=custom;
lowres=lores:auto/on/off;
- lpi=integer "x>0" "%s must be greater than 0";
+ lpi=integer;
menus=menus:standard/extended;
messages=custom;
mexpand=mexp:on/off;
- miterate=integer "x>0" "%s must be greater than 0";
- mnest=integer "x>0" "%s must be greater than 0";
+ miterate=integer;
+ mnest=integer;
mprint=mprint:on/off;
- mxerrs=integer "x >= 1" "%s must be at least 1";
- mxloops=integer "x >=1" "%s must be at least 1";
+ mxerrs=integer;
+ mxloops=integer;
mxmemory=integer;
mxwarns=integer;
printback=custom;
rrb=rrb:native/isl/isb/idl/idb/vf/vd/vg/zs/zl;
safer=safe:on;
scompression=scompress:on/off;
- scripttab=string "x==1" "one character long";
+ scripttab=string;
seed=custom;
tnumbers=custom;
- tb1=string "x==3 || x==11" "3 or 11 characters long";
+ tvars=custom;
+ tb1=string;
tbfonts=string;
undefined=undef:warn/nowarn;
wib=wib:msbfirst/lsbfirst/vax/native;
wrb=wrb:native/isl/isb/idl/idb/vf/vd/vg/zs/zl;
width=custom;
- workspace=integer "x>0" "%s must be positive";
+ workspace=integer;
xsort=xsort:yes/no.
*/
if (cmd.sbc_include)
settings_set_include (cmd.inc == STC_ON);
if (cmd.sbc_mxerrs)
- settings_set_max_messages (MSG_S_ERROR, cmd.n_mxerrs[0]);
+ {
+ if (cmd.n_mxerrs[0] >= 1)
+ settings_set_max_messages (MSG_S_ERROR, cmd.n_mxerrs[0]);
+ else
+ msg (SE, _("%s must be at least 1."), "MXERRS");
+ }
if (cmd.sbc_mxloops)
{
if (cmd.n_mxloops[0] >= 1)
msg (SE, _("%s must be at least 1."), "MXLOOPS");
}
if (cmd.sbc_mxwarns)
- settings_set_max_messages (MSG_S_WARNING, cmd.n_mxwarns[0]);
+ {
+ if (cmd.n_mxwarns[0] >= 0)
+ settings_set_max_messages (MSG_S_WARNING, cmd.n_mxwarns[0]);
+ else
+ msg (SE, _("%s must not be negative."), "MXWARNS");
+ }
if (cmd.sbc_rib)
settings_set_input_integer_format (stc_to_integer_format (cmd.rib));
if (cmd.sbc_rrb)
{
if ( cmd.n_workspace[0] < 1024 && ! settings_get_testing_mode ())
msg (SE, _("WORKSPACE must be at least 1MB"));
+ else if (cmd.n_workspace[0] <= 0)
+ msg (SE, _("WORKSPACE must be positive"));
else
settings_set_workspace (cmd.n_workspace[0] * 1024L);
}
}
else
{
- lex_error (lexer, _("expecting VALUES, LABELS or BOTH"));
+ lex_error_expecting (lexer, "VALUES", "LABELS", "BOTH", NULL_SENTINEL);
+ return 0;
+ }
+
+ return 1;
+}
+
+
+static int
+stc_custom_tvars (struct lexer *lexer,
+ struct dataset *ds UNUSED,
+ struct cmd_set *cmd UNUSED, void *aux UNUSED)
+{
+ lex_match (lexer, T_EQUALS);
+
+ if (lex_match_id (lexer, "NAMES"))
+ {
+ settings_set_var_style (SETTINGS_VAR_STYLE_NAMES);
+ }
+ else if (lex_match_id (lexer, "LABELS"))
+ {
+ settings_set_var_style (SETTINGS_VAR_STYLE_LABELS);
+ }
+ else if (lex_match_id (lexer, "BOTH"))
+ {
+ settings_set_var_style (SETTINGS_VAR_STYLE_BOTH);
+ }
+ else
+ {
+ lex_error_expecting (lexer, "NAMES", "LABELS", "BOTH", NULL_SENTINEL);
return 0;
}
return xstrdup (fmt_to_string (settings_get_format (), str));
}
+static char *
+show_journal (const struct dataset *ds UNUSED)
+{
+ return (journal_is_enabled ()
+ ? xasprintf ("\"%s\"", journal_get_file_name ())
+ : xstrdup ("disabled"));
+}
+
static char *
show_length (const struct dataset *ds UNUSED)
{
return xasprintf ("%d", settings_get_viewwidth ());
}
+static char *
+show_current_directory (const struct dataset *ds UNUSED)
+{
+ char *buf = NULL;
+ char *wd = NULL;
+ size_t len = 256;
+
+ do
+ {
+ len <<= 1;
+ buf = xrealloc (buf, len);
+ }
+ while (NULL == (wd = getcwd (buf, len)));
+
+ return wd;
+}
+
+static char *
+show_tempdir (const struct dataset *ds UNUSED)
+{
+ return strdup (temp_dir_name ());
+}
+
+static char *
+show_version (const struct dataset *ds UNUSED)
+{
+ return strdup (version);
+}
+
+static char *
+show_system (const struct dataset *ds UNUSED)
+{
+ return strdup (host_system);
+}
+
+static char *
+show_n (const struct dataset *ds)
+{
+ casenumber n;
+ size_t l;
+
+ const struct casereader *reader = dataset_source (ds);
+
+ if (reader == NULL)
+ return strdup (_("Unknown"));
+
+ n = casereader_count_cases (reader);
+
+ return asnprintf (NULL, &l, "%ld", n);
+}
+
+
struct show_sbc
{
const char *name;
{"CCD", show_ccd},
{"CCE", show_cce},
{"DECIMALS", show_decimals},
+ {"DIRECTORY", show_current_directory},
+ {"ENVIRONMENT", show_system},
{"ERRORS", show_errors},
{"FORMAT", show_format},
+ {"JOURNAL", show_journal},
{"LENGTH", show_length},
{"LOCALE", show_locale},
{"MESSAGES", show_messages},
{"MXERRS", show_mxerrs},
{"MXLOOPS", show_mxloops},
{"MXWARNS", show_mxwarns},
+ {"N", show_n},
{"PRINTBACk", show_printback},
{"RESULTS", show_results},
{"RIB", show_rib},
{"RRB", show_rrb},
{"SCOMPRESSION", show_scompression},
+ {"TEMPDIR", show_tempdir},
{"UNDEFINED", show_undefined},
+ {"VERSION", show_version},
{"WEIGHT", show_weight},
{"WIB", show_wib},
{"WRB", show_wrb},
fputs (copyleft, stdout);
}
+
int
cmd_show (struct lexer *lexer, struct dataset *ds)
{
show_all_cc (ds);
else if (lex_match_id (lexer, "WARRANTY"))
show_warranty (ds);
- else if (lex_match_id (lexer, "COPYING"))
+ else if (lex_match_id (lexer, "COPYING") || lex_match_id (lexer, "LICENSE"))
show_copying (ds);
else if (lex_token (lexer) == T_ID)
{