John's original code for patch #6210.
[pspp] / src / ui / terminal / main.c
index 8ed050778fdcec6e870e0d243ccd6b39e7859d9c..b25350b94c4f07c6c6b21f8183697ba9a21d5a88 100644 (file)
@@ -1,20 +1,18 @@
-/* PSPP - computes sample statistics.
+/* PSPP - a program for statistical analysis.
    Copyright (C) 1997-9, 2000, 2006 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 the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
    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., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA. */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
 #include <config.h>
 
@@ -80,6 +78,11 @@ static struct dataset * the_dataset = NULL;
 static struct lexer *the_lexer;
 static struct source_stream *the_source_stream ;
 
+static int view_length = -1;
+static int view_width = -1;
+
+static void get_termcap_viewport (int);
+
 
 /* Program entry point. */
 int
@@ -89,6 +92,7 @@ main (int argc, char **argv)
   signal (SIGSEGV, bug_handler);
   signal (SIGFPE, bug_handler);
   signal (SIGINT, interrupt_handler);
+  signal (SIGWINCH, get_termcap_viewport);
 
   set_program_name (argv[0]);
 
@@ -106,15 +110,23 @@ main (int argc, char **argv)
                          );
   prompt_init ();
   readln_initialize ();
-  settings_init ();
+  get_termcap_viewport (0);
+  settings_init (&view_width, &view_length);
   random_init ();
 
-  the_dataset = create_dataset (NULL, NULL);
+  the_dataset = create_dataset ();
 
   if (parse_command_line (argc, argv, the_source_stream))
     {
       msg_ui_init (the_source_stream);
-      outp_read_devices ();
+      if (!get_testing_mode ())
+        outp_read_devices ();
+      else
+        outp_configure_driver_line (
+          ss_cstr ("raw-ascii:ascii:listing:width=9999 length=9999 "
+                   "output-file=\"pspp.list\" emphasis=none "
+                   "headers=off paginate=off squeeze=on "
+                   "top-margin=0 bottom-margin=0"));
       the_lexer = lex_create (the_source_stream);
 
       for (;;)
@@ -145,7 +157,9 @@ i18n_init (void)
 #if HAVE_LC_MESSAGES
   setlocale (LC_MESSAGES, "");
 #endif
-  setlocale (LC_MONETARY, "");
+#if HAVE_LC_PAPER
+  setlocale (LC_PAPER, "");
+#endif
   bindtextdomain (PACKAGE, locale_dir);
   textdomain (PACKAGE);
 #endif /* ENABLE_NLS */
@@ -217,3 +231,71 @@ terminate (bool success)
     }
   exit (success ? EXIT_SUCCESS : EXIT_FAILURE);
 }
+
+\f
+
+#include "error.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+static void
+set_fallback_viewport (void)
+{
+  if (view_width < 0 && getenv ("COLUMNS") != NULL)
+    view_width = atoi (getenv ("COLUMNS"));
+
+  if (view_length < 0 && getenv ("LINES") != NULL)
+    view_length = atoi (getenv ("LINES"));
+
+  if (view_width < 0)
+    view_width = 79;
+
+  if (view_length < 0)
+    view_length = 24;
+}
+
+/* Code that interfaces to ncurses.  This must be at the very end
+   of this file because curses.h redefines "bool" on some systems
+   (e.g. OpenBSD), causing declaration mismatches with functions
+   that have parameters or return values of type "bool". */
+#if HAVE_LIBNCURSES
+#include <curses.h>
+#include <term.h>
+
+static void
+get_termcap_viewport (int sig UNUSED)
+{
+  char term_buffer [16384];
+
+  if (getenv ("TERM") == NULL)
+    goto fallback;
+
+  else if (tgetent (term_buffer, getenv ("TERM")) <= 0)
+    {
+      error (0,0, _("could not access definition for terminal `%s'"),
+             getenv ("TERM"));
+      goto fallback;
+    }
+
+  if (tgetnum ("li") > 0)
+    view_length = tgetnum ("li");
+
+  if (tgetnum ("co") > 1)
+    view_width = tgetnum ("co") - 1;
+
+ fallback:
+  set_fallback_viewport ();
+}
+
+#else /* !HAVE_LIBNCURSES */
+
+static void
+get_termcap_viewport (int sig UNUSED)
+{
+  set_fallback_viewport ();
+}
+
+#endif /* !HAVE_LIBNCURSES */
+
+