$NetBSD: patch-ae,v 1.10 2012/03/05 12:16:00 obache Exp $

--- fep_edit.c.orig	1995-01-20 08:16:37.000000000 +0000
+++ fep_edit.c	2011-09-29 20:19:55.000000000 +0000
@@ -6,12 +6,26 @@
-#endif lint
+#endif /* lint */
 
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <sys/fcntl.h>
+#include <inttypes.h>
+#ifdef TERMIOS
+#include <termios.h>
+#ifdef __linux__
+#ifndef _POSIX_VDISABLE
+#define _POSIX_VDISABLE '\0'
+#endif
+#endif
+#else
 #include <sgtty.h>
+#endif
 #include <sys/time.h>
+#include <stdlib.h>
 #include <ctype.h>
-#include <sys/dir.h>
+#include <dirent.h>
 #include <sys/file.h>
 #include <setjmp.h>
 #include "fep_defs.h"
@@ -25,7 +39,7 @@ int		MarkPosition = -1;	/* Marked positi
 EDITMODE	editmode = NOTYET;	/* edtimode EMACS, VI */
 EDITSTATUS	editstatus = NOTEDITING;/* EDITING, NOTEDITING */
 
-int	maxline = MAXCOMLEN;		/* maximum length of command line */
+int	maxline = MAXCMDLEN;		/* maximum length of command line */
 int	NeedNewLine;			/* add new line flag */
 int	NeedSave;			/* need to save to history */
 int	Transparency = OFF;		/* transparent flag */
@@ -86,7 +100,7 @@ BINDENT emacsBindings[] = {
 	/* ^X-^V	*/	{"\\^X\\^V",	view_buffer},
 	/* ^X-^K	*/	{"\\^X\\^K",	kill_to_top_of_line},
 	/* ^X-^L	*/	{"\\^X\\^L",	fep_repaint},
-	/* ^X-^C	*/	{"\\^X\\^C",	terminate},
+	/* ^X-^C	*/	{"\\^X\\^C",	(FUNC)terminate},
 	/* ^X-^D	*/	{"\\^X\\^D",	send_eof},
 	/* ^X-(		*/	{"\\^X(",	fep_start_script},
 	/* ^X-)		*/	{"\\^X)",	fep_end_script},
@@ -99,9 +113,9 @@ BINDENT emacsBindings[] = {
 init_bind_table ()
 {
 
-    curFuncTab = (FUNC *) calloc (sizeof (FUNC), 256);
-    altFuncTab = (FUNC *) calloc (sizeof (FUNC), 256);
-    if (curFuncTab == 0 || altFuncTab == 0) {
+    curFuncTab = calloc (sizeof (FUNC), 256);
+    altFuncTab = calloc (sizeof (FUNC), 256);
+    if (curFuncTab == NULL || altFuncTab == NULL) {
 	printf ("Can't allocate space for function table\n");
 	exit (1);
     }
@@ -167,9 +181,9 @@ init_edit_params ()
     /*
      * Initialize command line buffer
      */
-    CommandLine = (CHAR *) calloc (maxline, 1);
-    KillBuffer = (CHAR *) calloc (maxline, 1);
-    if (CommandLine == 0 || KillBuffer == 0) {
+    CommandLine = calloc (maxline, 1);
+    KillBuffer = calloc (maxline, 1);
+    if (CommandLine == NULL || KillBuffer == NULL) {
 	perror ("Edit line buffer");
 	exit (1);
     }
@@ -192,6 +206,30 @@ initEmacsBindings (cft, aft)
 
 #define import(table,key,fn) if((int)key>0)table[(int)key]=fn
 
+#ifdef TERMIOS
+    /* Now, using cbreak mode
+    import (cft, initial_ttymode.c_cc[VSTART], ignore);
+    import (cft, initial_ttymode.c_cc[VSTOP], ignore);
+    */
+    import (cft, initial_ttymode.c_cc[VINTR], insert_and_flush);
+    import (cft, initial_ttymode.c_cc[VQUIT], insert_and_flush);
+    /* Now, EOF will be sent on empty line.
+    import (cft, initial_ttymode.c_cc[VEOF], send_eof);
+    */
+#ifdef VSWTC
+    import (cft, initial_ttymode.c_cc[VSWTC], insert_and_flush);
+#endif
+    import (cft, initial_ttymode.c_cc[VSUSP], insert_and_flush);
+    /* ^Y is used for yank-from-kill-buffer
+    import (cft, initial_ttymode.c_cc[VDSUSP], self_insert);
+    */
+    import (cft, initial_ttymode.c_cc[VREPRINT], reprint);
+    import (cft, initial_ttymode.c_cc[VDISCARD], self_insert);
+    import (cft, initial_ttymode.c_cc[VWERASE], delete_previous_word);
+    import (cft, initial_ttymode.c_cc[VLNEXT], literal_next);
+    import (cft, initial_ttymode.c_cc[VERASE], delete_previous_character);
+    import (cft, initial_ttymode.c_cc[VKILL], delete_line);
+#else
     /* Now, using cbreak mode
     import (cft, tchars_buf.t_startc, ignore);
     import (cft, tchars_buf.t_stopc, ignore);
@@ -212,6 +250,7 @@ initEmacsBindings (cft, aft)
     import (cft, ltchars_buf.t_lnextc, literal_next);
     import (cft, initial_ttymode.sg_erase, delete_previous_character);
     import (cft, initial_ttymode.sg_kill, delete_line);
+#endif
 
 #undef import
 
@@ -227,7 +266,7 @@ initEmacsBindings (cft, aft)
  * Main function of front end program
  */
 CHAR *
-getline()
+get_line()
 {
     int c;
     CHAR *execute_command, *check_alias();
@@ -257,7 +296,7 @@ RETRY:
 	 */
 	swallow_output();
 
-	if (fgets (CommandLine, MAXCOMLEN, redirect_fp)) {
+	if (fgets (CommandLine, MAXCMDLEN, redirect_fp)) {
 	    ++redirect_line;
 	    execute_command = CommandLine;
 	    goto RETURN;	    
@@ -301,7 +340,11 @@ RETRY:
 	 * call send_eof
 	 */
 	if (
+#ifdef TERMIOS
+	    c == initial_ttymode.c_cc[VEOF]
+#else
 	    c == tchars_buf.t_eofc
+#endif
 	    && curFuncTab[c] != send_eof
 	    && ! look_var ("ignore-eof")
 	    && CommandLine [0] == '\0'
@@ -422,11 +465,11 @@ self_insert(c)
     register int i, nbyte = 1, currentNull;
 #ifdef KANJI
     CHAR byte2;
-#endif KANJI
+#endif /* KANJI */
 
     currentNull = strlen (CommandLine);
 
-    if (currentNull >= maxline) {
+    if (currentNull + 1 >= maxline) {
         errorBell();
 	return (0);
     }
@@ -441,7 +484,7 @@ self_insert(c)
 	nbyte = 2;
     }
     else
-#endif KANJI
+#endif /* KANJI */
 	putChar (c);
     reverse_strcpy (
 	&CommandLine[CurrentPosition] + nbyte,
@@ -453,7 +496,7 @@ self_insert(c)
     if (nbyte > 1) {
 	CommandLine[CurrentPosition - 1] = byte2;
     }
-#endif KANJI
+#endif /* KANJI */
     printS (&CommandLine [CurrentPosition]);
 
     if (CommandLine[CurrentPosition] != '\0') {
@@ -557,7 +600,7 @@ moveto (position)
 #ifdef KANJI
 	    && !(CurrentPosition + 1 == position
 		    && iskanji (CommandLine[CurrentPosition]))
-#endif KANJI
+#endif /* KANJI */
 	)
 	    (void) forward_n_character (1);
 }
@@ -581,10 +624,10 @@ beginning_of_line()
 #ifdef KANJI
 #define INC(i) if(iskanji(CommandLine[i])) i+=2; else i++;
 #define DEC(i) if(i>=2 && iskanji_in_string(CommandLine, i-2)) i-=2; else i--;
-#else KANJI
+#else /* KANJI */
 #define INC(i) i++
 #define DEC(i) i--
-#endif KANJI
+#endif /* KANJI */
 
 /*
  * Move cursor to end of line
@@ -642,7 +685,7 @@ backward_n_character(n)
 	    i--;
 	}
 	else
-#endif KANJI
+#endif /* KANJI */
 	putchar (BS);
 	i--;
     }
@@ -697,7 +740,7 @@ backward_n_word (n)
 	    nchars++;
 	}
     }
-#else KANJI
+#else /* KANJI */
     while (n--) {
 	i--, nchars++;
 	while (i > 0 && !iswordchar (CommandLine [i])) {
@@ -707,7 +750,7 @@ backward_n_word (n)
 	    i--, nchars++;
 	}
     }
-#endif KANJI
+#endif /* KANJI */
     return (backward_n_character (nchars));
 }
 
@@ -758,7 +801,7 @@ backward_n_Word (n)
 	    nchars++;
 	}
     }
-#else KANJI
+#else /* KANJI */
     while (n--) {
 	i--, nchars++;
 	while (i > 0 && !isWordchar (CommandLine [i]))
@@ -766,7 +809,7 @@ backward_n_Word (n)
 	while (i > 0 && isWordchar (CommandLine [i - 1]))
 	    i--, nchars++;
     }
-#endif KANJI
+#endif /* KANJI */
     return (backward_n_character (nchars));
 }
 
@@ -804,7 +847,7 @@ forward_n_character(n)
 	(void) putchar (CommandLine[i++]);
     }
     else
-#endif KANJI
+#endif /* KANJI */
     if (isctlchar(CommandLine[i])) {
 	(void) putchar (unctl (CommandLine [i]));
 	i++;
@@ -819,7 +862,7 @@ forward_n_character(n)
 	    (void) putchar (CommandLine[i++]);
 	}
 	else
-#endif KANJI
+#endif /* KANJI */
 	putChar (CommandLine [i++]);
     }
 
@@ -1000,9 +1043,9 @@ delete_previous_n_character(n)
 	    i -= 2, nbyte += 2;
 	else
 	    i -= 1, nbyte += 1;
-#else KANJI
+#else /* KANJI */
     nbyte = n;
-#endif KANJI
+#endif /* KANJI */
 
     deleteArea = howlong (&CommandLine[CurrentPosition - nbyte], nbyte);
     restArea = howlong (&CommandLine[CurrentPosition], 0);
@@ -1075,7 +1118,7 @@ delete_previous_n_word(n)
 	    nchars++;
 	}
     }
-#else KANJI
+#else /* KANJI */
     while (n--) {
 	i--, nchars++;
 	while (i > 0 && !iswordchar (CommandLine [i]))
@@ -1083,7 +1126,7 @@ delete_previous_n_word(n)
 	while (i > 0 && iswordchar (CommandLine [i - 1]))
 	    i--, nchars++;
     }
-#endif KANJI
+#endif /* KANJI */
 
     return (delete_previous_n_character (nchars));
 }
@@ -1136,7 +1179,7 @@ delete_previous_n_Word(n)
 	    nchars++;
 	}
     }
-#else KANJI
+#else /* KANJI */
     while (n--) {
 	i--, nchars++;
 	while (i > 0 && !isWordchar (CommandLine [i]))
@@ -1144,7 +1187,7 @@ delete_previous_n_Word(n)
 	while (i > 0 && isWordchar (CommandLine [i - 1]))
 	    i--, nchars++;
     }
-#endif KANJI
+#endif /* KANJI */
 
     return (delete_previous_n_character (nchars));
 }
@@ -1183,9 +1226,9 @@ delete_next_n_character (n)
 	    else
 		cp++, nbyte++;
     }
-#else KANJI
+#else /* KANJI */
     nbyte = n;
-#endif KANJI
+#endif /* KANJI */
 
     deleteArea = howlong (&CommandLine[CurrentPosition], nbyte);
     restArea = howlong (&CommandLine[CurrentPosition + nbyte], 0);
@@ -1481,7 +1524,11 @@ insert_and_flush(c)
  */
 send_eof()
 {
+#ifdef TERMIOS
+    char c = initial_ttymode.c_cc[VEOF];
+#else
     char c = tchars_buf.t_eofc;
+#endif
 
     (void) self_insert (c);
     if (isctlchar (c))
@@ -1698,7 +1745,7 @@ expand_file_name ()
     char *fileList[256];
     CHAR line[256];
     DIR *dirp, *x_opendir();
-    struct direct *dp;
+    struct dirent *dp;
     int found = 0;
     int i;
     int tilde_expanded = 0;
@@ -1737,11 +1784,11 @@ expand_file_name ()
 	    char *fcp;
 
 # ifdef ALLOCA
-  	    fcp = (char *) alloca (strlen (dp->d_name) + 1);
-# else ALLOCA
-  	    fcp = (char *) malloc (strlen (dp->d_name) + 1);
-# endif ALLOCA
-	    if (fcp == 0) {
+  	    fcp = alloca (strlen (dp->d_name) + 1);
+# else /* ALLOCA */
+  	    fcp = malloc (strlen (dp->d_name) + 1);
+# endif /* ALLOCA */
+	    if (fcp == NULL) {
 		fputs ("\r\n", stdout);
 		perror ("alloca:");
 		reprint ();
@@ -1754,7 +1801,7 @@ expand_file_name ()
     fileList [i] = (char *) 0;
 
     if (*start_expand == '~' && look_var ("expand-tilde")) {
-	char *buf [256], *p;
+	char buf [256], *p;
 
 	strcpy (buf, start_expand);
 	p = x_dirname (buf);
@@ -1801,7 +1848,7 @@ expand_file_name ()
 # ifndef ALLOCA
     for (i = 0; fileList [i]; i++)
 	free (fileList [i]);
-# endif ALLOCA
+# endif /* ALLOCA */
 
     closedir(dirp);
     return (0);
@@ -1903,7 +1950,7 @@ ls (dirp, prefixstring)
     DIR *dirp;
     char *prefixstring;
 {
-    struct direct *dp;
+    struct dirent *dp;
     char *fileList[MAXFILES + 1];
     int i, j;
     int maxlen = 0;
@@ -1928,11 +1975,11 @@ ls (dirp, prefixstring)
 	    continue;
 	if (prefix (prefixstring, dp->d_name)) {
 # ifdef ALLOCA
-  	    fcp = (char *) alloca (strlen (dp->d_name) + 1);
-# else ALLOCA
-  	    fcp = (char *) malloc (strlen (dp->d_name) + 1);
-# endif ALLOCA
-	    if (fcp == 0) {
+  	    fcp = alloca (strlen (dp->d_name) + 1);
+# else /* ALLOCA */
+  	    fcp = malloc (strlen (dp->d_name) + 1);
+# endif /* ALLOCA */
+	    if (fcp == NULL) {
 		fputs ("\r\n", stdout);
 		perror ("alloca:");
 		reprint ();
@@ -1975,7 +2022,7 @@ BACK:
 # ifndef ALLOCA
     for (i = 0; fileList [i]; i++)
 	free (fileList [i]);
-# endif ALLOCA
+# endif /* ALLOCA */
     return;
 }
 
@@ -2022,7 +2069,7 @@ list_remote_file (host, pattern)
 	fputs ("\n", stdout);
     }
 }
-#endif RINFO
+#endif /* RINFO */
 
 bind_key (ft, func, s, dfunc)
     FUNC ft[];		/* Function table */
@@ -2032,7 +2079,7 @@ bind_key (ft, func, s, dfunc)
 {
     char tmps[16];
 
-    if (s[0] == '\\' && s[1] == '^' && s[2] != NULL) {
+    if (s[0] == '\\' && s[1] == '^' && s[2] != '\0') {
 	tmps[0] = toctrl (s[2]);
 	strcpy (&tmps[1], &s[3]);
 	s = tmps;
@@ -2042,7 +2089,7 @@ bind_key (ft, func, s, dfunc)
      * If the string contain only one character, put the function to
      * appropriate position in the table.
      */
-    if (*(s+1) == NULL) {
+    if (*(s+1) == '\0') {
 	if (isIndirect (ft[(int) *s]))
 	    free (maskIndirect (ft[(int) *s]));
 
@@ -2059,11 +2106,11 @@ bind_key (ft, func, s, dfunc)
 	if (! (isIndirect (ft[(int) *s]))) {
 	    register int i;
 
-	    nft = (FUNC *) calloc (sizeof (FUNC), 256);
+	    nft = calloc (sizeof (FUNC), 256);
 	    /*
 	     * If failed in allocating, return 0.
 	     */
-	    if (nft == 0)
+	    if (nft == NULL)
 		return (0);
 
 	    /*
