X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fterminal%2Fread-line.c;h=544e18d55dd965608919ba6b5e435c002edeb165;hb=81579d9e9f994fb2908f50af41c3eb033d216e58;hp=626b06353392f75c6941c6e1ac1e30f6096a0ef2;hpb=68f08c4bb53fcde16035b622bdb6e9529f9cf3ae;p=pspp-builds.git diff --git a/src/ui/terminal/read-line.c b/src/ui/terminal/read-line.c index 626b0635..544e18d5 100644 --- a/src/ui/terminal/read-line.c +++ b/src/ui/terminal/read-line.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2007 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2007, 2009, 2011 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 @@ -16,26 +16,30 @@ #include -#include "read-line.h" +#include "ui/terminal/read-line.h" #include #include #include #include +#if ! HAVE_READLINE +#include +#endif -#include "msg-ui.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "xalloc.h" +#include "data/file-name.h" +#include "data/settings.h" +#include "language/command.h" +#include "language/prompt.h" +#include "libpspp/cast.h" +#include "libpspp/message.h" +#include "libpspp/str.h" +#include "libpspp/version.h" +#include "output/driver.h" +#include "output/journal.h" +#include "ui/terminal/msg-ui.h" +#include "ui/terminal/terminal.h" + +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -91,7 +95,7 @@ readln_uninitialize (void) initialised = false; #if HAVE_READLINE - if (history_file != NULL && false == get_testing_mode() ) + if (history_file != NULL && false == settings_get_testing_mode () ) write_history (history_file); clear_history (); free (history_file); @@ -103,8 +107,7 @@ static bool read_interactive (struct getl_interface *s, struct string *line) { - struct readln_source *is = - (struct readln_source *) s ; + struct readln_source *is = UP_CAST (s, struct readln_source, parent); return is->interactive_func (line, prompt_get_style ()); } @@ -143,15 +146,15 @@ readln_read (struct string *line, enum prompt_style style) #if HAVE_READLINE char *string; #endif + bool eof; assert (initialised); - reset_msg_count (); + msg_ui_reset_counts (); welcome (); - if (style == PROMPT_FIRST) - som_flush (); + output_flush (); #if HAVE_READLINE rl_attempted_completion_function = (style == PROMPT_FIRST @@ -159,28 +162,38 @@ readln_read (struct string *line, enum prompt_style style) : dont_complete); string = readline (prompt); if (string == NULL) - return false; + eof = true; else { if (string[0]) add_history (string); ds_assign_cstr (line, string); free (string); - return true; + eof = false; } #else fputs (prompt, stdout); fflush (stdout); - if (ds_read_line (line, stdin)) + if (ds_read_line (line, stdin, SIZE_MAX)) { ds_chomp (line, '\n'); - return true; + eof = false; } else - return false; + eof = true; #endif -} + /* Check whether the size of the window has changed, so that + the output drivers can adjust their settings as needed. We + only do this for the first line of a command, as it's + possible that the output drivers are actually in use + afterward, and we don't want to confuse them in the middle + of output. */ + if (style == PROMPT_FIRST) + terminal_check_size (); + + return !eof; +} static void readln_close (struct getl_interface *i) @@ -200,7 +213,7 @@ create_readln_source (void) rlns->parent.read = read_interactive; rlns->parent.close = readln_close; - return (struct getl_interface *) rlns; + return &rlns->parent; }