Fix typo.
[pspp-builds.git] / src / getline.c
index 2988b0787b45f1747a959b834733057194a76575..d0170980096160a65d7f26b756f5018cafc883e0 100644 (file)
 
    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. */
 
 #include <config.h>
 #include "getline.h"
-#include <assert.h>
+#include "error.h"
 #include <stdio.h>
 #include <errno.h>
 #include <stdlib.h>
 #include "alloc.h"
+#include "command.h"
 #include "error.h"
 #include "filename.h"
 #include "lexer.h"
@@ -43,6 +44,10 @@ int getl_welcomed;
 int getl_mode;
 int getl_prompt;
 
+#if HAVE_LIBREADLINE
+#include <readline/readline.h>
+#endif
+
 #if HAVE_LIBHISTORY
 static char *history_file;
 
@@ -57,6 +62,7 @@ extern int write_history (char *);
 #endif /* no readline/history.h */
 #endif /* -lhistory */
 
+
 extern struct cmd_set cmd;
 
 static struct string getl_include_path;
@@ -72,19 +78,25 @@ static int read_console (void);
 void
 getl_initialize (void)
 {
-  ds_create (NULL, &getl_include_path,
+  ds_create (&getl_include_path,
             fn_getenv_default ("STAT_INCLUDE_PATH", include_path));
-  ds_init (NULL, &getl_buf, 256);
+  ds_init (&getl_buf, 256);
+#if HAVE_LIBREADLINE 
+  rl_completion_entry_function = pspp_completion_function;
+#endif
 }
 
 /* Close getline. */
 void
 getl_uninitialize (void)
 {
+  getl_close_all();
 #if HAVE_LIBHISTORY && defined (unix)
   if (history_file)
     write_history (history_file);
 #endif
+  ds_destroy (&getl_buf);
+  ds_destroy (&getl_include_path);
 }
 
 /* Returns a string that represents the directory that the syntax file
@@ -109,9 +121,9 @@ void
 getl_add_include_dir (const char *path)
 {
   if (ds_length (&getl_include_path))
-    ds_putchar (&getl_include_path, PATH_DELIMITER);
+    ds_putc (&getl_include_path, PATH_DELIMITER);
 
-  ds_concat (&getl_include_path, path);
+  ds_puts (&getl_include_path, path);
 }
 
 /* Adds FN to the tail end of the list of script files to execute.
@@ -154,7 +166,7 @@ getl_include (const char *fn)
 
   {
     char *cur_dir = getl_get_current_directory ();
-    real_fn = fn_search_path (fn, ds_value (&getl_include_path), cur_dir);
+    real_fn = fn_search_path (fn, ds_c_str (&getl_include_path), cur_dir);
     free (cur_dir);
   }
 
@@ -273,7 +285,7 @@ handle_line_buffer (void)
     }
   while (s->cur_line == NULL);
 
-  ds_concat_buffer (&getl_buf, s->cur_line->line, s->cur_line->len);
+  ds_concat (&getl_buf, s->cur_line->line, s->cur_line->len);
 
   /* Advance pointers. */
   s->cur_line = s->cur_line->next;
@@ -309,7 +321,7 @@ getl_read_line (void)
          perform_DO_REPEAT_substitutions ();
          if (getl_head->print)
            tab_output_text (TAB_LEFT | TAT_FIX | TAT_PRINTF, "+%s",
-                            ds_value (&getl_buf));
+                            ds_c_str (&getl_buf));
          return 1;
        }
       
@@ -326,7 +338,7 @@ getl_read_line (void)
            }
        }
 
-      if (!ds_getline (&getl_buf, s->f))
+      if (!ds_gets (&getl_buf, s->f))
        {
          if (ferror (s->f))
            msg (ME, _("Reading `%s': %s."), s->fn, strerror (errno));
@@ -337,13 +349,13 @@ getl_read_line (void)
        ds_truncate (&getl_buf, ds_length (&getl_buf) - 1);
 
       if (get_echo())
-       tab_output_text (TAB_LEFT | TAT_FIX, ds_value (&getl_buf));
+       tab_output_text (TAB_LEFT | TAT_FIX, ds_c_str (&getl_buf));
 
       getl_head->ln++;
 
       /* Allows shebang invocation: `#! /usr/local/bin/pspp'. */
-      if (ds_value (&getl_buf)[0] == '#'
-         && ds_value (&getl_buf)[1] == '!')
+      if (ds_c_str (&getl_buf)[0] == '#'
+         && ds_c_str (&getl_buf)[1] == '!')
        continue;
 
       return 1;
@@ -451,6 +463,7 @@ read_console (void)
 
     default:
       assert (0);
+      abort ();
     }
 
   line = readline (prompt);
@@ -463,7 +476,9 @@ read_console (void)
 #endif
 
   ds_clear (&getl_buf);
-  ds_concat (&getl_buf, line);
+  ds_puts (&getl_buf, line);
+
+  free (line);
 
   return 1;
 }
@@ -476,7 +491,7 @@ read_console (void)
 
   fputs (getl_prompt ? get_cprompt() : get_prompt(), stdout);
   ds_clear (&getl_buf);
-  if (ds_getline (&getl_buf, stdin))
+  if (ds_gets (&getl_buf, stdin))
     return 1;
 
   if (ferror (stdin))