--- /tmp/Eval/source/eval.c	Tue Apr 13 21:04:42 1993
+++ eval.c	Wed Sep 24 12:25:27 1997
@@ -44,6 +44,9 @@
 */
 
 #include   "eval.h"
+#include   <readline/readline.h>
+#include   <readline/history.h>
+#include   <signal.h>
 
 static char    tempname[80];
 static char    wdir[100];
@@ -122,6 +125,7 @@
 static BOOLEAN process_line(FILE *stream,int showinp,int showout,VARPTR vlist,
                             VARPTR clist,char *pinput);
 static void init_varlist(VARPTR vlist);
+static void init_sig(void);
 static void var_copy(VARPTR dest,VARPTR source);
 static int print_help(FILE *stream,int extended,int page,char *s);
 static int more(char *text,char *input,int pause);
@@ -143,6 +147,8 @@
 
 
     init_varlist(vlist);
+    initialize_readline();
+    init_sig();
     wdir[0]=EOS;
     rpath[0]=EOS;
     setobase(10);
@@ -462,6 +468,7 @@
         if (input[m0]!='?')
             {
             evaluate(&input[m0],showout,vlist,clist);
+	    init_sig(); 
             break;
             }
         if (!strcmp(&input[m0],"?"))
@@ -565,6 +572,24 @@
        vlist[i].name[0]=EOS;
    }
 
+static void ignore_fpe(void)
+{
+  printf("Floating point exception... ignore result!\n");
+  signal(SIGFPE, SIG_IGN);
+}
+
+/*
+** init_sig()
+**
+** initialize signal handler for floating point exceptions
+**
+*/
+
+static void init_sig(void)
+{
+  signal(SIGFPE, ignore_fpe);
+}
+
 /*
 ** var_copy(VARPTR dest,VARPTR source)
 **
@@ -839,24 +864,89 @@
     s[j+1]=EOS;
     }
 
+char *
+complete_consts (char *text, int state)
+{
+  static int i = 0, j = 0;
+
+  if (state == 0) {
+    i = 0;
+    j = 0;
+  }
+
+  while (i<MAXC) {
+    if (strncmp (clist[i].name, text, strlen(text)) == 0)
+      return strdup(clist[i++].name);
+    else
+      i++;
+  }
 
-static int nextline(char *s,FILE *stream)
-
+  while (j<NUMFUNCS) {
+    if (strncmp (flist[j].name, text, strlen(text)) == 0)
+      return strdup(flist[j++].name);
+    else
+      j++;
+  }
+    
+  return NULL;
+}
+    
+int initialize_readline ()
+{
+  /* Allow conditional parsing of the ~/.inputrc file. */
+  rl_readline_name = "Eval";
+  
+  rl_completion_entry_function = (Function *)complete_consts;
+}
+
+/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+     
+/* Read a string, and return a pointer to it.  Returns NULL on EOF. */
+char *
+do_gets ()
+{
+  /* If the buffer has already been allocated, return the memory
+     to the free pool. */
+  if (line_read != (char *)NULL)
     {
-    while (1)
-
-        {
-        if (stream==stdin)
-            printf("%s",PROMPT);
-        if (fgets(s,MAXINPUT,stream)==NULL)
-            return(0);
-        fixup(s);
-        if (s[0]!=';')
-            break;
-        }
-    return(1);
+      free (line_read);
+      line_read = (char *)NULL;
     }
 
+  /* Get a line from the user. */
+  line_read = readline (PROMPT);
+  
+  /* If the line has any text in it, save it on the history. */
+  if (line_read && *line_read)
+    add_history (line_read);
+  
+  return (line_read);
+}
+
+
+static int nextline(char *s,FILE *stream)
+     
+{
+  while (1)
+    
+    {
+      if (stream==stdin) {
+	if (do_gets() == NULL)
+	  return 0;
+	else
+	  strncpy(s, line_read, MAXINPUT);
+      }
+      else
+	if (fgets(s,MAXINPUT,stream)==NULL)
+	  return(0);
+      fixup(s);
+      if (s[0]!=';')
+	break;
+    }
+  return(1);
+}
+     
 
 static void close_temp(int showout)