Updated libedit to NetBSD upstream
Note: This unconditionally assumes wchar_t support. May need revision if some platforms prove problematic.
This commit is contained in:
		
							
								
								
									
										40
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -80,6 +80,7 @@ asn1_*.[cx] | |||||||
| /lib/libedit/src/emacs.h | /lib/libedit/src/emacs.h | ||||||
| /lib/libedit/src/fcns.c | /lib/libedit/src/fcns.c | ||||||
| /lib/libedit/src/fcns.h | /lib/libedit/src/fcns.h | ||||||
|  | /lib/libedit/src/func.h | ||||||
| /lib/libedit/src/help.c | /lib/libedit/src/help.c | ||||||
| /lib/libedit/src/help.h | /lib/libedit/src/help.h | ||||||
| /lib/libedit/src/vi.h | /lib/libedit/src/vi.h | ||||||
| @@ -213,10 +214,6 @@ asn1_*.[cx] | |||||||
| /lib/com_err/parse.h | /lib/com_err/parse.h | ||||||
| /lib/com_err/snprintf.c | /lib/com_err/snprintf.c | ||||||
| /lib/com_err/strlcpy.c | /lib/com_err/strlcpy.c | ||||||
| /lib/editline/snprintf.c |  | ||||||
| /lib/editline/strdup.c |  | ||||||
| /lib/editline/strlcat.c |  | ||||||
| /lib/editline/testit |  | ||||||
| /lib/gssapi/gss | /lib/gssapi/gss | ||||||
| /lib/gssapi/gsstool | /lib/gssapi/gsstool | ||||||
| /lib/gssapi/krb5/gsskrb5-private.h | /lib/gssapi/krb5/gsskrb5-private.h | ||||||
| @@ -231,9 +228,36 @@ asn1_*.[cx] | |||||||
| /lib/gssapi/test_names | /lib/gssapi/test_names | ||||||
| /lib/gssapi/test_ntlm | /lib/gssapi/test_ntlm | ||||||
| /lib/gssapi/test_oid | /lib/gssapi/test_oid | ||||||
|  | /lib/hcrypto/crypto-test | ||||||
|  | /lib/hcrypto/crypto-test2 | ||||||
|  | /lib/hcrypto/destest | ||||||
|  | /lib/hcrypto/error | ||||||
|  | /lib/hcrypto/example_evp_cipher | ||||||
| /lib/hcrypto/hcrypto | /lib/hcrypto/hcrypto | ||||||
| /lib/hcrypto/hcrypto-link | /lib/hcrypto/hcrypto-link | ||||||
|  | /lib/hcrypto/mdtest | ||||||
|  | /lib/hcrypto/rc2test | ||||||
|  | /lib/hcrypto/rctest | ||||||
|  | /lib/hcrypto/test-out-1 | ||||||
|  | /lib/hcrypto/test-out-15 | ||||||
|  | /lib/hcrypto/test-out-16 | ||||||
|  | /lib/hcrypto/test-out-17 | ||||||
|  | /lib/hcrypto/test-out-31 | ||||||
|  | /lib/hcrypto/test-out-32 | ||||||
|  | /lib/hcrypto/test-out-33 | ||||||
|  | /lib/hcrypto/test_bn | ||||||
|  | /lib/hcrypto/test_bulk | ||||||
|  | /lib/hcrypto/test_cipher | ||||||
|  | /lib/hcrypto/test_crypto | ||||||
|  | /lib/hcrypto/test_dh | ||||||
|  | /lib/hcrypto/test_engine_dso | ||||||
|  | /lib/hcrypto/test_hmac | ||||||
|  | /lib/hcrypto/test-out-7 | ||||||
|  | /lib/hcrypto/test_pkcs12 | ||||||
|  | /lib/hcrypto/test_pkcs5 | ||||||
| /lib/hcrypto/test_rand | /lib/hcrypto/test_rand | ||||||
|  | /lib/hcrypto/test_rsa | ||||||
|  | /lib/hcrypto/unix | ||||||
| /lib/roken/test-detach | /lib/roken/test-detach | ||||||
| /lib/hdb/hdb-protos.h | /lib/hdb/hdb-protos.h | ||||||
| /lib/hdb/hdb-private.h | /lib/hdb/hdb-private.h | ||||||
| @@ -318,6 +342,7 @@ asn1_*.[cx] | |||||||
| /lib/krb5/krbhst-test | /lib/krb5/krbhst-test | ||||||
| /lib/krb5/n-fold-test | /lib/krb5/n-fold-test | ||||||
| /lib/krb5/parse-name-test | /lib/krb5/parse-name-test | ||||||
|  | /lib/krb5/pseudo-random-test | ||||||
| /lib/krb5/store-test | /lib/krb5/store-test | ||||||
| /lib/krb5/string-to-key-test | /lib/krb5/string-to-key-test | ||||||
| /lib/krb5/test_acl | /lib/krb5/test_acl | ||||||
| @@ -424,6 +449,7 @@ asn1_*.[cx] | |||||||
| /tests/can/check-can | /tests/can/check-can | ||||||
| /tests/can/current-db.db | /tests/can/current-db.db | ||||||
| /tests/can/krb5.conf | /tests/can/krb5.conf | ||||||
|  | /tests/can/log | ||||||
| /tests/can/mit-pkinit-20070607.cf | /tests/can/mit-pkinit-20070607.cf | ||||||
| /tests/can/test_can | /tests/can/test_can | ||||||
| /tests/db/add-modify-delete | /tests/db/add-modify-delete | ||||||
| @@ -438,8 +464,10 @@ asn1_*.[cx] | |||||||
| /tests/db/krb5.conf-lmdb | /tests/db/krb5.conf-lmdb | ||||||
| /tests/db/krb5.conf-sqlite | /tests/db/krb5.conf-sqlite | ||||||
| /tests/db/loaddump-db | /tests/db/loaddump-db | ||||||
|  | /tests/db/log | ||||||
| /tests/db/tempfile | /tests/db/tempfile | ||||||
| /tests/gss/barpassword | /tests/gss/barpassword | ||||||
|  | /tests/gss/check-basic | ||||||
| /tests/gss/check-context | /tests/gss/check-context | ||||||
| /tests/gss/check-gss | /tests/gss/check-gss | ||||||
| /tests/gss/check-gssmask | /tests/gss/check-gssmask | ||||||
| @@ -449,6 +477,7 @@ asn1_*.[cx] | |||||||
| /tests/gss/foopassword | /tests/gss/foopassword | ||||||
| /tests/gss/krb5.conf | /tests/gss/krb5.conf | ||||||
| /tests/gss/krb5ccfile | /tests/gss/krb5ccfile | ||||||
|  | /tests/gss/krb5ccfile2 | ||||||
| /tests/gss/krb5ccfile-ds | /tests/gss/krb5ccfile-ds | ||||||
| /tests/gss/server.keytab | /tests/gss/server.keytab | ||||||
| /tests/gss/tempfile | /tests/gss/tempfile | ||||||
| @@ -485,8 +514,10 @@ asn1_*.[cx] | |||||||
| /tests/kdc/check-tester | /tests/kdc/check-tester | ||||||
| /tests/kdc/check-uu | /tests/kdc/check-uu | ||||||
| /tests/kdc/current-db.db | /tests/kdc/current-db.db | ||||||
|  | /tests/kdc/current.log.save | ||||||
| /tests/kdc/current-db.sqlite3 | /tests/kdc/current-db.sqlite3 | ||||||
| /tests/kdc/foopassword | /tests/kdc/foopassword | ||||||
|  | /tests/kdc/foopassword.rkpty | ||||||
| /tests/kdc/iprop-stats | /tests/kdc/iprop-stats | ||||||
| /tests/kdc/iprop.keytab | /tests/kdc/iprop.keytab | ||||||
| /tests/kdc/ipropd.dumpfile | /tests/kdc/ipropd.dumpfile | ||||||
| @@ -506,6 +537,7 @@ asn1_*.[cx] | |||||||
| /tests/kdc/krb5-cc.conf | /tests/kdc/krb5-cc.conf | ||||||
| /tests/kdc/krb5.conf.keys | /tests/kdc/krb5.conf.keys | ||||||
| /tests/kdc/localname | /tests/kdc/localname | ||||||
|  | /tests/kdc/notfoopassword | ||||||
| /tests/kdc/o2cache.krb5 | /tests/kdc/o2cache.krb5 | ||||||
| /tests/kdc/ocache.krb5 | /tests/kdc/ocache.krb5 | ||||||
| /tests/kdc/pkinit.crt | /tests/kdc/pkinit.crt | ||||||
|   | |||||||
| @@ -64,22 +64,3 @@ AC_DEFUN([EL_GETPW_R_DRAFT], | |||||||
|        AC_MSG_RESULT(yes)], |        AC_MSG_RESULT(yes)], | ||||||
|       [AC_MSG_RESULT(no)]) |       [AC_MSG_RESULT(no)]) | ||||||
| ]) | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
| dnl |  | ||||||
| dnl use option --enable-widec to turn on use of wide-character support |  | ||||||
| dnl |  | ||||||
| AC_DEFUN([EL_ENABLE_WIDEC], |  | ||||||
| [ |  | ||||||
|    AC_MSG_CHECKING(if you want wide-character code) |  | ||||||
|    AC_ARG_ENABLE(widec, |  | ||||||
|       [  --enable-widec          compile with wide-char/UTF-8 code], |  | ||||||
|       [with_widec=$enableval], |  | ||||||
|       [with_widec=no]) |  | ||||||
|    AC_MSG_RESULT($with_widec) |  | ||||||
|    if test "$with_widec" = yes ; then |  | ||||||
|       AC_DEFINE(WIDECHAR, 1, [Define to 1 if you want wide-character code]) |  | ||||||
|    fi |  | ||||||
|    AM_CONDITIONAL([WIDECHAR], [test "$with_widec" = yes]) |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,23 +1,5 @@ | |||||||
| /* config.h.in.  Generated from configure.ac by autoheader.  */ | /* config.h.in.  Generated from configure.ac by autoheader.  */ | ||||||
|  |  | ||||||
| /* Define to 1 if the `closedir' function returns void instead of `int'. */ |  | ||||||
| #undef CLOSEDIR_VOID |  | ||||||
|  |  | ||||||
| /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP |  | ||||||
|    systems. This function is required for `alloca.c' support on those systems. |  | ||||||
|    */ |  | ||||||
| #undef CRAY_STACKSEG_END |  | ||||||
|  |  | ||||||
| /* Define to 1 if using `alloca.c'. */ |  | ||||||
| #undef C_ALLOCA |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have `alloca', as a function or macro. */ |  | ||||||
| #undef HAVE_ALLOCA |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). |  | ||||||
|    */ |  | ||||||
| #undef HAVE_ALLOCA_H |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <curses.h> header file. */ | /* Define to 1 if you have the <curses.h> header file. */ | ||||||
| #undef HAVE_CURSES_H | #undef HAVE_CURSES_H | ||||||
|  |  | ||||||
| @@ -28,15 +10,15 @@ | |||||||
| /* Define to 1 if you have the <dlfcn.h> header file. */ | /* Define to 1 if you have the <dlfcn.h> header file. */ | ||||||
| #undef HAVE_DLFCN_H | #undef HAVE_DLFCN_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `endpwent' function. */ |  | ||||||
| #undef HAVE_ENDPWENT |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <fcntl.h> header file. */ | /* Define to 1 if you have the <fcntl.h> header file. */ | ||||||
| #undef HAVE_FCNTL_H | #undef HAVE_FCNTL_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `fork' function. */ | /* Define to 1 if you have the `fork' function. */ | ||||||
| #undef HAVE_FORK | #undef HAVE_FORK | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the `getline' function. */ | ||||||
|  | #undef HAVE_GETLINE | ||||||
|  |  | ||||||
| /* Define to 1 if you have getpwnam_r and getpwuid_r that are draft POSIX.1 | /* Define to 1 if you have getpwnam_r and getpwuid_r that are draft POSIX.1 | ||||||
|    versions. */ |    versions. */ | ||||||
| #undef HAVE_GETPW_R_DRAFT | #undef HAVE_GETPW_R_DRAFT | ||||||
| @@ -63,30 +45,15 @@ | |||||||
| /* Define to 1 if you have the <limits.h> header file. */ | /* Define to 1 if you have the <limits.h> header file. */ | ||||||
| #undef HAVE_LIMITS_H | #undef HAVE_LIMITS_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <malloc.h> header file. */ |  | ||||||
| #undef HAVE_MALLOC_H |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `memchr' function. */ |  | ||||||
| #undef HAVE_MEMCHR |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <memory.h> header file. */ | /* Define to 1 if you have the <memory.h> header file. */ | ||||||
| #undef HAVE_MEMORY_H | #undef HAVE_MEMORY_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `memset' function. */ |  | ||||||
| #undef HAVE_MEMSET |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <ncurses.h> header file. */ | /* Define to 1 if you have the <ncurses.h> header file. */ | ||||||
| #undef HAVE_NCURSES_H | #undef HAVE_NCURSES_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ | /* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ | ||||||
| #undef HAVE_NDIR_H | #undef HAVE_NDIR_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `regcomp' function. */ |  | ||||||
| #undef HAVE_REGCOMP |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `re_comp' function. */ |  | ||||||
| #undef HAVE_RE_COMP |  | ||||||
|  |  | ||||||
| /* Define to 1 if `stat' has the bug that it succeeds when given the | /* Define to 1 if `stat' has the bug that it succeeds when given the | ||||||
|    zero-length file name argument. */ |    zero-length file name argument. */ | ||||||
| #undef HAVE_STAT_EMPTY_STRING_BUG | #undef HAVE_STAT_EMPTY_STRING_BUG | ||||||
| @@ -97,41 +64,14 @@ | |||||||
| /* Define to 1 if you have the <stdlib.h> header file. */ | /* Define to 1 if you have the <stdlib.h> header file. */ | ||||||
| #undef HAVE_STDLIB_H | #undef HAVE_STDLIB_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strcasecmp' function. */ |  | ||||||
| #undef HAVE_STRCASECMP |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strchr' function. */ |  | ||||||
| #undef HAVE_STRCHR |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strcspn' function. */ |  | ||||||
| #undef HAVE_STRCSPN |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strdup' function. */ |  | ||||||
| #undef HAVE_STRDUP |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strerror' function. */ |  | ||||||
| #undef HAVE_STRERROR |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <strings.h> header file. */ | /* Define to 1 if you have the <strings.h> header file. */ | ||||||
| #undef HAVE_STRINGS_H | #undef HAVE_STRINGS_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <string.h> header file. */ | /* Define to 1 if you have the <string.h> header file. */ | ||||||
| #undef HAVE_STRING_H | #undef HAVE_STRING_H | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strlcat' function. */ | /* Define to 1 if struct dirent has member d_namlen */ | ||||||
| #undef HAVE_STRLCAT | #undef HAVE_STRUCT_DIRENT_D_NAMLEN | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strlcpy' function. */ |  | ||||||
| #undef HAVE_STRLCPY |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strrchr' function. */ |  | ||||||
| #undef HAVE_STRRCHR |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strstr' function. */ |  | ||||||
| #undef HAVE_STRSTR |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `strtol' function. */ |  | ||||||
| #undef HAVE_STRTOL |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <sys/cdefs.h> header file. */ | /* Define to 1 if you have the <sys/cdefs.h> header file. */ | ||||||
| #undef HAVE_SYS_CDEFS_H | #undef HAVE_SYS_CDEFS_H | ||||||
| @@ -214,14 +154,6 @@ | |||||||
| /* Define as the return type of signal handlers (`int' or `void'). */ | /* Define as the return type of signal handlers (`int' or `void'). */ | ||||||
| #undef RETSIGTYPE | #undef RETSIGTYPE | ||||||
|  |  | ||||||
| /* If using the C implementation of alloca, define if you know the |  | ||||||
|    direction of stack growth for your system; otherwise it will be |  | ||||||
|    automatically deduced at runtime. |  | ||||||
| 	STACK_DIRECTION > 0 => grows toward higher addresses |  | ||||||
| 	STACK_DIRECTION < 0 => grows toward lower addresses |  | ||||||
| 	STACK_DIRECTION = 0 => direction of growth unknown */ |  | ||||||
| #undef STACK_DIRECTION |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the ANSI C header files. */ | /* Define to 1 if you have the ANSI C header files. */ | ||||||
| #undef STDC_HEADERS | #undef STDC_HEADERS | ||||||
|  |  | ||||||
| @@ -250,9 +182,6 @@ | |||||||
| /* Version number of package */ | /* Version number of package */ | ||||||
| #undef VERSION | #undef VERSION | ||||||
|  |  | ||||||
| /* Define to 1 if you want wide-character code */ |  | ||||||
| #undef WIDECHAR |  | ||||||
|  |  | ||||||
| /* Define to 1 if on MINIX. */ | /* Define to 1 if on MINIX. */ | ||||||
| #undef _MINIX | #undef _MINIX | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
|  |  | ||||||
| AC_PREREQ(2.61) | AC_PREREQ(2.61) | ||||||
| AC_INIT(libedit, [EL_RELEASE],, libedit-[EL_TIMESTAMP]) | AC_INIT(libedit, [EL_RELEASE],, libedit-[EL_TIMESTAMP]) | ||||||
| AC_CONFIG_SRCDIR([src/strlcat.c]) | AC_CONFIG_SRCDIR([src/el.c]) | ||||||
| AC_CONFIG_HEADER([config.h]) | AC_CONFIG_HEADER([config.h]) | ||||||
|  |  | ||||||
| # features of Posix that are extensions to C (define _GNU_SOURCE) | # features of Posix that are extensions to C (define _GNU_SOURCE) | ||||||
| @@ -38,15 +38,11 @@ AC_CHECK_LIB(curses, tgetent,, | |||||||
|       [AC_MSG_ERROR([libcurses or libncurses are required!])] )] ) |       [AC_MSG_ERROR([libcurses or libncurses are required!])] )] ) | ||||||
|  |  | ||||||
|  |  | ||||||
| ### use option --enable-widec to turn on use of wide-character support |  | ||||||
| EL_ENABLE_WIDEC |  | ||||||
|  |  | ||||||
| # Checks for header files. | # Checks for header files. | ||||||
| AC_FUNC_ALLOCA |  | ||||||
| AC_HEADER_DIRENT | AC_HEADER_DIRENT | ||||||
| AC_HEADER_STDC | AC_HEADER_STDC | ||||||
| AC_HEADER_SYS_WAIT | AC_HEADER_SYS_WAIT | ||||||
| AC_CHECK_HEADERS([fcntl.h limits.h malloc.h stdlib.h string.h sys/ioctl.h sys/param.h unistd.h curses.h ncurses.h sys/cdefs.h]) | AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h string.h sys/ioctl.h sys/param.h unistd.h curses.h ncurses.h sys/cdefs.h]) | ||||||
|  |  | ||||||
| AC_CHECK_HEADER([termios.h], [], [AC_MSG_ERROR([termios.h is required!])],[]) | AC_CHECK_HEADER([termios.h], [], [AC_MSG_ERROR([termios.h is required!])],[]) | ||||||
|  |  | ||||||
| @@ -66,7 +62,6 @@ AC_TYPE_SIZE_T | |||||||
| AC_CHECK_TYPES([u_int32_t]) | AC_CHECK_TYPES([u_int32_t]) | ||||||
|  |  | ||||||
| # Checks for library functions. | # Checks for library functions. | ||||||
| AC_FUNC_CLOSEDIR_VOID |  | ||||||
| AC_FUNC_FORK | AC_FUNC_FORK | ||||||
| AC_PROG_GCC_TRADITIONAL | AC_PROG_GCC_TRADITIONAL | ||||||
| ## _AIX is offended by rpl_malloc and rpl_realloc | ## _AIX is offended by rpl_malloc and rpl_realloc | ||||||
| @@ -74,10 +69,17 @@ AC_PROG_GCC_TRADITIONAL | |||||||
| #AC_FUNC_REALLOC | #AC_FUNC_REALLOC | ||||||
| AC_TYPE_SIGNAL | AC_TYPE_SIGNAL | ||||||
| AC_FUNC_STAT | AC_FUNC_STAT | ||||||
| AC_CHECK_FUNCS([endpwent isascii memchr memset re_comp regcomp strcasecmp strchr strcspn strdup strlcpy strlcat strerror strrchr strstr strtol issetugid wcsdup]) | AC_CHECK_FUNCS([getline isascii issetugid wcsdup]) | ||||||
| EL_GETPW_R_POSIX | EL_GETPW_R_POSIX | ||||||
| EL_GETPW_R_DRAFT | EL_GETPW_R_DRAFT | ||||||
|  |  | ||||||
|  | AC_CHECK_MEMBER(struct dirent.d_namlen, | ||||||
|  | AC_DEFINE([HAVE_STRUCT_DIRENT_D_NAMLEN],[1], | ||||||
|  | [Define to 1 if struct dirent has member d_namlen]),, | ||||||
|  | [#if HAVE_DIRENT_H | ||||||
|  | #include <dirent.h> | ||||||
|  | #endif | ||||||
|  | ]) | ||||||
|  |  | ||||||
| AH_BOTTOM([ | AH_BOTTOM([ | ||||||
| #include "sys.h" | #include "sys.h" | ||||||
|   | |||||||
| @@ -1,52 +1,38 @@ | |||||||
|  |  | ||||||
| BUILT_SOURCES = vi.h emacs.h common.h fcns.h help.h fcns.c help.c | BUILT_SOURCES = vi.h emacs.h common.h fcns.h help.h func.h | ||||||
| if WIDECHAR |  | ||||||
| BUILT_SOURCES += tokenizern.c historyn.c |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| AHDR= vi.h emacs.h common.h  | AHDR= vi.h emacs.h common.h  | ||||||
| ASRC= $(srcdir)/vi.c $(srcdir)/emacs.c $(srcdir)/common.c | ASRC= $(srcdir)/vi.c $(srcdir)/emacs.c $(srcdir)/common.c | ||||||
|  |  | ||||||
| vi.h: Makefile $(srcdir)/vi.c | vi.h: Makefile $(srcdir)/makelist $(srcdir)/vi.c | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/vi.c > $@ | 	AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/vi.c > $@ | ||||||
|  |  | ||||||
| emacs.h: Makefile $(srcdir)/emacs.c | emacs.h: Makefile $(srcdir)/makelist $(srcdir)/emacs.c | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/emacs.c > $@ | 	AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/emacs.c > $@ | ||||||
|  |  | ||||||
| common.h: Makefile $(srcdir)/common.c | common.h: Makefile $(srcdir)/makelist $(srcdir)/common.c | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/common.c > $@ | 	AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/common.c > $@ | ||||||
|  |  | ||||||
| fcns.h: Makefile $(AHDR) | fcns.h: Makefile $(srcdir)/makelist $(AHDR) | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -fh $(AHDR) > $@ | 	AWK=$(AWK) sh $(srcdir)/makelist -fh $(AHDR) > $@ | ||||||
|  |  | ||||||
| help.h: Makefile $(ASRC) | func.h: Makefile $(srcdir)/makelist $(AHDR) | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -bh $(ASRC) > $@ |  | ||||||
|  |  | ||||||
| fcns.c: Makefile $(AHDR) |  | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -fc $(AHDR) > $@ | 	AWK=$(AWK) sh $(srcdir)/makelist -fc $(AHDR) > $@ | ||||||
|  |  | ||||||
| help.c: Makefile $(ASRC) | help.h: Makefile $(srcdir)/makelist $(ASRC) | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -bc $(ASRC) > $@ | 	AWK=$(AWK) sh $(srcdir)/makelist -bh $(ASRC) > $@ | ||||||
|  |  | ||||||
| tokenizern.c: Makefile $(srcdir)/tokenizer.c |  | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -n $(srcdir)/tokenizer.c > $@ |  | ||||||
|  |  | ||||||
| historyn.c: Makefile $(srcdir)/history.c |  | ||||||
| 	AWK=$(AWK) sh $(srcdir)/makelist -n $(srcdir)/history.c > $@ |  | ||||||
|  |  | ||||||
| CLEANFILES = $(BUILT_SOURCES) | CLEANFILES = $(BUILT_SOURCES) | ||||||
|  |  | ||||||
| lib_LTLIBRARIES    = libheimedit.la | lib_LTLIBRARIES    = libheimedit.la | ||||||
| libheimedit_la_SOURCES = chared.c common.c el.c emacs.c hist.c key.c map.c chartype.c parse.c \ | libheimedit_la_SOURCES = \ | ||||||
| 							prompt.c read.c refresh.c search.c sig.c term.c tty.c vi.c \ |     chared.c chartype.c common.c el.c eln.c emacs.c filecomplete.c hist.c \ | ||||||
| 							fgetln.c strlcat.c strlcpy.c unvis.c vis.c wcsdup.c tokenizer.c \ |     history.c historyn.c keymacro.c map.c parse.c prompt.c read.c readline.c \ | ||||||
| 							history.c filecomplete.c readline.c chared.h el.h hist.h \ |     refresh.c search.c sig.c terminal.c tokenizer.c tokenizern.c tty.c \ | ||||||
| 							histedit.h key.h map.h chartype.h parse.h prompt.h read.h refresh.h \ |     unvis.c vi.c vis.c wcsdup.c \ | ||||||
| 							search.h sig.h sys.h el_term.h tty.h vis.h filecomplete.h \ |     chared.h chartype.h editline/readline.h el.h filecomplete.h \ | ||||||
| 							editline/readline.h |     histedit.h hist.h keymacro.h map.h parse.h prompt.h read.h \ | ||||||
| if WIDECHAR |     refresh.h search.h sig.h sys.h terminal.h tty.h vis.h | ||||||
| libheimedit_la_SOURCES += eln.c |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| EXTRA_DIST = makelist shlib_version | EXTRA_DIST = makelist shlib_version | ||||||
| #nobase_include_HEADERS = histedit.h editline/readline.h | #nobase_include_HEADERS = histedit.h editline/readline.h | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: chared.c,v 1.29 2010/08/28 15:44:59 christos Exp $	*/ | /*	$NetBSD: chared.c,v 1.56 2016/05/22 19:44:26 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,17 +37,20 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)chared.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)chared.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: chared.c,v 1.29 2010/08/28 15:44:59 christos Exp $"); | __RCSID("$NetBSD: chared.c,v 1.56 2016/05/22 19:44:26 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * chared.c: Character editor utilities |  * chared.c: Character editor utilities | ||||||
|  */ |  */ | ||||||
|  | #include <ctype.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include "el.h" | #include <string.h> | ||||||
|  |  | ||||||
| private void ch__clearmacro (EditLine *); | #include "el.h" | ||||||
|  | #include "common.h" | ||||||
|  | #include "fcns.h" | ||||||
|  |  | ||||||
| /* value to leave unused in line buffer */ | /* value to leave unused in line buffer */ | ||||||
| #define	EL_LEAVE	2 | #define	EL_LEAVE	2 | ||||||
| @@ -55,7 +58,7 @@ private void ch__clearmacro (EditLine *); | |||||||
| /* cv_undo(): | /* cv_undo(): | ||||||
|  *	Handle state for the vi undo command |  *	Handle state for the vi undo command | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| cv_undo(EditLine *el) | cv_undo(EditLine *el) | ||||||
| { | { | ||||||
| 	c_undo_t *vu = &el->el_chared.c_undo; | 	c_undo_t *vu = &el->el_chared.c_undo; | ||||||
| @@ -63,8 +66,8 @@ cv_undo(EditLine *el) | |||||||
| 	size_t size; | 	size_t size; | ||||||
|  |  | ||||||
| 	/* Save entire line for undo */ | 	/* Save entire line for undo */ | ||||||
| 	size = el->el_line.lastchar - el->el_line.buffer; | 	size = (size_t)(el->el_line.lastchar - el->el_line.buffer); | ||||||
| 	vu->len = size; | 	vu->len = (ssize_t)size; | ||||||
| 	vu->cursor = (int)(el->el_line.cursor - el->el_line.buffer); | 	vu->cursor = (int)(el->el_line.cursor - el->el_line.buffer); | ||||||
| 	(void)memcpy(vu->buf, el->el_line.buffer, size * sizeof(*vu->buf)); | 	(void)memcpy(vu->buf, el->el_line.buffer, size * sizeof(*vu->buf)); | ||||||
|  |  | ||||||
| @@ -79,12 +82,12 @@ cv_undo(EditLine *el) | |||||||
| /* cv_yank(): | /* cv_yank(): | ||||||
|  *	Save yank/delete data for paste |  *	Save yank/delete data for paste | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| cv_yank(EditLine *el, const Char *ptr, int size) | cv_yank(EditLine *el, const wchar_t *ptr, int size) | ||||||
| { | { | ||||||
| 	c_kill_t *k = &el->el_chared.c_kill; | 	c_kill_t *k = &el->el_chared.c_kill; | ||||||
|  |  | ||||||
| 	(void)memcpy(k->buf, ptr, size * sizeof(*k->buf)); | 	(void)memcpy(k->buf, ptr, (size_t)size * sizeof(*k->buf)); | ||||||
| 	k->last = k->buf + size; | 	k->last = k->buf + size; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -92,10 +95,10 @@ cv_yank(EditLine *el, const Char *ptr, int size) | |||||||
| /* c_insert(): | /* c_insert(): | ||||||
|  *	Insert num characters |  *	Insert num characters | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| c_insert(EditLine *el, int num) | c_insert(EditLine *el, int num) | ||||||
| { | { | ||||||
| 	Char *cp; | 	wchar_t *cp; | ||||||
|  |  | ||||||
| 	if (el->el_line.lastchar + num >= el->el_line.limit) { | 	if (el->el_line.lastchar + num >= el->el_line.limit) { | ||||||
| 		if (!ch_enlargebufs(el, (size_t)num)) | 		if (!ch_enlargebufs(el, (size_t)num)) | ||||||
| @@ -114,7 +117,7 @@ c_insert(EditLine *el, int num) | |||||||
| /* c_delafter(): | /* c_delafter(): | ||||||
|  *	Delete num characters after the cursor |  *	Delete num characters after the cursor | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| c_delafter(EditLine *el, int num) | c_delafter(EditLine *el, int num) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -127,7 +130,7 @@ c_delafter(EditLine *el, int num) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (num > 0) { | 	if (num > 0) { | ||||||
| 		Char *cp; | 		wchar_t *cp; | ||||||
|  |  | ||||||
| 		for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++) | 		for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++) | ||||||
| 			*cp = cp[num]; | 			*cp = cp[num]; | ||||||
| @@ -140,10 +143,10 @@ c_delafter(EditLine *el, int num) | |||||||
| /* c_delafter1(): | /* c_delafter1(): | ||||||
|  *	Delete the character after the cursor, do not yank |  *	Delete the character after the cursor, do not yank | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| c_delafter1(EditLine *el) | c_delafter1(EditLine *el) | ||||||
| { | { | ||||||
| 	Char *cp; | 	wchar_t *cp; | ||||||
|  |  | ||||||
| 	for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++) | 	for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++) | ||||||
| 		*cp = cp[1]; | 		*cp = cp[1]; | ||||||
| @@ -155,7 +158,7 @@ c_delafter1(EditLine *el) | |||||||
| /* c_delbefore(): | /* c_delbefore(): | ||||||
|  *	Delete num characters before the cursor |  *	Delete num characters before the cursor | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| c_delbefore(EditLine *el, int num) | c_delbefore(EditLine *el, int num) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -168,7 +171,7 @@ c_delbefore(EditLine *el, int num) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (num > 0) { | 	if (num > 0) { | ||||||
| 		Char *cp; | 		wchar_t *cp; | ||||||
|  |  | ||||||
| 		for (cp = el->el_line.cursor - num; | 		for (cp = el->el_line.cursor - num; | ||||||
| 		    cp <= el->el_line.lastchar; | 		    cp <= el->el_line.lastchar; | ||||||
| @@ -183,10 +186,10 @@ c_delbefore(EditLine *el, int num) | |||||||
| /* c_delbefore1(): | /* c_delbefore1(): | ||||||
|  *	Delete the character before the cursor, do not yank |  *	Delete the character before the cursor, do not yank | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| c_delbefore1(EditLine *el) | c_delbefore1(EditLine *el) | ||||||
| { | { | ||||||
| 	Char *cp; | 	wchar_t *cp; | ||||||
|  |  | ||||||
| 	for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++) | 	for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++) | ||||||
| 		*cp = cp[1]; | 		*cp = cp[1]; | ||||||
| @@ -198,22 +201,22 @@ c_delbefore1(EditLine *el) | |||||||
| /* ce__isword(): | /* ce__isword(): | ||||||
|  *	Return if p is part of a word according to emacs |  *	Return if p is part of a word according to emacs | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| ce__isword(Int p) | ce__isword(wint_t p) | ||||||
| { | { | ||||||
| 	return (Isalnum(p) || Strchr(STR("*?_-.[]~="), p) != NULL); | 	return iswalnum(p) || wcschr(L"*?_-.[]~=", p) != NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* cv__isword(): | /* cv__isword(): | ||||||
|  *	Return if p is part of a word according to vi |  *	Return if p is part of a word according to vi | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| cv__isword(Int p) | cv__isword(wint_t p) | ||||||
| { | { | ||||||
| 	if (Isalnum(p) || p == '_') | 	if (iswalnum(p) || p == L'_') | ||||||
| 		return 1; | 		return 1; | ||||||
| 	if (Isgraph(p)) | 	if (iswgraph(p)) | ||||||
| 		return 2; | 		return 2; | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| @@ -222,18 +225,18 @@ cv__isword(Int p) | |||||||
| /* cv__isWord(): | /* cv__isWord(): | ||||||
|  *	Return if p is part of a big word according to vi |  *	Return if p is part of a big word according to vi | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| cv__isWord(Int p) | cv__isWord(wint_t p) | ||||||
| { | { | ||||||
| 	return (!Isspace(p)); | 	return !iswspace(p); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* c__prev_word(): | /* c__prev_word(): | ||||||
|  *	Find the previous word |  *	Find the previous word | ||||||
|  */ |  */ | ||||||
| protected Char * | libedit_private wchar_t * | ||||||
| c__prev_word(Char *p, Char *low, int n, int (*wtest)(Int)) | c__prev_word(wchar_t *p, wchar_t *low, int n, int (*wtest)(wint_t)) | ||||||
| { | { | ||||||
| 	p--; | 	p--; | ||||||
|  |  | ||||||
| @@ -249,15 +252,15 @@ c__prev_word(Char *p, Char *low, int n, int (*wtest)(Int)) | |||||||
| 	if (p < low) | 	if (p < low) | ||||||
| 		p = low; | 		p = low; | ||||||
| 	/* cp now points where we want it */ | 	/* cp now points where we want it */ | ||||||
| 	return (p); | 	return p; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* c__next_word(): | /* c__next_word(): | ||||||
|  *	Find the next word |  *	Find the next word | ||||||
|  */ |  */ | ||||||
| protected Char * | libedit_private wchar_t * | ||||||
| c__next_word(Char *p, Char *high, int n, int (*wtest)(Int)) | c__next_word(wchar_t *p, wchar_t *high, int n, int (*wtest)(wint_t)) | ||||||
| { | { | ||||||
| 	while (n--) { | 	while (n--) { | ||||||
| 		while ((p < high) && !(*wtest)(*p)) | 		while ((p < high) && !(*wtest)(*p)) | ||||||
| @@ -268,14 +271,15 @@ c__next_word(Char *p, Char *high, int n, int (*wtest)(Int)) | |||||||
| 	if (p > high) | 	if (p > high) | ||||||
| 		p = high; | 		p = high; | ||||||
| 	/* p now points where we want it */ | 	/* p now points where we want it */ | ||||||
| 	return (p); | 	return p; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* cv_next_word(): | /* cv_next_word(): | ||||||
|  *	Find the next word vi style |  *	Find the next word vi style | ||||||
|  */ |  */ | ||||||
| protected Char * | libedit_private wchar_t * | ||||||
| cv_next_word(EditLine *el, Char *p, Char *high, int n, int (*wtest)(Int)) | cv_next_word(EditLine *el, wchar_t *p, wchar_t *high, int n, | ||||||
|  |     int (*wtest)(wint_t)) | ||||||
| { | { | ||||||
| 	int test; | 	int test; | ||||||
|  |  | ||||||
| @@ -288,29 +292,29 @@ cv_next_word(EditLine *el, Char *p, Char *high, int n, int (*wtest)(Int)) | |||||||
| 		 * trailing whitespace! This is not what 'w' does.. | 		 * trailing whitespace! This is not what 'w' does.. | ||||||
| 		 */ | 		 */ | ||||||
| 		if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT)) | 		if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT)) | ||||||
| 			while ((p < high) && Isspace(*p)) | 			while ((p < high) && iswspace(*p)) | ||||||
| 				p++; | 				p++; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* p now points where we want it */ | 	/* p now points where we want it */ | ||||||
| 	if (p > high) | 	if (p > high) | ||||||
| 		return (high); | 		return high; | ||||||
| 	else | 	else | ||||||
| 		return (p); | 		return p; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* cv_prev_word(): | /* cv_prev_word(): | ||||||
|  *	Find the previous word vi style |  *	Find the previous word vi style | ||||||
|  */ |  */ | ||||||
| protected Char * | libedit_private wchar_t * | ||||||
| cv_prev_word(Char *p, Char *low, int n, int (*wtest)(Int)) | cv_prev_word(wchar_t *p, wchar_t *low, int n, int (*wtest)(wint_t)) | ||||||
| { | { | ||||||
| 	int test; | 	int test; | ||||||
|  |  | ||||||
| 	p--; | 	p--; | ||||||
| 	while (n--) { | 	while (n--) { | ||||||
| 		while ((p > low) && Isspace(*p)) | 		while ((p > low) && iswspace(*p)) | ||||||
| 			p--; | 			p--; | ||||||
| 		test = (*wtest)(*p); | 		test = (*wtest)(*p); | ||||||
| 		while ((p >= low) && (*wtest)(*p) == test) | 		while ((p >= low) && (*wtest)(*p) == test) | ||||||
| @@ -320,51 +324,16 @@ cv_prev_word(Char *p, Char *low, int n, int (*wtest)(Int)) | |||||||
|  |  | ||||||
| 	/* p now points where we want it */ | 	/* p now points where we want it */ | ||||||
| 	if (p < low) | 	if (p < low) | ||||||
| 		return (low); | 		return low; | ||||||
| 	else | 	else | ||||||
| 		return (p); | 		return p; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef notdef |  | ||||||
| /* c__number(): |  | ||||||
|  *	Ignore character p points to, return number appearing after that. |  | ||||||
|  * 	A '$' by itself means a big number; "$-" is for negative; '^' means 1. |  | ||||||
|  * 	Return p pointing to last char used. |  | ||||||
|  */ |  | ||||||
| protected Char * |  | ||||||
| c__number( |  | ||||||
|     Char *p,	/* character position */ |  | ||||||
|     int *num,	/* Return value	*/ |  | ||||||
|     int dval)	/* dval is the number to subtract from like $-3 */ |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 	int sign = 1; |  | ||||||
|  |  | ||||||
| 	if (*++p == '^') { |  | ||||||
| 		*num = 1; |  | ||||||
| 		return (p); |  | ||||||
| 	} |  | ||||||
| 	if (*p == '$') { |  | ||||||
| 		if (*++p != '-') { |  | ||||||
| 			*num = 0x7fffffff;	/* Handle $ */ |  | ||||||
| 			return (--p); |  | ||||||
| 		} |  | ||||||
| 		sign = -1;			/* Handle $- */ |  | ||||||
| 		++p; |  | ||||||
| 	} |  | ||||||
|     /* XXX: this assumes ASCII compatible digits */ |  | ||||||
| 	for (i = 0; Isdigit(*p); i = 10 * i + *p++ - '0') |  | ||||||
| 		continue; |  | ||||||
| 	*num = (sign < 0 ? dval - i : i); |  | ||||||
| 	return (--p); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* cv_delfini(): | /* cv_delfini(): | ||||||
|  *	Finish vi delete action |  *	Finish vi delete action | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| cv_delfini(EditLine *el) | cv_delfini(EditLine *el) | ||||||
| { | { | ||||||
| 	int size; | 	int size; | ||||||
| @@ -399,40 +368,18 @@ cv_delfini(EditLine *el) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef notdef |  | ||||||
| /* ce__endword(): |  | ||||||
|  *	Go to the end of this word according to emacs |  | ||||||
|  */ |  | ||||||
| protected Char * |  | ||||||
| ce__endword(Char *p, Char *high, int n) |  | ||||||
| { |  | ||||||
| 	p++; |  | ||||||
|  |  | ||||||
| 	while (n--) { |  | ||||||
| 		while ((p < high) && Isspace(*p)) |  | ||||||
| 			p++; |  | ||||||
| 		while ((p < high) && !Isspace(*p)) |  | ||||||
| 			p++; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	p--; |  | ||||||
| 	return (p); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* cv__endword(): | /* cv__endword(): | ||||||
|  *	Go to the end of this word according to vi |  *	Go to the end of this word according to vi | ||||||
|  */ |  */ | ||||||
| protected Char * | libedit_private wchar_t * | ||||||
| cv__endword(Char *p, Char *high, int n, int (*wtest)(Int)) | cv__endword(wchar_t *p, wchar_t *high, int n, int (*wtest)(wint_t)) | ||||||
| { | { | ||||||
| 	int test; | 	int test; | ||||||
|  |  | ||||||
| 	p++; | 	p++; | ||||||
|  |  | ||||||
| 	while (n--) { | 	while (n--) { | ||||||
| 		while ((p < high) && Isspace(*p)) | 		while ((p < high) && iswspace(*p)) | ||||||
| 			p++; | 			p++; | ||||||
|  |  | ||||||
| 		test = (*wtest)(*p); | 		test = (*wtest)(*p); | ||||||
| @@ -440,21 +387,19 @@ cv__endword(Char *p, Char *high, int n, int (*wtest)(Int)) | |||||||
| 			p++; | 			p++; | ||||||
| 	} | 	} | ||||||
| 	p--; | 	p--; | ||||||
| 	return (p); | 	return p; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* ch_init(): | /* ch_init(): | ||||||
|  *	Initialize the character editor |  *	Initialize the character editor | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| ch_init(EditLine *el) | ch_init(EditLine *el) | ||||||
| { | { | ||||||
| 	c_macro_t *ma = &el->el_chared.c_macro; |  | ||||||
|  |  | ||||||
| 	el->el_line.buffer		= el_malloc(EL_BUFSIZ * | 	el->el_line.buffer		= el_malloc(EL_BUFSIZ * | ||||||
| 	    sizeof(*el->el_line.buffer)); | 	    sizeof(*el->el_line.buffer)); | ||||||
| 	if (el->el_line.buffer == NULL) | 	if (el->el_line.buffer == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
|  |  | ||||||
| 	(void) memset(el->el_line.buffer, 0, EL_BUFSIZ * | 	(void) memset(el->el_line.buffer, 0, EL_BUFSIZ * | ||||||
| 	    sizeof(*el->el_line.buffer)); | 	    sizeof(*el->el_line.buffer)); | ||||||
| @@ -465,7 +410,7 @@ ch_init(EditLine *el) | |||||||
| 	el->el_chared.c_undo.buf	= el_malloc(EL_BUFSIZ * | 	el->el_chared.c_undo.buf	= el_malloc(EL_BUFSIZ * | ||||||
| 	    sizeof(*el->el_chared.c_undo.buf)); | 	    sizeof(*el->el_chared.c_undo.buf)); | ||||||
| 	if (el->el_chared.c_undo.buf == NULL) | 	if (el->el_chared.c_undo.buf == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	(void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ * | 	(void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ * | ||||||
| 	    sizeof(*el->el_chared.c_undo.buf)); | 	    sizeof(*el->el_chared.c_undo.buf)); | ||||||
| 	el->el_chared.c_undo.len	= -1; | 	el->el_chared.c_undo.len	= -1; | ||||||
| @@ -473,7 +418,7 @@ ch_init(EditLine *el) | |||||||
| 	el->el_chared.c_redo.buf	= el_malloc(EL_BUFSIZ * | 	el->el_chared.c_redo.buf	= el_malloc(EL_BUFSIZ * | ||||||
| 	    sizeof(*el->el_chared.c_redo.buf)); | 	    sizeof(*el->el_chared.c_redo.buf)); | ||||||
| 	if (el->el_chared.c_redo.buf == NULL) | 	if (el->el_chared.c_redo.buf == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	el->el_chared.c_redo.pos	= el->el_chared.c_redo.buf; | 	el->el_chared.c_redo.pos	= el->el_chared.c_redo.buf; | ||||||
| 	el->el_chared.c_redo.lim	= el->el_chared.c_redo.buf + EL_BUFSIZ; | 	el->el_chared.c_redo.lim	= el->el_chared.c_redo.buf + EL_BUFSIZ; | ||||||
| 	el->el_chared.c_redo.cmd	= ED_UNASSIGNED; | 	el->el_chared.c_redo.cmd	= ED_UNASSIGNED; | ||||||
| @@ -484,13 +429,15 @@ ch_init(EditLine *el) | |||||||
| 	el->el_chared.c_kill.buf	= el_malloc(EL_BUFSIZ * | 	el->el_chared.c_kill.buf	= el_malloc(EL_BUFSIZ * | ||||||
| 	    sizeof(*el->el_chared.c_kill.buf)); | 	    sizeof(*el->el_chared.c_kill.buf)); | ||||||
| 	if (el->el_chared.c_kill.buf == NULL) | 	if (el->el_chared.c_kill.buf == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	(void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ * | 	(void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ * | ||||||
| 	    sizeof(*el->el_chared.c_kill.buf)); | 	    sizeof(*el->el_chared.c_kill.buf)); | ||||||
| 	el->el_chared.c_kill.mark	= el->el_line.buffer; | 	el->el_chared.c_kill.mark	= el->el_line.buffer; | ||||||
| 	el->el_chared.c_kill.last	= el->el_chared.c_kill.buf; | 	el->el_chared.c_kill.last	= el->el_chared.c_kill.buf; | ||||||
| 	el->el_chared.c_resizefun	= NULL; | 	el->el_chared.c_resizefun	= NULL; | ||||||
| 	el->el_chared.c_resizearg	= NULL; | 	el->el_chared.c_resizearg	= NULL; | ||||||
|  | 	el->el_chared.c_aliasfun	= NULL; | ||||||
|  | 	el->el_chared.c_aliasarg	= NULL; | ||||||
|  |  | ||||||
| 	el->el_map.current		= el->el_map.key; | 	el->el_map.current		= el->el_map.key; | ||||||
|  |  | ||||||
| @@ -500,19 +447,14 @@ ch_init(EditLine *el) | |||||||
| 	el->el_state.argument		= 1; | 	el->el_state.argument		= 1; | ||||||
| 	el->el_state.lastcmd		= ED_UNASSIGNED; | 	el->el_state.lastcmd		= ED_UNASSIGNED; | ||||||
|  |  | ||||||
| 	ma->level	= -1; | 	return 0; | ||||||
| 	ma->offset	= 0; |  | ||||||
| 	ma->macro	= el_malloc(EL_MAXMACRO * sizeof(*ma->macro)); |  | ||||||
| 	if (ma->macro == NULL) |  | ||||||
| 		return (-1); |  | ||||||
| 	return (0); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* ch_reset(): | /* ch_reset(): | ||||||
|  *	Reset the character editor |  *	Reset the character editor | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| ch_reset(EditLine *el, int mclear) | ch_reset(EditLine *el) | ||||||
| { | { | ||||||
| 	el->el_line.cursor		= el->el_line.buffer; | 	el->el_line.cursor		= el->el_line.buffer; | ||||||
| 	el->el_line.lastchar		= el->el_line.buffer; | 	el->el_line.lastchar		= el->el_line.buffer; | ||||||
| @@ -534,30 +476,19 @@ ch_reset(EditLine *el, int mclear) | |||||||
| 	el->el_state.lastcmd		= ED_UNASSIGNED; | 	el->el_state.lastcmd		= ED_UNASSIGNED; | ||||||
|  |  | ||||||
| 	el->el_history.eventno		= 0; | 	el->el_history.eventno		= 0; | ||||||
|  |  | ||||||
| 	if (mclear) |  | ||||||
| 		ch__clearmacro(el); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| private void |  | ||||||
| ch__clearmacro(EditLine *el) |  | ||||||
| { |  | ||||||
| 	c_macro_t *ma = &el->el_chared.c_macro; |  | ||||||
| 	while (ma->level >= 0) |  | ||||||
| 		el_free((ptr_t)ma->macro[ma->level--]); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* ch_enlargebufs(): | /* ch_enlargebufs(): | ||||||
|  *	Enlarge line buffer to be able to hold twice as much characters. |  *	Enlarge line buffer to be able to hold twice as much characters. | ||||||
|  *	Returns 1 if successful, 0 if not. |  *	Returns 1 if successful, 0 if not. | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| ch_enlargebufs(EditLine *el, size_t addlen) | ch_enlargebufs(EditLine *el, size_t addlen) | ||||||
| { | { | ||||||
| 	size_t sz, newsz; | 	size_t sz, newsz; | ||||||
| 	Char *newbuffer, *oldbuf, *oldkbuf; | 	wchar_t *newbuffer, *oldbuf, *oldkbuf; | ||||||
|  |  | ||||||
| 	sz = el->el_line.limit - el->el_line.buffer + EL_LEAVE; | 	sz = (size_t)(el->el_line.limit - el->el_line.buffer + EL_LEAVE); | ||||||
| 	newsz = sz * 2; | 	newsz = sz * 2; | ||||||
| 	/* | 	/* | ||||||
| 	 * If newly required length is longer than current buffer, we need | 	 * If newly required length is longer than current buffer, we need | ||||||
| @@ -589,7 +520,8 @@ ch_enlargebufs(EditLine *el, size_t addlen) | |||||||
| 	/* | 	/* | ||||||
| 	 * Reallocate kill buffer. | 	 * Reallocate kill buffer. | ||||||
| 	 */ | 	 */ | ||||||
| 	newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz * sizeof(*newbuffer)); | 	newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz * | ||||||
|  | 	    sizeof(*newbuffer)); | ||||||
| 	if (!newbuffer) | 	if (!newbuffer) | ||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
| @@ -639,53 +571,51 @@ ch_enlargebufs(EditLine *el, size_t addlen) | |||||||
| /* ch_end(): | /* ch_end(): | ||||||
|  *	Free the data structures used by the editor |  *	Free the data structures used by the editor | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| ch_end(EditLine *el) | ch_end(EditLine *el) | ||||||
| { | { | ||||||
| 	el_free((ptr_t) el->el_line.buffer); | 	el_free(el->el_line.buffer); | ||||||
| 	el->el_line.buffer = NULL; | 	el->el_line.buffer = NULL; | ||||||
| 	el->el_line.limit = NULL; | 	el->el_line.limit = NULL; | ||||||
| 	el_free((ptr_t) el->el_chared.c_undo.buf); | 	el_free(el->el_chared.c_undo.buf); | ||||||
| 	el->el_chared.c_undo.buf = NULL; | 	el->el_chared.c_undo.buf = NULL; | ||||||
| 	el_free((ptr_t) el->el_chared.c_redo.buf); | 	el_free(el->el_chared.c_redo.buf); | ||||||
| 	el->el_chared.c_redo.buf = NULL; | 	el->el_chared.c_redo.buf = NULL; | ||||||
| 	el->el_chared.c_redo.pos = NULL; | 	el->el_chared.c_redo.pos = NULL; | ||||||
| 	el->el_chared.c_redo.lim = NULL; | 	el->el_chared.c_redo.lim = NULL; | ||||||
| 	el->el_chared.c_redo.cmd = ED_UNASSIGNED; | 	el->el_chared.c_redo.cmd = ED_UNASSIGNED; | ||||||
| 	el_free((ptr_t) el->el_chared.c_kill.buf); | 	el_free(el->el_chared.c_kill.buf); | ||||||
| 	el->el_chared.c_kill.buf = NULL; | 	el->el_chared.c_kill.buf = NULL; | ||||||
| 	ch_reset(el, 1); | 	ch_reset(el); | ||||||
| 	el_free((ptr_t) el->el_chared.c_macro.macro); |  | ||||||
| 	el->el_chared.c_macro.macro = NULL; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_insertstr(): | /* el_insertstr(): | ||||||
|  *	Insert string at cursorI |  *	Insert string at cursorI | ||||||
|  */ |  */ | ||||||
| public int | int | ||||||
| FUN(el,insertstr)(EditLine *el, const Char *s) | el_winsertstr(EditLine *el, const wchar_t *s) | ||||||
| { | { | ||||||
| 	size_t len; | 	size_t len; | ||||||
|  |  | ||||||
| 	if ((len = Strlen(s)) == 0) | 	if (s == NULL || (len = wcslen(s)) == 0) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	if (el->el_line.lastchar + len >= el->el_line.limit) { | 	if (el->el_line.lastchar + len >= el->el_line.limit) { | ||||||
| 		if (!ch_enlargebufs(el, len)) | 		if (!ch_enlargebufs(el, len)) | ||||||
| 			return (-1); | 			return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	c_insert(el, (int)len); | 	c_insert(el, (int)len); | ||||||
| 	while (*s) | 	while (*s) | ||||||
| 		*el->el_line.cursor++ = *s++; | 		*el->el_line.cursor++ = *s++; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_deletestr(): | /* el_deletestr(): | ||||||
|  *	Delete num characters before the cursor |  *	Delete num characters before the cursor | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| el_deletestr(EditLine *el, int n) | el_deletestr(EditLine *el, int n) | ||||||
| { | { | ||||||
| 	if (n <= 0) | 	if (n <= 0) | ||||||
| @@ -700,19 +630,37 @@ el_deletestr(EditLine *el, int n) | |||||||
| 		el->el_line.cursor = el->el_line.buffer; | 		el->el_line.cursor = el->el_line.buffer; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* el_cursor(): | ||||||
|  |  *	Move the cursor to the left or the right of the current position | ||||||
|  |  */ | ||||||
|  | int | ||||||
|  | el_cursor(EditLine *el, int n) | ||||||
|  | { | ||||||
|  | 	if (n == 0) | ||||||
|  | 		goto out; | ||||||
|  |  | ||||||
|  | 	el->el_line.cursor += n; | ||||||
|  |  | ||||||
|  | 	if (el->el_line.cursor < el->el_line.buffer) | ||||||
|  | 		el->el_line.cursor = el->el_line.buffer; | ||||||
|  | 	if (el->el_line.cursor > el->el_line.lastchar) | ||||||
|  | 		el->el_line.cursor = el->el_line.lastchar; | ||||||
|  | out: | ||||||
|  | 	return (int)(el->el_line.cursor - el->el_line.buffer); | ||||||
|  | } | ||||||
|  |  | ||||||
| /* c_gets(): | /* c_gets(): | ||||||
|  *	Get a string |  *	Get a string | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| c_gets(EditLine *el, Char *buf, const Char *prompt) | c_gets(EditLine *el, wchar_t *buf, const wchar_t *prompt) | ||||||
| { | { | ||||||
| 	Char ch; |  | ||||||
| 	ssize_t len; | 	ssize_t len; | ||||||
| 	Char *cp = el->el_line.buffer; | 	wchar_t *cp = el->el_line.buffer, ch; | ||||||
|  |  | ||||||
| 	if (prompt) { | 	if (prompt) { | ||||||
| 		len = Strlen(prompt); | 		len = (ssize_t)wcslen(prompt); | ||||||
| 		(void)memcpy(cp, prompt, len * sizeof(*cp)); | 		(void)memcpy(cp, prompt, (size_t)len * sizeof(*cp)); | ||||||
| 		cp += len; | 		cp += len; | ||||||
| 	} | 	} | ||||||
| 	len = 0; | 	len = 0; | ||||||
| @@ -723,7 +671,7 @@ c_gets(EditLine *el, Char *buf, const Char *prompt) | |||||||
| 		el->el_line.lastchar = cp + 1; | 		el->el_line.lastchar = cp + 1; | ||||||
| 		re_refresh(el); | 		re_refresh(el); | ||||||
|  |  | ||||||
| 		if (FUN(el,getc)(el, &ch) != 1) { | 		if (el_wgetc(el, &ch) != 1) { | ||||||
| 			ed_end_of_file(el, 0); | 			ed_end_of_file(el, 0); | ||||||
| 			len = -1; | 			len = -1; | ||||||
| 			break; | 			break; | ||||||
| @@ -731,24 +679,25 @@ c_gets(EditLine *el, Char *buf, const Char *prompt) | |||||||
|  |  | ||||||
| 		switch (ch) { | 		switch (ch) { | ||||||
|  |  | ||||||
| 		case 0010:	/* Delete and backspace */ | 		case L'\b':	/* Delete and backspace */ | ||||||
| 		case 0177: | 		case 0177: | ||||||
| 			if (len == 0) { | 			if (len == 0) { | ||||||
| 				len = -1; | 				len = -1; | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
|  | 			len--; | ||||||
| 			cp--; | 			cp--; | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
| 		case 0033:	/* ESC */ | 		case 0033:	/* ESC */ | ||||||
| 		case '\r':	/* Newline */ | 		case L'\r':	/* Newline */ | ||||||
| 		case '\n': | 		case L'\n': | ||||||
| 			buf[len] = ch; | 			buf[len] = ch; | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		default: | 		default: | ||||||
| 			if (len >= EL_BUFSIZ - 16) | 			if (len >= (ssize_t)(EL_BUFSIZ - 16)) | ||||||
| 				term_beep(el); | 				terminal_beep(el); | ||||||
| 			else { | 			else { | ||||||
| 				buf[len++] = ch; | 				buf[len++] = ch; | ||||||
| 				*cp++ = ch; | 				*cp++ = ch; | ||||||
| @@ -768,16 +717,16 @@ c_gets(EditLine *el, Char *buf, const Char *prompt) | |||||||
| /* c_hpos(): | /* c_hpos(): | ||||||
|  *	Return the current horizontal position of the cursor |  *	Return the current horizontal position of the cursor | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| c_hpos(EditLine *el) | c_hpos(EditLine *el) | ||||||
| { | { | ||||||
| 	Char *ptr; | 	wchar_t *ptr; | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 	 * Find how many characters till the beginning of this line. | 	 * Find how many characters till the beginning of this line. | ||||||
| 	 */ | 	 */ | ||||||
| 	if (el->el_line.cursor == el->el_line.buffer) | 	if (el->el_line.cursor == el->el_line.buffer) | ||||||
| 		return (0); | 		return 0; | ||||||
| 	else { | 	else { | ||||||
| 		for (ptr = el->el_line.cursor - 1; | 		for (ptr = el->el_line.cursor - 1; | ||||||
| 		     ptr >= el->el_line.buffer && *ptr != '\n'; | 		     ptr >= el->el_line.buffer && *ptr != '\n'; | ||||||
| @@ -787,10 +736,18 @@ c_hpos(EditLine *el) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| protected int | libedit_private int | ||||||
| ch_resizefun(EditLine *el, el_zfunc_t f, void *a) | ch_resizefun(EditLine *el, el_zfunc_t f, void *a) | ||||||
| { | { | ||||||
| 	el->el_chared.c_resizefun = f; | 	el->el_chared.c_resizefun = f; | ||||||
| 	el->el_chared.c_resizearg = a; | 	el->el_chared.c_resizearg = a; | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | libedit_private int | ||||||
|  | ch_aliasfun(EditLine *el, el_afunc_t f, void *a) | ||||||
|  | { | ||||||
|  | 	el->el_chared.c_aliasfun = f; | ||||||
|  | 	el->el_chared.c_aliasarg = a; | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: chared.h,v 1.21 2010/08/28 15:44:59 christos Exp $	*/ | /*	$NetBSD: chared.h,v 1.30 2016/05/22 19:44:26 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -40,13 +40,6 @@ | |||||||
| #ifndef _h_el_chared | #ifndef _h_el_chared | ||||||
| #define	_h_el_chared | #define	_h_el_chared | ||||||
|  |  | ||||||
| #include <ctype.h> |  | ||||||
| #include <string.h> |  | ||||||
|  |  | ||||||
| #include "histedit.h" |  | ||||||
|  |  | ||||||
| #define	EL_MAXMACRO	10 |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * This is an issue of basic "vi" look-and-feel. Defining VI_MOVE works |  * This is an issue of basic "vi" look-and-feel. Defining VI_MOVE works | ||||||
|  * like real vi: i.e. the transition from command<->insert modes moves |  * like real vi: i.e. the transition from command<->insert modes moves | ||||||
| @@ -59,29 +52,22 @@ | |||||||
|  */ |  */ | ||||||
| #define	VI_MOVE | #define	VI_MOVE | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef struct c_macro_t { |  | ||||||
| 	int	  level; |  | ||||||
| 	int	  offset; |  | ||||||
| 	Char	**macro; |  | ||||||
| } c_macro_t; |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Undo information for vi - no undo in emacs (yet) |  * Undo information for vi - no undo in emacs (yet) | ||||||
|  */ |  */ | ||||||
| typedef struct c_undo_t { | typedef struct c_undo_t { | ||||||
| 	ssize_t	 len;			/* length of saved line */ | 	ssize_t	 len;			/* length of saved line */ | ||||||
| 	int	 cursor;		/* position of saved cursor */ | 	int	 cursor;		/* position of saved cursor */ | ||||||
| 	Char	*buf;			/* full saved text */ | 	wchar_t	*buf;			/* full saved text */ | ||||||
| } c_undo_t; | } c_undo_t; | ||||||
|  |  | ||||||
| /* redo for vi */ | /* redo for vi */ | ||||||
| typedef struct c_redo_t { | typedef struct c_redo_t { | ||||||
| 	Char	*buf;			/* redo insert key sequence */ | 	wchar_t	*buf;			/* redo insert key sequence */ | ||||||
| 	Char	*pos; | 	wchar_t	*pos; | ||||||
| 	Char	*lim; | 	wchar_t	*lim; | ||||||
| 	el_action_t	cmd;		/* command to redo */ | 	el_action_t	cmd;		/* command to redo */ | ||||||
| 	Char	ch;			/* char that invoked it */ | 	wchar_t	ch;			/* char that invoked it */ | ||||||
| 	int	count; | 	int	count; | ||||||
| 	int	action;			/* from cv_action() */ | 	int	action;			/* from cv_action() */ | ||||||
| } c_redo_t; | } c_redo_t; | ||||||
| @@ -91,19 +77,20 @@ typedef struct c_redo_t { | |||||||
|  */ |  */ | ||||||
| typedef struct c_vcmd_t { | typedef struct c_vcmd_t { | ||||||
| 	int	 action; | 	int	 action; | ||||||
| 	Char	*pos; | 	wchar_t	*pos; | ||||||
| } c_vcmd_t; | } c_vcmd_t; | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Kill buffer for emacs |  * Kill buffer for emacs | ||||||
|  */ |  */ | ||||||
| typedef struct c_kill_t { | typedef struct c_kill_t { | ||||||
| 	Char	*buf; | 	wchar_t	*buf; | ||||||
| 	Char	*last; | 	wchar_t	*last; | ||||||
| 	Char	*mark; | 	wchar_t	*mark; | ||||||
| } c_kill_t; | } c_kill_t; | ||||||
|  |  | ||||||
| typedef void (*el_zfunc_t)(EditLine *, void *); | typedef void (*el_zfunc_t)(EditLine *, void *); | ||||||
|  | typedef const char *(*el_afunc_t)(void *, const char *); | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Note that we use both data structures because the user can bind |  * Note that we use both data structures because the user can bind | ||||||
| @@ -114,9 +101,10 @@ typedef struct el_chared_t { | |||||||
| 	c_kill_t	c_kill; | 	c_kill_t	c_kill; | ||||||
| 	c_redo_t	c_redo; | 	c_redo_t	c_redo; | ||||||
| 	c_vcmd_t	c_vcmd; | 	c_vcmd_t	c_vcmd; | ||||||
| 	c_macro_t	c_macro; |  | ||||||
| 	el_zfunc_t	c_resizefun; | 	el_zfunc_t	c_resizefun; | ||||||
|  | 	el_afunc_t	c_aliasfun; | ||||||
| 	void *		c_resizearg; | 	void *		c_resizearg; | ||||||
|  | 	void *		c_aliasarg; | ||||||
| } el_chared_t; | } el_chared_t; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -136,36 +124,32 @@ typedef struct el_chared_t { | |||||||
| #define	MODE_REPLACE	1 | #define	MODE_REPLACE	1 | ||||||
| #define	MODE_REPLACE_1	2 | #define	MODE_REPLACE_1	2 | ||||||
|  |  | ||||||
| #include "common.h" |  | ||||||
| #include "vi.h" |  | ||||||
| #include "emacs.h" |  | ||||||
| #include "search.h" |  | ||||||
| #include "fcns.h" |  | ||||||
|  |  | ||||||
|  | libedit_private int	 cv__isword(wint_t); | ||||||
|  | libedit_private int	 cv__isWord(wint_t); | ||||||
|  | libedit_private void	 cv_delfini(EditLine *); | ||||||
|  | libedit_private wchar_t *cv__endword(wchar_t *, wchar_t *, int, int (*)(wint_t)); | ||||||
|  | libedit_private int	 ce__isword(wint_t); | ||||||
|  | libedit_private void	 cv_undo(EditLine *); | ||||||
|  | libedit_private void	 cv_yank(EditLine *, const wchar_t *, int); | ||||||
|  | libedit_private wchar_t *cv_next_word(EditLine*, wchar_t *, wchar_t *, int, | ||||||
|  | 			int (*)(wint_t)); | ||||||
|  | libedit_private wchar_t *cv_prev_word(wchar_t *, wchar_t *, int, int (*)(wint_t)); | ||||||
|  | libedit_private wchar_t *c__next_word(wchar_t *, wchar_t *, int, int (*)(wint_t)); | ||||||
|  | libedit_private wchar_t *c__prev_word(wchar_t *, wchar_t *, int, int (*)(wint_t)); | ||||||
|  | libedit_private void	 c_insert(EditLine *, int); | ||||||
|  | libedit_private void	 c_delbefore(EditLine *, int); | ||||||
|  | libedit_private void	 c_delbefore1(EditLine *); | ||||||
|  | libedit_private void	 c_delafter(EditLine *, int); | ||||||
|  | libedit_private void	 c_delafter1(EditLine *); | ||||||
|  | libedit_private int	 c_gets(EditLine *, wchar_t *, const wchar_t *); | ||||||
|  | libedit_private int	 c_hpos(EditLine *); | ||||||
|  |  | ||||||
| protected int	 cv__isword(Int); | libedit_private int	 ch_init(EditLine *); | ||||||
| protected int	 cv__isWord(Int); | libedit_private void	 ch_reset(EditLine *); | ||||||
| protected void	 cv_delfini(EditLine *); | libedit_private int	 ch_resizefun(EditLine *, el_zfunc_t, void *); | ||||||
| protected Char	*cv__endword(Char *, Char *, int, int (*)(Int)); | libedit_private int	 ch_aliasfun(EditLine *, el_afunc_t, void *); | ||||||
| protected int	 ce__isword(Int); | libedit_private int	 ch_enlargebufs(EditLine *, size_t); | ||||||
| protected void	 cv_undo(EditLine *); | libedit_private void	 ch_end(EditLine *); | ||||||
| protected void	 cv_yank(EditLine *, const Char *, int); |  | ||||||
| protected Char	*cv_next_word(EditLine*, Char *, Char *, int, int (*)(Int)); |  | ||||||
| protected Char	*cv_prev_word(Char *, Char *, int, int (*)(Int)); |  | ||||||
| protected Char	*c__next_word(Char *, Char *, int, int (*)(Int)); |  | ||||||
| protected Char	*c__prev_word(Char *, Char *, int, int (*)(Int)); |  | ||||||
| protected void	 c_insert(EditLine *, int); |  | ||||||
| protected void	 c_delbefore(EditLine *, int); |  | ||||||
| protected void	 c_delbefore1(EditLine *); |  | ||||||
| protected void	 c_delafter(EditLine *, int); |  | ||||||
| protected void	 c_delafter1(EditLine *); |  | ||||||
| protected int	 c_gets(EditLine *, Char *, const Char *); |  | ||||||
| protected int	 c_hpos(EditLine *); |  | ||||||
|  |  | ||||||
| protected int	 ch_init(EditLine *); |  | ||||||
| protected void	 ch_reset(EditLine *, int); |  | ||||||
| protected int	 ch_resizefun(EditLine *, el_zfunc_t, void *); |  | ||||||
| protected int	 ch_enlargebufs(EditLine *, size_t); |  | ||||||
| protected void	 ch_end(EditLine *); |  | ||||||
|  |  | ||||||
| #endif /* _h_el_chared */ | #endif /* _h_el_chared */ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: chartype.c,v 1.4 2010/04/15 00:55:57 christos Exp $	*/ | /*	$NetBSD: chartype.c,v 1.30 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 2009 The NetBSD Foundation, Inc. |  * Copyright (c) 2009 The NetBSD Foundation, Inc. | ||||||
| @@ -12,13 +12,6 @@ | |||||||
|  * 2. Redistributions in binary form must reproduce the above copyright |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  *    notice, this list of conditions and the following disclaimer in the |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  *    documentation and/or other materials provided with the distribution. |  *    documentation and/or other materials provided with the distribution. | ||||||
|  * 3. All advertising materials mentioning features or use of this software |  | ||||||
|  *    must display the following acknowledgement: |  | ||||||
|  *        This product includes software developed by the NetBSD |  | ||||||
|  *        Foundation, Inc. and its contributors. |  | ||||||
|  * 4. Neither the name of The NetBSD Foundation nor the names of its |  | ||||||
|  *    contributors may be used to endorse or promote products derived |  | ||||||
|  *    from this software without specific prior written permission. |  | ||||||
|  * |  * | ||||||
|  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | ||||||
|  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||||||
| @@ -38,122 +31,132 @@ | |||||||
|  */ |  */ | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #if !defined(lint) && !defined(SCCSID) | #if !defined(lint) && !defined(SCCSID) | ||||||
| __RCSID("$NetBSD: chartype.c,v 1.4 2010/04/15 00:55:57 christos Exp $"); | __RCSID("$NetBSD: chartype.c,v 1.30 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
| #include "el.h" |  | ||||||
|  | #include <ctype.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| #define CT_BUFSIZ 1024 | #include "el.h" | ||||||
|  |  | ||||||
| #ifdef WIDECHAR | #define CT_BUFSIZ ((size_t)1024) | ||||||
| protected void |  | ||||||
| ct_conv_buff_resize(ct_buffer_t *conv, size_t mincsize, size_t minwsize) | static int ct_conv_cbuff_resize(ct_buffer_t *, size_t); | ||||||
|  | static int ct_conv_wbuff_resize(ct_buffer_t *, size_t); | ||||||
|  |  | ||||||
|  | static int | ||||||
|  | ct_conv_cbuff_resize(ct_buffer_t *conv, size_t csize) | ||||||
| { | { | ||||||
| 	void *p; | 	void *p; | ||||||
| 	if (mincsize > conv->csize) { |  | ||||||
| 		conv->csize = mincsize; | 	if (csize <= conv->csize) | ||||||
| 		p = el_realloc(conv->cbuff, conv->csize); | 		return 0; | ||||||
|  |  | ||||||
|  | 	conv->csize = csize; | ||||||
|  |  | ||||||
|  | 	p = el_realloc(conv->cbuff, conv->csize * sizeof(*conv->cbuff)); | ||||||
| 	if (p == NULL) { | 	if (p == NULL) { | ||||||
| 		conv->csize = 0; | 		conv->csize = 0; | ||||||
| 		el_free(conv->cbuff); | 		el_free(conv->cbuff); | ||||||
| 		conv->cbuff = NULL; | 		conv->cbuff = NULL; | ||||||
| 		} else | 		return -1; | ||||||
| 			conv->cbuff = p; |  | ||||||
| 	} | 	} | ||||||
|  | 	conv->cbuff = p; | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| 	if (minwsize > conv->wsize) { | static int | ||||||
| 		conv->wsize = minwsize; | ct_conv_wbuff_resize(ct_buffer_t *conv, size_t wsize) | ||||||
| 		p = el_realloc(conv->wbuff, conv->wsize); | { | ||||||
|  | 	void *p; | ||||||
|  |  | ||||||
|  | 	if (wsize <= conv->wsize) | ||||||
|  | 		return 0; | ||||||
|  |  | ||||||
|  | 	conv->wsize = wsize; | ||||||
|  |  | ||||||
|  | 	p = el_realloc(conv->wbuff, conv->wsize * sizeof(*conv->wbuff)); | ||||||
| 	if (p == NULL) { | 	if (p == NULL) { | ||||||
| 		conv->wsize = 0; | 		conv->wsize = 0; | ||||||
| 		el_free(conv->wbuff); | 		el_free(conv->wbuff); | ||||||
| 		conv->wbuff = NULL; | 		conv->wbuff = NULL; | ||||||
| 		} else | 		return -1; | ||||||
| 			conv->wbuff = p; |  | ||||||
| 	} | 	} | ||||||
|  | 	conv->wbuff = p; | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| public char * | char * | ||||||
| ct_encode_string(const Char *s, ct_buffer_t *conv) | ct_encode_string(const wchar_t *s, ct_buffer_t *conv) | ||||||
| { | { | ||||||
| 	char *dst; | 	char *dst; | ||||||
| 	ssize_t used = 0; | 	ssize_t used; | ||||||
|  |  | ||||||
| 	if (!s) | 	if (!s) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	if (!conv->cbuff) |  | ||||||
| 		ct_conv_buff_resize(conv, CT_BUFSIZ, 0); |  | ||||||
| 	if (!conv->cbuff) |  | ||||||
| 		return NULL; |  | ||||||
|  |  | ||||||
| 	dst = conv->cbuff; | 	dst = conv->cbuff; | ||||||
| 	while (*s) { | 	for (;;) { | ||||||
| 		used = ct_encode_char(dst, (int)(conv->csize - | 		used = (ssize_t)(dst - conv->cbuff); | ||||||
| 		    (dst - conv->cbuff)), *s); | 		if ((conv->csize - (size_t)used) < 5) { | ||||||
| 		if (used == -1) { /* failed to encode, need more buffer space */ | 			if (ct_conv_cbuff_resize(conv, | ||||||
| 			used = dst - conv->cbuff; | 			    conv->csize + CT_BUFSIZ) == -1) | ||||||
| 			ct_conv_buff_resize(conv, conv->csize + CT_BUFSIZ, 0); |  | ||||||
| 			if (!conv->cbuff) |  | ||||||
| 				return NULL; | 				return NULL; | ||||||
| 			dst = conv->cbuff + used; | 			dst = conv->cbuff + used; | ||||||
| 			/* don't increment s here - we want to retry it! */ |  | ||||||
| 		} | 		} | ||||||
| 		else | 		if (!*s) | ||||||
|  | 			break; | ||||||
|  | 		used = ct_encode_char(dst, (size_t)5, *s); | ||||||
|  | 		if (used == -1) /* failed to encode, need more buffer space */ | ||||||
|  | 			abort(); | ||||||
| 		++s; | 		++s; | ||||||
| 		dst += used; | 		dst += used; | ||||||
| 	} | 	} | ||||||
| 	if (dst >= (conv->cbuff + conv->csize)) { |  | ||||||
| 		used = dst - conv->cbuff; |  | ||||||
| 		ct_conv_buff_resize(conv, conv->csize + 1, 0); |  | ||||||
| 		if (!conv->cbuff) |  | ||||||
| 			return NULL; |  | ||||||
| 		dst = conv->cbuff + used; |  | ||||||
| 	} |  | ||||||
| 	*dst = '\0'; | 	*dst = '\0'; | ||||||
| 	return conv->cbuff; | 	return conv->cbuff; | ||||||
| } | } | ||||||
|  |  | ||||||
| public Char * | wchar_t * | ||||||
| ct_decode_string(const char *s, ct_buffer_t *conv) | ct_decode_string(const char *s, ct_buffer_t *conv) | ||||||
| { | { | ||||||
| 	size_t len = 0; | 	size_t len; | ||||||
|  |  | ||||||
| 	if (!s) | 	if (!s) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	if (!conv->wbuff) |  | ||||||
| 		ct_conv_buff_resize(conv, 0, CT_BUFSIZ); | 	len = mbstowcs(NULL, s, (size_t)0); | ||||||
| 	if (!conv->wbuff) | 	if (len == (size_t)-1) | ||||||
| 		return NULL; | 		return NULL; | ||||||
|  |  | ||||||
| 	len = ct_mbstowcs(0, s, 0); | 	if (conv->wsize < ++len) | ||||||
| 	if (len > conv->wsize) | 		if (ct_conv_wbuff_resize(conv, len + CT_BUFSIZ) == -1) | ||||||
| 		ct_conv_buff_resize(conv, 0, len + 1); |  | ||||||
| 	if (!conv->wbuff) |  | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 	ct_mbstowcs(conv->wbuff, s, conv->wsize); |  | ||||||
|  | 	mbstowcs(conv->wbuff, s, conv->wsize); | ||||||
| 	return conv->wbuff; | 	return conv->wbuff; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| protected Char ** | libedit_private wchar_t ** | ||||||
| ct_decode_argv(int argc, const char *argv[], ct_buffer_t *conv) | ct_decode_argv(int argc, const char *argv[], ct_buffer_t *conv) | ||||||
| { | { | ||||||
| 	size_t bufspace; | 	size_t bufspace; | ||||||
| 	int i; | 	int i; | ||||||
| 	Char *p; | 	wchar_t *p; | ||||||
| 	Char **wargv; | 	wchar_t **wargv; | ||||||
| 	ssize_t bytes; | 	ssize_t bytes; | ||||||
|  |  | ||||||
| 	/* Make sure we have enough space in the conversion buffer to store all | 	/* Make sure we have enough space in the conversion buffer to store all | ||||||
| 	 * the argv strings. */ | 	 * the argv strings. */ | ||||||
| 	for (i = 0, bufspace = 0; i < argc; ++i) | 	for (i = 0, bufspace = 0; i < argc; ++i) | ||||||
| 		bufspace += argv[i] ? strlen(argv[i]) + 1 : 0; | 		bufspace += argv[i] ? strlen(argv[i]) + 1 : 0; | ||||||
| 	ct_conv_buff_resize(conv, 0, bufspace); | 	if (conv->wsize < ++bufspace) | ||||||
| 	if (!conv->wsize) | 		if (ct_conv_wbuff_resize(conv, bufspace + CT_BUFSIZ) == -1) | ||||||
| 			return NULL; | 			return NULL; | ||||||
|  |  | ||||||
| 	wargv = el_malloc(argc * sizeof(*wargv)); | 	wargv = el_malloc((size_t)argc * sizeof(*wargv)); | ||||||
|  |  | ||||||
| 	for (i = 0, p = conv->wbuff; i < argc; ++i) { | 	for (i = 0, p = conv->wbuff; i < argc; ++i) { | ||||||
| 		if (!argv[i]) {   /* don't pass null pointers to mbstowcs */ | 		if (!argv[i]) {   /* don't pass null pointers to mbstowcs */ | ||||||
| @@ -161,14 +164,14 @@ ct_decode_argv(int argc, const char *argv[], ct_buffer_t *conv) | |||||||
| 			continue; | 			continue; | ||||||
| 		} else { | 		} else { | ||||||
| 			wargv[i] = p; | 			wargv[i] = p; | ||||||
| 			bytes = mbstowcs(p, argv[i], bufspace); | 			bytes = (ssize_t)mbstowcs(p, argv[i], bufspace); | ||||||
| 		} | 		} | ||||||
| 		if (bytes == -1) { | 		if (bytes == -1) { | ||||||
| 			el_free(wargv); | 			el_free(wargv); | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 		} else | 		} else | ||||||
| 			bytes++;  /* include '\0' in the count */ | 			bytes++;  /* include '\0' in the count */ | ||||||
| 		bufspace -= bytes; | 		bufspace -= (size_t)bytes; | ||||||
| 		p += bytes; | 		p += bytes; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -176,8 +179,8 @@ ct_decode_argv(int argc, const char *argv[], ct_buffer_t *conv) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| protected size_t | libedit_private size_t | ||||||
| ct_enc_width(Char c) | ct_enc_width(wchar_t c) | ||||||
| { | { | ||||||
| 	/* UTF-8 encoding specific values */ | 	/* UTF-8 encoding specific values */ | ||||||
| 	if (c < 0x80) | 	if (c < 0x80) | ||||||
| @@ -192,74 +195,66 @@ ct_enc_width(Char c) | |||||||
| 		return 0; /* not a valid codepoint */ | 		return 0; /* not a valid codepoint */ | ||||||
| } | } | ||||||
|  |  | ||||||
| protected ssize_t | libedit_private ssize_t | ||||||
| ct_encode_char(char *dst, size_t len, Char c) | ct_encode_char(char *dst, size_t len, wchar_t c) | ||||||
| { | { | ||||||
| 	ssize_t l = 0; | 	ssize_t l = 0; | ||||||
| 	if (len < ct_enc_width(c)) | 	if (len < ct_enc_width(c)) | ||||||
| 		return -1; | 		return -1; | ||||||
| 	l = ct_wctomb(dst, c); | 	l = wctomb(dst, c); | ||||||
|  |  | ||||||
| 	if (l < 0) { | 	if (l < 0) { | ||||||
| 		ct_wctomb_reset; | 		wctomb(NULL, L'\0'); | ||||||
| 		l = 0; | 		l = 0; | ||||||
| 	} | 	} | ||||||
| 	return l; | 	return l; | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| protected const Char * | libedit_private const wchar_t * | ||||||
| ct_visual_string(const Char *s) | ct_visual_string(const wchar_t *s, ct_buffer_t *conv) | ||||||
| { | { | ||||||
| 	static Char *buff = NULL; | 	wchar_t *dst; | ||||||
| 	static size_t buffsize = 0; | 	ssize_t used; | ||||||
| 	void *p; |  | ||||||
| 	Char *dst; |  | ||||||
| 	ssize_t used = 0; |  | ||||||
|  |  | ||||||
| 	if (!s) | 	if (!s) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	if (!buff) { |  | ||||||
| 	    buffsize = CT_BUFSIZ; | 	if (ct_conv_wbuff_resize(conv, CT_BUFSIZ) == -1) | ||||||
| 	    buff = el_malloc(buffsize * sizeof(*buff)); | 		return NULL; | ||||||
| 	} |  | ||||||
| 	dst = buff; | 	used = 0; | ||||||
|  | 	dst = conv->wbuff; | ||||||
| 	while (*s) { | 	while (*s) { | ||||||
| 		used = ct_visual_char(dst, buffsize - (dst - buff), *s); | 		used = ct_visual_char(dst, | ||||||
| 		if (used == -1) { /* failed to encode, need more buffer space */ | 		    conv->wsize - (size_t)(dst - conv->wbuff), *s); | ||||||
| 			used = dst - buff; | 		if (used != -1) { | ||||||
| 			buffsize += CT_BUFSIZ; |  | ||||||
| 			p = el_realloc(buff, buffsize * sizeof(*buff)); |  | ||||||
| 			if (p == NULL) |  | ||||||
| 				goto out; |  | ||||||
| 			buff = p; |  | ||||||
| 			dst = buff + used; |  | ||||||
| 			/* don't increment s here - we want to retry it! */ |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 			++s; | 			++s; | ||||||
| 			dst += used; | 			dst += used; | ||||||
|  | 			continue; | ||||||
| 		} | 		} | ||||||
| 	if (dst >= (buff + buffsize)) { /* sigh */ |  | ||||||
| 		buffsize += 1; | 		/* failed to encode, need more buffer space */ | ||||||
| 		p = el_realloc(buff, buffsize * sizeof(*buff)); | 		used = dst - conv->wbuff; | ||||||
| 		if (p == NULL) | 		if (ct_conv_wbuff_resize(conv, conv->wsize + CT_BUFSIZ) == -1) | ||||||
| 			goto out; |  | ||||||
| 		buff = p; |  | ||||||
| 		dst = buff + buffsize - 1; |  | ||||||
| 	} |  | ||||||
| 	*dst = 0; |  | ||||||
| 	return buff; |  | ||||||
| out: |  | ||||||
| 	el_free(buff); |  | ||||||
| 	buffsize = 0; |  | ||||||
| 			return NULL; | 			return NULL; | ||||||
|  | 		dst = conv->wbuff + used; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (dst >= (conv->wbuff + conv->wsize)) { /* sigh */ | ||||||
|  | 		used = dst - conv->wbuff; | ||||||
|  | 		if (ct_conv_wbuff_resize(conv, conv->wsize + CT_BUFSIZ) == -1) | ||||||
|  | 			return NULL; | ||||||
|  | 		dst = conv->wbuff + used; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	*dst = L'\0'; | ||||||
|  | 	return conv->wbuff; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| protected int | libedit_private int | ||||||
| ct_visual_width(Char c) | ct_visual_width(wchar_t c) | ||||||
| { | { | ||||||
| 	int t = ct_chr_class(c); | 	int t = ct_chr_class(c); | ||||||
| 	switch (t) { | 	switch (t) { | ||||||
| @@ -269,7 +264,6 @@ ct_visual_width(Char c) | |||||||
| 		return 1; /* Hmm, this really need to be handled outside! */ | 		return 1; /* Hmm, this really need to be handled outside! */ | ||||||
| 	case CHTYPE_NL: | 	case CHTYPE_NL: | ||||||
| 		return 0; /* Should this be 1 instead? */ | 		return 0; /* Should this be 1 instead? */ | ||||||
| #ifdef WIDECHAR |  | ||||||
| 	case CHTYPE_PRINT: | 	case CHTYPE_PRINT: | ||||||
| 		return wcwidth(c); | 		return wcwidth(c); | ||||||
| 	case CHTYPE_NONPRINT: | 	case CHTYPE_NONPRINT: | ||||||
| @@ -277,20 +271,14 @@ ct_visual_width(Char c) | |||||||
| 			return 8; /* \U+12345 */ | 			return 8; /* \U+12345 */ | ||||||
| 		else | 		else | ||||||
| 			return 7; /* \U+1234 */ | 			return 7; /* \U+1234 */ | ||||||
| #else |  | ||||||
| 	case CHTYPE_PRINT: |  | ||||||
| 		return 1; |  | ||||||
| 	case CHTYPE_NONPRINT: |  | ||||||
| 		return 4; /* \123 */ |  | ||||||
| #endif |  | ||||||
| 	default: | 	default: | ||||||
| 		return 0; /* should not happen */ | 		return 0; /* should not happen */ | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| protected ssize_t | libedit_private ssize_t | ||||||
| ct_visual_char(Char *dst, size_t len, Char c) | ct_visual_char(wchar_t *dst, size_t len, wchar_t c) | ||||||
| { | { | ||||||
| 	int t = ct_chr_class(c); | 	int t = ct_chr_class(c); | ||||||
| 	switch (t) { | 	switch (t) { | ||||||
| @@ -315,7 +303,6 @@ ct_visual_char(Char *dst, size_t len, Char c) | |||||||
| 		 * so this is right */ | 		 * so this is right */ | ||||||
| 		if ((ssize_t)len < ct_visual_width(c)) | 		if ((ssize_t)len < ct_visual_width(c)) | ||||||
| 			return -1;   /* insufficient space */ | 			return -1;   /* insufficient space */ | ||||||
| #ifdef WIDECHAR |  | ||||||
| 		*dst++ = '\\'; | 		*dst++ = '\\'; | ||||||
| 		*dst++ = 'U'; | 		*dst++ = 'U'; | ||||||
| 		*dst++ = '+'; | 		*dst++ = '+'; | ||||||
| @@ -326,14 +313,7 @@ ct_visual_char(Char *dst, size_t len, Char c) | |||||||
| 		*dst++ = tohexdigit(((unsigned int) c >>  8) & 0xf); | 		*dst++ = tohexdigit(((unsigned int) c >>  8) & 0xf); | ||||||
| 		*dst++ = tohexdigit(((unsigned int) c >>  4) & 0xf); | 		*dst++ = tohexdigit(((unsigned int) c >>  4) & 0xf); | ||||||
| 		*dst   = tohexdigit(((unsigned int) c      ) & 0xf); | 		*dst   = tohexdigit(((unsigned int) c      ) & 0xf); | ||||||
| 		return (c > 0xffff) ? 8 : 7; | 		return c > 0xffff ? 8 : 7; | ||||||
| #else |  | ||||||
| 		*dst++ = '\\'; |  | ||||||
| #define tooctaldigit(v) ((v) + '0') |  | ||||||
| 		*dst++ = tooctaldigit(((unsigned int) c >> 6) & 0x7); |  | ||||||
| 		*dst++ = tooctaldigit(((unsigned int) c >> 3) & 0x7); |  | ||||||
| 		*dst++ = tooctaldigit(((unsigned int) c     ) & 0x7); |  | ||||||
| #endif |  | ||||||
| 		/*FALLTHROUGH*/ | 		/*FALLTHROUGH*/ | ||||||
| 	/* these two should be handled outside this function */ | 	/* these two should be handled outside this function */ | ||||||
| 	default:            /* we should never hit the default */ | 	default:            /* we should never hit the default */ | ||||||
| @@ -344,16 +324,16 @@ ct_visual_char(Char *dst, size_t len, Char c) | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| protected int | libedit_private int | ||||||
| ct_chr_class(Char c) | ct_chr_class(wchar_t c) | ||||||
| { | { | ||||||
| 	if (c == '\t') | 	if (c == '\t') | ||||||
| 		return CHTYPE_TAB; | 		return CHTYPE_TAB; | ||||||
| 	else if (c == '\n') | 	else if (c == '\n') | ||||||
| 		return CHTYPE_NL; | 		return CHTYPE_NL; | ||||||
| 	else if (IsASCII(c) && Iscntrl(c)) | 	else if (c < 0x100 && iswcntrl(c)) | ||||||
| 		return CHTYPE_ASCIICTL; | 		return CHTYPE_ASCIICTL; | ||||||
| 	else if (Isprint(c)) | 	else if (iswprint(c)) | ||||||
| 		return CHTYPE_PRINT; | 		return CHTYPE_PRINT; | ||||||
| 	else | 	else | ||||||
| 		return CHTYPE_NONPRINT; | 		return CHTYPE_NONPRINT; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: chartype.h,v 1.7 2010/12/16 17:42:28 wiz Exp $	*/ | /*	$NetBSD: chartype.h,v 1.34 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 2009 The NetBSD Foundation, Inc. |  * Copyright (c) 2009 The NetBSD Foundation, Inc. | ||||||
| @@ -12,13 +12,6 @@ | |||||||
|  * 2. Redistributions in binary form must reproduce the above copyright |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  *    notice, this list of conditions and the following disclaimer in the |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  *    documentation and/or other materials provided with the distribution. |  *    documentation and/or other materials provided with the distribution. | ||||||
|  * 3. All advertising materials mentioning features or use of this software |  | ||||||
|  *    must display the following acknowledgement: |  | ||||||
|  *        This product includes software developed by the NetBSD |  | ||||||
|  *        Foundation, Inc. and its contributors. |  | ||||||
|  * 4. Neither the name of The NetBSD Foundation nor the names of its |  | ||||||
|  *    contributors may be used to endorse or promote products derived |  | ||||||
|  *    from this software without specific prior written permission. |  | ||||||
|  * |  * | ||||||
|  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | ||||||
|  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||||||
| @@ -36,15 +29,11 @@ | |||||||
| #ifndef _h_chartype_f | #ifndef _h_chartype_f | ||||||
| #define _h_chartype_f | #define _h_chartype_f | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef WIDECHAR |  | ||||||
|  |  | ||||||
| /* Ideally we should also test the value of the define to see if it | /* Ideally we should also test the value of the define to see if it | ||||||
|  * supports non-BMP code points without requiring UTF-16, but nothing |  * supports non-BMP code points without requiring UTF-16, but nothing | ||||||
|  * seems to actually advertise this properly, despite Unicode 3.1 having |  * seems to actually advertise this properly, despite Unicode 3.1 having | ||||||
|  * been around since 2001... */ |  * been around since 2001... */ | ||||||
| #if !defined(__NetBSD__) && !defined(__sun) && !(defined(__APPLE__) && defined(__MACH__)) | #if !defined(__NetBSD__) && !defined(__sun) && !(defined(__APPLE__) && defined(__MACH__)) && !defined(__OpenBSD__) && !defined(__FreeBSD__) | ||||||
| #ifndef __STDC_ISO_10646__ | #ifndef __STDC_ISO_10646__ | ||||||
| /* In many places it is assumed that the first 127 code points are ASCII | /* In many places it is assumed that the first 127 code points are ASCII | ||||||
|  * compatible, so ensure wchar_t indeed does ISO 10646 and not some other |  * compatible, so ensure wchar_t indeed does ISO 10646 and not some other | ||||||
| @@ -60,175 +49,53 @@ | |||||||
| #warning Build environment does not support non-BMP characters | #warning Build environment does not support non-BMP characters | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef HAVE_WCSDUP |  | ||||||
| wchar_t *wcsdup(const wchar_t *s); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #define ct_mbtowc            mbtowc |  | ||||||
| #define ct_mbtowc_reset      mbtowc(0,0,0) |  | ||||||
| #define ct_wctomb            wctomb |  | ||||||
| #define ct_wctomb_reset      wctomb(0,0) |  | ||||||
| #define ct_wcstombs          wcstombs |  | ||||||
| #define ct_mbstowcs          mbstowcs |  | ||||||
|  |  | ||||||
| #define Char			wchar_t |  | ||||||
| #define Int			wint_t |  | ||||||
| #define FUN(prefix,rest)	prefix ## _w ## rest |  | ||||||
| #define FUNW(type)		type ## _w |  | ||||||
| #define TYPE(type)		type ## W |  | ||||||
| #define FSTR			"%ls" |  | ||||||
| #define STR(x) 			L ## x |  | ||||||
| #define UC(c)			c |  | ||||||
| #define Isalpha(x)  iswalpha(x) |  | ||||||
| #define Isalnum(x)  iswalnum(x) |  | ||||||
| #define Isgraph(x)  iswgraph(x) |  | ||||||
| #define Isspace(x)  iswspace(x) |  | ||||||
| #define Isdigit(x)  iswdigit(x) |  | ||||||
| #define Iscntrl(x)  iswcntrl(x) |  | ||||||
| #define Isprint(x)  iswprint(x) |  | ||||||
|  |  | ||||||
| #define Isupper(x)  iswupper(x) |  | ||||||
| #define Islower(x)  iswlower(x) |  | ||||||
| #define Toupper(x)  towupper(x) |  | ||||||
| #define Tolower(x)  towlower(x) |  | ||||||
|  |  | ||||||
| #define IsASCII(x)  (x < 0x100) |  | ||||||
|  |  | ||||||
| #define Strlen(x)       wcslen(x) |  | ||||||
| #define Strchr(s,c)     wcschr(s,c) |  | ||||||
| #define Strrchr(s,c)    wcsrchr(s,c) |  | ||||||
| #define Strstr(s,v)     wcsstr(s,v) |  | ||||||
| #define Strdup(x)       wcsdup(x) |  | ||||||
| #define Strcpy(d,s)     wcscpy(d,s) |  | ||||||
| #define Strncpy(d,s,n)  wcsncpy(d,s,n) |  | ||||||
| #define Strncat(d,s,n)  wcsncat(d,s,n) |  | ||||||
|  |  | ||||||
| #define Strcmp(s,v)     wcscmp(s,v) |  | ||||||
| #define Strncmp(s,v,n)  wcsncmp(s,v,n) |  | ||||||
| #define Strcspn(s,r)    wcscspn(s,r) |  | ||||||
|  |  | ||||||
| #define Strtol(p,e,b)   wcstol(p,e,b) |  | ||||||
|  |  | ||||||
| #define Width(c)	wcwidth(c) |  | ||||||
|  |  | ||||||
| #else /* NARROW */ |  | ||||||
|  |  | ||||||
| #define ct_mbtowc            error |  | ||||||
| #define ct_mbtowc_reset |  | ||||||
| #define ct_wctomb            error |  | ||||||
| #define ct_wctomb_reset |  | ||||||
| #define ct_wcstombs(a, b, c)    (strncpy(a, b, c), strlen(a)) |  | ||||||
| #define ct_mbstowcs(a, b, c)    (strncpy(a, b, c), strlen(a)) |  | ||||||
|  |  | ||||||
| #define Char			char |  | ||||||
| #define Int			int |  | ||||||
| #define FUN(prefix,rest)	prefix ## _ ## rest |  | ||||||
| #define FUNW(type)		type |  | ||||||
| #define TYPE(type)		type |  | ||||||
| #define FSTR			"%s" |  | ||||||
| #define STR(x) 			x |  | ||||||
| #define UC(c)			(unsigned char)(c) |  | ||||||
|  |  | ||||||
| #define Isalpha(x)  isalpha((unsigned char)x) |  | ||||||
| #define Isalnum(x)  isalnum((unsigned char)x) |  | ||||||
| #define Isgraph(x)  isgraph((unsigned char)x) |  | ||||||
| #define Isspace(x)  isspace((unsigned char)x) |  | ||||||
| #define Isdigit(x)  isdigit((unsigned char)x) |  | ||||||
| #define Iscntrl(x)  iscntrl((unsigned char)x) |  | ||||||
| #define Isprint(x)  isprint((unsigned char)x) |  | ||||||
|  |  | ||||||
| #define Isupper(x)  isupper((unsigned char)x) |  | ||||||
| #define Islower(x)  islower((unsigned char)x) |  | ||||||
| #define Toupper(x)  toupper((unsigned char)x) |  | ||||||
| #define Tolower(x)  tolower((unsigned char)x) |  | ||||||
|  |  | ||||||
| #define IsASCII(x)  isascii((unsigned char)x) |  | ||||||
|  |  | ||||||
| #define Strlen(x)       strlen(x) |  | ||||||
| #define Strchr(s,c)     strchr(s,c) |  | ||||||
| #define Strrchr(s,c)    strrchr(s,c) |  | ||||||
| #define Strstr(s,v)     strstr(s,v) |  | ||||||
| #define Strdup(x)       strdup(x) |  | ||||||
| #define Strcpy(d,s)     strcpy(d,s) |  | ||||||
| #define Strncpy(d,s,n)  strncpy(d,s,n) |  | ||||||
| #define Strncat(d,s,n)  strncat(d,s,n) |  | ||||||
|  |  | ||||||
| #define Strcmp(s,v)     strcmp(s,v) |  | ||||||
| #define Strncmp(s,v,n)  strncmp(s,v,n) |  | ||||||
| #define Strcspn(s,r)    strcspn(s,r) |  | ||||||
|  |  | ||||||
| #define Strtol(p,e,b)   strtol(p,e,b) |  | ||||||
|  |  | ||||||
| #define Width(c)	1 |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef WIDECHAR |  | ||||||
| /* | /* | ||||||
|  * Conversion buffer |  * Conversion buffer | ||||||
|  */ |  */ | ||||||
| typedef struct ct_buffer_t { | typedef struct ct_buffer_t { | ||||||
|         char    *cbuff; |         char    *cbuff; | ||||||
|         size_t  csize; |         size_t  csize; | ||||||
|         Char *wbuff; |         wchar_t *wbuff; | ||||||
|         size_t  wsize; |         size_t  wsize; | ||||||
| } ct_buffer_t; | } ct_buffer_t; | ||||||
|  |  | ||||||
| #define ct_encode_string __ct_encode_string |  | ||||||
| /* Encode a wide-character string and return the UTF-8 encoded result. */ | /* Encode a wide-character string and return the UTF-8 encoded result. */ | ||||||
| public char *ct_encode_string(const Char *, ct_buffer_t *); | char *ct_encode_string(const wchar_t *, ct_buffer_t *); | ||||||
|  |  | ||||||
| #define ct_decode_string __ct_decode_string |  | ||||||
| /* Decode a (multi)?byte string and return the wide-character string result. */ | /* Decode a (multi)?byte string and return the wide-character string result. */ | ||||||
| public Char *ct_decode_string(const char *, ct_buffer_t *); | wchar_t *ct_decode_string(const char *, ct_buffer_t *); | ||||||
|  |  | ||||||
| /* Decode a (multi)?byte argv string array. | /* Decode a (multi)?byte argv string array. | ||||||
|  * The pointer returned must be free()d when done. */ |  * The pointer returned must be free()d when done. */ | ||||||
| protected Char **ct_decode_argv(int, const char *[],  ct_buffer_t *); | libedit_private wchar_t **ct_decode_argv(int, const char *[],  ct_buffer_t *); | ||||||
|  |  | ||||||
| /* Resizes the conversion buffer(s) if needed. */ | /* Encode a character into the destination buffer, provided there is sufficient | ||||||
| protected void ct_conv_buff_resize(ct_buffer_t *, size_t, size_t); |  | ||||||
| protected ssize_t ct_encode_char(char *, size_t, Char); |  | ||||||
| protected size_t ct_enc_width(Char); |  | ||||||
|  |  | ||||||
| #define ct_free_argv(s)	el_free(s) |  | ||||||
|  |  | ||||||
| #else |  | ||||||
| #define	ct_encode_string(s, b)	(s) |  | ||||||
| #define ct_decode_string(s, b)	(s) |  | ||||||
| #define ct_decode_argv(l, s, b)	(s) |  | ||||||
| #define ct_conv_buff_resize(b, os, ns) |  | ||||||
| #define ct_encode_char(d, l, s)	(*d = s, 1) |  | ||||||
| #define ct_free_argv(s) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef NARROWCHAR |  | ||||||
| /* Encode a characted into the destination buffer, provided there is sufficent |  | ||||||
|  * buffer space available. Returns the number of bytes used up (zero if the |  * buffer space available. Returns the number of bytes used up (zero if the | ||||||
|  * character cannot be encoded, -1 if there was not enough space available). */ |  * character cannot be encoded, -1 if there was not enough space available). */ | ||||||
|  | libedit_private ssize_t ct_encode_char(char *, size_t, wchar_t); | ||||||
|  | libedit_private size_t ct_enc_width(wchar_t); | ||||||
|  |  | ||||||
| /* The maximum buffer size to hold the most unwieldly visual representation, | /* The maximum buffer size to hold the most unwieldy visual representation, | ||||||
|  * in this case \U+nnnnn. */ |  * in this case \U+nnnnn. */ | ||||||
| #define VISUAL_WIDTH_MAX 8 | #define VISUAL_WIDTH_MAX ((size_t)8) | ||||||
|  |  | ||||||
| /* The terminal is thought of in terms of X columns by Y lines. In the cases | /* The terminal is thought of in terms of X columns by Y lines. In the cases | ||||||
|  * where a wide character takes up more than one column, the adjacent |  * where a wide character takes up more than one column, the adjacent | ||||||
|  * occupied column entries will contain this faux character. */ |  * occupied column entries will contain this faux character. */ | ||||||
| #define MB_FILL_CHAR ((Char)-1) | #define MB_FILL_CHAR ((wchar_t)-1) | ||||||
|  |  | ||||||
| /* Visual width of character c, taking into account ^? , \0177 and \U+nnnnn | /* Visual width of character c, taking into account ^? , \0177 and \U+nnnnn | ||||||
|  * style visual expansions. */ |  * style visual expansions. */ | ||||||
| protected int ct_visual_width(Char); | libedit_private int ct_visual_width(wchar_t); | ||||||
|  |  | ||||||
| /* Turn the given character into the appropriate visual format, matching | /* Turn the given character into the appropriate visual format, matching | ||||||
|  * the width given by ct_visual_width(). Returns the number of characters used |  * the width given by ct_visual_width(). Returns the number of characters used | ||||||
|  * up, or -1 if insufficient space. Buffer length is in count of Char's. */ |  * up, or -1 if insufficient space. Buffer length is in count of wchar_t's. */ | ||||||
| protected ssize_t ct_visual_char(Char *, size_t, Char); | libedit_private ssize_t ct_visual_char(wchar_t *, size_t, wchar_t); | ||||||
|  |  | ||||||
| /* Convert the given string into visual format, using the ct_visual_char() | /* Convert the given string into visual format, using the ct_visual_char() | ||||||
|  * function. Uses a static buffer, so not threadsafe. */ |  * function. Uses a static buffer, so not threadsafe. */ | ||||||
| protected const Char *ct_visual_string(const Char *); | libedit_private const wchar_t *ct_visual_string(const wchar_t *, ct_buffer_t *); | ||||||
|  |  | ||||||
|  |  | ||||||
| /* printable character, use ct_visual_width() to find out display width */ | /* printable character, use ct_visual_width() to find out display width */ | ||||||
| @@ -242,8 +109,6 @@ protected const Char *ct_visual_string(const Char *); | |||||||
| /* non-printable character */ | /* non-printable character */ | ||||||
| #define CHTYPE_NONPRINT     (-4) | #define CHTYPE_NONPRINT     (-4) | ||||||
| /* classification of character c, as one of the above defines */ | /* classification of character c, as one of the above defines */ | ||||||
| protected int ct_chr_class(Char c); | libedit_private int ct_chr_class(wchar_t c); | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* _chartype_f */ | #endif /* _chartype_f */ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: common.c,v 1.24 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: common.c,v 1.47 2016/05/22 19:44:26 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,27 +37,34 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)common.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)common.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: common.c,v 1.24 2009/12/30 22:37:40 christos Exp $"); | __RCSID("$NetBSD: common.c,v 1.47 2016/05/22 19:44:26 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * common.c: Common Editor functions |  * common.c: Common Editor functions | ||||||
|  */ |  */ | ||||||
|  | #include <ctype.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  | #include "common.h" | ||||||
|  | #include "fcns.h" | ||||||
|  | #include "parse.h" | ||||||
|  | #include "vi.h" | ||||||
|  |  | ||||||
| /* ed_end_of_file(): | /* ed_end_of_file(): | ||||||
|  *	Indicate end of file |  *	Indicate end of file | ||||||
|  *	[^D] |  *	[^D] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_end_of_file(EditLine *el, Int c __attribute__((__unused__))) | ed_end_of_file(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	re_goto_bottom(el); | 	re_goto_bottom(el); | ||||||
| 	*el->el_line.lastchar = '\0'; | 	*el->el_line.lastchar = '\0'; | ||||||
| 	return (CC_EOF); | 	return CC_EOF; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -65,13 +72,13 @@ ed_end_of_file(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Add character to the line |  *	Add character to the line | ||||||
|  *	Insert a character [bound to all insert keys] |  *	Insert a character [bound to all insert keys] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| ed_insert(EditLine *el, Int c) | ed_insert(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
| 	int count = el->el_state.argument; | 	int count = el->el_state.argument; | ||||||
|  |  | ||||||
| 	if (c == '\0') | 	if (c == '\0') | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	if (el->el_line.lastchar + el->el_state.argument >= | 	if (el->el_line.lastchar + el->el_state.argument >= | ||||||
| 	    el->el_line.limit) { | 	    el->el_line.limit) { | ||||||
| @@ -99,7 +106,7 @@ ed_insert(EditLine *el, Int c) | |||||||
| 	if (el->el_state.inputmode == MODE_REPLACE_1) | 	if (el->el_state.inputmode == MODE_REPLACE_1) | ||||||
| 		return vi_command_mode(el, 0); | 		return vi_command_mode(el, 0); | ||||||
|  |  | ||||||
| 	return (CC_NORM); | 	return CC_NORM; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -107,14 +114,14 @@ ed_insert(EditLine *el, Int c) | |||||||
|  *	Delete from beginning of current word to cursor |  *	Delete from beginning of current word to cursor | ||||||
|  *	[M-^?] [^W] |  *	[M-^?] [^W] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_delete_prev_word(EditLine *el, Int c __attribute__((__unused__))) | ed_delete_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *cp, *p, *kp; | 	wchar_t *cp, *p, *kp; | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor == el->el_line.buffer) | 	if (el->el_line.cursor == el->el_line.buffer) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, | 	cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, | ||||||
| 	    el->el_state.argument, ce__isword); | 	    el->el_state.argument, ce__isword); | ||||||
| @@ -127,7 +134,7 @@ ed_delete_prev_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	el->el_line.cursor = cp; | 	el->el_line.cursor = cp; | ||||||
| 	if (el->el_line.cursor < el->el_line.buffer) | 	if (el->el_line.cursor < el->el_line.buffer) | ||||||
| 		el->el_line.cursor = el->el_line.buffer; /* bounds check */ | 		el->el_line.cursor = el->el_line.buffer; /* bounds check */ | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -135,14 +142,14 @@ ed_delete_prev_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Delete character under cursor |  *	Delete character under cursor | ||||||
|  *	[^D] [x] |  *	[^D] [x] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_delete_next_char(EditLine *el, Int c) | ed_delete_next_char(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| #ifdef notdef			/* XXX */ | #ifdef DEBUG_EDIT | ||||||
| #define	EL	el->el_line | #define	EL	el->el_line | ||||||
| 	(void) fprintf(el->el_errlfile, | 	(void) fprintf(el->el_errfile, | ||||||
| 	    "\nD(b: %x(%s)  c: %x(%s) last: %x(%s) limit: %x(%s)\n", | 	    "\nD(b: %p(%ls)  c: %p(%ls) last: %p(%ls) limit: %p(%ls)\n", | ||||||
| 	    EL.buffer, EL.buffer, EL.cursor, EL.cursor, EL.lastchar, | 	    EL.buffer, EL.buffer, EL.cursor, EL.cursor, EL.lastchar, | ||||||
| 	    EL.lastchar, EL.limit, EL.limit); | 	    EL.lastchar, EL.limit, EL.limit); | ||||||
| #endif | #endif | ||||||
| @@ -152,32 +159,29 @@ ed_delete_next_char(EditLine *el, Int c) | |||||||
| 			if (el->el_line.cursor == el->el_line.buffer) { | 			if (el->el_line.cursor == el->el_line.buffer) { | ||||||
| 				/* if I'm also at the beginning */ | 				/* if I'm also at the beginning */ | ||||||
| #ifdef KSHVI | #ifdef KSHVI | ||||||
| 				return (CC_ERROR); | 				return CC_ERROR; | ||||||
| #else | #else | ||||||
| 				/* then do an EOF */ | 				/* then do an EOF */ | ||||||
| 				term_writec(el, c); | 				terminal_writec(el, c); | ||||||
| 				return (CC_EOF); | 				return CC_EOF; | ||||||
| #endif | #endif | ||||||
| 			} else { | 			} else { | ||||||
| #ifdef KSHVI | #ifdef KSHVI | ||||||
| 				el->el_line.cursor--; | 				el->el_line.cursor--; | ||||||
| #else | #else | ||||||
| 				return (CC_ERROR); | 				return CC_ERROR; | ||||||
| #endif | #endif | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else | ||||||
| 			if (el->el_line.cursor != el->el_line.buffer) | 				return CC_ERROR; | ||||||
| 				el->el_line.cursor--; |  | ||||||
| 			else |  | ||||||
| 				return (CC_ERROR); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	c_delafter(el, el->el_state.argument);	/* delete after dot */ | 	c_delafter(el, el->el_state.argument);	/* delete after dot */ | ||||||
| 	if (el->el_line.cursor >= el->el_line.lastchar && | 	if (el->el_map.type == MAP_VI && | ||||||
|  | 	    el->el_line.cursor >= el->el_line.lastchar && | ||||||
| 	    el->el_line.cursor > el->el_line.buffer) | 	    el->el_line.cursor > el->el_line.buffer) | ||||||
| 			/* bounds check */ | 			/* bounds check */ | ||||||
| 		el->el_line.cursor = el->el_line.lastchar - 1; | 		el->el_line.cursor = el->el_line.lastchar - 1; | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -185,11 +189,11 @@ ed_delete_next_char(EditLine *el, Int c) | |||||||
|  *	Cut to the end of line |  *	Cut to the end of line | ||||||
|  *	[^K] [^K] |  *	[^K] [^K] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_kill_line(EditLine *el, Int c __attribute__((__unused__))) | ed_kill_line(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *kp, *cp; | 	wchar_t *kp, *cp; | ||||||
|  |  | ||||||
| 	cp = el->el_line.cursor; | 	cp = el->el_line.cursor; | ||||||
| 	kp = el->el_chared.c_kill.buf; | 	kp = el->el_chared.c_kill.buf; | ||||||
| @@ -198,7 +202,7 @@ ed_kill_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	el->el_chared.c_kill.last = kp; | 	el->el_chared.c_kill.last = kp; | ||||||
| 			/* zap! -- delete to end */ | 			/* zap! -- delete to end */ | ||||||
| 	el->el_line.lastchar = el->el_line.cursor; | 	el->el_line.lastchar = el->el_line.cursor; | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -206,22 +210,22 @@ ed_kill_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Move cursor to the end of line |  *	Move cursor to the end of line | ||||||
|  *	[^E] [^E] |  *	[^E] [^E] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_move_to_end(EditLine *el, Int c __attribute__((__unused__))) | ed_move_to_end(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_line.cursor = el->el_line.lastchar; | 	el->el_line.cursor = el->el_line.lastchar; | ||||||
| 	if (el->el_map.type == MAP_VI) { | 	if (el->el_map.type == MAP_VI) { | ||||||
| 		if (el->el_chared.c_vcmd.action != NOP) { | 		if (el->el_chared.c_vcmd.action != NOP) { | ||||||
| 			cv_delfini(el); | 			cv_delfini(el); | ||||||
| 			return (CC_REFRESH); | 			return CC_REFRESH; | ||||||
| 		} | 		} | ||||||
| #ifdef VI_MOVE | #ifdef VI_MOVE | ||||||
| 		el->el_line.cursor--; | 		el->el_line.cursor--; | ||||||
| #endif | #endif | ||||||
| 	} | 	} | ||||||
| 	return (CC_CURSOR); | 	return CC_CURSOR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -229,23 +233,23 @@ ed_move_to_end(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Move cursor to the beginning of line |  *	Move cursor to the beginning of line | ||||||
|  *	[^A] [^A] |  *	[^A] [^A] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_move_to_beg(EditLine *el, Int c __attribute__((__unused__))) | ed_move_to_beg(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_line.cursor = el->el_line.buffer; | 	el->el_line.cursor = el->el_line.buffer; | ||||||
|  |  | ||||||
| 	if (el->el_map.type == MAP_VI) { | 	if (el->el_map.type == MAP_VI) { | ||||||
| 			/* We want FIRST non space character */ | 			/* We want FIRST non space character */ | ||||||
| 		while (Isspace(*el->el_line.cursor)) | 		while (iswspace(*el->el_line.cursor)) | ||||||
| 			el->el_line.cursor++; | 			el->el_line.cursor++; | ||||||
| 		if (el->el_chared.c_vcmd.action != NOP) { | 		if (el->el_chared.c_vcmd.action != NOP) { | ||||||
| 			cv_delfini(el); | 			cv_delfini(el); | ||||||
| 			return (CC_REFRESH); | 			return CC_REFRESH; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return (CC_CURSOR); | 	return CC_CURSOR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -253,13 +257,13 @@ ed_move_to_beg(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Exchange the character to the left of the cursor with the one under it |  *	Exchange the character to the left of the cursor with the one under it | ||||||
|  *	[^T] [^T] |  *	[^T] [^T] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| ed_transpose_chars(EditLine *el, Int c) | ed_transpose_chars(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor < el->el_line.lastchar) { | 	if (el->el_line.cursor < el->el_line.lastchar) { | ||||||
| 		if (el->el_line.lastchar <= &el->el_line.buffer[1]) | 		if (el->el_line.lastchar <= &el->el_line.buffer[1]) | ||||||
| 			return (CC_ERROR); | 			return CC_ERROR; | ||||||
| 		else | 		else | ||||||
| 			el->el_line.cursor++; | 			el->el_line.cursor++; | ||||||
| 	} | 	} | ||||||
| @@ -268,9 +272,9 @@ ed_transpose_chars(EditLine *el, Int c) | |||||||
| 		c = el->el_line.cursor[-2]; | 		c = el->el_line.cursor[-2]; | ||||||
| 		el->el_line.cursor[-2] = el->el_line.cursor[-1]; | 		el->el_line.cursor[-2] = el->el_line.cursor[-1]; | ||||||
| 		el->el_line.cursor[-1] = c; | 		el->el_line.cursor[-1] = c; | ||||||
| 		return (CC_REFRESH); | 		return CC_REFRESH; | ||||||
| 	} else | 	} else | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -278,17 +282,17 @@ ed_transpose_chars(EditLine *el, Int c) | |||||||
|  *	Move to the right one character |  *	Move to the right one character | ||||||
|  *	[^F] [^F] |  *	[^F] [^F] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_next_char(EditLine *el, Int c __attribute__((__unused__))) | ed_next_char(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *lim = el->el_line.lastchar; | 	wchar_t *lim = el->el_line.lastchar; | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor >= lim || | 	if (el->el_line.cursor >= lim || | ||||||
| 	    (el->el_line.cursor == lim - 1 && | 	    (el->el_line.cursor == lim - 1 && | ||||||
| 	    el->el_map.type == MAP_VI && | 	    el->el_map.type == MAP_VI && | ||||||
| 	    el->el_chared.c_vcmd.action == NOP)) | 	    el->el_chared.c_vcmd.action == NOP)) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	el->el_line.cursor += el->el_state.argument; | 	el->el_line.cursor += el->el_state.argument; | ||||||
| 	if (el->el_line.cursor > lim) | 	if (el->el_line.cursor > lim) | ||||||
| @@ -297,9 +301,9 @@ ed_next_char(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	if (el->el_map.type == MAP_VI) | 	if (el->el_map.type == MAP_VI) | ||||||
| 		if (el->el_chared.c_vcmd.action != NOP) { | 		if (el->el_chared.c_vcmd.action != NOP) { | ||||||
| 			cv_delfini(el); | 			cv_delfini(el); | ||||||
| 			return (CC_REFRESH); | 			return CC_REFRESH; | ||||||
| 		} | 		} | ||||||
| 	return (CC_CURSOR); | 	return CC_CURSOR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -307,13 +311,13 @@ ed_next_char(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Move to the beginning of the current word |  *	Move to the beginning of the current word | ||||||
|  *	[M-b] [b] |  *	[M-b] [b] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_prev_word(EditLine *el, Int c __attribute__((__unused__))) | ed_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor == el->el_line.buffer) | 	if (el->el_line.cursor == el->el_line.buffer) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	el->el_line.cursor = c__prev_word(el->el_line.cursor, | 	el->el_line.cursor = c__prev_word(el->el_line.cursor, | ||||||
| 	    el->el_line.buffer, | 	    el->el_line.buffer, | ||||||
| @@ -323,9 +327,9 @@ ed_prev_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	if (el->el_map.type == MAP_VI) | 	if (el->el_map.type == MAP_VI) | ||||||
| 		if (el->el_chared.c_vcmd.action != NOP) { | 		if (el->el_chared.c_vcmd.action != NOP) { | ||||||
| 			cv_delfini(el); | 			cv_delfini(el); | ||||||
| 			return (CC_REFRESH); | 			return CC_REFRESH; | ||||||
| 		} | 		} | ||||||
| 	return (CC_CURSOR); | 	return CC_CURSOR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -333,9 +337,9 @@ ed_prev_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Move to the left one character |  *	Move to the left one character | ||||||
|  *	[^B] [^B] |  *	[^B] [^B] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_prev_char(EditLine *el, Int c __attribute__((__unused__))) | ed_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor > el->el_line.buffer) { | 	if (el->el_line.cursor > el->el_line.buffer) { | ||||||
| @@ -346,11 +350,11 @@ ed_prev_char(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 		if (el->el_map.type == MAP_VI) | 		if (el->el_map.type == MAP_VI) | ||||||
| 			if (el->el_chared.c_vcmd.action != NOP) { | 			if (el->el_chared.c_vcmd.action != NOP) { | ||||||
| 				cv_delfini(el); | 				cv_delfini(el); | ||||||
| 				return (CC_REFRESH); | 				return CC_REFRESH; | ||||||
| 			} | 			} | ||||||
| 		return (CC_CURSOR); | 		return CC_CURSOR; | ||||||
| 	} else | 	} else | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -358,32 +362,30 @@ ed_prev_char(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Add the next character typed verbatim |  *	Add the next character typed verbatim | ||||||
|  *	[^V] [^V] |  *	[^V] [^V] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| ed_quoted_insert(EditLine *el, Int c) | ed_quoted_insert(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
| 	int num; | 	int num; | ||||||
| 	Char tc; |  | ||||||
|  |  | ||||||
| 	tty_quotemode(el); | 	tty_quotemode(el); | ||||||
| 	num = FUN(el,getc)(el, &tc); | 	num = el_wgetc(el, &c); | ||||||
| 	c = tc; |  | ||||||
| 	tty_noquotemode(el); | 	tty_noquotemode(el); | ||||||
| 	if (num == 1) | 	if (num == 1) | ||||||
| 		return (ed_insert(el, c)); | 		return ed_insert(el, c); | ||||||
| 	else | 	else | ||||||
| 		return (ed_end_of_file(el, 0)); | 		return ed_end_of_file(el, 0); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ed_digit(): | /* ed_digit(): | ||||||
|  *	Adds to argument or enters a digit |  *	Adds to argument or enters a digit | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| ed_digit(EditLine *el, Int c) | ed_digit(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (!Isdigit(c)) | 	if (!iswdigit(c)) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	if (el->el_state.doingarg) { | 	if (el->el_state.doingarg) { | ||||||
| 			/* if doing an arg, add this in... */ | 			/* if doing an arg, add this in... */ | ||||||
| @@ -391,11 +393,11 @@ ed_digit(EditLine *el, Int c) | |||||||
| 			el->el_state.argument = c - '0'; | 			el->el_state.argument = c - '0'; | ||||||
| 		else { | 		else { | ||||||
| 			if (el->el_state.argument > 1000000) | 			if (el->el_state.argument > 1000000) | ||||||
| 				return (CC_ERROR); | 				return CC_ERROR; | ||||||
| 			el->el_state.argument = | 			el->el_state.argument = | ||||||
| 			    (el->el_state.argument * 10) + (c - '0'); | 			    (el->el_state.argument * 10) + (c - '0'); | ||||||
| 		} | 		} | ||||||
| 		return (CC_ARGHACK); | 		return CC_ARGHACK; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return ed_insert(el, c); | 	return ed_insert(el, c); | ||||||
| @@ -406,23 +408,23 @@ ed_digit(EditLine *el, Int c) | |||||||
|  *	Digit that starts argument |  *	Digit that starts argument | ||||||
|  *	For ESC-n |  *	For ESC-n | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| ed_argument_digit(EditLine *el, Int c) | ed_argument_digit(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (!Isdigit(c)) | 	if (!iswdigit(c)) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	if (el->el_state.doingarg) { | 	if (el->el_state.doingarg) { | ||||||
| 		if (el->el_state.argument > 1000000) | 		if (el->el_state.argument > 1000000) | ||||||
| 			return (CC_ERROR); | 			return CC_ERROR; | ||||||
| 		el->el_state.argument = (el->el_state.argument * 10) + | 		el->el_state.argument = (el->el_state.argument * 10) + | ||||||
| 		    (c - '0'); | 		    (c - '0'); | ||||||
| 	} else {		/* else starting an argument */ | 	} else {		/* else starting an argument */ | ||||||
| 		el->el_state.argument = c - '0'; | 		el->el_state.argument = c - '0'; | ||||||
| 		el->el_state.doingarg = 1; | 		el->el_state.doingarg = 1; | ||||||
| 	} | 	} | ||||||
| 	return (CC_ARGHACK); | 	return CC_ARGHACK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -430,114 +432,27 @@ ed_argument_digit(EditLine *el, Int c) | |||||||
|  *	Indicates unbound character |  *	Indicates unbound character | ||||||
|  *	Bound to keys that are not assigned |  *	Bound to keys that are not assigned | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_unassigned(EditLine *el, Int c __attribute__((__unused__))) | ed_unassigned(EditLine *el __attribute__((__unused__)), | ||||||
|  |     wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	return (CC_ERROR); | 	return CC_ERROR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /* ed_ignore(): | ||||||
|  ** TTY key handling. |  *	Input characters that have no effect | ||||||
|  **/ |  *	[^C ^O ^Q ^S ^Z ^\ ^]] [^C ^O ^Q ^S ^\] | ||||||
|  |  | ||||||
| /* ed_tty_sigint(): |  | ||||||
|  *	Tty interrupt character |  | ||||||
|  *	[^C] |  | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_tty_sigint(EditLine *el __attribute__((__unused__)), | ed_ignore(EditLine *el __attribute__((__unused__)), | ||||||
| 	      Int c __attribute__((__unused__))) | 	      wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	return (CC_NORM); | 	return CC_NORM; | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ed_tty_dsusp(): |  | ||||||
|  *	Tty delayed suspend character |  | ||||||
|  *	[^Y] |  | ||||||
|  */ |  | ||||||
| protected el_action_t |  | ||||||
| /*ARGSUSED*/ |  | ||||||
| ed_tty_dsusp(EditLine *el __attribute__((__unused__)), |  | ||||||
| 	     Int c __attribute__((__unused__))) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| 	return (CC_NORM); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ed_tty_flush_output(): |  | ||||||
|  *	Tty flush output characters |  | ||||||
|  *	[^O] |  | ||||||
|  */ |  | ||||||
| protected el_action_t |  | ||||||
| /*ARGSUSED*/ |  | ||||||
| ed_tty_flush_output(EditLine *el __attribute__((__unused__)), |  | ||||||
| 		    Int c __attribute__((__unused__))) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| 	return (CC_NORM); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ed_tty_sigquit(): |  | ||||||
|  *	Tty quit character |  | ||||||
|  *	[^\] |  | ||||||
|  */ |  | ||||||
| protected el_action_t |  | ||||||
| /*ARGSUSED*/ |  | ||||||
| ed_tty_sigquit(EditLine *el __attribute__((__unused__)), |  | ||||||
| 	       Int c __attribute__((__unused__))) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| 	return (CC_NORM); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ed_tty_sigtstp(): |  | ||||||
|  *	Tty suspend character |  | ||||||
|  *	[^Z] |  | ||||||
|  */ |  | ||||||
| protected el_action_t |  | ||||||
| /*ARGSUSED*/ |  | ||||||
| ed_tty_sigtstp(EditLine *el __attribute__((__unused__)), |  | ||||||
| 	       Int c __attribute__((__unused__))) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| 	return (CC_NORM); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ed_tty_stop_output(): |  | ||||||
|  *	Tty disallow output characters |  | ||||||
|  *	[^S] |  | ||||||
|  */ |  | ||||||
| protected el_action_t |  | ||||||
| /*ARGSUSED*/ |  | ||||||
| ed_tty_stop_output(EditLine *el __attribute__((__unused__)), |  | ||||||
| 		   Int c __attribute__((__unused__))) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| 	return (CC_NORM); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ed_tty_start_output(): |  | ||||||
|  *	Tty allow output characters |  | ||||||
|  *	[^Q] |  | ||||||
|  */ |  | ||||||
| protected el_action_t |  | ||||||
| /*ARGSUSED*/ |  | ||||||
| ed_tty_start_output(EditLine *el __attribute__((__unused__)), |  | ||||||
| 		    Int c __attribute__((__unused__))) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| 	return (CC_NORM); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -545,15 +460,15 @@ ed_tty_start_output(EditLine *el __attribute__((__unused__)), | |||||||
|  *	Execute command |  *	Execute command | ||||||
|  *	[^J] |  *	[^J] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_newline(EditLine *el, Int c __attribute__((__unused__))) | ed_newline(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	re_goto_bottom(el); | 	re_goto_bottom(el); | ||||||
| 	*el->el_line.lastchar++ = '\n'; | 	*el->el_line.lastchar++ = '\n'; | ||||||
| 	*el->el_line.lastchar = '\0'; | 	*el->el_line.lastchar = '\0'; | ||||||
| 	return (CC_NEWLINE); | 	return CC_NEWLINE; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -561,19 +476,19 @@ ed_newline(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Delete the character to the left of the cursor |  *	Delete the character to the left of the cursor | ||||||
|  *	[^?] |  *	[^?] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_delete_prev_char(EditLine *el, Int c __attribute__((__unused__))) | ed_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor <= el->el_line.buffer) | 	if (el->el_line.cursor <= el->el_line.buffer) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	c_delbefore(el, el->el_state.argument); | 	c_delbefore(el, el->el_state.argument); | ||||||
| 	el->el_line.cursor -= el->el_state.argument; | 	el->el_line.cursor -= el->el_state.argument; | ||||||
| 	if (el->el_line.cursor < el->el_line.buffer) | 	if (el->el_line.cursor < el->el_line.buffer) | ||||||
| 		el->el_line.cursor = el->el_line.buffer; | 		el->el_line.cursor = el->el_line.buffer; | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -581,14 +496,14 @@ ed_delete_prev_char(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Clear screen leaving current line at the top |  *	Clear screen leaving current line at the top | ||||||
|  *	[^L] |  *	[^L] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_clear_screen(EditLine *el, Int c __attribute__((__unused__))) | ed_clear_screen(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	term_clear_screen(el);	/* clear the whole real screen */ | 	terminal_clear_screen(el);	/* clear the whole real screen */ | ||||||
| 	re_clear_display(el);	/* reset everything */ | 	re_clear_display(el);	/* reset everything */ | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -596,13 +511,13 @@ ed_clear_screen(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Redisplay everything |  *	Redisplay everything | ||||||
|  *	^R |  *	^R | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_redisplay(EditLine *el __attribute__((__unused__)), | ed_redisplay(EditLine *el __attribute__((__unused__)), | ||||||
| 	     Int c __attribute__((__unused__))) | 	     wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	return (CC_REDISPLAY); | 	return CC_REDISPLAY; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -610,13 +525,13 @@ ed_redisplay(EditLine *el __attribute__((__unused__)), | |||||||
|  *	Erase current line and start from scratch |  *	Erase current line and start from scratch | ||||||
|  *	[^G] |  *	[^G] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_start_over(EditLine *el, Int c __attribute__((__unused__))) | ed_start_over(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	ch_reset(el, 0); | 	ch_reset(el); | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -624,13 +539,13 @@ ed_start_over(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	First character in a bound sequence |  *	First character in a bound sequence | ||||||
|  *	Placeholder for external keys |  *	Placeholder for external keys | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_sequence_lead_in(EditLine *el __attribute__((__unused__)), | ed_sequence_lead_in(EditLine *el __attribute__((__unused__)), | ||||||
| 		    Int c __attribute__((__unused__))) | 		    wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	return (CC_NORM); | 	return CC_NORM; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -638,9 +553,9 @@ ed_sequence_lead_in(EditLine *el __attribute__((__unused__)), | |||||||
|  *	Move to the previous history line |  *	Move to the previous history line | ||||||
|  *	[^P] [k] |  *	[^P] [k] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_prev_history(EditLine *el, Int c __attribute__((__unused__))) | ed_prev_history(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	char beep = 0; | 	char beep = 0; | ||||||
| 	int sv_event = el->el_history.eventno; | 	int sv_event = el->el_history.eventno; | ||||||
| @@ -650,7 +565,7 @@ ed_prev_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  |  | ||||||
| 	if (el->el_history.eventno == 0) {	/* save the current buffer | 	if (el->el_history.eventno == 0) {	/* save the current buffer | ||||||
| 						 * away */ | 						 * away */ | ||||||
| 		(void) Strncpy(el->el_history.buf, el->el_line.buffer, | 		(void) wcsncpy(el->el_history.buf, el->el_line.buffer, | ||||||
| 		    EL_BUFSIZ); | 		    EL_BUFSIZ); | ||||||
| 		el->el_history.last = el->el_history.buf + | 		el->el_history.last = el->el_history.buf + | ||||||
| 		    (el->el_line.lastchar - el->el_line.buffer); | 		    (el->el_line.lastchar - el->el_line.buffer); | ||||||
| @@ -660,7 +575,6 @@ ed_prev_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	if (hist_get(el) == CC_ERROR) { | 	if (hist_get(el) == CC_ERROR) { | ||||||
| 		if (el->el_map.type == MAP_VI) { | 		if (el->el_map.type == MAP_VI) { | ||||||
| 			el->el_history.eventno = sv_event; | 			el->el_history.eventno = sv_event; | ||||||
|  |  | ||||||
| 		} | 		} | ||||||
| 		beep = 1; | 		beep = 1; | ||||||
| 		/* el->el_history.eventno was fixed by first call */ | 		/* el->el_history.eventno was fixed by first call */ | ||||||
| @@ -676,9 +590,9 @@ ed_prev_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Move to the next history line |  *	Move to the next history line | ||||||
|  *	[^N] [j] |  *	[^N] [j] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_next_history(EditLine *el, Int c __attribute__((__unused__))) | ed_next_history(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	el_action_t beep = CC_REFRESH, rval; | 	el_action_t beep = CC_REFRESH, rval; | ||||||
|  |  | ||||||
| @@ -703,13 +617,13 @@ ed_next_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Search previous in history for a line matching the current |  *	Search previous in history for a line matching the current | ||||||
|  *	next search history [M-P] [K] |  *	next search history [M-P] [K] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_search_prev_history(EditLine *el, Int c __attribute__((__unused__))) | ed_search_prev_history(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	const Char *hp; | 	const wchar_t *hp; | ||||||
| 	int h; | 	int h; | ||||||
| 	bool_t found = 0; | 	int found = 0; | ||||||
|  |  | ||||||
| 	el->el_chared.c_vcmd.action = NOP; | 	el->el_chared.c_vcmd.action = NOP; | ||||||
| 	el->el_chared.c_undo.len = -1; | 	el->el_chared.c_undo.len = -1; | ||||||
| @@ -720,20 +634,20 @@ ed_search_prev_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 		    "e_prev_search_hist(): eventno < 0;\n"); | 		    "e_prev_search_hist(): eventno < 0;\n"); | ||||||
| #endif | #endif | ||||||
| 		el->el_history.eventno = 0; | 		el->el_history.eventno = 0; | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| 	} | 	} | ||||||
| 	if (el->el_history.eventno == 0) { | 	if (el->el_history.eventno == 0) { | ||||||
| 		(void) Strncpy(el->el_history.buf, el->el_line.buffer, | 		(void) wcsncpy(el->el_history.buf, el->el_line.buffer, | ||||||
| 		    EL_BUFSIZ); | 		    EL_BUFSIZ); | ||||||
| 		el->el_history.last = el->el_history.buf + | 		el->el_history.last = el->el_history.buf + | ||||||
| 		    (el->el_line.lastchar - el->el_line.buffer); | 		    (el->el_line.lastchar - el->el_line.buffer); | ||||||
| 	} | 	} | ||||||
| 	if (el->el_history.ref == NULL) | 	if (el->el_history.ref == NULL) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	hp = HIST_FIRST(el); | 	hp = HIST_FIRST(el); | ||||||
| 	if (hp == NULL) | 	if (hp == NULL) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	c_setpat(el);		/* Set search pattern !! */ | 	c_setpat(el);		/* Set search pattern !! */ | ||||||
|  |  | ||||||
| @@ -744,11 +658,11 @@ ed_search_prev_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| #ifdef SDEBUG | #ifdef SDEBUG | ||||||
| 		(void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp); | 		(void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp); | ||||||
| #endif | #endif | ||||||
| 		if ((Strncmp(hp, el->el_line.buffer, (size_t) | 		if ((wcsncmp(hp, el->el_line.buffer, (size_t) | ||||||
| 			    (el->el_line.lastchar - el->el_line.buffer)) || | 			    (el->el_line.lastchar - el->el_line.buffer)) || | ||||||
| 			hp[el->el_line.lastchar - el->el_line.buffer]) && | 			hp[el->el_line.lastchar - el->el_line.buffer]) && | ||||||
| 		    c_hmatch(el, hp)) { | 		    c_hmatch(el, hp)) { | ||||||
| 			found++; | 			found = 1; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		h++; | 		h++; | ||||||
| @@ -759,11 +673,11 @@ ed_search_prev_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| #ifdef SDEBUG | #ifdef SDEBUG | ||||||
| 		(void) fprintf(el->el_errfile, "not found\n"); | 		(void) fprintf(el->el_errfile, "not found\n"); | ||||||
| #endif | #endif | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| 	} | 	} | ||||||
| 	el->el_history.eventno = h; | 	el->el_history.eventno = h; | ||||||
|  |  | ||||||
| 	return (hist_get(el)); | 	return hist_get(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -771,27 +685,27 @@ ed_search_prev_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Search next in history for a line matching the current |  *	Search next in history for a line matching the current | ||||||
|  *	[M-N] [J] |  *	[M-N] [J] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_search_next_history(EditLine *el, Int c __attribute__((__unused__))) | ed_search_next_history(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	const Char *hp; | 	const wchar_t *hp; | ||||||
| 	int h; | 	int h; | ||||||
| 	bool_t found = 0; | 	int found = 0; | ||||||
|  |  | ||||||
| 	el->el_chared.c_vcmd.action = NOP; | 	el->el_chared.c_vcmd.action = NOP; | ||||||
| 	el->el_chared.c_undo.len = -1; | 	el->el_chared.c_undo.len = -1; | ||||||
| 	*el->el_line.lastchar = '\0';	/* just in case */ | 	*el->el_line.lastchar = '\0';	/* just in case */ | ||||||
|  |  | ||||||
| 	if (el->el_history.eventno == 0) | 	if (el->el_history.eventno == 0) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	if (el->el_history.ref == NULL) | 	if (el->el_history.ref == NULL) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	hp = HIST_FIRST(el); | 	hp = HIST_FIRST(el); | ||||||
| 	if (hp == NULL) | 	if (hp == NULL) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	c_setpat(el);		/* Set search pattern !! */ | 	c_setpat(el);		/* Set search pattern !! */ | ||||||
|  |  | ||||||
| @@ -799,7 +713,7 @@ ed_search_next_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| #ifdef SDEBUG | #ifdef SDEBUG | ||||||
| 		(void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp); | 		(void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp); | ||||||
| #endif | #endif | ||||||
| 		if ((Strncmp(hp, el->el_line.buffer, (size_t) | 		if ((wcsncmp(hp, el->el_line.buffer, (size_t) | ||||||
| 			    (el->el_line.lastchar - el->el_line.buffer)) || | 			    (el->el_line.lastchar - el->el_line.buffer)) || | ||||||
| 			hp[el->el_line.lastchar - el->el_line.buffer]) && | 			hp[el->el_line.lastchar - el->el_line.buffer]) && | ||||||
| 		    c_hmatch(el, hp)) | 		    c_hmatch(el, hp)) | ||||||
| @@ -812,12 +726,12 @@ ed_search_next_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| #ifdef SDEBUG | #ifdef SDEBUG | ||||||
| 			(void) fprintf(el->el_errfile, "not found\n"); | 			(void) fprintf(el->el_errfile, "not found\n"); | ||||||
| #endif | #endif | ||||||
| 			return (CC_ERROR); | 			return CC_ERROR; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	el->el_history.eventno = found; | 	el->el_history.eventno = found; | ||||||
|  |  | ||||||
| 	return (hist_get(el)); | 	return hist_get(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -825,11 +739,11 @@ ed_search_next_history(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Move up one line |  *	Move up one line | ||||||
|  *	Could be [k] [^p] |  *	Could be [k] [^p] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_prev_line(EditLine *el, Int c __attribute__((__unused__))) | ed_prev_line(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *ptr; | 	wchar_t *ptr; | ||||||
| 	int nchars = c_hpos(el); | 	int nchars = c_hpos(el); | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| @@ -843,7 +757,7 @@ ed_prev_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 	if (el->el_state.argument > 0) | 	if (el->el_state.argument > 0) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
|          * Move to the beginning of the line |          * Move to the beginning of the line | ||||||
| @@ -860,7 +774,7 @@ ed_prev_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 		continue; | 		continue; | ||||||
|  |  | ||||||
| 	el->el_line.cursor = ptr; | 	el->el_line.cursor = ptr; | ||||||
| 	return (CC_CURSOR); | 	return CC_CURSOR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -868,11 +782,11 @@ ed_prev_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Move down one line |  *	Move down one line | ||||||
|  *	Could be [j] [^n] |  *	Could be [j] [^n] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_next_line(EditLine *el, Int c __attribute__((__unused__))) | ed_next_line(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *ptr; | 	wchar_t *ptr; | ||||||
| 	int nchars = c_hpos(el); | 	int nchars = c_hpos(el); | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| @@ -883,7 +797,7 @@ ed_next_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 	if (el->el_state.argument > 0) | 	if (el->el_state.argument > 0) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
|          * Move to the character requested |          * Move to the character requested | ||||||
| @@ -894,7 +808,7 @@ ed_next_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 		continue; | 		continue; | ||||||
|  |  | ||||||
| 	el->el_line.cursor = ptr; | 	el->el_line.cursor = ptr; | ||||||
| 	return (CC_CURSOR); | 	return CC_CURSOR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -902,18 +816,18 @@ ed_next_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Editline extended command |  *	Editline extended command | ||||||
|  *	[M-X] [:] |  *	[M-X] [:] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| ed_command(EditLine *el, Int c __attribute__((__unused__))) | ed_command(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char tmpbuf[EL_BUFSIZ]; | 	wchar_t tmpbuf[EL_BUFSIZ]; | ||||||
| 	int tmplen; | 	int tmplen; | ||||||
|  |  | ||||||
| 	tmplen = c_gets(el, tmpbuf, STR("\n: ")); | 	tmplen = c_gets(el, tmpbuf, L"\n: "); | ||||||
| 	term__putc(el, '\n'); | 	terminal__putc(el, '\n'); | ||||||
|  |  | ||||||
| 	if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1) | 	if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1) | ||||||
| 		term_beep(el); | 		terminal_beep(el); | ||||||
|  |  | ||||||
| 	el->el_map.current = el->el_map.key; | 	el->el_map.current = el->el_map.key; | ||||||
| 	re_clear_display(el); | 	re_clear_display(el); | ||||||
|   | |||||||
							
								
								
									
										997
									
								
								lib/libedit/src/editline.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										997
									
								
								lib/libedit/src/editline.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,997 @@ | |||||||
|  | .\"	$NetBSD: editline.3,v 1.92 2016/05/22 23:54:20 christos Exp $ | ||||||
|  | .\" | ||||||
|  | .\" Copyright (c) 1997-2014 The NetBSD Foundation, Inc. | ||||||
|  | .\" All rights reserved. | ||||||
|  | .\" | ||||||
|  | .\" This file was contributed to The NetBSD Foundation by Luke Mewburn. | ||||||
|  | .\" | ||||||
|  | .\" Redistribution and use in source and binary forms, with or without | ||||||
|  | .\" modification, are permitted provided that the following conditions | ||||||
|  | .\" are met: | ||||||
|  | .\" 1. Redistributions of source code must retain the above copyright | ||||||
|  | .\"    notice, this list of conditions and the following disclaimer. | ||||||
|  | .\" 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | .\"    notice, this list of conditions and the following disclaimer in the | ||||||
|  | .\"    documentation and/or other materials provided with the distribution. | ||||||
|  | .\" | ||||||
|  | .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | ||||||
|  | .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||||||
|  | .\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||||
|  | .\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | ||||||
|  | .\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  | .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  | .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  | .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  | .\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | .\" POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | .\" | ||||||
|  | .Dd May 22, 2016 | ||||||
|  | .Dt EDITLINE 3 | ||||||
|  | .Os | ||||||
|  | .Sh NAME | ||||||
|  | .Nm editline , | ||||||
|  | .Nm el_init , | ||||||
|  | .Nm el_init_fd , | ||||||
|  | .Nm el_end , | ||||||
|  | .Nm el_reset , | ||||||
|  | .Nm el_gets , | ||||||
|  | .Nm el_wgets , | ||||||
|  | .Nm el_getc , | ||||||
|  | .Nm el_wgetc , | ||||||
|  | .Nm el_push , | ||||||
|  | .Nm el_wpush , | ||||||
|  | .Nm el_parse , | ||||||
|  | .Nm el_wparse , | ||||||
|  | .Nm el_set , | ||||||
|  | .Nm el_wset , | ||||||
|  | .Nm el_get , | ||||||
|  | .Nm el_wget , | ||||||
|  | .Nm el_source , | ||||||
|  | .Nm el_resize , | ||||||
|  | .Nm el_cursor , | ||||||
|  | .Nm el_line , | ||||||
|  | .Nm el_wline , | ||||||
|  | .Nm el_insertstr , | ||||||
|  | .Nm el_winsertstr , | ||||||
|  | .Nm el_deletestr , | ||||||
|  | .Nm el_wdeletestr , | ||||||
|  | .Nm history_init , | ||||||
|  | .Nm history_winit , | ||||||
|  | .Nm history_end , | ||||||
|  | .Nm history_wend , | ||||||
|  | .Nm history , | ||||||
|  | .Nm history_w , | ||||||
|  | .Nm tok_init , | ||||||
|  | .Nm tok_winit , | ||||||
|  | .Nm tok_end , | ||||||
|  | .Nm tok_wend , | ||||||
|  | .Nm tok_reset , | ||||||
|  | .Nm tok_wreset , | ||||||
|  | .Nm tok_line , | ||||||
|  | .Nm tok_wline , | ||||||
|  | .Nm tok_str , | ||||||
|  | .Nm tok_wstr | ||||||
|  | .Nd line editor, history and tokenization functions | ||||||
|  | .Sh LIBRARY | ||||||
|  | .Lb libedit | ||||||
|  | .Sh SYNOPSIS | ||||||
|  | .In histedit.h | ||||||
|  | .Ft EditLine * | ||||||
|  | .Fn el_init "const char *prog" "FILE *fin" "FILE *fout" "FILE *ferr" | ||||||
|  | .Ft EditLine * | ||||||
|  | .Fn el_init_fd "const char *prog" "FILE *fin" "FILE *fout" "FILE *ferr" "int fdin" "int fdout" "int fderr" | ||||||
|  | .Ft void | ||||||
|  | .Fn el_end "EditLine *e" | ||||||
|  | .Ft void | ||||||
|  | .Fn el_reset "EditLine *e" | ||||||
|  | .Ft const char * | ||||||
|  | .Fn el_gets "EditLine *e" "int *count" | ||||||
|  | .Ft const wchar_t * | ||||||
|  | .Fn el_wgets "EditLine *e" "int *count" | ||||||
|  | .Ft int | ||||||
|  | .Fn el_getc "EditLine *e" "char *ch" | ||||||
|  | .Ft int | ||||||
|  | .Fn el_wgetc "EditLine *e" "wchar_t *wc" | ||||||
|  | .Ft void | ||||||
|  | .Fn el_push "EditLine *e" "const char *mbs" | ||||||
|  | .Ft void | ||||||
|  | .Fn el_wpush "EditLine *e" "const wchar_t *wcs" | ||||||
|  | .Ft int | ||||||
|  | .Fn el_parse "EditLine *e" "int argc" "const char *argv[]" | ||||||
|  | .Ft int | ||||||
|  | .Fn el_wparse "EditLine *e" "int argc" "const wchar_t *argv[]" | ||||||
|  | .Ft int | ||||||
|  | .Fn el_set "EditLine *e" "int op" "..." | ||||||
|  | .Ft int | ||||||
|  | .Fn el_wset "EditLine *e" "int op" "..." | ||||||
|  | .Ft int | ||||||
|  | .Fn el_get "EditLine *e" "int op" "..." | ||||||
|  | .Ft int | ||||||
|  | .Fn el_wget "EditLine *e" "int op" "..." | ||||||
|  | .Ft int | ||||||
|  | .Fn el_source "EditLine *e" "const char *file" | ||||||
|  | .Ft void | ||||||
|  | .Fn el_resize "EditLine *e" | ||||||
|  | .Ft int | ||||||
|  | .Fn el_cursor "EditLine *e" "int count" | ||||||
|  | .Ft const LineInfo * | ||||||
|  | .Fn el_line "EditLine *e" | ||||||
|  | .Ft const LineInfoW * | ||||||
|  | .Fn el_wline "EditLine *e" | ||||||
|  | .Ft int | ||||||
|  | .Fn el_insertstr "EditLine *e" "const char *str" | ||||||
|  | .Ft int | ||||||
|  | .Fn el_winsertstr "EditLine *e" "const wchar_t *str" | ||||||
|  | .Ft void | ||||||
|  | .Fn el_deletestr "EditLine *e" "int count" | ||||||
|  | .Ft void | ||||||
|  | .Fn el_wdeletestr "EditLine *e" "int count" | ||||||
|  | .Ft History * | ||||||
|  | .Fn history_init void | ||||||
|  | .Ft HistoryW * | ||||||
|  | .Fn history_winit void | ||||||
|  | .Ft void | ||||||
|  | .Fn history_end "History *h" | ||||||
|  | .Ft void | ||||||
|  | .Fn history_wend "HistoryW *h" | ||||||
|  | .Ft int | ||||||
|  | .Fn history "History *h" "HistEvent *ev" "int op" "..." | ||||||
|  | .Ft int | ||||||
|  | .Fn history_w "HistoryW *h" "HistEventW *ev" "int op" "..." | ||||||
|  | .Ft Tokenizer * | ||||||
|  | .Fn tok_init "const char *IFS" | ||||||
|  | .Ft TokenizerW * | ||||||
|  | .Fn tok_winit "const wchar_t *IFS" | ||||||
|  | .Ft void | ||||||
|  | .Fn tok_end "Tokenizer *t" | ||||||
|  | .Ft void | ||||||
|  | .Fn tok_wend "TokenizerW *t" | ||||||
|  | .Ft void | ||||||
|  | .Fn tok_reset "Tokenizer *t" | ||||||
|  | .Ft void | ||||||
|  | .Fn tok_wreset "TokenizerW *t" | ||||||
|  | .Ft int | ||||||
|  | .Fn tok_line "Tokenizer *t" "const LineInfo *li" "int *argc" "const char **argv[]" "int *cursorc" "int *cursoro" | ||||||
|  | .Ft int | ||||||
|  | .Fn tok_wline "TokenizerW *t" "const LineInfoW *li" "int *argc" "const wchar_t **argv[]" "int *cursorc" "int *cursoro" | ||||||
|  | .Ft int | ||||||
|  | .Fn tok_str "Tokenizer *t" "const char *str" "int *argc" "const char **argv[]" | ||||||
|  | .Ft int | ||||||
|  | .Fn tok_wstr "TokenizerW *t" "const wchar_t *str" "int *argc" "const wchar_t **argv[]" | ||||||
|  | .Sh DESCRIPTION | ||||||
|  | The | ||||||
|  | .Nm | ||||||
|  | library provides generic line editing, history and tokenization functions, | ||||||
|  | similar to those found in | ||||||
|  | .Xr sh 1 . | ||||||
|  | .Pp | ||||||
|  | These functions are available in the | ||||||
|  | .Nm libedit | ||||||
|  | library (which needs the | ||||||
|  | .Nm libtermcap | ||||||
|  | library). | ||||||
|  | Programs should be linked with | ||||||
|  | .Fl ledit ltermcap . | ||||||
|  | .Pp | ||||||
|  | The | ||||||
|  | .Nm | ||||||
|  | library respects the | ||||||
|  | .Ev LC_CTYPE | ||||||
|  | locale set by the application program and never uses | ||||||
|  | .Xr setlocale 3 | ||||||
|  | to change the locale. | ||||||
|  | The only locales supported are UTF-8 and the default C or POSIX locale. | ||||||
|  | If any other locale is set, behaviour is undefined. | ||||||
|  | .Sh LINE EDITING FUNCTIONS | ||||||
|  | The line editing functions use a common data structure, | ||||||
|  | .Fa EditLine , | ||||||
|  | which is created by | ||||||
|  | .Fn el_init | ||||||
|  | or | ||||||
|  | .Fn el_init_fd | ||||||
|  | and freed by | ||||||
|  | .Fn el_end . | ||||||
|  | .Pp | ||||||
|  | The wide-character functions behave the same way as their narrow | ||||||
|  | counterparts. | ||||||
|  | .Pp | ||||||
|  | The following functions are available: | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Fn el_init | ||||||
|  | Initialize the line editor, and return a data structure | ||||||
|  | to be used by all other line editing functions, or | ||||||
|  | .Dv NULL | ||||||
|  | on failure. | ||||||
|  | .Fa prog | ||||||
|  | is the name of the invoking program, used when reading the | ||||||
|  | .Xr editrc 5 | ||||||
|  | file to determine which settings to use. | ||||||
|  | .Fa fin , | ||||||
|  | .Fa fout | ||||||
|  | and | ||||||
|  | .Fa ferr | ||||||
|  | are the input, output, and error streams (respectively) to use. | ||||||
|  | In this documentation, references to | ||||||
|  | .Dq the tty | ||||||
|  | are actually to this input/output stream combination. | ||||||
|  | .It Fn el_init_fd | ||||||
|  | Like | ||||||
|  | .Fn el_init | ||||||
|  | but allows specifying file descriptors for the | ||||||
|  | .Xr stdio 3 | ||||||
|  | corresponding streams, in case those were created with | ||||||
|  | .Xr funopen 3 . | ||||||
|  | .It Fn el_end | ||||||
|  | Clean up and finish with | ||||||
|  | .Fa e , | ||||||
|  | assumed to have been created with | ||||||
|  | .Fn el_init | ||||||
|  | or | ||||||
|  | .Fn el_init_fd . | ||||||
|  | .It Fn el_reset | ||||||
|  | Reset the tty and the parser. | ||||||
|  | This should be called after an error which may have upset the tty's | ||||||
|  | state. | ||||||
|  | .It Fn el_gets | ||||||
|  | Read a line from the tty. | ||||||
|  | .Fa count | ||||||
|  | is modified to contain the number of characters read. | ||||||
|  | Returns the line read if successful, or | ||||||
|  | .Dv NULL | ||||||
|  | if no characters were read or if an error occurred. | ||||||
|  | If an error occurred, | ||||||
|  | .Fa count | ||||||
|  | is set to \-1 and | ||||||
|  | .Dv errno | ||||||
|  | contains the error code that caused it. | ||||||
|  | The return value may not remain valid across calls to | ||||||
|  | .Fn el_gets | ||||||
|  | and must be copied if the data is to be retained. | ||||||
|  | .It Fn el_wgetc | ||||||
|  | Read a wide character from the tty, respecting the current locale, | ||||||
|  | or from the input queue described in | ||||||
|  | .Xr editline 7 | ||||||
|  | if that is not empty, and store it in | ||||||
|  | .Fa wc . | ||||||
|  | If an invalid or incomplete character is found, it is discarded, | ||||||
|  | .Va errno | ||||||
|  | is set to | ||||||
|  | .Er EILSEQ , | ||||||
|  | and the next character is read and stored in | ||||||
|  | .Fa wc . | ||||||
|  | Returns 1 if a valid character was read, 0 on end of file, or \-1 on | ||||||
|  | .Xr read 2 | ||||||
|  | failure. | ||||||
|  | In the latter case, | ||||||
|  | .Va errno | ||||||
|  | is set to indicate the error. | ||||||
|  | .It Fn el_getc | ||||||
|  | Read a wide character as described for | ||||||
|  | .Fn el_wgetc | ||||||
|  | and return 0 on end of file or \-1 on failure. | ||||||
|  | If the wide character can be represented as a single-byte character, | ||||||
|  | convert it with | ||||||
|  | .Xr wctob 3 , | ||||||
|  | store the result in | ||||||
|  | .Fa ch , | ||||||
|  | and return 1; otherwise, set | ||||||
|  | .Va errno | ||||||
|  | to | ||||||
|  | .Er ERANGE | ||||||
|  | and return \-1. | ||||||
|  | In the C or POSIX locale, this simply reads a byte, but for any other | ||||||
|  | locale, including UTF-8, this is rarely useful. | ||||||
|  | .It Fn el_wpush | ||||||
|  | Push the wide character string | ||||||
|  | .Fa wcs | ||||||
|  | back onto the input queue described in | ||||||
|  | .Xr editline 7 . | ||||||
|  | If the queue overflows, for example due to a recursive macro, | ||||||
|  | or if an error occurs, for example because | ||||||
|  | .Fa wcs | ||||||
|  | is | ||||||
|  | .Dv NULL | ||||||
|  | or memory allocation fails, the function beeps at the user, | ||||||
|  | but does not report the problem to the caller. | ||||||
|  | .It Fn el_push | ||||||
|  | Use the current locale to convert the multibyte string | ||||||
|  | .Fa mbs | ||||||
|  | to a wide character string, and pass the result to | ||||||
|  | .Fn el_wpush . | ||||||
|  | .It Fn el_parse | ||||||
|  | Parses the | ||||||
|  | .Fa argv | ||||||
|  | array (which is | ||||||
|  | .Fa argc | ||||||
|  | elements in size) | ||||||
|  | to execute builtin | ||||||
|  | .Nm | ||||||
|  | commands. | ||||||
|  | If the command is prefixed with | ||||||
|  | .Dq prog : | ||||||
|  | then | ||||||
|  | .Fn el_parse | ||||||
|  | will only execute the command if | ||||||
|  | .Dq prog | ||||||
|  | matches the | ||||||
|  | .Fa prog | ||||||
|  | argument supplied to | ||||||
|  | .Fn el_init . | ||||||
|  | The return value is | ||||||
|  | \-1 if the command is unknown, | ||||||
|  | 0 if there was no error or | ||||||
|  | .Dq prog | ||||||
|  | didn't match, or | ||||||
|  | 1 if the command returned an error. | ||||||
|  | Refer to | ||||||
|  | .Xr editrc 5 | ||||||
|  | for more information. | ||||||
|  | .It Fn el_set | ||||||
|  | Set | ||||||
|  | .Nm | ||||||
|  | parameters. | ||||||
|  | .Fa op | ||||||
|  | determines which parameter to set, and each operation has its | ||||||
|  | own parameter list. | ||||||
|  | Returns 0 on success, \-1 on failure. | ||||||
|  | .Pp | ||||||
|  | The following values for | ||||||
|  | .Fa op | ||||||
|  | are supported, along with the required argument list: | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)" | ||||||
|  | Define prompt printing function as | ||||||
|  | .Fa f , | ||||||
|  | which is to return a string that contains the prompt. | ||||||
|  | .It Dv EL_PROMPT_ESC , Fa "char *(*f)(EditLine *)" , Fa "char c" | ||||||
|  | Same as | ||||||
|  | .Dv EL_PROMPT , | ||||||
|  | but the | ||||||
|  | .Fa c | ||||||
|  | argument indicates the start/stop literal prompt character. | ||||||
|  | .Pp | ||||||
|  | If a start/stop literal character is found in the prompt, the | ||||||
|  | character itself | ||||||
|  | is not printed, but characters after it are printed directly to the | ||||||
|  | terminal without affecting the state of the current line. | ||||||
|  | A subsequent second start/stop literal character ends this behavior. | ||||||
|  | This is typically used to embed literal escape sequences that change the | ||||||
|  | color/style of the terminal in the prompt. | ||||||
|  | .Dv 0 | ||||||
|  | unsets it. | ||||||
|  | .It Dv EL_REFRESH | ||||||
|  | Re-display the current line on the next terminal line. | ||||||
|  | .It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)" | ||||||
|  | Define right side prompt printing function as | ||||||
|  | .Fa f , | ||||||
|  | which is to return a string that contains the prompt. | ||||||
|  | .It Dv EL_RPROMPT_ESC , Fa "char *(*f)(EditLine *)" , Fa "char c" | ||||||
|  | Define the right prompt printing function but with a literal escape character. | ||||||
|  | .It Dv EL_TERMINAL , Fa "const char *type" | ||||||
|  | Define terminal type of the tty to be | ||||||
|  | .Fa type , | ||||||
|  | or to | ||||||
|  | .Ev TERM | ||||||
|  | if | ||||||
|  | .Fa type | ||||||
|  | is | ||||||
|  | .Dv NULL . | ||||||
|  | .It Dv EL_EDITOR , Fa "const char *mode" | ||||||
|  | Set editing mode to | ||||||
|  | .Fa mode , | ||||||
|  | which must be one of | ||||||
|  | .Dq emacs | ||||||
|  | or | ||||||
|  | .Dq vi . | ||||||
|  | .It Dv EL_SIGNAL , Fa "int flag" | ||||||
|  | If | ||||||
|  | .Fa flag | ||||||
|  | is non-zero, | ||||||
|  | .Nm | ||||||
|  | will install its own signal handler for the following signals when | ||||||
|  | reading command input: | ||||||
|  | .Dv SIGCONT , | ||||||
|  | .Dv SIGHUP , | ||||||
|  | .Dv SIGINT , | ||||||
|  | .Dv SIGQUIT , | ||||||
|  | .Dv SIGSTOP , | ||||||
|  | .Dv SIGTERM , | ||||||
|  | .Dv SIGTSTP , | ||||||
|  | and | ||||||
|  | .Dv SIGWINCH . | ||||||
|  | Otherwise, the current signal handlers will be used. | ||||||
|  | .It Dv EL_BIND , Fa "const char *" , Fa "..." , Dv NULL | ||||||
|  | Perform the | ||||||
|  | .Ic bind | ||||||
|  | builtin command. | ||||||
|  | Refer to | ||||||
|  | .Xr editrc 5 | ||||||
|  | for more information. | ||||||
|  | .It Dv EL_ECHOTC , Fa "const char *" , Fa "..." , Dv NULL | ||||||
|  | Perform the | ||||||
|  | .Ic echotc | ||||||
|  | builtin command. | ||||||
|  | Refer to | ||||||
|  | .Xr editrc 5 | ||||||
|  | for more information. | ||||||
|  | .It Dv EL_SETTC , Fa "const char *" , Fa "..." , Dv NULL | ||||||
|  | Perform the | ||||||
|  | .Ic settc | ||||||
|  | builtin command. | ||||||
|  | Refer to | ||||||
|  | .Xr editrc 5 | ||||||
|  | for more information. | ||||||
|  | .It Dv EL_SETTY , Fa "const char *" , Fa "..." , Dv NULL | ||||||
|  | Perform the | ||||||
|  | .Ic setty | ||||||
|  | builtin command. | ||||||
|  | Refer to | ||||||
|  | .Xr editrc 5 | ||||||
|  | for more information. | ||||||
|  | .It Dv EL_TELLTC , Fa "const char *" , Fa "..." , Dv NULL | ||||||
|  | Perform the | ||||||
|  | .Ic telltc | ||||||
|  | builtin command. | ||||||
|  | Refer to | ||||||
|  | .Xr editrc 5 | ||||||
|  | for more information. | ||||||
|  | .It Dv EL_ADDFN , Fa "const char *name" , Fa "const char *help" , \ | ||||||
|  | Fa "unsigned char (*func)(EditLine *e, int ch)" | ||||||
|  | Add a user defined function, | ||||||
|  | .Fn func , | ||||||
|  | referred to as | ||||||
|  | .Fa name | ||||||
|  | which is invoked when a key which is bound to | ||||||
|  | .Fa name | ||||||
|  | is entered. | ||||||
|  | .Fa help | ||||||
|  | is a description of | ||||||
|  | .Fa name . | ||||||
|  | At invocation time, | ||||||
|  | .Fa ch | ||||||
|  | is the key which caused the invocation. | ||||||
|  | The return value of | ||||||
|  | .Fn func | ||||||
|  | should be one of: | ||||||
|  | .Bl -tag -width "CC_REDISPLAY" | ||||||
|  | .It Dv CC_NORM | ||||||
|  | Add a normal character. | ||||||
|  | .It Dv CC_NEWLINE | ||||||
|  | End of line was entered. | ||||||
|  | .It Dv CC_EOF | ||||||
|  | EOF was entered. | ||||||
|  | .It Dv CC_ARGHACK | ||||||
|  | Expecting further command input as arguments, do nothing visually. | ||||||
|  | .It Dv CC_REFRESH | ||||||
|  | Refresh display. | ||||||
|  | .It Dv CC_REFRESH_BEEP | ||||||
|  | Refresh display, and beep. | ||||||
|  | .It Dv CC_CURSOR | ||||||
|  | Cursor moved, so update and perform | ||||||
|  | .Dv CC_REFRESH . | ||||||
|  | .It Dv CC_REDISPLAY | ||||||
|  | Redisplay entire input line. | ||||||
|  | This is useful if a key binding outputs extra information. | ||||||
|  | .It Dv CC_ERROR | ||||||
|  | An error occurred. | ||||||
|  | Beep, and flush tty. | ||||||
|  | .It Dv CC_FATAL | ||||||
|  | Fatal error, reset tty to known state. | ||||||
|  | .El | ||||||
|  | .It Dv EL_HIST , Fa "History *(*func)(History *, int op, ...)" , \ | ||||||
|  | Fa "const char *ptr" | ||||||
|  | Defines which history function to use, which is usually | ||||||
|  | .Fn history . | ||||||
|  | .Fa ptr | ||||||
|  | should be the value returned by | ||||||
|  | .Fn history_init . | ||||||
|  | .It Dv EL_EDITMODE , Fa "int flag" | ||||||
|  | If | ||||||
|  | .Fa flag | ||||||
|  | is non-zero, | ||||||
|  | editing is enabled (the default). | ||||||
|  | Note that this is only an indication, and does not | ||||||
|  | affect the operation of | ||||||
|  | .Nm . | ||||||
|  | At this time, it is the caller's responsibility to | ||||||
|  | check this | ||||||
|  | (using | ||||||
|  | .Fn el_get ) | ||||||
|  | to determine if editing should be enabled or not. | ||||||
|  | .It Dv EL_UNBUFFERED , Fa "int flag" | ||||||
|  | If | ||||||
|  | .Fa flag | ||||||
|  | is zero, | ||||||
|  | unbuffered mode is disabled (the default). | ||||||
|  | In unbuffered mode, | ||||||
|  | .Fn el_gets | ||||||
|  | will return immediately after processing a single character. | ||||||
|  | .It Dv EL_GETCFN , Fa "el_rfunc_t f" | ||||||
|  | Whenever reading a character, use the function | ||||||
|  | .Bd -ragged -offset indent -compact | ||||||
|  | .Ft int | ||||||
|  | .Fo f | ||||||
|  | .Fa "EditLine *e" | ||||||
|  | .Fa "wchar_t *wc" | ||||||
|  | .Fc | ||||||
|  | .Ed | ||||||
|  | which stores the character in | ||||||
|  | .Fa wc | ||||||
|  | and returns 1 on success, 0 on end of file, or \-1 on I/O or encoding | ||||||
|  | errors. | ||||||
|  | Functions internally using it include | ||||||
|  | .Fn el_wgets , | ||||||
|  | .Fn el_wgetc , | ||||||
|  | .Fn el_gets , | ||||||
|  | and | ||||||
|  | .Fn el_getc . | ||||||
|  | Initially, a builtin function is installed, and replacing it | ||||||
|  | is discouraged because writing such a function is very error prone. | ||||||
|  | The builtin function can be restored at any time by passing the | ||||||
|  | special value | ||||||
|  | .Dv EL_BUILTIN_GETCFN | ||||||
|  | instead of a function pointer. | ||||||
|  | .It Dv EL_CLIENTDATA , Fa "void *data" | ||||||
|  | Register | ||||||
|  | .Fa data | ||||||
|  | to be associated with this EditLine structure. | ||||||
|  | It can be retrieved with the corresponding | ||||||
|  | .Fn el_get | ||||||
|  | call. | ||||||
|  | .It Dv EL_SETFP , Fa "int fd" , Fa "FILE *fp" | ||||||
|  | Set the current | ||||||
|  | .Nm editline | ||||||
|  | file pointer for | ||||||
|  | .Dq input | ||||||
|  | .Fa fd | ||||||
|  | = | ||||||
|  | .Dv 0 , | ||||||
|  | .Dq output | ||||||
|  | .Fa fd | ||||||
|  | = | ||||||
|  | .Dv 1 , | ||||||
|  | or | ||||||
|  | .Dq error | ||||||
|  | .Fa fd | ||||||
|  | = | ||||||
|  | .Dv 2 | ||||||
|  | from | ||||||
|  | .Fa fp . | ||||||
|  | .El | ||||||
|  | .It Fn el_get | ||||||
|  | Get | ||||||
|  | .Nm | ||||||
|  | parameters. | ||||||
|  | .Fa op | ||||||
|  | determines which parameter to retrieve into | ||||||
|  | .Fa result . | ||||||
|  | Returns 0 if successful, \-1 otherwise. | ||||||
|  | .Pp | ||||||
|  | The following values for | ||||||
|  | .Fa op | ||||||
|  | are supported, along with actual type of | ||||||
|  | .Fa result : | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c" | ||||||
|  | Set | ||||||
|  | .Fa f | ||||||
|  | to a pointer to the function that displays the prompt. | ||||||
|  | If | ||||||
|  | .Fa c | ||||||
|  | is not | ||||||
|  | .Dv NULL , | ||||||
|  | set it to the start/stop literal prompt character. | ||||||
|  | .It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c" | ||||||
|  | Set | ||||||
|  | .Fa f | ||||||
|  | to a pointer to the function that displays the prompt. | ||||||
|  | If | ||||||
|  | .Fa c | ||||||
|  | is not | ||||||
|  | .Dv NULL , | ||||||
|  | set it to the start/stop literal prompt character. | ||||||
|  | .It Dv EL_EDITOR , Fa "const char **n" | ||||||
|  | Set the name of the editor in | ||||||
|  | .Fa n , | ||||||
|  | which will be one of | ||||||
|  | .Dq emacs | ||||||
|  | or | ||||||
|  | .Dq vi . | ||||||
|  | .It Dv EL_GETTC , Fa "const char *name" , Fa "void *value" | ||||||
|  | If | ||||||
|  | .Fa name | ||||||
|  | is a valid | ||||||
|  | .Xr termcap 5 | ||||||
|  | capability set | ||||||
|  | .Fa value | ||||||
|  | to the current value of that capability. | ||||||
|  | .It Dv EL_SIGNAL , Fa "int *s" | ||||||
|  | Set | ||||||
|  | .Fa s | ||||||
|  | to non-zero if | ||||||
|  | .Nm | ||||||
|  | has installed private signal handlers (see | ||||||
|  | .Fn el_get | ||||||
|  | above). | ||||||
|  | .It Dv EL_EDITMODE , Fa "int *c" | ||||||
|  | Set | ||||||
|  | .Fa c | ||||||
|  | to non-zero if editing is enabled. | ||||||
|  | .It Dv EL_GETCFN , Fa "el_rfunc_t *f" | ||||||
|  | Set | ||||||
|  | .Fa f | ||||||
|  | to a pointer to the function that reads characters, or to | ||||||
|  | .Dv EL_BUILTIN_GETCFN | ||||||
|  | if the builtin function is in use. | ||||||
|  | .It Dv EL_CLIENTDATA , Fa "void **data" | ||||||
|  | Set | ||||||
|  | .Fa data | ||||||
|  | to the previously registered client data set by an | ||||||
|  | .Fn el_set | ||||||
|  | call. | ||||||
|  | .It Dv EL_UNBUFFERED , Fa "int *c" | ||||||
|  | Set | ||||||
|  | .Fa c | ||||||
|  | to non-zero if unbuffered mode is enabled. | ||||||
|  | .It Dv EL_GETFP , Fa "int fd", Fa "FILE **fp" | ||||||
|  | Set | ||||||
|  | .Fa fp | ||||||
|  | to the current | ||||||
|  | .Nm editline | ||||||
|  | file pointer for | ||||||
|  | .Dq input | ||||||
|  | .Fa fd | ||||||
|  | = | ||||||
|  | .Dv 0 , | ||||||
|  | .Dq output | ||||||
|  | .Fa fd | ||||||
|  | = | ||||||
|  | .Dv 1 , | ||||||
|  | or | ||||||
|  | .Dq error | ||||||
|  | .Fa fd | ||||||
|  | = | ||||||
|  | .Dv 2 . | ||||||
|  | .El | ||||||
|  | .It Fn el_source | ||||||
|  | Initialize | ||||||
|  | .Nm | ||||||
|  | by reading the contents of | ||||||
|  | .Fa file . | ||||||
|  | .Fn el_parse | ||||||
|  | is called for each line in | ||||||
|  | .Fa file . | ||||||
|  | If | ||||||
|  | .Fa file | ||||||
|  | is | ||||||
|  | .Dv NULL , | ||||||
|  | try | ||||||
|  | .Pa $HOME/.editrc . | ||||||
|  | Refer to | ||||||
|  | .Xr editrc 5 | ||||||
|  | for details on the format of | ||||||
|  | .Fa file . | ||||||
|  | .Fn el_source | ||||||
|  | returns 0 on success and \-1 on error. | ||||||
|  | .It Fn el_resize | ||||||
|  | Must be called if the terminal size changes. | ||||||
|  | If | ||||||
|  | .Dv EL_SIGNAL | ||||||
|  | has been set with | ||||||
|  | .Fn el_set , | ||||||
|  | then this is done automatically. | ||||||
|  | Otherwise, it's the responsibility of the application to call | ||||||
|  | .Fn el_resize | ||||||
|  | on the appropriate occasions. | ||||||
|  | .It Fn el_cursor | ||||||
|  | Move the cursor to the right (if positive) or to the left (if negative) | ||||||
|  | .Fa count | ||||||
|  | characters. | ||||||
|  | Returns the resulting offset of the cursor from the beginning of the line. | ||||||
|  | .It Fn el_line | ||||||
|  | Return the editing information for the current line in a | ||||||
|  | .Fa LineInfo | ||||||
|  | structure, which is defined as follows: | ||||||
|  | .Bd -literal | ||||||
|  | typedef struct lineinfo { | ||||||
|  |     const char *buffer;    /* address of buffer */ | ||||||
|  |     const char *cursor;    /* address of cursor */ | ||||||
|  |     const char *lastchar;  /* address of last character */ | ||||||
|  | } LineInfo; | ||||||
|  | .Ed | ||||||
|  | .Pp | ||||||
|  | .Fa buffer | ||||||
|  | is not NUL terminated. | ||||||
|  | This function may be called after | ||||||
|  | .Fn el_gets | ||||||
|  | to obtain the | ||||||
|  | .Fa LineInfo | ||||||
|  | structure pertaining to line returned by that function, | ||||||
|  | and from within user defined functions added with | ||||||
|  | .Dv EL_ADDFN . | ||||||
|  | .It Fn el_insertstr | ||||||
|  | Insert | ||||||
|  | .Fa str | ||||||
|  | into the line at the cursor. | ||||||
|  | Returns \-1 if | ||||||
|  | .Fa str | ||||||
|  | is empty or won't fit, and 0 otherwise. | ||||||
|  | .It Fn el_deletestr | ||||||
|  | Delete | ||||||
|  | .Fa count | ||||||
|  | characters before the cursor. | ||||||
|  | .El | ||||||
|  | .Sh HISTORY LIST FUNCTIONS | ||||||
|  | The history functions use a common data structure, | ||||||
|  | .Fa History , | ||||||
|  | which is created by | ||||||
|  | .Fn history_init | ||||||
|  | and freed by | ||||||
|  | .Fn history_end . | ||||||
|  | .Pp | ||||||
|  | The following functions are available: | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Fn history_init | ||||||
|  | Initialize the history list, and return a data structure | ||||||
|  | to be used by all other history list functions, or | ||||||
|  | .Dv NULL | ||||||
|  | on failure. | ||||||
|  | .It Fn history_end | ||||||
|  | Clean up and finish with | ||||||
|  | .Fa h , | ||||||
|  | assumed to have been created with | ||||||
|  | .Fn history_init . | ||||||
|  | .It Fn history | ||||||
|  | Perform operation | ||||||
|  | .Fa op | ||||||
|  | on the history list, with optional arguments as needed by the | ||||||
|  | operation. | ||||||
|  | .Fa ev | ||||||
|  | is changed accordingly to operation. | ||||||
|  | The following values for | ||||||
|  | .Fa op | ||||||
|  | are supported, along with the required argument list: | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Dv H_SETSIZE , Fa "int size" | ||||||
|  | Set size of history to | ||||||
|  | .Fa size | ||||||
|  | elements. | ||||||
|  | .It Dv H_GETSIZE | ||||||
|  | Get number of events currently in history. | ||||||
|  | .It Dv H_END | ||||||
|  | Cleans up and finishes with | ||||||
|  | .Fa h , | ||||||
|  | assumed to be created with | ||||||
|  | .Fn history_init . | ||||||
|  | .It Dv H_CLEAR | ||||||
|  | Clear the history. | ||||||
|  | .It Dv H_FUNC , Fa "void *ptr" , Fa "history_gfun_t first" , \ | ||||||
|  | Fa "history_gfun_t next" , Fa "history_gfun_t last" , \ | ||||||
|  | Fa "history_gfun_t prev" , Fa "history_gfun_t curr" , \ | ||||||
|  | Fa "history_sfun_t set" , Fa "history_vfun_t clear" , \ | ||||||
|  | Fa "history_efun_t enter" , Fa "history_efun_t add" | ||||||
|  | Define functions to perform various history operations. | ||||||
|  | .Fa ptr | ||||||
|  | is the argument given to a function when it's invoked. | ||||||
|  | .It Dv H_FIRST | ||||||
|  | Return the first element in the history. | ||||||
|  | .It Dv H_LAST | ||||||
|  | Return the last element in the history. | ||||||
|  | .It Dv H_PREV | ||||||
|  | Return the previous element in the history. | ||||||
|  | It is newer than the current one. | ||||||
|  | .It Dv H_NEXT | ||||||
|  | Return the next element in the history. | ||||||
|  | It is older than the current one. | ||||||
|  | .It Dv H_CURR | ||||||
|  | Return the current element in the history. | ||||||
|  | .It Dv H_SET | ||||||
|  | Set the cursor to point to the requested element. | ||||||
|  | .It Dv H_ADD , Fa "const char *str" | ||||||
|  | Append | ||||||
|  | .Fa str | ||||||
|  | to the current element of the history, or perform the | ||||||
|  | .Dv H_ENTER | ||||||
|  | operation with argument | ||||||
|  | .Fa str | ||||||
|  | if there is no current element. | ||||||
|  | .It Dv H_APPEND , Fa "const char *str" | ||||||
|  | Append | ||||||
|  | .Fa str | ||||||
|  | to the last new element of the history. | ||||||
|  | .It Dv H_ENTER , Fa "const char *str" | ||||||
|  | Add | ||||||
|  | .Fa str | ||||||
|  | as a new element to the history and, if necessary, | ||||||
|  | removing the oldest entry to keep the list to the created size. | ||||||
|  | If | ||||||
|  | .Dv H_SETUNIQUE | ||||||
|  | has been called with a non-zero argument, the element | ||||||
|  | will not be entered into the history if its contents match | ||||||
|  | the ones of the current history element. | ||||||
|  | If the element is entered | ||||||
|  | .Fn history | ||||||
|  | returns 1; if it is ignored as a duplicate returns 0. | ||||||
|  | Finally | ||||||
|  | .Fn history | ||||||
|  | returns \-1 if an error occurred. | ||||||
|  | .It Dv H_PREV_STR , Fa "const char *str" | ||||||
|  | Return the closest previous event that starts with | ||||||
|  | .Fa str . | ||||||
|  | .It Dv H_NEXT_STR , Fa "const char *str" | ||||||
|  | Return the closest next event that starts with | ||||||
|  | .Fa str . | ||||||
|  | .It Dv H_PREV_EVENT , Fa "int e" | ||||||
|  | Return the previous event numbered | ||||||
|  | .Fa e . | ||||||
|  | .It Dv H_NEXT_EVENT , Fa "int e" | ||||||
|  | Return the next event numbered | ||||||
|  | .Fa e . | ||||||
|  | .It Dv H_LOAD , Fa "const char *file" | ||||||
|  | Load the history list stored in | ||||||
|  | .Fa file . | ||||||
|  | .It Dv H_SAVE , Fa "const char *file" | ||||||
|  | Save the history list to | ||||||
|  | .Fa file . | ||||||
|  | .It Dv H_SAVE_FP , Fa "FILE *fp" | ||||||
|  | Save the history list to the opened | ||||||
|  | .Ft FILE | ||||||
|  | pointer | ||||||
|  | .Fa fp . | ||||||
|  | .It Dv H_SETUNIQUE , Fa "int unique" | ||||||
|  | Set flag that adjacent identical event strings should not be entered | ||||||
|  | into the history. | ||||||
|  | .It Dv H_GETUNIQUE | ||||||
|  | Retrieve the current setting if adjacent identical elements should | ||||||
|  | be entered into the history. | ||||||
|  | .It Dv H_DEL , Fa "int e" | ||||||
|  | Delete the event numbered | ||||||
|  | .Fa e . | ||||||
|  | This function is only provided for | ||||||
|  | .Xr readline 3 | ||||||
|  | compatibility. | ||||||
|  | The caller is responsible for free'ing the string in the returned | ||||||
|  | .Fa HistEvent . | ||||||
|  | .El | ||||||
|  | .Pp | ||||||
|  | .Fn history | ||||||
|  | returns \*[Gt]= 0 if the operation | ||||||
|  | .Fa op | ||||||
|  | succeeds. | ||||||
|  | Otherwise, \-1 is returned and | ||||||
|  | .Fa ev | ||||||
|  | is updated to contain more details about the error. | ||||||
|  | .El | ||||||
|  | .Sh TOKENIZATION FUNCTIONS | ||||||
|  | The tokenization functions use a common data structure, | ||||||
|  | .Fa Tokenizer , | ||||||
|  | which is created by | ||||||
|  | .Fn tok_init | ||||||
|  | and freed by | ||||||
|  | .Fn tok_end . | ||||||
|  | .Pp | ||||||
|  | The following functions are available: | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Fn tok_init | ||||||
|  | Initialize the tokenizer, and return a data structure | ||||||
|  | to be used by all other tokenizer functions. | ||||||
|  | .Fa IFS | ||||||
|  | contains the Input Field Separators, which defaults to | ||||||
|  | .Aq space , | ||||||
|  | .Aq tab , | ||||||
|  | and | ||||||
|  | .Aq newline | ||||||
|  | if | ||||||
|  | .Dv NULL . | ||||||
|  | .It Fn tok_end | ||||||
|  | Clean up and finish with | ||||||
|  | .Fa t , | ||||||
|  | assumed to have been created with | ||||||
|  | .Fn tok_init . | ||||||
|  | .It Fn tok_reset | ||||||
|  | Reset the tokenizer state. | ||||||
|  | Use after a line has been successfully tokenized | ||||||
|  | by | ||||||
|  | .Fn tok_line | ||||||
|  | or | ||||||
|  | .Fn tok_str | ||||||
|  | and before a new line is to be tokenized. | ||||||
|  | .It Fn tok_line | ||||||
|  | Tokenize | ||||||
|  | .Fa li , | ||||||
|  | If successful, modify: | ||||||
|  | .Fa argv | ||||||
|  | to contain the words, | ||||||
|  | .Fa argc | ||||||
|  | to contain the number of words, | ||||||
|  | .Fa cursorc | ||||||
|  | (if not | ||||||
|  | .Dv NULL ) | ||||||
|  | to contain the index of the word containing the cursor, | ||||||
|  | and | ||||||
|  | .Fa cursoro | ||||||
|  | (if not | ||||||
|  | .Dv NULL ) | ||||||
|  | to contain the offset within | ||||||
|  | .Fa argv[cursorc] | ||||||
|  | of the cursor. | ||||||
|  | .Pp | ||||||
|  | Returns | ||||||
|  | 0 if successful, | ||||||
|  | \-1 for an internal error, | ||||||
|  | 1 for an unmatched single quote, | ||||||
|  | 2 for an unmatched double quote, | ||||||
|  | and | ||||||
|  | 3 for a backslash quoted | ||||||
|  | .Aq newline . | ||||||
|  | A positive exit code indicates that another line should be read | ||||||
|  | and tokenization attempted again. | ||||||
|  | . | ||||||
|  | .It Fn tok_str | ||||||
|  | A simpler form of | ||||||
|  | .Fn tok_line ; | ||||||
|  | .Fa str | ||||||
|  | is a NUL terminated string to tokenize. | ||||||
|  | .El | ||||||
|  | . | ||||||
|  | .\"XXX.Sh EXAMPLES | ||||||
|  | .\"XXX: provide some examples | ||||||
|  | .Sh SEE ALSO | ||||||
|  | .Xr sh 1 , | ||||||
|  | .Xr signal 3 , | ||||||
|  | .Xr termcap 3 , | ||||||
|  | .Xr editrc 5 , | ||||||
|  | .Xr termcap 5 , | ||||||
|  | .Xr editline 7 | ||||||
|  | .Sh HISTORY | ||||||
|  | The | ||||||
|  | .Nm | ||||||
|  | library first appeared in | ||||||
|  | .Bx 4.4 . | ||||||
|  | .Dv CC_REDISPLAY | ||||||
|  | appeared in | ||||||
|  | .Nx 1.3 . | ||||||
|  | .Dv CC_REFRESH_BEEP , | ||||||
|  | .Dv EL_EDITMODE | ||||||
|  | and the readline emulation appeared in | ||||||
|  | .Nx 1.4 . | ||||||
|  | .Dv EL_RPROMPT | ||||||
|  | appeared in | ||||||
|  | .Nx 1.5 . | ||||||
|  | .Sh AUTHORS | ||||||
|  | .An -nosplit | ||||||
|  | The | ||||||
|  | .Nm | ||||||
|  | library was written by | ||||||
|  | .An Christos Zoulas . | ||||||
|  | .An Luke Mewburn | ||||||
|  | wrote this manual and implemented | ||||||
|  | .Dv CC_REDISPLAY , | ||||||
|  | .Dv CC_REFRESH_BEEP , | ||||||
|  | .Dv EL_EDITMODE , | ||||||
|  | and | ||||||
|  | .Dv EL_RPROMPT . | ||||||
|  | .An Jaromir Dolecek | ||||||
|  | implemented the readline emulation. | ||||||
|  | .An Johny Mattsson | ||||||
|  | implemented wide-character support. | ||||||
|  | .Sh BUGS | ||||||
|  | At this time, it is the responsibility of the caller to | ||||||
|  | check the result of the | ||||||
|  | .Dv EL_EDITMODE | ||||||
|  | operation of | ||||||
|  | .Fn el_get | ||||||
|  | (after an | ||||||
|  | .Fn el_source | ||||||
|  | or | ||||||
|  | .Fn el_parse ) | ||||||
|  | to determine if | ||||||
|  | .Nm | ||||||
|  | should be used for further input. | ||||||
|  | I.e., | ||||||
|  | .Dv EL_EDITMODE | ||||||
|  | is purely an indication of the result of the most recent | ||||||
|  | .Xr editrc 5 | ||||||
|  | .Ic edit | ||||||
|  | command. | ||||||
							
								
								
									
										935
									
								
								lib/libedit/src/editline.7
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										935
									
								
								lib/libedit/src/editline.7
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,935 @@ | |||||||
|  | .\"	$NetBSD: editline.7,v 1.5 2016/05/09 21:27:55 christos Exp $ | ||||||
|  | .\"	$OpenBSD: editline.7,v 1.1 2016/04/20 01:11:45 schwarze Exp $ | ||||||
|  | .\" | ||||||
|  | .\" Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org> | ||||||
|  | .\" | ||||||
|  | .\" Permission to use, copy, modify, and distribute this software for any | ||||||
|  | .\" purpose with or without fee is hereby granted, provided that the above | ||||||
|  | .\" copyright notice and this permission notice appear in all copies. | ||||||
|  | .\" | ||||||
|  | .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||||
|  | .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||||
|  | .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||||
|  | .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||||
|  | .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||||
|  | .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||||||
|  | .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  | .\" | ||||||
|  | .Dd May 7, 2016 | ||||||
|  | .Dt EDITLINE 7 | ||||||
|  | .Os | ||||||
|  | .Sh NAME | ||||||
|  | .Nm editline | ||||||
|  | .Nd line editing user interface | ||||||
|  | .Sh DESCRIPTION | ||||||
|  | When a program using the | ||||||
|  | .Xr editline 3 | ||||||
|  | library prompts for an input string using the function | ||||||
|  | .Xr el_wgets 3 , | ||||||
|  | it reads characters from the terminal. | ||||||
|  | Invalid input bytes that do not form characters are silently | ||||||
|  | discarded. | ||||||
|  | For each character read, one editor command is executed. | ||||||
|  | The mapping of input characters to editor commands depends on the | ||||||
|  | editing mode. | ||||||
|  | There are three editing modes: vi insert mode, vi command mode, | ||||||
|  | and emacs mode. | ||||||
|  | The default is vi insert mode. | ||||||
|  | The program can switch the default to emacs mode by using the | ||||||
|  | .Xr el_set 3 | ||||||
|  | or | ||||||
|  | .Xr el_parse 3 | ||||||
|  | functions, and the user can switch to emacs mode either in the | ||||||
|  | .Xr editrc 5 | ||||||
|  | configuration file or interactively with the | ||||||
|  | .Ic ed-command | ||||||
|  | editor command, in all three cases executing the | ||||||
|  | .Ic bind Fl e | ||||||
|  | builtin command. | ||||||
|  | .Pp | ||||||
|  | If trying to read from the terminal results in end of file or an | ||||||
|  | error, the library signals end of file to the program and does not | ||||||
|  | return a string. | ||||||
|  | .Ss Input character bindings | ||||||
|  | All default bindings described below can be overridden by individual | ||||||
|  | programs and can be changed with the | ||||||
|  | .Xr editrc 5 | ||||||
|  | .Ic bind | ||||||
|  | builtin command. | ||||||
|  | .Pp | ||||||
|  | In the following tables, | ||||||
|  | .Sq Ctrl- | ||||||
|  | indicates a character with the bit 0x40 flipped, and | ||||||
|  | .Sq Meta- | ||||||
|  | indicates a character with the bit 0x80 set. | ||||||
|  | In vi insert mode and in emacs mode, all Meta-characters considered | ||||||
|  | printable by the current | ||||||
|  | .Xr locale 1 | ||||||
|  | are bound to | ||||||
|  | .Ic ed-insert | ||||||
|  | instead of to the editor command listed below. | ||||||
|  | Consequently, in UTF-8 mode, most of the Meta-characters are not | ||||||
|  | directly accessible because their code points are occupied by | ||||||
|  | printable Unicode characters, and Meta-characters are usually input | ||||||
|  | using the | ||||||
|  | .Ic em-meta-next | ||||||
|  | editor command. | ||||||
|  | For example, to enter | ||||||
|  | .Sq Meta-B | ||||||
|  | in order to call the | ||||||
|  | .Ic ed-prev-word | ||||||
|  | editor command in emacs mode, call | ||||||
|  | .Ic em-meta-next | ||||||
|  | by pressing and releasing the escape key (or equivalently, Ctrl-[), | ||||||
|  | then press and release the | ||||||
|  | .Sq B | ||||||
|  | key. | ||||||
|  | If you have configured a Meta-key on your keyboard, for example | ||||||
|  | with | ||||||
|  | .Ql setxkbmap -option altwin:left_meta_win , | ||||||
|  | the Ctrl-Meta-characters are directly accessible. | ||||||
|  | For example, to enter | ||||||
|  | .Sq Ctrl-Meta-H | ||||||
|  | in order to call the | ||||||
|  | .Ic ed-delete-prev-word | ||||||
|  | editor command in emacs mode, hold down the keys | ||||||
|  | .Sq Ctrl , | ||||||
|  | .Sq Meta , | ||||||
|  | and | ||||||
|  | .Sq H | ||||||
|  | at the same time. | ||||||
|  | Alternatively, press and release the escape key, then press and | ||||||
|  | release | ||||||
|  | .Sq Ctrl-H . | ||||||
|  | .Pp | ||||||
|  | In vi input mode, input characters are bound to the following editor | ||||||
|  | commands by default: | ||||||
|  | .Bl -column -offset indent "Ctrl-Z, TSTP" "ed-search-next-history" | ||||||
|  | .It Ctrl-D, EOF Ta Ic vi-list-or-eof | ||||||
|  | .It Ctrl-H, BS Ta Ic vi-delete-prev-char | ||||||
|  | .It Ctrl-J, LF Ta Ic ed-newline | ||||||
|  | .It Ctrl-M, CR Ta Ic ed-newline | ||||||
|  | .It Ctrl-Q Ta Ic ed-tty-start-output | ||||||
|  | .It Ctrl-S Ta Ic ed-tty-stop-output | ||||||
|  | .It Ctrl-U Ta Ic vi-kill-line-prev | ||||||
|  | .It Ctrl-V Ta Ic ed-quoted-insert | ||||||
|  | .It Ctrl-W Ta Ic ed-delete-prev-word | ||||||
|  | .It Ctrl-[, ESC Ta Ic vi-command-mode | ||||||
|  | .It Ctrl-\e, QUIT Ta Ic ed-tty-sigquit | ||||||
|  | .It Ctrl-?, DEL Ta Ic vi-delete-prev-char | ||||||
|  | .El | ||||||
|  | .Pp | ||||||
|  | All other input characters except the NUL character (Ctrl-@) are | ||||||
|  | bound to | ||||||
|  | .Ic ed-insert . | ||||||
|  | .Pp | ||||||
|  | In vi command mode, input characters are bound to the following | ||||||
|  | editor commands by default: | ||||||
|  | .Bl -column -offset indent "Ctrl-Z, TSTP" "ed-search-next-history" | ||||||
|  | .It Ctrl-A Ta Ic ed-move-to-beg | ||||||
|  | .It Ctrl-C, INT Ta Ic ed-tty-sigint | ||||||
|  | .It Ctrl-E Ta Ic ed-move-to-end | ||||||
|  | .It Ctrl-H, BS Ta Ic ed-delete-prev-char | ||||||
|  | .It Ctrl-J, LF Ta Ic ed-newline | ||||||
|  | .It Ctrl-K Ta Ic ed-kill-line | ||||||
|  | .It Ctrl-L, FF Ta Ic ed-clear-screen | ||||||
|  | .It Ctrl-M, CR Ta Ic ed-newline | ||||||
|  | .It Ctrl-N Ta Ic ed-next-history | ||||||
|  | .It Ctrl-O Ta Ic ed-tty-flush-output | ||||||
|  | .It Ctrl-P Ta Ic ed-prev-history | ||||||
|  | .It Ctrl-Q Ta Ic ed-tty-start-output | ||||||
|  | .It Ctrl-R Ta Ic ed-redisplay | ||||||
|  | .It Ctrl-S Ta Ic ed-tty-stop-output | ||||||
|  | .It Ctrl-U Ta Ic vi-kill-line-prev | ||||||
|  | .It Ctrl-W Ta Ic ed-delete-prev-word | ||||||
|  | .It Ctrl-[, ESC Ta Ic em-meta-next | ||||||
|  | .It Ctrl-\e, QUIT Ta Ic ed-tty-sigquit | ||||||
|  | .It Space Ta Ic ed-next-char | ||||||
|  | .It # Ta Ic vi-comment-out | ||||||
|  | .It $ Ta Ic ed-move-to-end | ||||||
|  | .It % Ta Ic vi-match | ||||||
|  | .It + Ta Ic ed-next-history | ||||||
|  | .It \&, Ta Ic vi-repeat-prev-char | ||||||
|  | .It - Ta Ic ed-prev-history | ||||||
|  | .It \&. Ta Ic vi-redo | ||||||
|  | .It / Ta Ic vi-search-prev | ||||||
|  | .It 0 Ta Ic vi-zero | ||||||
|  | .It 1 to 9 Ta Ic ed-argument-digit | ||||||
|  | .It \&: Ta Ic ed-command | ||||||
|  | .It \&; Ta Ic vi-repeat-next-char | ||||||
|  | .It \&? Ta Ic vi-search-next | ||||||
|  | .It @ Ta Ic vi-alias | ||||||
|  | .It A Ta Ic vi-add-at-eol | ||||||
|  | .It B Ta Ic vi-prev-big-word | ||||||
|  | .It C Ta Ic vi-change-to-eol | ||||||
|  | .It D Ta Ic ed-kill-line | ||||||
|  | .It E Ta Ic vi-end-big-word | ||||||
|  | .It F Ta Ic vi-prev-char | ||||||
|  | .It G Ta Ic vi-to-history-line | ||||||
|  | .It I Ta Ic vi-insert-at-bol | ||||||
|  | .It J Ta Ic ed-search-next-history | ||||||
|  | .It K Ta Ic ed-search-prev-history | ||||||
|  | .It N Ta Ic vi-repeat-search-prev | ||||||
|  | .It O Ta Ic ed-sequence-lead-in | ||||||
|  | .It P Ta Ic vi-paste-prev | ||||||
|  | .It R Ta Ic vi-replace-mode | ||||||
|  | .It S Ta Ic vi-substitute-line | ||||||
|  | .It T Ta Ic vi-to-prev-char | ||||||
|  | .It U Ta Ic vi-undo-line | ||||||
|  | .It W Ta Ic vi-next-big-word | ||||||
|  | .It X Ta Ic ed-delete-prev-char | ||||||
|  | .It Y Ta Ic vi-yank-end | ||||||
|  | .It \&[ Ta Ic ed-sequence-lead-in | ||||||
|  | .It ^ Ta Ic ed-move-to-beg | ||||||
|  | .It _ Ta Ic vi-history-word | ||||||
|  | .It a Ta Ic vi-add | ||||||
|  | .It b Ta Ic vi-prev-word | ||||||
|  | .It c Ta Ic vi-change-meta | ||||||
|  | .It d Ta Ic vi-delete-meta | ||||||
|  | .It e Ta Ic vi-end-word | ||||||
|  | .It f Ta Ic vi-next-char | ||||||
|  | .It h Ta Ic ed-prev-char | ||||||
|  | .It i Ta Ic vi-insert | ||||||
|  | .It j Ta Ic ed-next-history | ||||||
|  | .It k Ta Ic ed-prev-history | ||||||
|  | .It l Ta Ic ed-next-char | ||||||
|  | .It n Ta Ic vi-repeat-search-next | ||||||
|  | .It p Ta Ic vi-paste-next | ||||||
|  | .It r Ta Ic vi-replace-char | ||||||
|  | .It s Ta Ic vi-substitute-char | ||||||
|  | .It t Ta Ic vi-to-next-char | ||||||
|  | .It u Ta Ic vi-undo | ||||||
|  | .It v Ta Ic vi-histedit | ||||||
|  | .It w Ta Ic vi-next-word | ||||||
|  | .It x Ta Ic ed-delete-next-char | ||||||
|  | .It y Ta Ic vi-yank | ||||||
|  | .It \&| Ta Ic vi-to-column | ||||||
|  | .It ~ Ta Ic vi-change-case | ||||||
|  | .It Ctrl-?, DEL Ta Ic ed-delete-prev-char | ||||||
|  | .It Meta-O Ta Ic ed-sequence-lead-in | ||||||
|  | .It Meta-[ Ta Ic ed-sequence-lead-in | ||||||
|  | .El | ||||||
|  | .Pp | ||||||
|  | In emacs mode, input characters are bound to the following editor | ||||||
|  | commands by default: | ||||||
|  | .Bl -column -offset indent "Ctrl-Z, TSTP" "ed-search-next-history" | ||||||
|  | .It 0 to 9 Ta Ic ed-digit | ||||||
|  | .It Ctrl-@, NUL Ta Ic em-set-mark | ||||||
|  | .It Ctrl-A Ta Ic ed-move-to-beg | ||||||
|  | .It Ctrl-B Ta Ic ed-prev-char | ||||||
|  | .It Ctrl-C, INT Ta Ic ed-tty-sigint | ||||||
|  | .It Ctrl-D, EOF Ta Ic em-delete-or-list | ||||||
|  | .It Ctrl-E Ta Ic ed-move-to-end | ||||||
|  | .It Ctrl-F Ta Ic ed-next-char | ||||||
|  | .It Ctrl-H, BS Ta Ic em-delete-prev-char | ||||||
|  | .It Ctrl-J, LF Ta Ic ed-newline | ||||||
|  | .It Ctrl-K Ta Ic ed-kill-line | ||||||
|  | .It Ctrl-L, FF Ta Ic ed-clear-screen | ||||||
|  | .It Ctrl-M, CR Ta Ic ed-newline | ||||||
|  | .It Ctrl-N Ta Ic ed-next-history | ||||||
|  | .It Ctrl-O Ta Ic ed-tty-flush-output | ||||||
|  | .It Ctrl-P Ta Ic ed-prev-history | ||||||
|  | .It Ctrl-Q Ta Ic ed-tty-start-output | ||||||
|  | .It Ctrl-R Ta Ic ed-redisplay | ||||||
|  | .It Ctrl-S Ta Ic ed-tty-stop-output | ||||||
|  | .It Ctrl-T Ta Ic ed-transpose-chars | ||||||
|  | .It Ctrl-U Ta Ic ed-kill-line | ||||||
|  | .It Ctrl-V Ta Ic ed-quoted-insert | ||||||
|  | .It Ctrl-W Ta Ic em-kill-region | ||||||
|  | .It Ctrl-X Ta Ic ed-sequence-lead-in | ||||||
|  | .It Ctrl-Y Ta Ic em-yank | ||||||
|  | .It Ctrl-Z, TSTP Ta Ic ed-tty-sigtstp | ||||||
|  | .It Ctrl-[, ESC Ta Ic em-meta-next | ||||||
|  | .It Ctrl-\e, QUIT Ta Ic ed-tty-sigquit | ||||||
|  | .It Ctrl-] Ta Ic ed-tty-dsusp | ||||||
|  | .It Ctrl-?, DEL Ta Ic em-delete-prev-char | ||||||
|  | .It Ctrl-Meta-H Ta Ic ed-delete-prev-word | ||||||
|  | .It Ctrl-Meta-L Ta Ic ed-clear-screen | ||||||
|  | .It Ctrl-Meta-_ Ta Ic em-copy-prev-word | ||||||
|  | .It Meta-0 to 9 Ta Ic ed-argument-digit | ||||||
|  | .It Meta-B Ta Ic ed-prev-word | ||||||
|  | .It Meta-C Ta Ic em-capitol-case | ||||||
|  | .It Meta-D Ta Ic em-delete-next-word | ||||||
|  | .It Meta-F Ta Ic em-next-word | ||||||
|  | .It Meta-L Ta Ic em-lower-case | ||||||
|  | .It Meta-N Ta Ic ed-search-next-history | ||||||
|  | .It Meta-O Ta Ic ed-sequence-lead-in | ||||||
|  | .It Meta-P Ta Ic ed-search-prev-history | ||||||
|  | .It Meta-U Ta Ic em-upper-case | ||||||
|  | .It Meta-W Ta Ic em-copy-region | ||||||
|  | .It Meta-X Ta Ic ed-command | ||||||
|  | .It Meta-[ Ta Ic ed-sequence-lead-in | ||||||
|  | .It Meta-b Ta Ic ed-prev-word | ||||||
|  | .It Meta-c Ta Ic em-capitol-case | ||||||
|  | .It Meta-d Ta Ic em-delete-next-word | ||||||
|  | .It Meta-f Ta Ic em-next-word | ||||||
|  | .It Meta-l Ta Ic em-lower-case | ||||||
|  | .It Meta-n Ta Ic ed-search-next-history | ||||||
|  | .It Meta-p Ta Ic ed-search-prev-history | ||||||
|  | .It Meta-u Ta Ic em-upper-case | ||||||
|  | .It Meta-w Ta Ic em-copy-region | ||||||
|  | .It Meta-x Ta Ic ed-command | ||||||
|  | .It Ctrl-Meta-? Ta Ic ed-delete-prev-word | ||||||
|  | .El | ||||||
|  | .Pp | ||||||
|  | The remaining | ||||||
|  | .Xr ascii 7 | ||||||
|  | characters in the range 0x20 to 0x7e are bound to | ||||||
|  | .Ic ed-insert . | ||||||
|  | .Pp | ||||||
|  | If standard output is not connected to a terminal device | ||||||
|  | or | ||||||
|  | .Xr el_set 3 | ||||||
|  | was used to set | ||||||
|  | .Dv EL_EDITMODE | ||||||
|  | to 0, all input character bindings are disabled and all characters | ||||||
|  | typed are appended to the edit buffer. | ||||||
|  | In that case, the edit buffer is returned to the program after a | ||||||
|  | newline or carriage return character is typed, or after the first | ||||||
|  | character typed if | ||||||
|  | .Xr el_set 3 | ||||||
|  | was used to set | ||||||
|  | .Dv EL_UNBUFFERED | ||||||
|  | to non-zero. | ||||||
|  | .Ss Editor commands | ||||||
|  | Most editor commands accept an optional argument. | ||||||
|  | The argument is entered by prefixing the editor command with one | ||||||
|  | or more of the editor commands | ||||||
|  | .Ic ed-argument-digit , | ||||||
|  | .Ic ed-digit , | ||||||
|  | .Ic em-universal-argument , | ||||||
|  | or | ||||||
|  | .Ic vi-zero . | ||||||
|  | When an argument is not provided, it defaults to 1. | ||||||
|  | For most editor commands, the effect of an argument is to repeatedly | ||||||
|  | execute the command that number of times. | ||||||
|  | .Pp | ||||||
|  | When talking about a character string from a left character to a | ||||||
|  | right character, the left character is included in the string, while | ||||||
|  | the right character is not included. | ||||||
|  | .Pp | ||||||
|  | If an editor command causes an error, the input character is discarded, | ||||||
|  | no action occurs, and the terminal bell is rung. | ||||||
|  | In case of a non-fatal error, the terminal bell is also rung, | ||||||
|  | but the editor command takes effect anyway. | ||||||
|  | .Pp | ||||||
|  | In the following list, the default key bindings are listed after | ||||||
|  | each editor command. | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Ic ed-argument-digit Pq vi command: 1 to 9; emacs: Meta-0 to Meta-9 | ||||||
|  | If in argument input mode, append the input digit to the argument | ||||||
|  | being read. | ||||||
|  | Otherwise, switch to argument input mode and use the input digit | ||||||
|  | as the most significant digit of the argument. | ||||||
|  | It is an error if the input character is not a digit or if the | ||||||
|  | existing argument is already greater than a million. | ||||||
|  | .It Ic ed-clear-screen Pq vi command: Ctrl-L; emacs: Ctrl-L, Ctrl-Meta-L | ||||||
|  | Clear the screen and display the edit buffer at the top. | ||||||
|  | Ignore any argument. | ||||||
|  | .It Ic ed-command Pq vi command: So \&: Sc ; emacs: Meta-X, Meta-x | ||||||
|  | Read a line from the terminal bypassing the normal line editing | ||||||
|  | functionality and execute that line as an | ||||||
|  | .Xr editrc 5 | ||||||
|  | builtin command. | ||||||
|  | If in vi command mode, also switch back to vi insert mode. | ||||||
|  | Ignore any argument. | ||||||
|  | .It Ic ed-delete-next-char Pq vi command: x | ||||||
|  | Delete the character at the cursor position. | ||||||
|  | With an argument, delete that number of characters. | ||||||
|  | In emacs mode, it is an error if the cursor is at the end of the | ||||||
|  | edit buffer. | ||||||
|  | In vi mode, the last character in the edit buffer is deleted in | ||||||
|  | that case, and it is an error if the buffer is empty. | ||||||
|  | .It Ic ed-delete-prev-char Pq vi command: X, Ctrl-H, BS, Ctrl-?, DEL | ||||||
|  | Delete the character to the left of the cursor position. | ||||||
|  | With an argument, delete that number of characters. | ||||||
|  | It is an error if the cursor is at the beginning of the edit buffer. | ||||||
|  | .It Ic ed-delete-prev-word Pq vi: Ctrl-W; emacs: Ctrl-Meta-H, Ctrl-Meta-? | ||||||
|  | Move to the left to the closest beginning of a word, delete the | ||||||
|  | string from that position to the cursor, and save it to the cut | ||||||
|  | buffer. | ||||||
|  | With an argument, delete that number of words. | ||||||
|  | It is an error if the cursor is at the beginning of the edit buffer. | ||||||
|  | .It Ic ed-digit Pq emacs: 0 to 9 | ||||||
|  | If in argument input mode, append the input digit to the argument | ||||||
|  | being read. | ||||||
|  | Otherwise, call | ||||||
|  | .Ic ed-insert . | ||||||
|  | It is an error if the input character is not a digit or if the | ||||||
|  | existing argument is already greater than a million. | ||||||
|  | .It Ic ed-end-of-file Pq not bound by default | ||||||
|  | Discard the edit buffer and indicate end of file to the program. | ||||||
|  | Ignore any argument. | ||||||
|  | .It Ic ed-ignore Pq various | ||||||
|  | Discard the input character and do nothing. | ||||||
|  | .It Ic ed-insert Pq vi input: almost all; emacs: printable characters | ||||||
|  | In insert mode, insert the input character left of the cursor | ||||||
|  | position. | ||||||
|  | In replace mode, overwrite the character at the cursor and move the | ||||||
|  | cursor to the right by one character position. | ||||||
|  | Accept an argument to do this repeatedly. | ||||||
|  | It is an error if the input character is the NUL character (Ctrl-@). | ||||||
|  | Failure to enlarge the edit buffer also results in an error. | ||||||
|  | .It Ic ed-kill-line Pq vi command: D, Ctrl-K; emacs: Ctrl-K, Ctrl-U | ||||||
|  | Delete the string from the cursor position to the end of the line | ||||||
|  | and save it to the cut buffer. | ||||||
|  | Ignore any argument. | ||||||
|  | .It Ic ed-move-to-beg Pq vi command: ^, Ctrl-A; emacs: Ctrl-A | ||||||
|  | In vi mode, move the cursor to the first non-space character in the | ||||||
|  | edit buffer. | ||||||
|  | In emacs mode, move the cursor to the beginning of the edit buffer. | ||||||
|  | Ignore any argument. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | .It Ic ed-move-to-end Pq vi command: $, Ctrl-E; emacs: Ctrl-E | ||||||
|  | Move the cursor to the end of the edit buffer. | ||||||
|  | Ignore any argument. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | .It Ic ed-newline Pq all modes: Ctrl-J, LF, Ctrl-M, CR | ||||||
|  | Append a newline character to the edit buffer and return the edit | ||||||
|  | buffer to the program. | ||||||
|  | Ignore any argument. | ||||||
|  | .It Ic ed-next-char Pq vi command: Space, l; emacs: Ctrl-F | ||||||
|  | Move the cursor one character position to the right. | ||||||
|  | With an argument, move by that number of characters. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the end of the edit | ||||||
|  | buffer. | ||||||
|  | .It Ic ed-next-history Pq vi command: j, +, Ctrl-N; emacs: Ctrl-N | ||||||
|  | Replace the edit buffer with the next history line. | ||||||
|  | That line is older than the current line. | ||||||
|  | With an argument, go forward by that number of history lines. | ||||||
|  | It is a non-fatal error to advance by more lines than are available. | ||||||
|  | .It Ic ed-next-line Pq not bound by default | ||||||
|  | Move the cursor down one line. | ||||||
|  | With an argument, move down by that number of lines. | ||||||
|  | It is an error if the edit buffer does not contain enough newline | ||||||
|  | characters to the right of the cursor position. | ||||||
|  | .It Ic ed-prev-char Pq vi command: h; emacs: Ctrl-B | ||||||
|  | Move the cursor one character position to the left. | ||||||
|  | With an argument, move by that number of characters. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the beginning of the | ||||||
|  | edit buffer. | ||||||
|  | .It Ic ed-prev-history Pq vi command: k, -, Ctrl-P; emacs: Ctrl-P | ||||||
|  | Replace the edit buffer with the previous history line. | ||||||
|  | That line is newer than the current line. | ||||||
|  | With an argument, go back by that number of lines. | ||||||
|  | It is a non-fatal error to back up by more lines than are available. | ||||||
|  | .It Ic ed-prev-line Pq not bound by default | ||||||
|  | Move the cursor up one line. | ||||||
|  | With an argument, move up by that number of lines. | ||||||
|  | It is an error if the edit buffer does not contain enough newline | ||||||
|  | characters to the left of the cursor position. | ||||||
|  | .It Ic ed-prev-word Pq emacs: Meta-B, Meta-b | ||||||
|  | Move the cursor to the left to the closest beginning of a word. | ||||||
|  | With an argument, repeat that number of times. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the beginning of the | ||||||
|  | edit buffer. | ||||||
|  | .It Ic ed-quoted-insert Pq vi insert, emacs: Ctrl-V | ||||||
|  | Read one character from the terminal bypassing the normal line | ||||||
|  | editing functionality and call | ||||||
|  | .Ic ed-insert | ||||||
|  | on it. | ||||||
|  | If trying to read the character returns end of file or an error, | ||||||
|  | call | ||||||
|  | .Ic ed-end-of-file | ||||||
|  | instead. | ||||||
|  | .It Ic ed-redisplay Pq vi command, emacs: Ctrl-R | ||||||
|  | Redisplay everything. | ||||||
|  | Ignore any argument. | ||||||
|  | .It Ic ed-search-next-history Pq vi command: J; emacs: Meta-N, Meta-n | ||||||
|  | Replace the edit buffer with the next matching history entry. | ||||||
|  | .It Ic ed-search-prev-history Pq vi command: K; emacs: Meta-P, Meta-p | ||||||
|  | Replace the edit buffer with the previous matching history entry. | ||||||
|  | .It Ic ed-sequence-lead-in Pq vi cmd: O, \&[; emacs: Ctrl-X;\ | ||||||
|  |  both: Meta-O, Meta-[ | ||||||
|  | Call a macro. | ||||||
|  | See the section about | ||||||
|  | .Sx Macros | ||||||
|  | below for details. | ||||||
|  | .It Ic ed-start-over Pq not bound by default | ||||||
|  | Discard the contents of the edit buffer and start from scratch. | ||||||
|  | Ignore any argument. | ||||||
|  | .It Ic ed-transpose-chars Pq emacs: Ctrl-T | ||||||
|  | Exchange the character at the cursor position with the one to the | ||||||
|  | left of it and move the cursor to the character to the right of the | ||||||
|  | two exchanged characters. | ||||||
|  | Ignore any argument. | ||||||
|  | It is an error if the cursor is at the beginning of the edit buffer | ||||||
|  | or if the edit buffer contains less than two characters. | ||||||
|  | .It Ic ed-unassigned Pq all characters not listed | ||||||
|  | This editor command always results in an error. | ||||||
|  | .It Ic em-capitol-case Pq emacs: Meta-C, Meta-c | ||||||
|  | Capitalize the string from the cursor to the end of the current | ||||||
|  | word. | ||||||
|  | That is, if it contains at least one alphabetic character, convert | ||||||
|  | the first alphabetic character to upper case, and convert all | ||||||
|  | characters to the right of it to lower case. | ||||||
|  | In any case, move the cursor to the next character after the end | ||||||
|  | of the current word. | ||||||
|  | .It Ic em-copy-prev-word Pq emacs: Ctrl-Meta-_ | ||||||
|  | Copy the string from the beginning of the current word to the cursor | ||||||
|  | and insert it to the left of the cursor. | ||||||
|  | Move the cursor to the character after the inserted string. | ||||||
|  | It is an error if the cursor is at the beginning of the edit buffer. | ||||||
|  | .It Ic em-copy-region Pq emacs: Meta-W, Meta-w | ||||||
|  | Copy the string from the cursor to the mark to the cut buffer. | ||||||
|  | It is an error if the mark is not set. | ||||||
|  | .It Ic em-delete-next-word Pq emacs: Meta-D, Meta-d | ||||||
|  | Delete the string from the cursor to the end of the current word | ||||||
|  | and save it to the cut buffer. | ||||||
|  | It is an error if the cursor is at the end of the edit buffer. | ||||||
|  | .It Ic em-delete-or-list Pq emacs: Ctrl-D, EOF | ||||||
|  | If the cursor is not at the end of the line, delete the character | ||||||
|  | at the cursor. | ||||||
|  | If the edit buffer is empty, indicate end of file to the program. | ||||||
|  | It is an error if the cursor is at the end of the edit buffer and | ||||||
|  | the edit buffer is not empty. | ||||||
|  | .It Ic em-delete-prev-char Pq emacs: Ctrl-H, BS, Ctrl-?, DEL | ||||||
|  | Delete the character to the left of the cursor. | ||||||
|  | It is an error if the cursor is at the beginning of the edit buffer. | ||||||
|  | .It Ic em-exchange-mark Pq not bound by default | ||||||
|  | Exchange the cursor and the mark. | ||||||
|  | .It Ic em-gosmacs-transpose Pq not bound by default | ||||||
|  | Exchange the two characters to the left of the cursor. | ||||||
|  | It is an error if the cursor is on the first or second character | ||||||
|  | of the edit buffer. | ||||||
|  | .It Ic em-inc-search-next Pq not bound by default | ||||||
|  | Emacs incremental next search. | ||||||
|  | .It Ic em-inc-search-prev Pq not bound by default | ||||||
|  | Emacs incremental reverse search. | ||||||
|  | .It Ic em-kill-line Pq not bound by default | ||||||
|  | Delete the entire contents of the edit buffer and save it to the | ||||||
|  | cut buffer. | ||||||
|  | .It Ic em-kill-region Pq emacs: Ctrl-W | ||||||
|  | Delete the string from the cursor to the mark and save it to the | ||||||
|  | cut buffer. | ||||||
|  | It is an error if the mark is not set. | ||||||
|  | .It Ic em-lower-case Pq emacs: Meta-L, Meta-l | ||||||
|  | Convert the characters from the cursor to the end of the current | ||||||
|  | word to lower case. | ||||||
|  | .It Ic em-meta-next Pq vi command, emacs: Ctrl-[, ESC | ||||||
|  | Set the bit 0x80 on the next character typed. | ||||||
|  | Unless the resulting code point is printable, holding down the | ||||||
|  | .Sq Meta- | ||||||
|  | key while typing that character is a simpler way to achieve the | ||||||
|  | same effect. | ||||||
|  | .It Ic em-next-word Pq Meta-F, Meta-f | ||||||
|  | Move the cursor to the end of the current word. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the end of the edit | ||||||
|  | buffer. | ||||||
|  | .It Ic em-set-mark Pq emacs: Ctrl-Q, NUL | ||||||
|  | Set the mark at the current cursor position. | ||||||
|  | .It Ic em-toggle-overwrite Pq not bound by default | ||||||
|  | Switch from insert to overwrite mode or vice versa. | ||||||
|  | .It Ic em-universal-argument Pq not bound by default | ||||||
|  | If in argument input mode, multiply the argument by 4. | ||||||
|  | Otherwise, switch to argument input mode and set the argument to 4. | ||||||
|  | It is an error if the existing argument is already greater than a | ||||||
|  | million. | ||||||
|  | .It Ic em-upper-case Pq emacs: Meta-U, Meta-u | ||||||
|  | Convert the characters from the cursor to the end of the current | ||||||
|  | word to upper case. | ||||||
|  | .It Ic em-yank Pq emacs: Ctrl-Y | ||||||
|  | Paste the cut buffer to the left of the cursor. | ||||||
|  | .It Ic vi-add Pq vi command: a | ||||||
|  | Switch to vi insert mode. | ||||||
|  | Unless the cursor is already at the end of the edit buffer, move | ||||||
|  | it one character position to the right. | ||||||
|  | .It Ic vi-add-at-eol Pq vi command: A | ||||||
|  | Switch to vi insert mode and move the cursor to the end of the edit | ||||||
|  | buffer. | ||||||
|  | .It Ic vi-alias Pq vi command: @ | ||||||
|  | If an alias function was defined by calling the | ||||||
|  | .Xr el_set 3 | ||||||
|  | or | ||||||
|  | .Xr el_wset 3 | ||||||
|  | function with the argument | ||||||
|  | .Dv EL_ALIAS_TEXT , | ||||||
|  | read one character from the terminal bypassing the normal line | ||||||
|  | editing functionality, call the alias function passing the argument that was specified with | ||||||
|  | .Dv EL_ALIAS_TEXT | ||||||
|  | as the first argument and the character read, with an underscore | ||||||
|  | prepended, as the second argument, and pass the string returned | ||||||
|  | from the alias function to | ||||||
|  | .Xr el_wpush 3 . | ||||||
|  | It is an error if no alias function is defined or if trying to read | ||||||
|  | the character results in end of file or an error. | ||||||
|  | .It Ic vi-change-case Pq vi command: ~ | ||||||
|  | Change the case of the character at the cursor and move the cursor | ||||||
|  | one character position to the right. | ||||||
|  | It is an error if the cursor is already at the end of the edit | ||||||
|  | buffer. | ||||||
|  | .It Ic vi-change-meta Pq vi command: c | ||||||
|  | Delete the string from the cursor to the position specified by the | ||||||
|  | following movement command and save a copy of it to the cut buffer. | ||||||
|  | When given twice in a row, instead delete the whole contents of the | ||||||
|  | edit buffer and save a copy of it to the cut buffer. | ||||||
|  | In either case, switch to vi insert mode after that. | ||||||
|  | .It Ic vi-change-to-eol Pq vi command: C | ||||||
|  | Delete the string from the cursor position to the end of the line | ||||||
|  | and save it to the cut buffer, then switch to vi insert mode. | ||||||
|  | .It Ic vi-command-mode Pq vi insert: Ctrl-[, ESC | ||||||
|  | Discard pending actions and arguments and switch to vi command mode. | ||||||
|  | Unless the cursor is already at the beginning of the edit buffer, | ||||||
|  | move it to the left by one character position. | ||||||
|  | .It Ic vi-comment-out Pq vi command: # | ||||||
|  | Insert a | ||||||
|  | .Sq # | ||||||
|  | character at the beginning of the edit buffer and return the edit | ||||||
|  | buffer to the program. | ||||||
|  | .It Ic vi-delete-meta Pq vi command: d | ||||||
|  | Delete the string from the cursor to the position specified by the | ||||||
|  | following movement command and save a copy of it to the cut buffer. | ||||||
|  | When given twice in a row, instead delete the whole contents of the | ||||||
|  | edit buffer and save a copy of it to the cut buffer. | ||||||
|  | .It Ic vi-delete-prev-char Pq vi insert: Ctrl-H, BS, Ctrl-?, DEL | ||||||
|  | Delete the character to the left of the cursor. | ||||||
|  | It is an error if the cursor is already at the beginning of the | ||||||
|  | edit buffer. | ||||||
|  | .It Ic vi-end-big-word Pq vi command: E | ||||||
|  | Move the cursor to the end of the current space delimited word. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the end of the edit | ||||||
|  | buffer. | ||||||
|  | .It Ic vi-end-word Pq vi command: e | ||||||
|  | Move the cursor to the end of the current word. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the end of the edit | ||||||
|  | buffer. | ||||||
|  | .It Ic vi-history-word Pq vi command: _ | ||||||
|  | Insert the first word from the most recent history entry after the | ||||||
|  | cursor, move the cursor after to the character after the inserted | ||||||
|  | word, and switch to vi insert mode. | ||||||
|  | It is an error if there is no history entry or the most recent | ||||||
|  | history entry is empty. | ||||||
|  | .It Ic vi-insert Pq vi command: i | ||||||
|  | Enter insert mode. | ||||||
|  | .It Ic vi-insert-at-bol Pq vi command: I | ||||||
|  | Move the cursor to the beginning of the edit buffer and switch to | ||||||
|  | vi insert mode. | ||||||
|  | .It Ic vi-kill-line-prev Pq vi: Ctrl-U | ||||||
|  | Delete the string from the beginning of the edit buffer to the | ||||||
|  | cursor and save it to the cut buffer. | ||||||
|  | .It Ic vi-list-or-eof Pq vi insert: Ctrl-D, EOF | ||||||
|  | If the edit buffer is empty, indicate end of file to the program. | ||||||
|  | It is an error if the edit buffer is not empty. | ||||||
|  | .It Ic vi-match Pq vi command: % | ||||||
|  | Consider opening and closing parentheses, braces, and brackets as | ||||||
|  | delimiters. | ||||||
|  | If the cursor is not at a delimiter, move it to the right until it | ||||||
|  | gets to one, then move it to the matching delimiter. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if there is no delimiter at the cursor or in the | ||||||
|  | string to the right of the cursor, or if the first such delimiter | ||||||
|  | has no matching delimiter. | ||||||
|  | .It Ic vi-next-big-word Pq vi command: W | ||||||
|  | Move the cursor to the right to the beginning of the next space | ||||||
|  | delimited word. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the end of the edit | ||||||
|  | buffer or on its last character. | ||||||
|  | .It Ic vi-next-char Pq vi command: f | ||||||
|  | Read one character from the terminal bypassing the normal line | ||||||
|  | editing functionality and move the cursor to the right to the next | ||||||
|  | instance of that character in the edit buffer. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | If trying to read the character results in end of file or an error, | ||||||
|  | call | ||||||
|  | .Ic ed-end-of-file | ||||||
|  | instead. | ||||||
|  | It is an error if the character is not found searching to the right | ||||||
|  | in the edit buffer. | ||||||
|  | .It Ic vi-next-word Pq vi command: w | ||||||
|  | Move the cursor to the right to the beginning of the next word. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the end of the edit | ||||||
|  | buffer or on its last character. | ||||||
|  | .It Ic vi-paste-next Pq vi command: p | ||||||
|  | Insert a copy of the cut buffer to the right of the cursor. | ||||||
|  | It is an error if the cut buffer is empty. | ||||||
|  | .It Ic vi-paste-prev Pq vi command: P | ||||||
|  | Insert a copy of the cut buffer to the left of the cursor. | ||||||
|  | It is an error if the cut buffer is empty. | ||||||
|  | .It Ic vi-prev-big-word Pq vi command: B | ||||||
|  | Move the cursor to the left to the next beginning of a space delimited | ||||||
|  | word. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the beginning of the | ||||||
|  | edit buffer. | ||||||
|  | .It Ic vi-prev-char Pq vi command: F | ||||||
|  | Read one character from the terminal bypassing the normal line | ||||||
|  | editing functionality and move the cursor to the left to the next | ||||||
|  | instance of that character in the edit buffer. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | If trying to read the character results in end of file or an error, | ||||||
|  | call | ||||||
|  | .Ic ed-end-of-file | ||||||
|  | instead. | ||||||
|  | It is an error if the character is not found searching to the left | ||||||
|  | in the edit buffer. | ||||||
|  | .It Ic vi-prev-word Pq vi command: b | ||||||
|  | Move the cursor to the left to the next beginning of a word. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | It is an error if the cursor is already at the beginning of the | ||||||
|  | edit buffer. | ||||||
|  | .It Ic vi-redo Pq vi command: Sq \&. | ||||||
|  | Redo the last non-motion command. | ||||||
|  | .It Ic vi-repeat-next-char Pq vi command: Sq \&; | ||||||
|  | Repeat the most recent character search in the same search direction. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | .It Ic vi-repeat-prev-char Pq vi command: Sq \&, | ||||||
|  | Repeat the most recent character search in the opposite search | ||||||
|  | direction. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | .It Ic vi-repeat-search-next Pq vi command: n | ||||||
|  | Repeat the most recent history search in the same search direction. | ||||||
|  | .It Ic vi-repeat-search-prev Pq vi command: N | ||||||
|  | Repeat the most recent history search in the opposite search | ||||||
|  | direction. | ||||||
|  | .It Ic vi-replace-char Pq vi command: r | ||||||
|  | Switch to vi replace mode, and automatically switch back to vi | ||||||
|  | command mode after the next character typed. | ||||||
|  | See | ||||||
|  | .Ic ed-insert | ||||||
|  | for a description of replace mode. | ||||||
|  | It is an error if the cursor is at the end of the edit buffer. | ||||||
|  | .It Ic vi-replace-mode Pq vi command: R | ||||||
|  | Switch to vi replace mode. | ||||||
|  | This is a variant of vi insert mode; see | ||||||
|  | .Ic ed-insert | ||||||
|  | for the difference. | ||||||
|  | .It Ic vi-search-next Pq vi command: \&? | ||||||
|  | Replace the edit buffer with the next matching history entry. | ||||||
|  | .It Ic vi-search-prev Pq vi command: / | ||||||
|  | Replace the edit buffer with the previous matching history entry. | ||||||
|  | .It Ic vi-substitute-char Pq vi command: s | ||||||
|  | Delete the character at the cursor and switch to vi insert mode. | ||||||
|  | .It Ic vi-substitute-line Pq vi command: S | ||||||
|  | Delete the entire contents of the edit buffer, save a copy of it | ||||||
|  | in the cut buffer, and enter vi insert mode. | ||||||
|  | .It Ic vi-to-column Pq vi command: \&| | ||||||
|  | Move the cursor to the column specified as the argument. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | .It Ic vi-to-history-line Pq vi command: G | ||||||
|  | Replace the edit buffer with the specified history entry. | ||||||
|  | .It Ic vi-to-next-char Pq vi command: t | ||||||
|  | Read one character from the terminal bypassing the normal line | ||||||
|  | editing functionality and move the cursor to the right to the | ||||||
|  | character before the next instance of that character in the edit | ||||||
|  | buffer. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | If trying to read the character results in end of file or an error, | ||||||
|  | call | ||||||
|  | .Ic ed-end-of-file | ||||||
|  | instead. | ||||||
|  | It is an error if the character is not found searching to the right | ||||||
|  | in the edit buffer. | ||||||
|  | .It Ic vi-to-prev-char Pq vi command: T | ||||||
|  | Read one character from the terminal bypassing the normal line | ||||||
|  | editing functionality and move the cursor to the left to the character | ||||||
|  | after the next instance of that character in the edit buffer. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | If trying to read the character results in end of file or an error, | ||||||
|  | call | ||||||
|  | .Ic ed-end-of-file | ||||||
|  | instead. | ||||||
|  | It is an error if the character is not found searching to the left | ||||||
|  | in the edit buffer. | ||||||
|  | .It Ic vi-undo Pq vi command: u | ||||||
|  | Undo the last change. | ||||||
|  | .It Ic vi-undo-line Pq vi command: U | ||||||
|  | Undo all changes to the edit buffer. | ||||||
|  | .It Ic vi-yank Pq vi command: y | ||||||
|  | Copy the string from the cursor to the position specified by the | ||||||
|  | following movement command to the cut buffer. | ||||||
|  | When given twice in a row, instead copy the whole contents of the | ||||||
|  | edit buffer to the cut buffer. | ||||||
|  | .It Ic vi-yank-end Pq vi command: Y | ||||||
|  | Copy the string from the cursor to the end of the edit buffer to | ||||||
|  | the cut buffer. | ||||||
|  | .It Ic vi-zero Pq vi command: 0 | ||||||
|  | If in argument input mode, multiply the argument by ten. | ||||||
|  | Otherwise, move the cursor to the beginning of the edit buffer. | ||||||
|  | Can be used as a movement command after | ||||||
|  | .Ic vi_change_meta , | ||||||
|  | .Ic vi_delete_meta , | ||||||
|  | or | ||||||
|  | .Ic vi_yank . | ||||||
|  | .El | ||||||
|  | .Ss Macros | ||||||
|  | If an input character is bound to the editor command | ||||||
|  | .Ic ed-sequence-lead-in , | ||||||
|  | .Nm | ||||||
|  | attempts to call a macro. | ||||||
|  | If the input character by itself forms the name of a macro, that | ||||||
|  | macro is executed. | ||||||
|  | Otherwise, additional input characters are read until the string | ||||||
|  | read forms the name of a macro, in which case that macro is executed, | ||||||
|  | or until the string read matches the beginning of none of the existing | ||||||
|  | macro names, in which case the string including the final, mismatching | ||||||
|  | character is discarded and the terminal bell is rung. | ||||||
|  | .Pp | ||||||
|  | There are two kinds of macros. | ||||||
|  | Command macros execute a single editor command. | ||||||
|  | Keyboard macros return a string of characters that is appended | ||||||
|  | as a new line to the | ||||||
|  | .Sx Input Queue . | ||||||
|  | .Pp | ||||||
|  | The following command macros are defined by default in vi command | ||||||
|  | mode and in emacs mode: | ||||||
|  | .Bl -column -offset indent "Esc O A, Esc O A" "em-exchange-mark" | ||||||
|  | .It Esc \&[ A, Esc O A Ta Ic ed-prev-history | ||||||
|  | .It Esc \&[ B, Esc O B Ta Ic ed-next-history | ||||||
|  | .It Esc \&[ C, Esc O C Ta Ic ed-next-char | ||||||
|  | .It Esc \&[ D, Esc O D Ta Ic ed-prev-char | ||||||
|  | .It Esc \&[ F, Esc O F Ta Ic ed-move-to-end | ||||||
|  | .It Esc \&[ H, Esc O H Ta Ic ed-move-to-beg | ||||||
|  | .El | ||||||
|  | .Pp | ||||||
|  | In vi command mode, they are also defined by default without the | ||||||
|  | initial escape character. | ||||||
|  | .Pp | ||||||
|  | In addition, the | ||||||
|  | .Nm | ||||||
|  | library tries to bind the strings generated by the arrow keys | ||||||
|  | as reported by the | ||||||
|  | .Xr terminfo 5 | ||||||
|  | database to these editor commands, unless that would clobber | ||||||
|  | user settings. | ||||||
|  | .Pp | ||||||
|  | In emacs mode, the two-character string | ||||||
|  | .Dq Ctrl-X Ctrl-X | ||||||
|  | is bound to the | ||||||
|  | .Ic em-exchange-mark | ||||||
|  | editor command. | ||||||
|  | .Ss Input Queue | ||||||
|  | The | ||||||
|  | .Nm | ||||||
|  | library maintains an input queue operated in FIFO mode. | ||||||
|  | Whenever it needs an input character, it takes the first character | ||||||
|  | from the first line of the input queue. | ||||||
|  | When the queue is empty, it reads from the terminal. | ||||||
|  | .Pp | ||||||
|  | A line can be appended to the end of the input queue in several ways: | ||||||
|  | .Bl -dash -offset indent | ||||||
|  | .It | ||||||
|  | By calling one of the keyboard | ||||||
|  | .Sx Macros . | ||||||
|  | .It | ||||||
|  | By calling the editor command | ||||||
|  | .Ic vi-redo . | ||||||
|  | .It | ||||||
|  | By calling the editor command | ||||||
|  | .Ic vi-alias . | ||||||
|  | .It | ||||||
|  | By pressing a key in emacs incremental search mode that doesn't | ||||||
|  | have a special meaning in that mode but returns to normal emacs | ||||||
|  | mode. | ||||||
|  | .It | ||||||
|  | If an application program directly calls the functions | ||||||
|  | .Xr el_push 3 | ||||||
|  | or | ||||||
|  | .Xr el_wpush 3 , | ||||||
|  | it can provide additional, program-specific ways | ||||||
|  | of appending to the input queue. | ||||||
|  | .El | ||||||
|  | .Sh SEE ALSO | ||||||
|  | .Xr mg 1 , | ||||||
|  | .Xr vi 1 , | ||||||
|  | .Xr editline 3 , | ||||||
|  | .Xr el_wgets 3 , | ||||||
|  | .Xr el_wpush 3 , | ||||||
|  | .Xr el_wset 3 , | ||||||
|  | .Xr editrc 5 | ||||||
|  | .Sh HISTORY | ||||||
|  | This manual page first appeared in | ||||||
|  | .Ox 6.0 | ||||||
|  | and | ||||||
|  | .Nx 8 . | ||||||
|  | .Sh AUTHORS | ||||||
|  | .An -nosplit | ||||||
|  | This manual page was written by | ||||||
|  | .An Ingo Schwarze Aq Mt schwarze@openbsd.org . | ||||||
							
								
								
									
										317
									
								
								lib/libedit/src/editrc.5
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										317
									
								
								lib/libedit/src/editrc.5
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,317 @@ | |||||||
|  | .\"	$NetBSD: editrc.5,v 1.32 2016/05/22 23:54:20 christos Exp $ | ||||||
|  | .\" | ||||||
|  | .\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc. | ||||||
|  | .\" All rights reserved. | ||||||
|  | .\" | ||||||
|  | .\" This file was contributed to The NetBSD Foundation by Luke Mewburn. | ||||||
|  | .\" | ||||||
|  | .\" Redistribution and use in source and binary forms, with or without | ||||||
|  | .\" modification, are permitted provided that the following conditions | ||||||
|  | .\" are met: | ||||||
|  | .\" 1. Redistributions of source code must retain the above copyright | ||||||
|  | .\"    notice, this list of conditions and the following disclaimer. | ||||||
|  | .\" 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  | .\"    notice, this list of conditions and the following disclaimer in the | ||||||
|  | .\"    documentation and/or other materials provided with the distribution. | ||||||
|  | .\" | ||||||
|  | .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | ||||||
|  | .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||||||
|  | .\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||||
|  | .\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | ||||||
|  | .\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||||
|  | .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||||
|  | .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||||
|  | .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||||
|  | .\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||||
|  | .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||||
|  | .\" POSSIBILITY OF SUCH DAMAGE. | ||||||
|  | .\" | ||||||
|  | .Dd May 22, 2016 | ||||||
|  | .Dt EDITRC 5 | ||||||
|  | .Os | ||||||
|  | .Sh NAME | ||||||
|  | .Nm editrc | ||||||
|  | .Nd configuration file for editline library | ||||||
|  | .Sh SYNOPSIS | ||||||
|  | .Nm | ||||||
|  | .Sh DESCRIPTION | ||||||
|  | The | ||||||
|  | .Nm | ||||||
|  | file defines various settings to be used by the | ||||||
|  | .Xr editline 3 | ||||||
|  | library. | ||||||
|  | .Pp | ||||||
|  | The format of each line is: | ||||||
|  | .Pp | ||||||
|  | .Dl [prog:]command [arg ...] | ||||||
|  | .Pp | ||||||
|  | .Ar command | ||||||
|  | is one of the | ||||||
|  | .Xr editline 3 | ||||||
|  | builtin commands. | ||||||
|  | Refer to | ||||||
|  | .Sx BUILTIN COMMANDS | ||||||
|  | for more information. | ||||||
|  | .Pp | ||||||
|  | .Ar prog | ||||||
|  | is the program name string that a program defines when it calls | ||||||
|  | .Xr el_init 3 | ||||||
|  | to set up | ||||||
|  | .Xr editline 3 , | ||||||
|  | which is usually | ||||||
|  | .Va argv[0] . | ||||||
|  | .Ar command | ||||||
|  | will be executed for any program which matches | ||||||
|  | .Ar prog . | ||||||
|  | .Pp | ||||||
|  | .Ar prog | ||||||
|  | may also be a | ||||||
|  | .Xr regex 3 | ||||||
|  | style | ||||||
|  | regular expression, in which case | ||||||
|  | .Ar command | ||||||
|  | will be executed for any program that matches the regular expression. | ||||||
|  | .Pp | ||||||
|  | If | ||||||
|  | .Ar prog | ||||||
|  | is absent, | ||||||
|  | .Ar command | ||||||
|  | is executed for all programs. | ||||||
|  | .Sh BUILTIN COMMANDS | ||||||
|  | The | ||||||
|  | .Nm editline | ||||||
|  | library has some builtin commands, which affect the way | ||||||
|  | that the line editing and history functions operate. | ||||||
|  | These are based on similar named builtins present in the | ||||||
|  | .Xr tcsh 1 | ||||||
|  | shell. | ||||||
|  | .Pp | ||||||
|  | The following builtin commands are available: | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Ic bind Oo Fl aeklrsv Oc Op Ar key Op Ar command | ||||||
|  | Without options and arguments, list all bound keys and macros, and | ||||||
|  | the editor command or input string to which each one is bound. | ||||||
|  | If only | ||||||
|  | .Ar key | ||||||
|  | is supplied, show the binding for that key or macro. | ||||||
|  | If | ||||||
|  | .Ar key command | ||||||
|  | is supplied, bind the editor | ||||||
|  | .Ar command | ||||||
|  | to that key or macro. | ||||||
|  | .Pp | ||||||
|  | The options are as follows: | ||||||
|  | .Bl -tag -width 4n | ||||||
|  | .It Fl a | ||||||
|  | List or change key bindings in the | ||||||
|  | .Xr vi 1 | ||||||
|  | mode alternate (command mode) key map. | ||||||
|  | .It Fl e | ||||||
|  | Bind all keys to the standard GNU Emacs-like bindings. | ||||||
|  | .It Fl k | ||||||
|  | .Ar key | ||||||
|  | is interpreted as a symbolic arrow key name, which may be one of | ||||||
|  | .Sq up , | ||||||
|  | .Sq down , | ||||||
|  | .Sq left | ||||||
|  | or | ||||||
|  | .Sq right . | ||||||
|  | .It Fl l | ||||||
|  | List all editor commands and a short description of each. | ||||||
|  | .It Fl r | ||||||
|  | Remove the binding of the key or macro | ||||||
|  | .Ar key . | ||||||
|  | .It Fl s | ||||||
|  | Define a keyboard macro rather than a key binding or command macro: | ||||||
|  | .Ar command | ||||||
|  | is taken as a literal string and appended to the input queue whenever | ||||||
|  | .Ar key | ||||||
|  | is typed. | ||||||
|  | Bound keys and macros in | ||||||
|  | .Ar command | ||||||
|  | are themselves reinterpreted, and this continues for ten levels of | ||||||
|  | interpretation. | ||||||
|  | .It Fl v | ||||||
|  | Bind all keys to the standard | ||||||
|  | .Xr vi 1 Ns -like | ||||||
|  | bindings. | ||||||
|  | .El | ||||||
|  | .Pp | ||||||
|  | The | ||||||
|  | .Xr editline 7 | ||||||
|  | manual documents all editor commands and contains more information | ||||||
|  | about macros and the input queue. | ||||||
|  | .Pp | ||||||
|  | .Ar key | ||||||
|  | and | ||||||
|  | .Ar command | ||||||
|  | can contain control characters of the form | ||||||
|  | .Sm off | ||||||
|  | .Sq No ^ Ar character | ||||||
|  | .Sm on | ||||||
|  | .Po | ||||||
|  | e.g.\& | ||||||
|  | .Sq ^A | ||||||
|  | .Pc , | ||||||
|  | and the following backslashed escape sequences: | ||||||
|  | .Pp | ||||||
|  | .Bl -tag -compact -offset indent -width 4n | ||||||
|  | .It Ic \ea | ||||||
|  | Bell | ||||||
|  | .It Ic \eb | ||||||
|  | Backspace | ||||||
|  | .It Ic \ee | ||||||
|  | Escape | ||||||
|  | .It Ic \ef | ||||||
|  | Formfeed | ||||||
|  | .It Ic \en | ||||||
|  | Newline | ||||||
|  | .It Ic \er | ||||||
|  | Carriage return | ||||||
|  | .It Ic \et | ||||||
|  | Horizontal tab | ||||||
|  | .It Ic \ev | ||||||
|  | Vertical tab | ||||||
|  | .Sm off | ||||||
|  | .It Sy \e Ar nnn | ||||||
|  | .Sm on | ||||||
|  | The ASCII character corresponding to the octal number | ||||||
|  | .Ar nnn . | ||||||
|  | .El | ||||||
|  | .Pp | ||||||
|  | .Sq \e | ||||||
|  | nullifies the special meaning of the following character, | ||||||
|  | if it has any, notably | ||||||
|  | .Sq \e | ||||||
|  | and | ||||||
|  | .Sq ^ . | ||||||
|  | .It Ic echotc Oo Fl sv Oc Ar arg Ar ... | ||||||
|  | Exercise terminal capabilities given in | ||||||
|  | .Ar arg ... . | ||||||
|  | If | ||||||
|  | .Ar arg | ||||||
|  | is | ||||||
|  | .Sq baud , | ||||||
|  | .Sq cols , | ||||||
|  | .Sq lines , | ||||||
|  | .Sq rows , | ||||||
|  | .Sq meta , | ||||||
|  | or | ||||||
|  | .Sq tabs , | ||||||
|  | the value of that capability is printed, with | ||||||
|  | .Dq yes | ||||||
|  | or | ||||||
|  | .Dq no | ||||||
|  | indicating that the terminal does or does not have that capability. | ||||||
|  | .Pp | ||||||
|  | .Fl s | ||||||
|  | returns an empty string for non-existent capabilities, rather than | ||||||
|  | causing an error. | ||||||
|  | .Fl v | ||||||
|  | causes messages to be verbose. | ||||||
|  | .It Ic edit Op Li on | Li off | ||||||
|  | Enable or disable the | ||||||
|  | .Nm editline | ||||||
|  | functionality in a program. | ||||||
|  | .It Ic history Ar list | Ar size Dv n | Ar unique Dv n | ||||||
|  | The | ||||||
|  | .Ar list | ||||||
|  | command lists all entries in the history. | ||||||
|  | The | ||||||
|  | .Ar size | ||||||
|  | command sets the history size to | ||||||
|  | .Dv n | ||||||
|  | entries. | ||||||
|  | The | ||||||
|  | .Ar unique | ||||||
|  | command controls if history should keep duplicate entries. | ||||||
|  | If | ||||||
|  | .Dv n | ||||||
|  | is non zero, only keep unique history entries. | ||||||
|  | If | ||||||
|  | .Dv n | ||||||
|  | is zero, then keep all entries (the default). | ||||||
|  | .It Ic settc Ar cap Ar val | ||||||
|  | Set the terminal capability | ||||||
|  | .Ar cap | ||||||
|  | to | ||||||
|  | .Ar val , | ||||||
|  | as defined in | ||||||
|  | .Xr termcap 5 . | ||||||
|  | No sanity checking is done. | ||||||
|  | .It Ic setty Oo Fl a Oc Oo Fl d Oc Oo Fl q Oc Oo Fl x Oc Oo Ar +mode Oc \ | ||||||
|  | Oo Ar -mode Oc Oo Ar mode Oc Oo Ar char=c Oc | ||||||
|  | Control which tty modes that | ||||||
|  | .Nm | ||||||
|  | won't allow the user to change. | ||||||
|  | .Fl d , | ||||||
|  | .Fl q | ||||||
|  | or | ||||||
|  | .Fl x | ||||||
|  | tells | ||||||
|  | .Ic setty | ||||||
|  | to act on the | ||||||
|  | .Sq edit , | ||||||
|  | .Sq quote | ||||||
|  | or | ||||||
|  | .Sq execute | ||||||
|  | set of tty modes respectively; defaulting to | ||||||
|  | .Fl x . | ||||||
|  | .Pp | ||||||
|  | Without other arguments, | ||||||
|  | .Ic setty | ||||||
|  | lists the modes in the chosen set which are fixed on | ||||||
|  | .Po | ||||||
|  | .Sq +mode | ||||||
|  | .Pc | ||||||
|  | or off | ||||||
|  | .Po | ||||||
|  | .Sq -mode | ||||||
|  | .Pc . | ||||||
|  | .Fl a | ||||||
|  | lists all tty modes in the chosen set regardless of the setting. | ||||||
|  | With | ||||||
|  | .Ar +mode , | ||||||
|  | .Ar -mode | ||||||
|  | or | ||||||
|  | .Ar mode , | ||||||
|  | fixes | ||||||
|  | .Ar mode | ||||||
|  | on or off or removes control of | ||||||
|  | .Ar mode | ||||||
|  | in the chosen set. | ||||||
|  | .Pp | ||||||
|  | .Ic Setty | ||||||
|  | can also be used to set tty characters to particular values using | ||||||
|  | .Ar char=value . | ||||||
|  | If | ||||||
|  | .Ar value | ||||||
|  | is empty | ||||||
|  | then the character is set to | ||||||
|  | .Dv _POSIX_VDISABLE . | ||||||
|  | .It Ic telltc | ||||||
|  | List the values of all the terminal capabilities (see | ||||||
|  | .Xr termcap 5 ) . | ||||||
|  | .El | ||||||
|  | .Sh FILES | ||||||
|  | .Bl -tag -width "~/.editrcXXX" | ||||||
|  | .It Pa ~/.editrc | ||||||
|  | User configuration file for the | ||||||
|  | .Xr editline 3 | ||||||
|  | library. | ||||||
|  | .El | ||||||
|  | .Sh SEE ALSO | ||||||
|  | .Xr editline 3 , | ||||||
|  | .Xr regex 3 , | ||||||
|  | .Xr termcap 5 , | ||||||
|  | .Xr editline 7 | ||||||
|  | .Sh AUTHORS | ||||||
|  | .An -nosplit | ||||||
|  | The | ||||||
|  | .Nm editline | ||||||
|  | library was written by | ||||||
|  | .An Christos Zoulas , | ||||||
|  | and this manual was written by | ||||||
|  | .An Luke Mewburn , | ||||||
|  | with some sections inspired by | ||||||
|  | .Xr tcsh 1 . | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: el.c,v 1.61 2011/01/27 23:11:40 christos Exp $	*/ | /*	$NetBSD: el.c,v 1.92 2016/05/22 19:44:26 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,37 +37,44 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)el.c	8.2 (Berkeley) 1/3/94"; | static char sccsid[] = "@(#)el.c	8.2 (Berkeley) 1/3/94"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: el.c,v 1.61 2011/01/27 23:11:40 christos Exp $"); | __RCSID("$NetBSD: el.c,v 1.92 2016/05/22 19:44:26 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| #ifndef MAXPATHLEN |  | ||||||
| #define MAXPATHLEN 4096 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * el.c: EditLine interface functions |  * el.c: EditLine interface functions | ||||||
|  */ |  */ | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <sys/param.h> | #include <sys/param.h> | ||||||
| #include <string.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <stdarg.h> |  | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
| #include <locale.h> |  | ||||||
| #include <langinfo.h> | #include <langinfo.h> | ||||||
|  | #include <locale.h> | ||||||
|  | #include <stdarg.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  | #include "parse.h" | ||||||
|  | #include "read.h" | ||||||
|  |  | ||||||
| /* el_init(): | /* el_init(): | ||||||
|  *	Initialize editline and set default parameters. |  *	Initialize editline and set default parameters. | ||||||
|  */ |  */ | ||||||
| public EditLine * | EditLine * | ||||||
| el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) | el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) | ||||||
| { | { | ||||||
| 	EditLine *el = (EditLine *) el_malloc(sizeof(EditLine)); |     return el_init_fd(prog, fin, fout, ferr, fileno(fin), fileno(fout), | ||||||
|  | 	fileno(ferr)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | EditLine * | ||||||
|  | el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr, | ||||||
|  |     int fdin, int fdout, int fderr) | ||||||
|  | { | ||||||
|  | 	EditLine *el = el_malloc(sizeof(*el)); | ||||||
|  |  | ||||||
| 	if (el == NULL) | 	if (el == NULL) | ||||||
| 		return (NULL); | 		return NULL; | ||||||
|  |  | ||||||
| 	memset(el, 0, sizeof(EditLine)); | 	memset(el, 0, sizeof(EditLine)); | ||||||
|  |  | ||||||
| @@ -75,11 +82,11 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) | |||||||
| 	el->el_outfile = fout; | 	el->el_outfile = fout; | ||||||
| 	el->el_errfile = ferr; | 	el->el_errfile = ferr; | ||||||
|  |  | ||||||
| 	el->el_infd = fileno(fin); | 	el->el_infd = fdin; | ||||||
| 	el->el_outfd = fileno(fout); | 	el->el_outfd = fdout; | ||||||
| 	el->el_errfd = fileno(ferr); | 	el->el_errfd = fderr; | ||||||
|  |  | ||||||
| 	el->el_prog = Strdup(ct_decode_string(prog, &el->el_scratch)); | 	el->el_prog = wcsdup(ct_decode_string(prog, &el->el_scratch)); | ||||||
| 	if (el->el_prog == NULL) { | 	if (el->el_prog == NULL) { | ||||||
| 		el_free(el); | 		el_free(el); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| @@ -89,19 +96,17 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) | |||||||
|          * Initialize all the modules. Order is important!!! |          * Initialize all the modules. Order is important!!! | ||||||
|          */ |          */ | ||||||
| 	el->el_flags = 0; | 	el->el_flags = 0; | ||||||
| #ifdef WIDECHAR |  | ||||||
| 	if (setlocale(LC_CTYPE, NULL) != NULL){ | 	if (setlocale(LC_CTYPE, NULL) != NULL){ | ||||||
| 		if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) | 		if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) | ||||||
| 			el->el_flags |= CHARSET_IS_UTF8; | 			el->el_flags |= CHARSET_IS_UTF8; | ||||||
| 	} | 	} | ||||||
| #endif |  | ||||||
|  |  | ||||||
| 	if (term_init(el) == -1) { | 	if (terminal_init(el) == -1) { | ||||||
| 		el_free(el->el_prog); | 		el_free(el->el_prog); | ||||||
| 		el_free(el); | 		el_free(el); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 	(void) key_init(el); | 	(void) keymacro_init(el); | ||||||
| 	(void) map_init(el); | 	(void) map_init(el); | ||||||
| 	if (tty_init(el) == -1) | 	if (tty_init(el) == -1) | ||||||
| 		el->el_flags |= NO_TTY; | 		el->el_flags |= NO_TTY; | ||||||
| @@ -110,16 +115,18 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) | |||||||
| 	(void) hist_init(el); | 	(void) hist_init(el); | ||||||
| 	(void) prompt_init(el); | 	(void) prompt_init(el); | ||||||
| 	(void) sig_init(el); | 	(void) sig_init(el); | ||||||
| 	(void) read_init(el); | 	if (read_init(el) == -1) { | ||||||
|  | 		el_end(el); | ||||||
| 	return (el); | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 	return el; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_end(): | /* el_end(): | ||||||
|  *	Clean up. |  *	Clean up. | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| el_end(EditLine *el) | el_end(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -128,50 +135,52 @@ el_end(EditLine *el) | |||||||
|  |  | ||||||
| 	el_reset(el); | 	el_reset(el); | ||||||
|  |  | ||||||
| 	term_end(el); | 	terminal_end(el); | ||||||
| 	key_end(el); | 	keymacro_end(el); | ||||||
| 	map_end(el); | 	map_end(el); | ||||||
|  | 	if (!(el->el_flags & NO_TTY)) | ||||||
| 		tty_end(el); | 		tty_end(el); | ||||||
| 	ch_end(el); | 	ch_end(el); | ||||||
|  | 	read_end(el->el_read); | ||||||
| 	search_end(el); | 	search_end(el); | ||||||
| 	hist_end(el); | 	hist_end(el); | ||||||
| 	prompt_end(el); | 	prompt_end(el); | ||||||
| 	sig_end(el); | 	sig_end(el); | ||||||
|  |  | ||||||
| 	el_free((ptr_t) el->el_prog); | 	el_free(el->el_prog); | ||||||
| 	el_free((ptr_t) el); | 	el_free(el->el_visual.cbuff); | ||||||
| #ifdef WIDECHAR | 	el_free(el->el_visual.wbuff); | ||||||
| 	el_free((ptr_t) el->el_scratch.cbuff); | 	el_free(el->el_scratch.cbuff); | ||||||
| 	el_free((ptr_t) el->el_scratch.wbuff); | 	el_free(el->el_scratch.wbuff); | ||||||
| 	el_free((ptr_t) el->el_lgcyconv.cbuff); | 	el_free(el->el_lgcyconv.cbuff); | ||||||
| 	el_free((ptr_t) el->el_lgcyconv.wbuff); | 	el_free(el->el_lgcyconv.wbuff); | ||||||
| #endif | 	el_free(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_reset(): | /* el_reset(): | ||||||
|  *	Reset the tty and the parser |  *	Reset the tty and the parser | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| el_reset(EditLine *el) | el_reset(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	tty_cookedmode(el); | 	tty_cookedmode(el); | ||||||
| 	ch_reset(el, 0);		/* XXX: Do we want that? */ | 	ch_reset(el);		/* XXX: Do we want that? */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_set(): | /* el_set(): | ||||||
|  *	set the editline parameters |  *	set the editline parameters | ||||||
|  */ |  */ | ||||||
| public int | int | ||||||
| FUN(el,set)(EditLine *el, int op, ...) | el_wset(EditLine *el, int op, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 	int rv = 0; | 	int rv = 0; | ||||||
|  |  | ||||||
| 	if (el == NULL) | 	if (el == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	va_start(ap, op); | 	va_start(ap, op); | ||||||
|  |  | ||||||
| 	switch (op) { | 	switch (op) { | ||||||
| @@ -190,21 +199,28 @@ FUN(el,set)(EditLine *el, int op, ...) | |||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	case EL_ALIAS_TEXT: { | ||||||
|  | 		el_afunc_t p = va_arg(ap, el_afunc_t); | ||||||
|  | 		void *arg = va_arg(ap, void *); | ||||||
|  | 		rv = ch_aliasfun(el, p, arg); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	case EL_PROMPT_ESC: | 	case EL_PROMPT_ESC: | ||||||
| 	case EL_RPROMPT_ESC: { | 	case EL_RPROMPT_ESC: { | ||||||
| 		el_pfunc_t p = va_arg(ap, el_pfunc_t); | 		el_pfunc_t p = va_arg(ap, el_pfunc_t); | ||||||
| 		int c = va_arg(ap, int); | 		int c = va_arg(ap, int); | ||||||
|  |  | ||||||
| 		rv = prompt_set(el, p, c, op, 1); | 		rv = prompt_set(el, p, (wchar_t)c, op, 1); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	case EL_TERMINAL: | 	case EL_TERMINAL: | ||||||
| 		rv = term_set(el, va_arg(ap, char *)); | 		rv = terminal_set(el, va_arg(ap, char *)); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case EL_EDITOR: | 	case EL_EDITOR: | ||||||
| 		rv = map_set_editor(el, va_arg(ap, Char *)); | 		rv = map_set_editor(el, va_arg(ap, wchar_t *)); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case EL_SIGNAL: | 	case EL_SIGNAL: | ||||||
| @@ -220,36 +236,36 @@ FUN(el,set)(EditLine *el, int op, ...) | |||||||
| 	case EL_ECHOTC: | 	case EL_ECHOTC: | ||||||
| 	case EL_SETTY: | 	case EL_SETTY: | ||||||
| 	{ | 	{ | ||||||
| 		const Char *argv[20]; | 		const wchar_t *argv[20]; | ||||||
| 		int i; | 		int i; | ||||||
|  |  | ||||||
| 		for (i = 1; i < 20; i++) | 		for (i = 1; i < (int)__arraycount(argv); i++) | ||||||
| 			if ((argv[i] = va_arg(ap, Char *)) == NULL) | 			if ((argv[i] = va_arg(ap, wchar_t *)) == NULL) | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 		switch (op) { | 		switch (op) { | ||||||
| 		case EL_BIND: | 		case EL_BIND: | ||||||
| 			argv[0] = STR("bind"); | 			argv[0] = L"bind"; | ||||||
| 			rv = map_bind(el, i, argv); | 			rv = map_bind(el, i, argv); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case EL_TELLTC: | 		case EL_TELLTC: | ||||||
| 			argv[0] = STR("telltc"); | 			argv[0] = L"telltc"; | ||||||
| 			rv = term_telltc(el, i, argv); | 			rv = terminal_telltc(el, i, argv); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case EL_SETTC: | 		case EL_SETTC: | ||||||
| 			argv[0] = STR("settc"); | 			argv[0] = L"settc"; | ||||||
| 			rv = term_settc(el, i, argv); | 			rv = terminal_settc(el, i, argv); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case EL_ECHOTC: | 		case EL_ECHOTC: | ||||||
| 			argv[0] = STR("echotc"); | 			argv[0] = L"echotc"; | ||||||
| 			rv = term_echotc(el, i, argv); | 			rv = terminal_echotc(el, i, argv); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case EL_SETTY: | 		case EL_SETTY: | ||||||
| 			argv[0] = STR("setty"); | 			argv[0] = L"setty"; | ||||||
| 			rv = tty_stty(el, i, argv); | 			rv = tty_stty(el, i, argv); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| @@ -263,8 +279,8 @@ FUN(el,set)(EditLine *el, int op, ...) | |||||||
|  |  | ||||||
| 	case EL_ADDFN: | 	case EL_ADDFN: | ||||||
| 	{ | 	{ | ||||||
| 		Char *name = va_arg(ap, Char *); | 		wchar_t *name = va_arg(ap, wchar_t *); | ||||||
| 		Char *help = va_arg(ap, Char *); | 		wchar_t *help = va_arg(ap, wchar_t *); | ||||||
| 		el_func_t func = va_arg(ap, el_func_t); | 		el_func_t func = va_arg(ap, el_func_t); | ||||||
|  |  | ||||||
| 		rv = map_addfunc(el, name, help, func); | 		rv = map_addfunc(el, name, help, func); | ||||||
| @@ -274,7 +290,7 @@ FUN(el,set)(EditLine *el, int op, ...) | |||||||
| 	case EL_HIST: | 	case EL_HIST: | ||||||
| 	{ | 	{ | ||||||
| 		hist_fun_t func = va_arg(ap, hist_fun_t); | 		hist_fun_t func = va_arg(ap, hist_fun_t); | ||||||
| 		ptr_t ptr = va_arg(ap, ptr_t); | 		void *ptr = va_arg(ap, void *); | ||||||
|  |  | ||||||
| 		rv = hist_set(el, func, ptr); | 		rv = hist_set(el, func, ptr); | ||||||
| 		if (!(el->el_flags & CHARSET_IS_UTF8)) | 		if (!(el->el_flags & CHARSET_IS_UTF8)) | ||||||
| @@ -293,8 +309,7 @@ FUN(el,set)(EditLine *el, int op, ...) | |||||||
| 	case EL_GETCFN: | 	case EL_GETCFN: | ||||||
| 	{ | 	{ | ||||||
| 		el_rfunc_t rc = va_arg(ap, el_rfunc_t); | 		el_rfunc_t rc = va_arg(ap, el_rfunc_t); | ||||||
| 		rv = el_read_setfn(el, rc); | 		rv = el_read_setfn(el->el_read, rc); | ||||||
| 		el->el_flags &= ~NARROW_READ; |  | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -355,7 +370,7 @@ FUN(el,set)(EditLine *el, int op, ...) | |||||||
| 	case EL_REFRESH: | 	case EL_REFRESH: | ||||||
| 		re_clear_display(el); | 		re_clear_display(el); | ||||||
| 		re_refresh(el); | 		re_refresh(el); | ||||||
| 		term__flush(el); | 		terminal__flush(el); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
| @@ -364,15 +379,15 @@ FUN(el,set)(EditLine *el, int op, ...) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	va_end(ap); | 	va_end(ap); | ||||||
| 	return (rv); | 	return rv; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_get(): | /* el_get(): | ||||||
|  *	retrieve the editline parameters |  *	retrieve the editline parameters | ||||||
|  */ |  */ | ||||||
| public int | int | ||||||
| FUN(el,get)(EditLine *el, int op, ...) | el_wget(EditLine *el, int op, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 	int rv; | 	int rv; | ||||||
| @@ -392,14 +407,14 @@ FUN(el,get)(EditLine *el, int op, ...) | |||||||
| 	case EL_PROMPT_ESC: | 	case EL_PROMPT_ESC: | ||||||
| 	case EL_RPROMPT_ESC: { | 	case EL_RPROMPT_ESC: { | ||||||
| 		el_pfunc_t *p = va_arg(ap, el_pfunc_t *); | 		el_pfunc_t *p = va_arg(ap, el_pfunc_t *); | ||||||
| 		Char *c = va_arg(ap, Char *); | 		wchar_t *c = va_arg(ap, wchar_t *); | ||||||
|  |  | ||||||
| 		rv = prompt_get(el, p, c, op); | 		rv = prompt_get(el, p, c, op); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	case EL_EDITOR: | 	case EL_EDITOR: | ||||||
| 		rv = map_get_editor(el, va_arg(ap, const Char **)); | 		rv = map_get_editor(el, va_arg(ap, const wchar_t **)); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case EL_SIGNAL: | 	case EL_SIGNAL: | ||||||
| @@ -413,7 +428,7 @@ FUN(el,get)(EditLine *el, int op, ...) | |||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case EL_TERMINAL: | 	case EL_TERMINAL: | ||||||
| 		term_get(el, va_arg(ap, const char **)); | 		terminal_get(el, va_arg(ap, const char **)); | ||||||
| 		rv = 0; | 		rv = 0; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| @@ -423,26 +438,17 @@ FUN(el,get)(EditLine *el, int op, ...) | |||||||
| 		char *argv[20]; | 		char *argv[20]; | ||||||
| 		int i; | 		int i; | ||||||
|  |  | ||||||
|  		for (i = 1; i < (int)(sizeof(argv) / sizeof(argv[0])); i++) | 		for (i = 1; i < (int)__arraycount(argv); i++) | ||||||
| 			if ((argv[i] = va_arg(ap, char *)) == NULL) | 			if ((argv[i] = va_arg(ap, char *)) == NULL) | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 		switch (op) { |  | ||||||
| 		case EL_GETTC: |  | ||||||
| 		argv[0] = name; | 		argv[0] = name; | ||||||
| 			rv = term_gettc(el, i, argv); | 		rv = terminal_gettc(el, i, argv); | ||||||
| 			break; |  | ||||||
|  |  | ||||||
| 		default: |  | ||||||
| 			rv = -1; |  | ||||||
| 			EL_ABORT((el->el_errfile, "Bad op %d\n", op)); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	case EL_GETCFN: | 	case EL_GETCFN: | ||||||
| 		*va_arg(ap, el_rfunc_t *) = el_read_getfn(el); | 		*va_arg(ap, el_rfunc_t *) = el_read_getfn(el->el_read); | ||||||
| 		rv = 0; | 		rv = 0; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| @@ -452,7 +458,7 @@ FUN(el,get)(EditLine *el, int op, ...) | |||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case EL_UNBUFFERED: | 	case EL_UNBUFFERED: | ||||||
| 		*va_arg(ap, int *) = (!(el->el_flags & UNBUFFERED)); | 		*va_arg(ap, int *) = (el->el_flags & UNBUFFERED) != 0; | ||||||
| 		rv = 0; | 		rv = 0; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| @@ -486,81 +492,97 @@ FUN(el,get)(EditLine *el, int op, ...) | |||||||
| 	} | 	} | ||||||
| 	va_end(ap); | 	va_end(ap); | ||||||
|  |  | ||||||
| 	return (rv); | 	return rv; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_line(): | /* el_line(): | ||||||
|  *	Return editing info |  *	Return editing info | ||||||
|  */ |  */ | ||||||
| public const TYPE(LineInfo) * | const LineInfoW * | ||||||
| FUN(el,line)(EditLine *el) | el_wline(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	return (const TYPE(LineInfo) *) (void *) &el->el_line; | 	return (const LineInfoW *)(void *)&el->el_line; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_source(): | /* el_source(): | ||||||
|  *	Source a file |  *	Source a file | ||||||
|  */ |  */ | ||||||
| public int | int | ||||||
| el_source(EditLine *el, const char *fname) | el_source(EditLine *el, const char *fname) | ||||||
| { | { | ||||||
| 	FILE *fp; | 	FILE *fp; | ||||||
| 	size_t len; | 	size_t len; | ||||||
|  | 	ssize_t slen; | ||||||
| 	char *ptr; | 	char *ptr; | ||||||
| 	char path[MAXPATHLEN]; | 	char *path = NULL; | ||||||
| 	const Char *dptr; | 	const wchar_t *dptr; | ||||||
|  | 	int error = 0; | ||||||
|  |  | ||||||
| 	fp = NULL; | 	fp = NULL; | ||||||
| 	if (fname == NULL) { | 	if (fname == NULL) { | ||||||
| 		static const char elpath[] = "/.editrc"; |  | ||||||
|  |  | ||||||
| #ifdef HAVE_ISSETUGID | #ifdef HAVE_ISSETUGID | ||||||
|  | 		static const char elpath[] = "/.editrc"; | ||||||
|  | 		size_t plen = sizeof(elpath); | ||||||
|  |  | ||||||
| 		if (issetugid()) | 		if (issetugid()) | ||||||
| 			return (-1); | 			return -1; | ||||||
| #endif |  | ||||||
| 		if ((ptr = getenv("HOME")) == NULL) | 		if ((ptr = getenv("HOME")) == NULL) | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path)) | 		plen += strlen(ptr); | ||||||
| 			return (-1); | 		if ((path = el_malloc(plen * sizeof(*path))) == NULL) | ||||||
| 		if (strlcat(path, elpath, sizeof(path)) >= sizeof(path)) | 			return -1; | ||||||
| 			return (-1); | 		(void)snprintf(path, plen, "%s%s", ptr, elpath); | ||||||
| 		fname = path; | 		fname = path; | ||||||
|  | #else | ||||||
|  | 		/* | ||||||
|  | 		 * If issetugid() is missing, always return an error, in order | ||||||
|  | 		 * to keep from inadvertently opening up the user to a security | ||||||
|  | 		 * hole. | ||||||
|  | 		 */ | ||||||
|  | 		return -1; | ||||||
|  | #endif | ||||||
| 	} | 	} | ||||||
| 	if (fp == NULL) | 	if (fp == NULL) | ||||||
| 		fp = fopen(fname, "r"); | 		fp = fopen(fname, "r"); | ||||||
| 	if (fp == NULL) | 	if (fp == NULL) { | ||||||
| 		return (-1); | 		el_free(path); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	ptr = NULL; | ||||||
|  | 	len = 0; | ||||||
|  | 	while ((slen = getline(&ptr, &len, fp)) != -1) { | ||||||
|  | 		if (*ptr == '\n') | ||||||
|  | 			continue;	/* Empty line. */ | ||||||
|  | 		if (slen > 0 && ptr[--slen] == '\n') | ||||||
|  | 			ptr[slen] = '\0'; | ||||||
|  |  | ||||||
| 	while ((ptr = fgetln(fp, &len)) != NULL) { |  | ||||||
| 		dptr = ct_decode_string(ptr, &el->el_scratch); | 		dptr = ct_decode_string(ptr, &el->el_scratch); | ||||||
| 		if (!dptr) | 		if (!dptr) | ||||||
| 			continue; | 			continue; | ||||||
| 		if (len > 0 && dptr[len - 1] == '\n') |  | ||||||
| 			--len; |  | ||||||
|  |  | ||||||
| 		/* loop until first non-space char or EOL */ | 		/* loop until first non-space char or EOL */ | ||||||
| 		while (*dptr != '\0' && Isspace(*dptr)) | 		while (*dptr != '\0' && iswspace(*dptr)) | ||||||
| 			dptr++; | 			dptr++; | ||||||
| 		if (*dptr == '#') | 		if (*dptr == '#') | ||||||
| 			continue;   /* ignore, this is a comment line */ | 			continue;   /* ignore, this is a comment line */ | ||||||
| 		if (parse_line(el, dptr) == -1) { | 		if ((error = parse_line(el, dptr)) == -1) | ||||||
| 			(void) fclose(fp); | 			break; | ||||||
| 			return (-1); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  | 	free(ptr); | ||||||
|  |  | ||||||
|  | 	el_free(path); | ||||||
| 	(void) fclose(fp); | 	(void) fclose(fp); | ||||||
| 	return (0); | 	return error; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_resize(): | /* el_resize(): | ||||||
|  *	Called from program when terminal is resized |  *	Called from program when terminal is resized | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| el_resize(EditLine *el) | el_resize(EditLine *el) | ||||||
| { | { | ||||||
| 	int lins, cols; | 	int lins, cols; | ||||||
| @@ -571,8 +593,8 @@ el_resize(EditLine *el) | |||||||
| 	(void) sigprocmask(SIG_BLOCK, &nset, &oset); | 	(void) sigprocmask(SIG_BLOCK, &nset, &oset); | ||||||
|  |  | ||||||
| 	/* get the correct window size */ | 	/* get the correct window size */ | ||||||
| 	if (term_get_size(el, &lins, &cols)) | 	if (terminal_get_size(el, &lins, &cols)) | ||||||
| 		term_change_size(el, lins, cols); | 		terminal_change_size(el, lins, cols); | ||||||
|  |  | ||||||
| 	(void) sigprocmask(SIG_SETMASK, &oset, NULL); | 	(void) sigprocmask(SIG_SETMASK, &oset, NULL); | ||||||
| } | } | ||||||
| @@ -581,38 +603,38 @@ el_resize(EditLine *el) | |||||||
| /* el_beep(): | /* el_beep(): | ||||||
|  *	Called from the program to beep |  *	Called from the program to beep | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| el_beep(EditLine *el) | el_beep(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	term_beep(el); | 	terminal_beep(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_editmode() | /* el_editmode() | ||||||
|  *	Set the state of EDIT_DISABLED from the `edit' command. |  *	Set the state of EDIT_DISABLED from the `edit' command. | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| el_editmode(EditLine *el, int argc, const Char **argv) | el_editmode(EditLine *el, int argc, const wchar_t **argv) | ||||||
| { | { | ||||||
| 	const Char *how; | 	const wchar_t *how; | ||||||
|  |  | ||||||
| 	if (argv == NULL || argc != 2 || argv[1] == NULL) | 	if (argv == NULL || argc != 2 || argv[1] == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
|  |  | ||||||
| 	how = argv[1]; | 	how = argv[1]; | ||||||
| 	if (Strcmp(how, STR("on")) == 0) { | 	if (wcscmp(how, L"on") == 0) { | ||||||
| 		el->el_flags &= ~EDIT_DISABLED; | 		el->el_flags &= ~EDIT_DISABLED; | ||||||
| 		tty_rawmode(el); | 		tty_rawmode(el); | ||||||
| 	} else if (Strcmp(how, STR("off")) == 0) { | 	} else if (wcscmp(how, L"off") == 0) { | ||||||
| 		tty_cookedmode(el); | 		tty_cookedmode(el); | ||||||
| 		el->el_flags |= EDIT_DISABLED; | 		el->el_flags |= EDIT_DISABLED; | ||||||
| 	} | 	} | ||||||
| 	else { | 	else { | ||||||
| 		(void) fprintf(el->el_errfile, "edit: Bad value `" FSTR "'.\n", | 		(void) fprintf(el->el_errfile, "edit: Bad value `%ls'.\n", | ||||||
| 		    how); | 		    how); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: el.h,v 1.22 2011/01/27 23:11:40 christos Exp $	*/ | /*	$NetBSD: el.h,v 1.41 2016/05/24 15:00:45 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -48,21 +48,15 @@ | |||||||
|  |  | ||||||
| #include "histedit.h" | #include "histedit.h" | ||||||
| #include "chartype.h" | #include "chartype.h" | ||||||
| #include <stdio.h> |  | ||||||
| #include <sys/types.h> |  | ||||||
|  |  | ||||||
| #define	EL_BUFSIZ	1024		/* Maximum line size		*/ | #define	EL_BUFSIZ	((size_t)1024)	/* Maximum line size		*/ | ||||||
|  |  | ||||||
| #define	HANDLE_SIGNALS	0x01 | #define	HANDLE_SIGNALS	0x01 | ||||||
| #define	NO_TTY		0x02 | #define	NO_TTY		0x02 | ||||||
| #define	EDIT_DISABLED	0x04 | #define	EDIT_DISABLED	0x04 | ||||||
| #define	UNBUFFERED	0x08 | #define	UNBUFFERED	0x08 | ||||||
| #define	CHARSET_IS_UTF8 0x10 | #define	CHARSET_IS_UTF8 0x10 | ||||||
| #define	IGNORE_EXTCHARS 0x20            /* Ignore characters read > 0xff */ |  | ||||||
| #define	NARROW_HISTORY	0x40 | #define	NARROW_HISTORY	0x40 | ||||||
| #define	NARROW_READ	0x80 |  | ||||||
|  |  | ||||||
| typedef int bool_t;			/* True or not			*/ |  | ||||||
|  |  | ||||||
| typedef unsigned char el_action_t;	/* Index to command array	*/ | typedef unsigned char el_action_t;	/* Index to command array	*/ | ||||||
|  |  | ||||||
| @@ -72,10 +66,10 @@ typedef struct coord_t {		/* Position on the screen	*/ | |||||||
| } coord_t; | } coord_t; | ||||||
|  |  | ||||||
| typedef struct el_line_t { | typedef struct el_line_t { | ||||||
| 	Char 		*buffer;	/* Input line			*/ | 	wchar_t		*buffer;	/* Input line			*/ | ||||||
| 	Char	        *cursor;	/* Cursor position		*/ | 	wchar_t	        *cursor;	/* Cursor position		*/ | ||||||
| 	Char	        *lastchar;	/* Last character		*/ | 	wchar_t	        *lastchar;	/* Last character		*/ | ||||||
| 	const Char	*limit;		/* Max position			*/ | 	const wchar_t	*limit;		/* Max position			*/ | ||||||
| } el_line_t; | } el_line_t; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -88,7 +82,7 @@ typedef struct el_state_t { | |||||||
| 	int		metanext;	/* Is the next char a meta char */ | 	int		metanext;	/* Is the next char a meta char */ | ||||||
| 	el_action_t	lastcmd;	/* Previous command		*/ | 	el_action_t	lastcmd;	/* Previous command		*/ | ||||||
| 	el_action_t	thiscmd;	/* this command			*/ | 	el_action_t	thiscmd;	/* this command			*/ | ||||||
| 	Char		thisch;		/* char that generated it	*/ | 	wchar_t		thisch;		/* char that generated it	*/ | ||||||
| } el_state_t; | } el_state_t; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -100,21 +94,19 @@ typedef struct el_state_t { | |||||||
|  |  | ||||||
| #include "tty.h" | #include "tty.h" | ||||||
| #include "prompt.h" | #include "prompt.h" | ||||||
| #include "key.h" | #include "keymacro.h" | ||||||
| #include "el_term.h" | #include "terminal.h" | ||||||
| #include "refresh.h" | #include "refresh.h" | ||||||
| #include "chared.h" | #include "chared.h" | ||||||
| #include "common.h" |  | ||||||
| #include "search.h" | #include "search.h" | ||||||
| #include "hist.h" | #include "hist.h" | ||||||
| #include "map.h" | #include "map.h" | ||||||
| #include "parse.h" |  | ||||||
| #include "sig.h" | #include "sig.h" | ||||||
| #include "help.h" |  | ||||||
| #include "read.h" | struct el_read_t; | ||||||
|  |  | ||||||
| struct editline { | struct editline { | ||||||
| 	Char		 *el_prog;	/* the program name		*/ | 	wchar_t		 *el_prog;	/* the program name		*/ | ||||||
| 	FILE		 *el_infile;	/* Stdio stuff			*/ | 	FILE		 *el_infile;	/* Stdio stuff			*/ | ||||||
| 	FILE		 *el_outfile;	/* Stdio stuff			*/ | 	FILE		 *el_outfile;	/* Stdio stuff			*/ | ||||||
| 	FILE		 *el_errfile;	/* Stdio stuff			*/ | 	FILE		 *el_errfile;	/* Stdio stuff			*/ | ||||||
| @@ -122,33 +114,31 @@ struct editline { | |||||||
| 	int		  el_outfd;	/* Output file descriptor	*/ | 	int		  el_outfd;	/* Output file descriptor	*/ | ||||||
| 	int		  el_errfd;	/* Error file descriptor	*/ | 	int		  el_errfd;	/* Error file descriptor	*/ | ||||||
| 	int		  el_flags;	/* Various flags.		*/ | 	int		  el_flags;	/* Various flags.		*/ | ||||||
| 	int		  el_errno;	/* Local copy of errno		*/ |  | ||||||
| 	coord_t		  el_cursor;	/* Cursor location		*/ | 	coord_t		  el_cursor;	/* Cursor location		*/ | ||||||
| 	Char		**el_display;	/* Real screen image = what is there */ | 	wchar_t		**el_display;	/* Real screen image = what is there */ | ||||||
| 	Char		**el_vdisplay;	/* Virtual screen image = what we see */ | 	wchar_t		**el_vdisplay;	/* Virtual screen image = what we see */ | ||||||
| 	void		 *el_data;	/* Client data			*/ | 	void		 *el_data;	/* Client data			*/ | ||||||
| 	el_line_t	  el_line;	/* The current line information	*/ | 	el_line_t	  el_line;	/* The current line information	*/ | ||||||
| 	el_state_t	  el_state;	/* Current editor state		*/ | 	el_state_t	  el_state;	/* Current editor state		*/ | ||||||
| 	el_term_t	  el_term;	/* Terminal dependent stuff	*/ | 	el_terminal_t	  el_terminal;	/* Terminal dependent stuff	*/ | ||||||
| 	el_tty_t	  el_tty;	/* Tty dependent stuff		*/ | 	el_tty_t	  el_tty;	/* Tty dependent stuff		*/ | ||||||
| 	el_refresh_t	  el_refresh;	/* Refresh stuff		*/ | 	el_refresh_t	  el_refresh;	/* Refresh stuff		*/ | ||||||
| 	el_prompt_t	  el_prompt;	/* Prompt stuff			*/ | 	el_prompt_t	  el_prompt;	/* Prompt stuff			*/ | ||||||
| 	el_prompt_t	  el_rprompt;	/* Prompt stuff			*/ | 	el_prompt_t	  el_rprompt;	/* Prompt stuff			*/ | ||||||
| 	el_chared_t	  el_chared;	/* Characted editor stuff	*/ | 	el_chared_t	  el_chared;	/* Characted editor stuff	*/ | ||||||
| 	el_map_t	  el_map;	/* Key mapping stuff		*/ | 	el_map_t	  el_map;	/* Key mapping stuff		*/ | ||||||
| 	el_key_t	  el_key;	/* Key binding stuff		*/ | 	el_keymacro_t	  el_keymacro;	/* Key binding stuff		*/ | ||||||
| 	el_history_t	  el_history;	/* History stuff		*/ | 	el_history_t	  el_history;	/* History stuff		*/ | ||||||
| 	el_search_t	  el_search;	/* Search stuff			*/ | 	el_search_t	  el_search;	/* Search stuff			*/ | ||||||
| 	el_signal_t	  el_signal;	/* Signal handling stuff	*/ | 	el_signal_t	  el_signal;	/* Signal handling stuff	*/ | ||||||
| 	el_read_t	  el_read;	/* Character reading stuff	*/ | 	struct el_read_t *el_read;	/* Character reading stuff	*/ | ||||||
| #ifdef WIDECHAR | 	ct_buffer_t       el_visual;    /* Buffer for displayable str	*/ | ||||||
| 	ct_buffer_t       el_scratch;   /* Scratch conversion buffer    */ | 	ct_buffer_t       el_scratch;   /* Scratch conversion buffer    */ | ||||||
| 	ct_buffer_t       el_lgcyconv;  /* Buffer for legacy wrappers   */ | 	ct_buffer_t       el_lgcyconv;  /* Buffer for legacy wrappers   */ | ||||||
| 	LineInfo          el_lgcylinfo; /* Legacy LineInfo buffer       */ | 	LineInfo          el_lgcylinfo; /* Legacy LineInfo buffer       */ | ||||||
| #endif |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| protected int	el_editmode(EditLine *, int, const Char **); | libedit_private int	el_editmode(EditLine *, int, const wchar_t **); | ||||||
|  |  | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
| #define	EL_ABORT(a)	do { \ | #define	EL_ABORT(a)	do { \ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: eln.c,v 1.9 2010/11/04 13:53:12 christos Exp $	*/ | /*	$NetBSD: eln.c,v 1.34 2016/05/09 21:37:34 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 2009 The NetBSD Foundation, Inc. |  * Copyright (c) 2009 The NetBSD Foundation, Inc. | ||||||
| @@ -12,13 +12,6 @@ | |||||||
|  * 2. Redistributions in binary form must reproduce the above copyright |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  *    notice, this list of conditions and the following disclaimer in the |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  *    documentation and/or other materials provided with the distribution. |  *    documentation and/or other materials provided with the distribution. | ||||||
|  * 3. All advertising materials mentioning features or use of this software |  | ||||||
|  *    must display the following acknowledgement: |  | ||||||
|  *        This product includes software developed by the NetBSD |  | ||||||
|  *        Foundation, Inc. and its contributors. |  | ||||||
|  * 4. Neither the name of The NetBSD Foundation nor the names of its |  | ||||||
|  *    contributors may be used to endorse or promote products derived |  | ||||||
|  *    from this software without specific prior written permission. |  | ||||||
|  * |  * | ||||||
|  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | ||||||
|  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||||||
| @@ -34,35 +27,38 @@ | |||||||
|  */ |  */ | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #if !defined(lint) && !defined(SCCSID) | #if !defined(lint) && !defined(SCCSID) | ||||||
| __RCSID("$NetBSD: eln.c,v 1.9 2010/11/04 13:53:12 christos Exp $"); | __RCSID("$NetBSD: eln.c,v 1.34 2016/05/09 21:37:34 christos Exp $"); | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| #include "histedit.h" | #include <errno.h> | ||||||
| #include "el.h" |  | ||||||
| #include "read.h" |  | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  |  | ||||||
| public int | #include "el.h" | ||||||
|  |  | ||||||
|  | int | ||||||
| el_getc(EditLine *el, char *cp) | el_getc(EditLine *el, char *cp) | ||||||
| { | { | ||||||
| 	int num_read; | 	int num_read; | ||||||
| 	wchar_t wc = 0; | 	wchar_t wc = 0; | ||||||
|  |  | ||||||
| 	if (!(el->el_flags & CHARSET_IS_UTF8)) | 	num_read = el_wgetc(el, &wc); | ||||||
| 		el->el_flags |= IGNORE_EXTCHARS; | 	*cp = '\0'; | ||||||
| 	num_read = el_wgetc (el, &wc); | 	if (num_read <= 0) | ||||||
| 	if (!(el->el_flags & CHARSET_IS_UTF8)) |  | ||||||
| 		el->el_flags &= ~IGNORE_EXTCHARS; |  | ||||||
|  |  | ||||||
| 	if (num_read > 0) |  | ||||||
| 		*cp = (unsigned char)wc; |  | ||||||
| 		return num_read; | 		return num_read; | ||||||
|  | 	num_read = wctob(wc); | ||||||
|  | 	if (num_read == EOF) { | ||||||
|  | 		errno = ERANGE; | ||||||
|  | 		return -1; | ||||||
|  | 	} else { | ||||||
|  | 		*cp = (char)num_read; | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| public void | void | ||||||
| el_push(EditLine *el, const char *str) | el_push(EditLine *el, const char *str) | ||||||
| { | { | ||||||
| 	/* Using multibyte->wide string decoding works fine under single-byte | 	/* Using multibyte->wide string decoding works fine under single-byte | ||||||
| @@ -71,36 +67,41 @@ el_push(EditLine *el, const char *str) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| public const char * | const char * | ||||||
| el_gets(EditLine *el, int *nread) | el_gets(EditLine *el, int *nread) | ||||||
| { | { | ||||||
| 	const wchar_t *tmp; | 	const wchar_t *tmp; | ||||||
|  |  | ||||||
| 	el->el_flags |= IGNORE_EXTCHARS; |  | ||||||
| 	tmp = el_wgets(el, nread); | 	tmp = el_wgets(el, nread); | ||||||
| 	el->el_flags &= ~IGNORE_EXTCHARS; | 	if (tmp != NULL) { | ||||||
|  | 	    int i; | ||||||
|  | 	    size_t nwread = 0; | ||||||
|  |  | ||||||
|  | 	    for (i = 0; i < *nread; i++) | ||||||
|  | 		nwread += ct_enc_width(tmp[i]); | ||||||
|  | 	    *nread = (int)nwread; | ||||||
|  | 	} | ||||||
| 	return ct_encode_string(tmp, &el->el_lgcyconv); | 	return ct_encode_string(tmp, &el->el_lgcyconv); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| public int | int | ||||||
| el_parse(EditLine *el, int argc, const char *argv[]) | el_parse(EditLine *el, int argc, const char *argv[]) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
| 	const wchar_t **wargv; | 	const wchar_t **wargv; | ||||||
|  |  | ||||||
| 	wargv = (const wchar_t **) | 	wargv = (void *)ct_decode_argv(argc, argv, &el->el_lgcyconv); | ||||||
| 	    ct_decode_argv(argc, argv, &el->el_lgcyconv); |  | ||||||
| 	if (!wargv) | 	if (!wargv) | ||||||
| 		return -1; | 		return -1; | ||||||
| 	ret = el_wparse(el, argc, wargv); | 	ret = el_wparse(el, argc, wargv); | ||||||
| 	ct_free_argv(wargv); | 	el_free(wargv); | ||||||
|  |  | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| public int | int | ||||||
| el_set(EditLine *el, int op, ...) | el_set(EditLine *el, int op, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| @@ -125,6 +126,22 @@ el_set(EditLine *el, int op, ...) | |||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	case EL_ALIAS_TEXT: { | ||||||
|  | 		el_afunc_t p = va_arg(ap, el_afunc_t); | ||||||
|  | 		void *arg = va_arg(ap, void *); | ||||||
|  | 		ret = ch_aliasfun(el, p, arg); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	case EL_PROMPT_ESC: | ||||||
|  | 	case EL_RPROMPT_ESC: { | ||||||
|  | 		el_pfunc_t p = va_arg(ap, el_pfunc_t); | ||||||
|  | 		int c = va_arg(ap, int); | ||||||
|  |  | ||||||
|  | 		ret = prompt_set(el, p, c, op, 0); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	case EL_TERMINAL:       /* const char * */ | 	case EL_TERMINAL:       /* const char * */ | ||||||
| 		ret = el_wset(el, op, va_arg(ap, char *)); | 		ret = el_wset(el, op, va_arg(ap, char *)); | ||||||
| 		break; | 		break; | ||||||
| @@ -149,12 +166,11 @@ el_set(EditLine *el, int op, ...) | |||||||
| 		const char *argv[20]; | 		const char *argv[20]; | ||||||
| 		int i; | 		int i; | ||||||
| 		const wchar_t **wargv; | 		const wchar_t **wargv; | ||||||
| 		for (i = 1; i < (int)__arraycount(argv); ++i) | 		for (i = 1; i < (int)__arraycount(argv) - 1; ++i) | ||||||
| 			if ((argv[i] = va_arg(ap, char *)) == NULL) | 			if ((argv[i] = va_arg(ap, const char *)) == NULL) | ||||||
| 			    break; | 			    break; | ||||||
| 		argv[0] = NULL; | 		argv[0] = argv[i] = NULL; | ||||||
| 		wargv = (const wchar_t **) | 		wargv = (void *)ct_decode_argv(i + 1, argv, &el->el_lgcyconv); | ||||||
| 		    ct_decode_argv(i, argv, &el->el_lgcyconv); |  | ||||||
| 		if (!wargv) { | 		if (!wargv) { | ||||||
| 		    ret = -1; | 		    ret = -1; | ||||||
| 		    goto out; | 		    goto out; | ||||||
| @@ -166,29 +182,29 @@ el_set(EditLine *el, int op, ...) | |||||||
| 		 */ | 		 */ | ||||||
| 		switch (op) { | 		switch (op) { | ||||||
| 		case EL_BIND: | 		case EL_BIND: | ||||||
| 			wargv[0] = STR("bind"); | 			wargv[0] = L"bind"; | ||||||
| 			ret = map_bind(el, i, wargv); | 			ret = map_bind(el, i, wargv); | ||||||
| 			break; | 			break; | ||||||
| 		case EL_TELLTC: | 		case EL_TELLTC: | ||||||
| 			wargv[0] = STR("telltc"); | 			wargv[0] = L"telltc"; | ||||||
| 			ret = term_telltc(el, i, wargv); | 			ret = terminal_telltc(el, i, wargv); | ||||||
| 			break; | 			break; | ||||||
| 		case EL_SETTC: | 		case EL_SETTC: | ||||||
| 			wargv[0] = STR("settc"); | 			wargv[0] = L"settc"; | ||||||
| 			ret = term_settc(el, i, wargv); | 			ret = terminal_settc(el, i, wargv); | ||||||
| 			break; | 			break; | ||||||
| 		case EL_ECHOTC: | 		case EL_ECHOTC: | ||||||
| 			wargv[0] = STR("echotc"); | 			wargv[0] = L"echotc"; | ||||||
| 			ret = term_echotc(el, i, wargv); | 			ret = terminal_echotc(el, i, wargv); | ||||||
| 			break; | 			break; | ||||||
| 		case EL_SETTY: | 		case EL_SETTY: | ||||||
| 			wargv[0] = STR("setty"); | 			wargv[0] = L"setty"; | ||||||
| 			ret = tty_stty(el, i, wargv); | 			ret = tty_stty(el, i, wargv); | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			ret = -1; | 			ret = -1; | ||||||
| 		} | 		} | ||||||
| 		ct_free_argv(wargv); | 		el_free(wargv); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -207,40 +223,42 @@ el_set(EditLine *el, int op, ...) | |||||||
| 		    ret = -1; | 		    ret = -1; | ||||||
| 		    goto out; | 		    goto out; | ||||||
| 		} | 		} | ||||||
| 		// XXX: The two strdup's leak | 		/* XXX: The two strdup's leak */ | ||||||
| 		ret = map_addfunc(el, Strdup(wargv[0]), Strdup(wargv[1]), | 		ret = map_addfunc(el, wcsdup(wargv[0]), wcsdup(wargv[1]), | ||||||
| 		    func); | 		    func); | ||||||
| 		ct_free_argv(wargv); | 		el_free(wargv); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	case EL_HIST: {           /* hist_fun_t, const char * */ | 	case EL_HIST: {           /* hist_fun_t, const char * */ | ||||||
| 		hist_fun_t fun = va_arg(ap, hist_fun_t); | 		hist_fun_t fun = va_arg(ap, hist_fun_t); | ||||||
| 		ptr_t ptr = va_arg(ap, ptr_t); | 		void *ptr = va_arg(ap, void *); | ||||||
| 		ret = hist_set(el, fun, ptr); | 		ret = hist_set(el, fun, ptr); | ||||||
| 		el->el_flags |= NARROW_HISTORY; | 		el->el_flags |= NARROW_HISTORY; | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	/* XXX: do we need to change el_rfunc_t? */ |  | ||||||
| 	case EL_GETCFN:         /* el_rfunc_t */ | 	case EL_GETCFN:         /* el_rfunc_t */ | ||||||
| 		ret = el_wset(el, op, va_arg(ap, el_rfunc_t)); | 		ret = el_wset(el, op, va_arg(ap, el_rfunc_t)); | ||||||
| 		el->el_flags |= NARROW_READ; |  | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case EL_CLIENTDATA:     /* void * */ | 	case EL_CLIENTDATA:     /* void * */ | ||||||
| 		ret = el_wset(el, op, va_arg(ap, void *)); | 		ret = el_wset(el, op, va_arg(ap, void *)); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case EL_SETFP: {          /* int, FILE * */ | 	case EL_SETFP: {          /* int, FILE * */ | ||||||
| 		int what = va_arg(ap, int); | 		int what = va_arg(ap, int); | ||||||
| 		FILE *fp = va_arg(ap, FILE *); | 		FILE *fp = va_arg(ap, FILE *); | ||||||
| 		ret = el_wset(el, op, what, fp); | 		ret = el_wset(el, op, what, fp); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	case EL_PROMPT_ESC: /* el_pfunc_t, char */ |  | ||||||
| 	case EL_RPROMPT_ESC: { | 	case EL_REFRESH: | ||||||
| 		el_pfunc_t p = va_arg(ap, el_pfunc_t); | 		re_clear_display(el); | ||||||
| 		char c = va_arg(ap, int); | 		re_refresh(el); | ||||||
| 		ret = prompt_set(el, p, c, op, 0); | 		terminal__flush(el); | ||||||
|  | 		ret = 0; | ||||||
| 		break; | 		break; | ||||||
| 	} |  | ||||||
| 	default: | 	default: | ||||||
| 		ret = -1; | 		ret = -1; | ||||||
| 		break; | 		break; | ||||||
| @@ -252,7 +270,7 @@ out: | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| public int | int | ||||||
| el_get(EditLine *el, int op, ...) | el_get(EditLine *el, int op, ...) | ||||||
| { | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| @@ -275,9 +293,9 @@ el_get(EditLine *el, int op, ...) | |||||||
| 	case EL_RPROMPT_ESC: { | 	case EL_RPROMPT_ESC: { | ||||||
| 		el_pfunc_t *p = va_arg(ap, el_pfunc_t *); | 		el_pfunc_t *p = va_arg(ap, el_pfunc_t *); | ||||||
| 		char *c = va_arg(ap, char *); | 		char *c = va_arg(ap, char *); | ||||||
| 		wchar_t wc; | 		wchar_t wc = 0; | ||||||
| 		ret = prompt_get(el, p, &wc, op); | 		ret = prompt_get(el, p, &wc, op); | ||||||
| 		*c = (unsigned char)wc; | 		*c = (char)wc; | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -310,11 +328,10 @@ el_get(EditLine *el, int op, ...) | |||||||
| 			if ((argv[i] = va_arg(ap, char *)) == NULL) | 			if ((argv[i] = va_arg(ap, char *)) == NULL) | ||||||
| 				break; | 				break; | ||||||
| 		argv[0] = gettc; | 		argv[0] = gettc; | ||||||
| 		ret = term_gettc(el, i, argv); | 		ret = terminal_gettc(el, i, argv); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* XXX: do we need to change el_rfunc_t? */ |  | ||||||
| 	case EL_GETCFN:         /* el_rfunc_t */ | 	case EL_GETCFN:         /* el_rfunc_t */ | ||||||
| 		ret = el_wget(el, op, va_arg(ap, el_rfunc_t *)); | 		ret = el_wget(el, op, va_arg(ap, el_rfunc_t *)); | ||||||
| 		break; | 		break; | ||||||
| @@ -346,7 +363,7 @@ el_line(EditLine *el) | |||||||
| 	const LineInfoW *winfo = el_wline(el); | 	const LineInfoW *winfo = el_wline(el); | ||||||
| 	LineInfo *info = &el->el_lgcylinfo; | 	LineInfo *info = &el->el_lgcylinfo; | ||||||
| 	size_t offset; | 	size_t offset; | ||||||
| 	const Char *p; | 	const wchar_t *p; | ||||||
|  |  | ||||||
| 	info->buffer   = ct_encode_string(winfo->buffer, &el->el_lgcyconv); | 	info->buffer   = ct_encode_string(winfo->buffer, &el->el_lgcyconv); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: emacs.c,v 1.23 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: emacs.c,v 1.36 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,37 +37,41 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)emacs.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)emacs.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: emacs.c,v 1.23 2009/12/30 22:37:40 christos Exp $"); | __RCSID("$NetBSD: emacs.c,v 1.36 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * emacs.c: Emacs functions |  * emacs.c: Emacs functions | ||||||
|  */ |  */ | ||||||
|  | #include <ctype.h> | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  | #include "emacs.h" | ||||||
|  | #include "fcns.h" | ||||||
|  |  | ||||||
| /* em_delete_or_list(): | /* em_delete_or_list(): | ||||||
|  *	Delete character under cursor or list completions if at end of line |  *	Delete character under cursor or list completions if at end of line | ||||||
|  *	[^D] |  *	[^D] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_delete_or_list(EditLine *el, Int c) | em_delete_or_list(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor == el->el_line.lastchar) { | 	if (el->el_line.cursor == el->el_line.lastchar) { | ||||||
| 					/* if I'm at the end */ | 					/* if I'm at the end */ | ||||||
| 		if (el->el_line.cursor == el->el_line.buffer) { | 		if (el->el_line.cursor == el->el_line.buffer) { | ||||||
| 					/* and the beginning */ | 					/* and the beginning */ | ||||||
| 			term_writec(el, c);	/* then do an EOF */ | 			terminal_writec(el, c);	/* then do an EOF */ | ||||||
| 			return (CC_EOF); | 			return CC_EOF; | ||||||
| 		} else { | 		} else { | ||||||
| 			/* | 			/* | ||||||
| 			 * Here we could list completions, but it is an | 			 * Here we could list completions, but it is an | ||||||
| 			 * error right now | 			 * error right now | ||||||
| 			 */ | 			 */ | ||||||
| 			term_beep(el); | 			terminal_beep(el); | ||||||
| 			return (CC_ERROR); | 			return CC_ERROR; | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		if (el->el_state.doingarg) | 		if (el->el_state.doingarg) | ||||||
| @@ -77,7 +81,7 @@ em_delete_or_list(EditLine *el, Int c) | |||||||
| 		if (el->el_line.cursor > el->el_line.lastchar) | 		if (el->el_line.cursor > el->el_line.lastchar) | ||||||
| 			el->el_line.cursor = el->el_line.lastchar; | 			el->el_line.cursor = el->el_line.lastchar; | ||||||
| 				/* bounds check */ | 				/* bounds check */ | ||||||
| 		return (CC_REFRESH); | 		return CC_REFRESH; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -86,14 +90,14 @@ em_delete_or_list(EditLine *el, Int c) | |||||||
|  *	Cut from cursor to end of current word |  *	Cut from cursor to end of current word | ||||||
|  *	[M-d] |  *	[M-d] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_delete_next_word(EditLine *el, Int c __attribute__((__unused__))) | em_delete_next_word(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *cp, *p, *kp; | 	wchar_t *cp, *p, *kp; | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor == el->el_line.lastchar) | 	if (el->el_line.cursor == el->el_line.lastchar) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	cp = c__next_word(el->el_line.cursor, el->el_line.lastchar, | 	cp = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ||||||
| 	    el->el_state.argument, ce__isword); | 	    el->el_state.argument, ce__isword); | ||||||
| @@ -107,7 +111,7 @@ em_delete_next_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	if (el->el_line.cursor > el->el_line.lastchar) | 	if (el->el_line.cursor > el->el_line.lastchar) | ||||||
| 		el->el_line.cursor = el->el_line.lastchar; | 		el->el_line.cursor = el->el_line.lastchar; | ||||||
| 				/* bounds check */ | 				/* bounds check */ | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -115,19 +119,19 @@ em_delete_next_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Paste cut buffer at cursor position |  *	Paste cut buffer at cursor position | ||||||
|  *	[^Y] |  *	[^Y] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_yank(EditLine *el, Int c __attribute__((__unused__))) | em_yank(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *kp, *cp; | 	wchar_t *kp, *cp; | ||||||
|  |  | ||||||
| 	if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) | 	if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) | ||||||
| 		return (CC_NORM); | 		return CC_NORM; | ||||||
|  |  | ||||||
| 	if (el->el_line.lastchar + | 	if (el->el_line.lastchar + | ||||||
| 	    (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= | 	    (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= | ||||||
| 	    el->el_line.limit) | 	    el->el_line.limit) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	el->el_chared.c_kill.mark = el->el_line.cursor; | 	el->el_chared.c_kill.mark = el->el_line.cursor; | ||||||
| 	cp = el->el_line.cursor; | 	cp = el->el_line.cursor; | ||||||
| @@ -143,7 +147,7 @@ em_yank(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	if (el->el_state.argument == 1) | 	if (el->el_state.argument == 1) | ||||||
| 		el->el_line.cursor = cp; | 		el->el_line.cursor = cp; | ||||||
|  |  | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -151,11 +155,11 @@ em_yank(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Cut the entire line and save in cut buffer |  *	Cut the entire line and save in cut buffer | ||||||
|  *	[^U] |  *	[^U] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_kill_line(EditLine *el, Int c __attribute__((__unused__))) | em_kill_line(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *kp, *cp; | 	wchar_t *kp, *cp; | ||||||
|  |  | ||||||
| 	cp = el->el_line.buffer; | 	cp = el->el_line.buffer; | ||||||
| 	kp = el->el_chared.c_kill.buf; | 	kp = el->el_chared.c_kill.buf; | ||||||
| @@ -165,7 +169,7 @@ em_kill_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 				/* zap! -- delete all of it */ | 				/* zap! -- delete all of it */ | ||||||
| 	el->el_line.lastchar = el->el_line.buffer; | 	el->el_line.lastchar = el->el_line.buffer; | ||||||
| 	el->el_line.cursor = el->el_line.buffer; | 	el->el_line.cursor = el->el_line.buffer; | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -173,14 +177,14 @@ em_kill_line(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Cut area between mark and cursor and save in cut buffer |  *	Cut area between mark and cursor and save in cut buffer | ||||||
|  *	[^W] |  *	[^W] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_kill_region(EditLine *el, Int c __attribute__((__unused__))) | em_kill_region(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *kp, *cp; | 	wchar_t *kp, *cp; | ||||||
|  |  | ||||||
| 	if (!el->el_chared.c_kill.mark) | 	if (!el->el_chared.c_kill.mark) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	if (el->el_chared.c_kill.mark > el->el_line.cursor) { | 	if (el->el_chared.c_kill.mark > el->el_line.cursor) { | ||||||
| 		cp = el->el_line.cursor; | 		cp = el->el_line.cursor; | ||||||
| @@ -198,7 +202,7 @@ em_kill_region(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 		c_delbefore(el, (int)(cp - el->el_chared.c_kill.mark)); | 		c_delbefore(el, (int)(cp - el->el_chared.c_kill.mark)); | ||||||
| 		el->el_line.cursor = el->el_chared.c_kill.mark; | 		el->el_line.cursor = el->el_chared.c_kill.mark; | ||||||
| 	} | 	} | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -206,14 +210,14 @@ em_kill_region(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Copy area between mark and cursor to cut buffer |  *	Copy area between mark and cursor to cut buffer | ||||||
|  *	[M-W] |  *	[M-W] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_copy_region(EditLine *el, Int c __attribute__((__unused__))) | em_copy_region(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *kp, *cp; | 	wchar_t *kp, *cp; | ||||||
|  |  | ||||||
| 	if (!el->el_chared.c_kill.mark) | 	if (!el->el_chared.c_kill.mark) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	if (el->el_chared.c_kill.mark > el->el_line.cursor) { | 	if (el->el_chared.c_kill.mark > el->el_line.cursor) { | ||||||
| 		cp = el->el_line.cursor; | 		cp = el->el_line.cursor; | ||||||
| @@ -228,7 +232,7 @@ em_copy_region(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 			*kp++ = *cp++;	/* copy it */ | 			*kp++ = *cp++;	/* copy it */ | ||||||
| 		el->el_chared.c_kill.last = kp; | 		el->el_chared.c_kill.last = kp; | ||||||
| 	} | 	} | ||||||
| 	return (CC_NORM); | 	return CC_NORM; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -236,8 +240,8 @@ em_copy_region(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Exchange the two characters before the cursor |  *	Exchange the two characters before the cursor | ||||||
|  *	Gosling emacs transpose chars [^T] |  *	Gosling emacs transpose chars [^T] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| em_gosmacs_transpose(EditLine *el, Int c) | em_gosmacs_transpose(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor > &el->el_line.buffer[1]) { | 	if (el->el_line.cursor > &el->el_line.buffer[1]) { | ||||||
| @@ -245,9 +249,9 @@ em_gosmacs_transpose(EditLine *el, Int c) | |||||||
| 		c = el->el_line.cursor[-2]; | 		c = el->el_line.cursor[-2]; | ||||||
| 		el->el_line.cursor[-2] = el->el_line.cursor[-1]; | 		el->el_line.cursor[-2] = el->el_line.cursor[-1]; | ||||||
| 		el->el_line.cursor[-1] = c; | 		el->el_line.cursor[-1] = c; | ||||||
| 		return (CC_REFRESH); | 		return CC_REFRESH; | ||||||
| 	} else | 	} else | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -255,12 +259,12 @@ em_gosmacs_transpose(EditLine *el, Int c) | |||||||
|  *	Move next to end of current word |  *	Move next to end of current word | ||||||
|  *	[M-f] |  *	[M-f] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_next_word(EditLine *el, Int c __attribute__((__unused__))) | em_next_word(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	if (el->el_line.cursor == el->el_line.lastchar) | 	if (el->el_line.cursor == el->el_line.lastchar) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	el->el_line.cursor = c__next_word(el->el_line.cursor, | 	el->el_line.cursor = c__next_word(el->el_line.cursor, | ||||||
| 	    el->el_line.lastchar, | 	    el->el_line.lastchar, | ||||||
| @@ -270,9 +274,9 @@ em_next_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	if (el->el_map.type == MAP_VI) | 	if (el->el_map.type == MAP_VI) | ||||||
| 		if (el->el_chared.c_vcmd.action != NOP) { | 		if (el->el_chared.c_vcmd.action != NOP) { | ||||||
| 			cv_delfini(el); | 			cv_delfini(el); | ||||||
| 			return (CC_REFRESH); | 			return CC_REFRESH; | ||||||
| 		} | 		} | ||||||
| 	return (CC_CURSOR); | 	return CC_CURSOR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -280,23 +284,23 @@ em_next_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Uppercase the characters from cursor to end of current word |  *	Uppercase the characters from cursor to end of current word | ||||||
|  *	[M-u] |  *	[M-u] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_upper_case(EditLine *el, Int c __attribute__((__unused__))) | em_upper_case(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *cp, *ep; | 	wchar_t *cp, *ep; | ||||||
|  |  | ||||||
| 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ||||||
| 	    el->el_state.argument, ce__isword); | 	    el->el_state.argument, ce__isword); | ||||||
|  |  | ||||||
| 	for (cp = el->el_line.cursor; cp < ep; cp++) | 	for (cp = el->el_line.cursor; cp < ep; cp++) | ||||||
| 		if (Islower(*cp)) | 		if (iswlower(*cp)) | ||||||
| 			*cp = Toupper(*cp); | 			*cp = towupper(*cp); | ||||||
|  |  | ||||||
| 	el->el_line.cursor = ep; | 	el->el_line.cursor = ep; | ||||||
| 	if (el->el_line.cursor > el->el_line.lastchar) | 	if (el->el_line.cursor > el->el_line.lastchar) | ||||||
| 		el->el_line.cursor = el->el_line.lastchar; | 		el->el_line.cursor = el->el_line.lastchar; | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -304,31 +308,31 @@ em_upper_case(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Capitalize the characters from cursor to end of current word |  *	Capitalize the characters from cursor to end of current word | ||||||
|  *	[M-c] |  *	[M-c] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_capitol_case(EditLine *el, Int c __attribute__((__unused__))) | em_capitol_case(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *cp, *ep; | 	wchar_t *cp, *ep; | ||||||
|  |  | ||||||
| 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ||||||
| 	    el->el_state.argument, ce__isword); | 	    el->el_state.argument, ce__isword); | ||||||
|  |  | ||||||
| 	for (cp = el->el_line.cursor; cp < ep; cp++) { | 	for (cp = el->el_line.cursor; cp < ep; cp++) { | ||||||
| 		if (Isalpha(*cp)) { | 		if (iswalpha(*cp)) { | ||||||
| 			if (Islower(*cp)) | 			if (iswlower(*cp)) | ||||||
| 				*cp = Toupper(*cp); | 				*cp = towupper(*cp); | ||||||
| 			cp++; | 			cp++; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	for (; cp < ep; cp++) | 	for (; cp < ep; cp++) | ||||||
| 		if (Isupper(*cp)) | 		if (iswupper(*cp)) | ||||||
| 			*cp = Tolower(*cp); | 			*cp = towlower(*cp); | ||||||
|  |  | ||||||
| 	el->el_line.cursor = ep; | 	el->el_line.cursor = ep; | ||||||
| 	if (el->el_line.cursor > el->el_line.lastchar) | 	if (el->el_line.cursor > el->el_line.lastchar) | ||||||
| 		el->el_line.cursor = el->el_line.lastchar; | 		el->el_line.cursor = el->el_line.lastchar; | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -336,23 +340,23 @@ em_capitol_case(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Lowercase the characters from cursor to end of current word |  *	Lowercase the characters from cursor to end of current word | ||||||
|  *	[M-l] |  *	[M-l] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_lower_case(EditLine *el, Int c __attribute__((__unused__))) | em_lower_case(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *cp, *ep; | 	wchar_t *cp, *ep; | ||||||
|  |  | ||||||
| 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | 	ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, | ||||||
| 	    el->el_state.argument, ce__isword); | 	    el->el_state.argument, ce__isword); | ||||||
|  |  | ||||||
| 	for (cp = el->el_line.cursor; cp < ep; cp++) | 	for (cp = el->el_line.cursor; cp < ep; cp++) | ||||||
| 		if (Isupper(*cp)) | 		if (iswupper(*cp)) | ||||||
| 			*cp = Tolower(*cp); | 			*cp = towlower(*cp); | ||||||
|  |  | ||||||
| 	el->el_line.cursor = ep; | 	el->el_line.cursor = ep; | ||||||
| 	if (el->el_line.cursor > el->el_line.lastchar) | 	if (el->el_line.cursor > el->el_line.lastchar) | ||||||
| 		el->el_line.cursor = el->el_line.lastchar; | 		el->el_line.cursor = el->el_line.lastchar; | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -360,13 +364,13 @@ em_lower_case(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Set the mark at cursor |  *	Set the mark at cursor | ||||||
|  *	[^@] |  *	[^@] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_set_mark(EditLine *el, Int c __attribute__((__unused__))) | em_set_mark(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_chared.c_kill.mark = el->el_line.cursor; | 	el->el_chared.c_kill.mark = el->el_line.cursor; | ||||||
| 	return (CC_NORM); | 	return CC_NORM; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -374,16 +378,16 @@ em_set_mark(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Exchange the cursor and mark |  *	Exchange the cursor and mark | ||||||
|  *	[^X^X] |  *	[^X^X] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_exchange_mark(EditLine *el, Int c __attribute__((__unused__))) | em_exchange_mark(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *cp; | 	wchar_t *cp; | ||||||
|  |  | ||||||
| 	cp = el->el_line.cursor; | 	cp = el->el_line.cursor; | ||||||
| 	el->el_line.cursor = el->el_chared.c_kill.mark; | 	el->el_line.cursor = el->el_chared.c_kill.mark; | ||||||
| 	el->el_chared.c_kill.mark = cp; | 	el->el_chared.c_kill.mark = cp; | ||||||
| 	return (CC_CURSOR); | 	return CC_CURSOR; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -391,16 +395,16 @@ em_exchange_mark(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Universal argument (argument times 4) |  *	Universal argument (argument times 4) | ||||||
|  *	[^U] |  *	[^U] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_universal_argument(EditLine *el, Int c __attribute__((__unused__))) | em_universal_argument(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| {				/* multiply current argument by 4 */ | {				/* multiply current argument by 4 */ | ||||||
|  |  | ||||||
| 	if (el->el_state.argument > 1000000) | 	if (el->el_state.argument > 1000000) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| 	el->el_state.doingarg = 1; | 	el->el_state.doingarg = 1; | ||||||
| 	el->el_state.argument *= 4; | 	el->el_state.argument *= 4; | ||||||
| 	return (CC_ARGHACK); | 	return CC_ARGHACK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -408,41 +412,41 @@ em_universal_argument(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Add 8th bit to next character typed |  *	Add 8th bit to next character typed | ||||||
|  *	[<ESC>] |  *	[<ESC>] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_meta_next(EditLine *el, Int c __attribute__((__unused__))) | em_meta_next(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_state.metanext = 1; | 	el->el_state.metanext = 1; | ||||||
| 	return (CC_ARGHACK); | 	return CC_ARGHACK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* em_toggle_overwrite(): | /* em_toggle_overwrite(): | ||||||
|  *	Switch from insert to overwrite mode or vice versa |  *	Switch from insert to overwrite mode or vice versa | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_toggle_overwrite(EditLine *el, Int c __attribute__((__unused__))) | em_toggle_overwrite(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? | 	el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? | ||||||
| 	    MODE_REPLACE : MODE_INSERT; | 	    MODE_REPLACE : MODE_INSERT; | ||||||
| 	return (CC_NORM); | 	return CC_NORM; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* em_copy_prev_word(): | /* em_copy_prev_word(): | ||||||
|  *	Copy current word to cursor |  *	Copy current word to cursor | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_copy_prev_word(EditLine *el, Int c __attribute__((__unused__))) | em_copy_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	Char *cp, *oldc, *dp; | 	wchar_t *cp, *oldc, *dp; | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor == el->el_line.buffer) | 	if (el->el_line.cursor == el->el_line.buffer) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	oldc = el->el_line.cursor; | 	oldc = el->el_line.cursor; | ||||||
| 	/* does a bounds check */ | 	/* does a bounds check */ | ||||||
| @@ -455,33 +459,33 @@ em_copy_prev_word(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  |  | ||||||
| 	el->el_line.cursor = dp;/* put cursor at end */ | 	el->el_line.cursor = dp;/* put cursor at end */ | ||||||
|  |  | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* em_inc_search_next(): | /* em_inc_search_next(): | ||||||
|  *	Emacs incremental next search |  *	Emacs incremental next search | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_inc_search_next(EditLine *el, Int c __attribute__((__unused__))) | em_inc_search_next(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_search.patlen = 0; | 	el->el_search.patlen = 0; | ||||||
| 	return (ce_inc_search(el, ED_SEARCH_NEXT_HISTORY)); | 	return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* em_inc_search_prev(): | /* em_inc_search_prev(): | ||||||
|  *	Emacs incremental reverse search |  *	Emacs incremental reverse search | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_inc_search_prev(EditLine *el, Int c __attribute__((__unused__))) | em_inc_search_prev(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_search.patlen = 0; | 	el->el_search.patlen = 0; | ||||||
| 	return (ce_inc_search(el, ED_SEARCH_PREV_HISTORY)); | 	return ce_inc_search(el, ED_SEARCH_PREV_HISTORY); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -489,13 +493,13 @@ em_inc_search_prev(EditLine *el, Int c __attribute__((__unused__))) | |||||||
|  *	Delete the character to the left of the cursor |  *	Delete the character to the left of the cursor | ||||||
|  *	[^?] |  *	[^?] | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| em_delete_prev_char(EditLine *el, Int c __attribute__((__unused__))) | em_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor <= el->el_line.buffer) | 	if (el->el_line.cursor <= el->el_line.buffer) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	if (el->el_state.doingarg) | 	if (el->el_state.doingarg) | ||||||
| 		c_delbefore(el, el->el_state.argument); | 		c_delbefore(el, el->el_state.argument); | ||||||
| @@ -504,5 +508,5 @@ em_delete_prev_char(EditLine *el, Int c __attribute__((__unused__))) | |||||||
| 	el->el_line.cursor -= el->el_state.argument; | 	el->el_line.cursor -= el->el_state.argument; | ||||||
| 	if (el->el_line.cursor < el->el_line.buffer) | 	if (el->el_line.cursor < el->el_line.buffer) | ||||||
| 		el->el_line.cursor = el->el_line.buffer; | 		el->el_line.cursor = el->el_line.buffer; | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,107 +0,0 @@ | |||||||
| /*	$NetBSD: fgetln.c,v 1.9 2008/04/29 06:53:03 martin Exp $	*/ |  | ||||||
|  |  | ||||||
| /*- |  | ||||||
|  * Copyright (c) 1998 The NetBSD Foundation, Inc. |  | ||||||
|  * All rights reserved. |  | ||||||
|  * |  | ||||||
|  * This code is derived from software contributed to The NetBSD Foundation |  | ||||||
|  * by Christos Zoulas. |  | ||||||
|  * |  | ||||||
|  * Redistribution and use in source and binary forms, with or without |  | ||||||
|  * modification, are permitted provided that the following conditions |  | ||||||
|  * are met: |  | ||||||
|  * 1. Redistributions of source code must retain the above copyright |  | ||||||
|  *    notice, this list of conditions and the following disclaimer. |  | ||||||
|  * 2. Redistributions in binary form must reproduce the above copyright |  | ||||||
|  *    notice, this list of conditions and the following disclaimer in the |  | ||||||
|  *    documentation and/or other materials provided with the distribution. |  | ||||||
|  * |  | ||||||
|  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |  | ||||||
|  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |  | ||||||
|  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |  | ||||||
|  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |  | ||||||
|  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |  | ||||||
|  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |  | ||||||
|  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |  | ||||||
|  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |  | ||||||
|  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |  | ||||||
|  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |  | ||||||
|  * POSSIBILITY OF SUCH DAMAGE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #ifdef HAVE_NBTOOL_CONFIG_H |  | ||||||
| #include "nbtool_config.h" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if !HAVE_FGETLN |  | ||||||
| #include "config.h" |  | ||||||
| #include <stdlib.h> |  | ||||||
| #ifndef HAVE_NBTOOL_CONFIG_H |  | ||||||
| /* These headers are required, but included from nbtool_config.h */ |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <unistd.h> |  | ||||||
| #include <errno.h> |  | ||||||
| #include <string.h> |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| char * |  | ||||||
| fgetln(FILE *fp, size_t *len) |  | ||||||
| { |  | ||||||
| 	static char *buf = NULL; |  | ||||||
| 	static size_t bufsiz = 0; |  | ||||||
| 	char *ptr; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	if (buf == NULL) { |  | ||||||
| 		bufsiz = BUFSIZ; |  | ||||||
| 		if ((buf = malloc(bufsiz)) == NULL) |  | ||||||
| 			return NULL; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if (fgets(buf, bufsiz, fp) == NULL) |  | ||||||
| 		return NULL; |  | ||||||
|  |  | ||||||
| 	*len = 0; |  | ||||||
| 	while ((ptr = strchr(&buf[*len], '\n')) == NULL) { |  | ||||||
| 		size_t nbufsiz = bufsiz + BUFSIZ; |  | ||||||
| 		char *nbuf = realloc(buf, nbufsiz); |  | ||||||
|  |  | ||||||
| 		if (nbuf == NULL) { |  | ||||||
| 			int oerrno = errno; |  | ||||||
| 			free(buf); |  | ||||||
| 			errno = oerrno; |  | ||||||
| 			buf = NULL; |  | ||||||
| 			return NULL; |  | ||||||
| 		} else |  | ||||||
| 			buf = nbuf; |  | ||||||
|  |  | ||||||
| 		if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL) { |  | ||||||
| 			buf[bufsiz] = '\0'; |  | ||||||
| 			*len = strlen(buf); |  | ||||||
| 			return buf; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		*len = bufsiz; |  | ||||||
| 		bufsiz = nbufsiz; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	*len = (ptr - buf) + 1; |  | ||||||
| 	return buf; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef TEST |  | ||||||
| int |  | ||||||
| main(int argc, char *argv[]) |  | ||||||
| { |  | ||||||
| 	char *p; |  | ||||||
| 	size_t len; |  | ||||||
|  |  | ||||||
| 	while ((p = fgetln(stdin, &len)) != NULL) { |  | ||||||
| 		(void)printf("%llu %s", (unsigned long long)len, p); |  | ||||||
| 		free(p); |  | ||||||
| 	} |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: filecomplete.c,v 1.23 2010/12/06 00:05:38 dholland Exp $	*/ | /*	$NetBSD: filecomplete.c,v 1.44 2016/10/31 17:46:32 abhinav Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1997 The NetBSD Foundation, Inc. |  * Copyright (c) 1997 The NetBSD Foundation, Inc. | ||||||
| @@ -29,52 +29,27 @@ | |||||||
|  * POSSIBILITY OF SUCH DAMAGE. |  * POSSIBILITY OF SUCH DAMAGE. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* AIX requires this to be the first thing in the file.  */ |  | ||||||
| #if defined (_AIX) && !defined (__GNUC__) |  | ||||||
|  #pragma alloca |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
|  |  | ||||||
| #ifdef __GNUC__ |  | ||||||
| # undef alloca |  | ||||||
| # define alloca(n) __builtin_alloca (n) |  | ||||||
| #else |  | ||||||
| # ifdef HAVE_ALLOCA_H |  | ||||||
| #  include <alloca.h> |  | ||||||
| # else |  | ||||||
| #  ifndef _AIX |  | ||||||
| extern char *alloca (); |  | ||||||
| #  endif |  | ||||||
| # endif |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if !defined(lint) && !defined(SCCSID) | #if !defined(lint) && !defined(SCCSID) | ||||||
| __RCSID("$NetBSD: filecomplete.c,v 1.23 2010/12/06 00:05:38 dholland Exp $"); | __RCSID("$NetBSD: filecomplete.c,v 1.44 2016/10/31 17:46:32 abhinav Exp $"); | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
| #include <stdio.h> |  | ||||||
| #include <dirent.h> | #include <dirent.h> | ||||||
| #include <string.h> |  | ||||||
| #include <pwd.h> |  | ||||||
| #include <ctype.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <unistd.h> |  | ||||||
| #include <limits.h> |  | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #include <vis.h> | #include <limits.h> | ||||||
|  | #include <pwd.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
| #include "fcns.h"		/* for EL_NUM_FCNS */ |  | ||||||
| #include "histedit.h" |  | ||||||
| #include "filecomplete.h" | #include "filecomplete.h" | ||||||
|  |  | ||||||
| static const Char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', | static const wchar_t break_chars[] = L" \t\n\"\\'`@$><=;|&{("; | ||||||
|     '$', '>', '<', '=', ';', '|', '&', '{', '(', '\0' }; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /********************************/ | /********************************/ | ||||||
| /* completion functions */ | /* completion functions */ | ||||||
| @@ -84,18 +59,21 @@ static const Char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', | |||||||
|  * if ``user'' isn't valid user name or ``txt'' doesn't start |  * if ``user'' isn't valid user name or ``txt'' doesn't start | ||||||
|  * w/ '~', returns pointer to strdup()ed copy of ``txt'' |  * w/ '~', returns pointer to strdup()ed copy of ``txt'' | ||||||
|  * |  * | ||||||
|  * it's callers's responsibility to free() returned string |  * it's the caller's responsibility to free() the returned string | ||||||
|  */ |  */ | ||||||
| char * | char * | ||||||
| fn_tilde_expand(const char *txt) | fn_tilde_expand(const char *txt) | ||||||
| { | { | ||||||
| 	struct passwd pwres, *pass; | #if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT) | ||||||
|  | 	struct passwd pwres; | ||||||
|  | 	char pwbuf[1024]; | ||||||
|  | #endif | ||||||
|  | 	struct passwd *pass; | ||||||
| 	char *temp; | 	char *temp; | ||||||
| 	size_t len = 0; | 	size_t len = 0; | ||||||
| 	char pwbuf[1024]; |  | ||||||
|  |  | ||||||
| 	if (txt[0] != '~') | 	if (txt[0] != '~') | ||||||
| 		return (strdup(txt)); | 		return strdup(txt); | ||||||
|  |  | ||||||
| 	temp = strchr(txt + 1, '/'); | 	temp = strchr(txt + 1, '/'); | ||||||
| 	if (temp == NULL) { | 	if (temp == NULL) { | ||||||
| @@ -103,8 +81,9 @@ fn_tilde_expand(const char *txt) | |||||||
| 		if (temp == NULL) | 		if (temp == NULL) | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 	} else { | 	} else { | ||||||
| 		len = temp - txt + 1;	/* text until string after slash */ | 		/* text until string after slash */ | ||||||
| 		temp = malloc(len); | 		len = (size_t)(temp - txt + 1); | ||||||
|  | 		temp = el_malloc(len * sizeof(*temp)); | ||||||
| 		if (temp == NULL) | 		if (temp == NULL) | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 		(void)strncpy(temp, txt + 1, len - 2); | 		(void)strncpy(temp, txt + 1, len - 2); | ||||||
| @@ -112,7 +91,8 @@ fn_tilde_expand(const char *txt) | |||||||
| 	} | 	} | ||||||
| 	if (temp[0] == 0) { | 	if (temp[0] == 0) { | ||||||
| #ifdef HAVE_GETPW_R_POSIX | #ifdef HAVE_GETPW_R_POSIX | ||||||
| 		if (getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf), &pass) != 0) | 		if (getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf), | ||||||
|  | 		    &pass) != 0) | ||||||
| 			pass = NULL; | 			pass = NULL; | ||||||
| #elif HAVE_GETPW_R_DRAFT | #elif HAVE_GETPW_R_DRAFT | ||||||
| 		pass = getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf)); | 		pass = getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf)); | ||||||
| @@ -129,20 +109,21 @@ fn_tilde_expand(const char *txt) | |||||||
| 		pass = getpwnam(temp); | 		pass = getpwnam(temp); | ||||||
| #endif | #endif | ||||||
| 	} | 	} | ||||||
| 	free(temp);		/* value no more needed */ | 	el_free(temp);		/* value no more needed */ | ||||||
| 	if (pass == NULL) | 	if (pass == NULL) | ||||||
| 		return (strdup(txt)); | 		return strdup(txt); | ||||||
|  |  | ||||||
| 	/* update pointer txt to point at string immedially following */ | 	/* update pointer txt to point at string immedially following */ | ||||||
| 	/* first slash */ | 	/* first slash */ | ||||||
| 	txt += len; | 	txt += len; | ||||||
|  |  | ||||||
| 	temp = malloc(strlen(pass->pw_dir) + 1 + strlen(txt) + 1); | 	len = strlen(pass->pw_dir) + 1 + strlen(txt) + 1; | ||||||
|  | 	temp = el_malloc(len * sizeof(*temp)); | ||||||
| 	if (temp == NULL) | 	if (temp == NULL) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	(void)sprintf(temp, "%s/%s", pass->pw_dir, txt); | 	(void)snprintf(temp, len, "%s/%s", pass->pw_dir, txt); | ||||||
|  |  | ||||||
| 	return (temp); | 	return temp; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -151,7 +132,7 @@ fn_tilde_expand(const char *txt) | |||||||
|  * such file can be found |  * such file can be found | ||||||
|  * value of ``state'' is ignored |  * value of ``state'' is ignored | ||||||
|  * |  * | ||||||
|  * it's caller's responsibility to free returned string |  * it's the caller's responsibility to free the returned string | ||||||
|  */ |  */ | ||||||
| char * | char * | ||||||
| fn_filename_completion_function(const char *text, int state) | fn_filename_completion_function(const char *text, int state) | ||||||
| @@ -168,19 +149,21 @@ fn_filename_completion_function(const char *text, int state) | |||||||
| 		if (temp) { | 		if (temp) { | ||||||
| 			char *nptr; | 			char *nptr; | ||||||
| 			temp++; | 			temp++; | ||||||
| 			nptr = realloc(filename, strlen(temp) + 1); | 			nptr = el_realloc(filename, (strlen(temp) + 1) * | ||||||
|  | 			    sizeof(*nptr)); | ||||||
| 			if (nptr == NULL) { | 			if (nptr == NULL) { | ||||||
| 				free(filename); | 				el_free(filename); | ||||||
| 				filename = NULL; | 				filename = NULL; | ||||||
| 				return NULL; | 				return NULL; | ||||||
| 			} | 			} | ||||||
| 			filename = nptr; | 			filename = nptr; | ||||||
| 			(void)strcpy(filename, temp); | 			(void)strcpy(filename, temp); | ||||||
| 			len = temp - text;	/* including last slash */ | 			len = (size_t)(temp - text);	/* including last slash */ | ||||||
|  |  | ||||||
| 			nptr = realloc(dirname, len + 1); | 			nptr = el_realloc(dirname, (len + 1) * | ||||||
|  | 			    sizeof(*nptr)); | ||||||
| 			if (nptr == NULL) { | 			if (nptr == NULL) { | ||||||
| 				free(dirname); | 				el_free(dirname); | ||||||
| 				dirname = NULL; | 				dirname = NULL; | ||||||
| 				return NULL; | 				return NULL; | ||||||
| 			} | 			} | ||||||
| @@ -188,7 +171,7 @@ fn_filename_completion_function(const char *text, int state) | |||||||
| 			(void)strncpy(dirname, text, len); | 			(void)strncpy(dirname, text, len); | ||||||
| 			dirname[len] = '\0'; | 			dirname[len] = '\0'; | ||||||
| 		} else { | 		} else { | ||||||
| 			free(filename); | 			el_free(filename); | ||||||
| 			if (*text == 0) | 			if (*text == 0) | ||||||
| 				filename = NULL; | 				filename = NULL; | ||||||
| 			else { | 			else { | ||||||
| @@ -196,7 +179,7 @@ fn_filename_completion_function(const char *text, int state) | |||||||
| 				if (filename == NULL) | 				if (filename == NULL) | ||||||
| 					return NULL; | 					return NULL; | ||||||
| 			} | 			} | ||||||
| 			free(dirname); | 			el_free(dirname); | ||||||
| 			dirname = NULL; | 			dirname = NULL; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -207,7 +190,7 @@ fn_filename_completion_function(const char *text, int state) | |||||||
|  |  | ||||||
| 		/* support for ``~user'' syntax */ | 		/* support for ``~user'' syntax */ | ||||||
|  |  | ||||||
| 		free(dirpath); | 		el_free(dirpath); | ||||||
| 		dirpath = NULL; | 		dirpath = NULL; | ||||||
| 		if (dirname == NULL) { | 		if (dirname == NULL) { | ||||||
| 			if ((dirname = strdup("")) == NULL) | 			if ((dirname = strdup("")) == NULL) | ||||||
| @@ -223,7 +206,7 @@ fn_filename_completion_function(const char *text, int state) | |||||||
|  |  | ||||||
| 		dir = opendir(dirpath); | 		dir = opendir(dirpath); | ||||||
| 		if (!dir) | 		if (!dir) | ||||||
| 			return (NULL);	/* cannot open the directory */ | 			return NULL;	/* cannot open the directory */ | ||||||
|  |  | ||||||
| 		/* will be used in cycle */ | 		/* will be used in cycle */ | ||||||
| 		filename_len = filename ? strlen(filename) : 0; | 		filename_len = filename ? strlen(filename) : 0; | ||||||
| @@ -240,8 +223,11 @@ fn_filename_completion_function(const char *text, int state) | |||||||
| 		/* otherwise, get first entry where first */ | 		/* otherwise, get first entry where first */ | ||||||
| 		/* filename_len characters are equal	  */ | 		/* filename_len characters are equal	  */ | ||||||
| 		if (entry->d_name[0] == filename[0] | 		if (entry->d_name[0] == filename[0] | ||||||
|           /* Some dirents have d_namlen, but it is not portable. */ | #if HAVE_STRUCT_DIRENT_D_NAMLEN | ||||||
|  | 		    && entry->d_namlen >= filename_len | ||||||
|  | #else | ||||||
| 		    && strlen(entry->d_name) >= filename_len | 		    && strlen(entry->d_name) >= filename_len | ||||||
|  | #endif | ||||||
| 		    && strncmp(entry->d_name, filename, | 		    && strncmp(entry->d_name, filename, | ||||||
| 			filename_len) == 0) | 			filename_len) == 0) | ||||||
| 			break; | 			break; | ||||||
| @@ -249,20 +235,24 @@ fn_filename_completion_function(const char *text, int state) | |||||||
|  |  | ||||||
| 	if (entry) {		/* match found */ | 	if (entry) {		/* match found */ | ||||||
|  |  | ||||||
|        /* Some dirents have d_namlen, but it is not portable. */ | #if HAVE_STRUCT_DIRENT_D_NAMLEN | ||||||
|  | 		len = entry->d_namlen; | ||||||
|  | #else | ||||||
| 		len = strlen(entry->d_name); | 		len = strlen(entry->d_name); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| 		temp = malloc(strlen(dirname) + len + 1); | 		len = strlen(dirname) + len + 1; | ||||||
|  | 		temp = el_malloc(len * sizeof(*temp)); | ||||||
| 		if (temp == NULL) | 		if (temp == NULL) | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 		(void)sprintf(temp, "%s%s", dirname, entry->d_name); | 		(void)snprintf(temp, len, "%s%s", dirname, entry->d_name); | ||||||
| 	} else { | 	} else { | ||||||
| 		(void)closedir(dir); | 		(void)closedir(dir); | ||||||
| 		dir = NULL; | 		dir = NULL; | ||||||
| 		temp = NULL; | 		temp = NULL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return (temp); | 	return temp; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -279,7 +269,7 @@ append_char_function(const char *name) | |||||||
| 		rs = "/"; | 		rs = "/"; | ||||||
| out: | out: | ||||||
| 	if (expname) | 	if (expname) | ||||||
| 		free(expname); | 		el_free(expname); | ||||||
| 	return rs; | 	return rs; | ||||||
| } | } | ||||||
| /* | /* | ||||||
| @@ -302,10 +292,10 @@ completion_matches(const char *text, char *(*genfunc)(const char *, int)) | |||||||
| 			char **nmatch_list; | 			char **nmatch_list; | ||||||
| 			while (matches + 3 >= match_list_len) | 			while (matches + 3 >= match_list_len) | ||||||
| 				match_list_len <<= 1; | 				match_list_len <<= 1; | ||||||
| 			nmatch_list = realloc(match_list, | 			nmatch_list = el_realloc(match_list, | ||||||
| 			    match_list_len * sizeof(char *)); | 			    match_list_len * sizeof(*nmatch_list)); | ||||||
| 			if (nmatch_list == NULL) { | 			if (nmatch_list == NULL) { | ||||||
| 				free(match_list); | 				el_free(match_list); | ||||||
| 				return NULL; | 				return NULL; | ||||||
| 			} | 			} | ||||||
| 			match_list = nmatch_list; | 			match_list = nmatch_list; | ||||||
| @@ -328,9 +318,9 @@ completion_matches(const char *text, char *(*genfunc)(const char *, int)) | |||||||
| 		max_equal = i; | 		max_equal = i; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	retstr = malloc(max_equal + 1); | 	retstr = el_malloc((max_equal + 1) * sizeof(*retstr)); | ||||||
| 	if (retstr == NULL) { | 	if (retstr == NULL) { | ||||||
| 		free(match_list); | 		el_free(match_list); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 	(void)strncpy(retstr, match_list[1], max_equal); | 	(void)strncpy(retstr, match_list[1], max_equal); | ||||||
| @@ -338,9 +328,9 @@ completion_matches(const char *text, char *(*genfunc)(const char *, int)) | |||||||
| 	match_list[0] = retstr; | 	match_list[0] = retstr; | ||||||
|  |  | ||||||
| 	/* add NULL as last pointer to the array */ | 	/* add NULL as last pointer to the array */ | ||||||
| 	match_list[matches + 1] = (char *) NULL; | 	match_list[matches + 1] = NULL; | ||||||
|  |  | ||||||
| 	return (match_list); | 	return match_list; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -367,7 +357,7 @@ void | |||||||
| fn_display_match_list (EditLine *el, char **matches, size_t num, size_t width) | fn_display_match_list (EditLine *el, char **matches, size_t num, size_t width) | ||||||
| { | { | ||||||
| 	size_t line, lines, col, cols, thisguy; | 	size_t line, lines, col, cols, thisguy; | ||||||
| 	int screenwidth = el->el_term.t_size.h; | 	int screenwidth = el->el_terminal.t_size.h; | ||||||
|  |  | ||||||
| 	/* Ignore matches[0]. Avoid 1-based array logic below. */ | 	/* Ignore matches[0]. Avoid 1-based array logic below. */ | ||||||
| 	matches++; | 	matches++; | ||||||
| @@ -377,7 +367,7 @@ fn_display_match_list (EditLine *el, char **matches, size_t num, size_t width) | |||||||
| 	 * Find out how many entries can be put on one line; count | 	 * Find out how many entries can be put on one line; count | ||||||
| 	 * with one space between strings the same way it's printed. | 	 * with one space between strings the same way it's printed. | ||||||
| 	 */ | 	 */ | ||||||
| 	cols = screenwidth / (width + 1); | 	cols = (size_t)screenwidth / (width + 1); | ||||||
| 	if (cols == 0) | 	if (cols == 0) | ||||||
| 		cols = 1; | 		cols = 1; | ||||||
|  |  | ||||||
| @@ -418,14 +408,14 @@ int | |||||||
| fn_complete(EditLine *el, | fn_complete(EditLine *el, | ||||||
| 	char *(*complet_func)(const char *, int), | 	char *(*complet_func)(const char *, int), | ||||||
| 	char **(*attempted_completion_function)(const char *, int, int), | 	char **(*attempted_completion_function)(const char *, int, int), | ||||||
| 	const Char *word_break, const Char *special_prefixes, | 	const wchar_t *word_break, const wchar_t *special_prefixes, | ||||||
| 	const char *(*app_func)(const char *), size_t query_items, | 	const char *(*app_func)(const char *), size_t query_items, | ||||||
| 	int *completion_type, int *over, int *point, int *end) | 	int *completion_type, int *over, int *point, int *end) | ||||||
| { | { | ||||||
| 	const TYPE(LineInfo) *li; | 	const LineInfoW *li; | ||||||
| 	Char *temp; | 	wchar_t *temp; | ||||||
|         char **matches; |         char **matches; | ||||||
| 	const Char *ctemp; | 	const wchar_t *ctemp; | ||||||
| 	size_t len; | 	size_t len; | ||||||
| 	int what_to_do = '\t'; | 	int what_to_do = '\t'; | ||||||
| 	int retval = CC_NORM; | 	int retval = CC_NORM; | ||||||
| @@ -443,38 +433,36 @@ fn_complete(EditLine *el, | |||||||
| 		app_func = append_char_function; | 		app_func = append_char_function; | ||||||
|  |  | ||||||
| 	/* We now look backwards for the start of a filename/variable word */ | 	/* We now look backwards for the start of a filename/variable word */ | ||||||
| 	li = FUN(el,line)(el); | 	li = el_wline(el); | ||||||
| 	ctemp = li->cursor; | 	ctemp = li->cursor; | ||||||
| 	while (ctemp > li->buffer | 	while (ctemp > li->buffer | ||||||
| 	    && !Strchr(word_break, ctemp[-1]) | 	    && !wcschr(word_break, ctemp[-1]) | ||||||
| 	    && (!special_prefixes || !Strchr(special_prefixes, ctemp[-1]) ) ) | 	    && (!special_prefixes || !wcschr(special_prefixes, ctemp[-1]) ) ) | ||||||
| 		ctemp--; | 		ctemp--; | ||||||
|  |  | ||||||
| 	len = li->cursor - ctemp; | 	len = (size_t)(li->cursor - ctemp); | ||||||
| #if defined(__SSP__) || defined(__SSP_ALL__) | 	temp = el_malloc((len + 1) * sizeof(*temp)); | ||||||
| 	temp = malloc(sizeof(*temp) * (len + 1)); | 	(void)wcsncpy(temp, ctemp, len); | ||||||
| #else |  | ||||||
| 	temp = alloca(sizeof(*temp) * (len + 1)); |  | ||||||
| #endif |  | ||||||
| 	(void)Strncpy(temp, ctemp, len); |  | ||||||
| 	temp[len] = '\0'; | 	temp[len] = '\0'; | ||||||
|  |  | ||||||
| 	/* these can be used by function called in completion_matches() */ | 	/* these can be used by function called in completion_matches() */ | ||||||
| 	/* or (*attempted_completion_function)() */ | 	/* or (*attempted_completion_function)() */ | ||||||
| 	if (point != 0) | 	if (point != NULL) | ||||||
| 		*point = (int)(li->cursor - li->buffer); | 		*point = (int)(li->cursor - li->buffer); | ||||||
| 	if (end != NULL) | 	if (end != NULL) | ||||||
| 		*end = (int)(li->lastchar - li->buffer); | 		*end = (int)(li->lastchar - li->buffer); | ||||||
|  |  | ||||||
| 	if (attempted_completion_function) { | 	if (attempted_completion_function) { | ||||||
| 		int cur_off = (int)(li->cursor - li->buffer); | 		int cur_off = (int)(li->cursor - li->buffer); | ||||||
| 		matches = (*attempted_completion_function) (ct_encode_string(temp, &el->el_scratch), | 		matches = (*attempted_completion_function)( | ||||||
| 		    (int)(cur_off - len), cur_off); | 		    ct_encode_string(temp, &el->el_scratch), | ||||||
|  | 		    cur_off - (int)len, cur_off); | ||||||
| 	} else | 	} else | ||||||
| 		matches = 0; | 		matches = NULL; | ||||||
| 	if (!attempted_completion_function || | 	if (!attempted_completion_function || | ||||||
| 	    (over != NULL && !*over && !matches)) | 	    (over != NULL && !*over && !matches)) | ||||||
| 		matches = completion_matches(ct_encode_string(temp, &el->el_scratch), complet_func); | 		matches = completion_matches( | ||||||
|  | 		    ct_encode_string(temp, &el->el_scratch), complet_func); | ||||||
|  |  | ||||||
| 	if (over != NULL) | 	if (over != NULL) | ||||||
| 		*over = 0; | 		*over = 0; | ||||||
| @@ -490,24 +478,22 @@ fn_complete(EditLine *el, | |||||||
| 		 */ | 		 */ | ||||||
| 		if (matches[0][0] != '\0') { | 		if (matches[0][0] != '\0') { | ||||||
| 			el_deletestr(el, (int) len); | 			el_deletestr(el, (int) len); | ||||||
| 			FUN(el,insertstr)(el, | 			el_winsertstr(el, | ||||||
| 			    ct_decode_string(matches[0], &el->el_scratch)); | 			    ct_decode_string(matches[0], &el->el_scratch)); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (what_to_do == '?') |  | ||||||
| 			goto display_matches; |  | ||||||
|  |  | ||||||
| 		if (matches[2] == NULL && strcmp(matches[0], matches[1]) == 0) { | 		if (matches[2] == NULL && | ||||||
|  | 		    (matches[1] == NULL || strcmp(matches[0], matches[1]) == 0)) { | ||||||
| 			/* | 			/* | ||||||
| 			 * We found exact match. Add a space after | 			 * We found exact match. Add a space after | ||||||
| 			 * it, unless we do filename completion and the | 			 * it, unless we do filename completion and the | ||||||
| 			 * object is a directory. | 			 * object is a directory. | ||||||
| 			 */ | 			 */ | ||||||
| 			FUN(el,insertstr)(el, | 			el_winsertstr(el, | ||||||
| 			    ct_decode_string((*app_func)(matches[0]), | 			    ct_decode_string((*app_func)(matches[0]), | ||||||
| 			    &el->el_scratch)); | 			    &el->el_scratch)); | ||||||
| 		} else if (what_to_do == '!') { | 		} else if (what_to_do == '!' || what_to_do == '?') { | ||||||
|     display_matches: |  | ||||||
| 			/* | 			/* | ||||||
| 			 * More than one match and requested to list possible | 			 * More than one match and requested to list possible | ||||||
| 			 * matches. | 			 * matches. | ||||||
| @@ -519,7 +505,7 @@ fn_complete(EditLine *el, | |||||||
| 					maxlen = match_len; | 					maxlen = match_len; | ||||||
| 			} | 			} | ||||||
| 			/* matches[1] through matches[i-1] are available */ | 			/* matches[1] through matches[i-1] are available */ | ||||||
| 			matches_num = i - 1; | 			matches_num = (size_t)(i - 1); | ||||||
|  |  | ||||||
| 			/* newline to get on next line from command line */ | 			/* newline to get on next line from command line */ | ||||||
| 			(void)fprintf(el->el_outfile, "\n"); | 			(void)fprintf(el->el_outfile, "\n"); | ||||||
| @@ -530,8 +516,8 @@ fn_complete(EditLine *el, | |||||||
| 			 */ | 			 */ | ||||||
| 			if (matches_num > query_items) { | 			if (matches_num > query_items) { | ||||||
| 				(void)fprintf(el->el_outfile, | 				(void)fprintf(el->el_outfile, | ||||||
| 				    "Display all %llu possibilities? (y or n) ", | 				    "Display all %zu possibilities? (y or n) ", | ||||||
| 				    (unsigned long long)matches_num); | 				    matches_num); | ||||||
| 				(void)fflush(el->el_outfile); | 				(void)fflush(el->el_outfile); | ||||||
| 				if (getc(stdin) != 'y') | 				if (getc(stdin) != 'y') | ||||||
| 					match_display = 0; | 					match_display = 0; | ||||||
| @@ -566,13 +552,11 @@ fn_complete(EditLine *el, | |||||||
|  |  | ||||||
| 		/* free elements of array and the array itself */ | 		/* free elements of array and the array itself */ | ||||||
| 		for (i = 0; matches[i]; i++) | 		for (i = 0; matches[i]; i++) | ||||||
| 			free(matches[i]); | 			el_free(matches[i]); | ||||||
| 		free(matches); | 		el_free(matches); | ||||||
| 		matches = NULL; | 		matches = NULL; | ||||||
| 	} | 	} | ||||||
| #if defined(__SSP__) || defined(__SSP_ALL__) | 	el_free(temp); | ||||||
| 	free(temp); |  | ||||||
| #endif |  | ||||||
| 	return retval; | 	return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -584,6 +568,6 @@ unsigned char | |||||||
| _el_fn_complete(EditLine *el, int ch __attribute__((__unused__))) | _el_fn_complete(EditLine *el, int ch __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	return (unsigned char)fn_complete(el, NULL, NULL, | 	return (unsigned char)fn_complete(el, NULL, NULL, | ||||||
| 	    break_chars, NULL, NULL, 100, | 	    break_chars, NULL, NULL, (size_t)100, | ||||||
| 	    NULL, NULL, NULL, NULL); | 	    NULL, NULL, NULL, NULL); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: filecomplete.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: filecomplete.h,v 1.10 2016/04/11 00:50:13 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1997 The NetBSD Foundation, Inc. |  * Copyright (c) 1997 The NetBSD Foundation, Inc. | ||||||
| @@ -34,7 +34,7 @@ | |||||||
| int fn_complete(EditLine *, | int fn_complete(EditLine *, | ||||||
|     char *(*)(const char *, int), |     char *(*)(const char *, int), | ||||||
|     char **(*)(const char *, int, int), |     char **(*)(const char *, int, int), | ||||||
|     const Char *, const Char *, const char *(*)(const char *), size_t, |     const wchar_t *, const wchar_t *, const char *(*)(const char *), size_t, | ||||||
|     int *, int *, int *, int *); |     int *, int *, int *, int *); | ||||||
|  |  | ||||||
| void fn_display_match_list(EditLine *, char **, size_t, size_t); | void fn_display_match_list(EditLine *, char **, size_t, size_t); | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: hist.c,v 1.17 2009/12/30 23:54:52 christos Exp $	*/ | /*	$NetBSD: hist.c,v 1.30 2016/11/07 15:30:18 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,7 +37,7 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)hist.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)hist.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: hist.c,v 1.17 2009/12/30 23:54:52 christos Exp $"); | __RCSID("$NetBSD: hist.c,v 1.30 2016/11/07 15:30:18 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| @@ -45,12 +45,15 @@ __RCSID("$NetBSD: hist.c,v 1.17 2009/12/30 23:54:52 christos Exp $"); | |||||||
|  * hist.c: History access functions |  * hist.c: History access functions | ||||||
|  */ |  */ | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <vis.h> | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  |  | ||||||
| /* hist_init(): | /* hist_init(): | ||||||
|  *	Initialization function. |  *	Initialization function. | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| hist_init(EditLine *el) | hist_init(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -59,20 +62,20 @@ hist_init(EditLine *el) | |||||||
| 	el->el_history.buf = el_malloc(EL_BUFSIZ * sizeof(*el->el_history.buf)); | 	el->el_history.buf = el_malloc(EL_BUFSIZ * sizeof(*el->el_history.buf)); | ||||||
| 	el->el_history.sz  = EL_BUFSIZ; | 	el->el_history.sz  = EL_BUFSIZ; | ||||||
| 	if (el->el_history.buf == NULL) | 	if (el->el_history.buf == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	el->el_history.last = el->el_history.buf; | 	el->el_history.last = el->el_history.buf; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* hist_end(): | /* hist_end(): | ||||||
|  *	clean up history; |  *	clean up history; | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| hist_end(EditLine *el) | hist_end(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el_free((ptr_t) el->el_history.buf); | 	el_free(el->el_history.buf); | ||||||
| 	el->el_history.buf = NULL; | 	el->el_history.buf = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -80,13 +83,13 @@ hist_end(EditLine *el) | |||||||
| /* hist_set(): | /* hist_set(): | ||||||
|  *	Set new history interface |  *	Set new history interface | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| hist_set(EditLine *el, hist_fun_t fun, ptr_t ptr) | hist_set(EditLine *el, hist_fun_t fun, void *ptr) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_history.ref = ptr; | 	el->el_history.ref = ptr; | ||||||
| 	el->el_history.fun = fun; | 	el->el_history.fun = fun; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -94,14 +97,14 @@ hist_set(EditLine *el, hist_fun_t fun, ptr_t ptr) | |||||||
|  *	Get a history line and update it in the buffer. |  *	Get a history line and update it in the buffer. | ||||||
|  *	eventno tells us the event to get. |  *	eventno tells us the event to get. | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| hist_get(EditLine *el) | hist_get(EditLine *el) | ||||||
| { | { | ||||||
| 	const Char *hp; | 	const wchar_t *hp; | ||||||
| 	int h; | 	int h; | ||||||
|  |  | ||||||
| 	if (el->el_history.eventno == 0) {	/* if really the current line */ | 	if (el->el_history.eventno == 0) {	/* if really the current line */ | ||||||
| 		(void) Strncpy(el->el_line.buffer, el->el_history.buf, | 		(void) wcsncpy(el->el_line.buffer, el->el_history.buf, | ||||||
| 		    el->el_history.sz); | 		    el->el_history.sz); | ||||||
| 		el->el_line.lastchar = el->el_line.buffer + | 		el->el_line.lastchar = el->el_line.buffer + | ||||||
| 		    (el->el_history.last - el->el_history.buf); | 		    (el->el_history.last - el->el_history.buf); | ||||||
| @@ -113,25 +116,25 @@ hist_get(EditLine *el) | |||||||
| #endif /* KSHVI */ | #endif /* KSHVI */ | ||||||
| 			el->el_line.cursor = el->el_line.lastchar; | 			el->el_line.cursor = el->el_line.lastchar; | ||||||
|  |  | ||||||
| 		return (CC_REFRESH); | 		return CC_REFRESH; | ||||||
| 	} | 	} | ||||||
| 	if (el->el_history.ref == NULL) | 	if (el->el_history.ref == NULL) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	hp = HIST_FIRST(el); | 	hp = HIST_FIRST(el); | ||||||
|  |  | ||||||
| 	if (hp == NULL) | 	if (hp == NULL) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	for (h = 1; h < el->el_history.eventno; h++) | 	for (h = 1; h < el->el_history.eventno; h++) | ||||||
| 		if ((hp = HIST_NEXT(el)) == NULL) { | 		if ((hp = HIST_NEXT(el)) == NULL) { | ||||||
| 			el->el_history.eventno = h; | 			el->el_history.eventno = h; | ||||||
| 			return (CC_ERROR); | 			return CC_ERROR; | ||||||
| 		} | 		} | ||||||
| 	(void) Strncpy(el->el_line.buffer, hp, | 	(void) wcsncpy(el->el_line.buffer, hp, | ||||||
| 			(size_t)(el->el_line.limit - el->el_line.buffer)); | 			(size_t)(el->el_line.limit - el->el_line.buffer)); | ||||||
| 	el->el_line.buffer[el->el_line.limit - el->el_line.buffer - 1] = '\0'; | 	el->el_line.buffer[el->el_line.limit - el->el_line.buffer - 1] = '\0'; | ||||||
| 	el->el_line.lastchar = el->el_line.buffer + Strlen(el->el_line.buffer); | 	el->el_line.lastchar = el->el_line.buffer + wcslen(el->el_line.buffer); | ||||||
|  |  | ||||||
| 	if (el->el_line.lastchar > el->el_line.buffer | 	if (el->el_line.lastchar > el->el_line.buffer | ||||||
| 	    && el->el_line.lastchar[-1] == '\n') | 	    && el->el_line.lastchar[-1] == '\n') | ||||||
| @@ -146,42 +149,63 @@ hist_get(EditLine *el) | |||||||
| #endif /* KSHVI */ | #endif /* KSHVI */ | ||||||
| 		el->el_line.cursor = el->el_line.lastchar; | 		el->el_line.cursor = el->el_line.lastchar; | ||||||
|  |  | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* hist_command() | /* hist_command() | ||||||
|  *	process a history command |  *	process a history command | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| hist_command(EditLine *el, int argc, const Char **argv) | hist_command(EditLine *el, int argc, const wchar_t **argv) | ||||||
| { | { | ||||||
| 	const Char *str; | 	const wchar_t *str; | ||||||
| 	int num; | 	int num; | ||||||
| 	HistEvent ev; | 	HistEventW ev; | ||||||
|  |  | ||||||
| 	if (el->el_history.ref == NULL) | 	if (el->el_history.ref == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
|  |  | ||||||
| 	if (argc == 1 || Strcmp(argv[1], STR("list")) == 0) { | 	if (argc == 1 || wcscmp(argv[1], L"list") == 0) { | ||||||
|  | 		size_t maxlen = 0; | ||||||
|  | 		char *buf = NULL; | ||||||
|  | 		int hno = 1; | ||||||
| 		 /* List history entries */ | 		 /* List history entries */ | ||||||
|  |  | ||||||
| 		for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el)) | 		for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el)) { | ||||||
| 			(void) fprintf(el->el_outfile, "%d %s", | 			char *ptr = | ||||||
| 			    el->el_history.ev.num, ct_encode_string(str, &el->el_scratch)); | 			    ct_encode_string(str, &el->el_scratch); | ||||||
| 		return (0); | 			size_t len = strlen(ptr); | ||||||
|  | 			if (len > 0 && ptr[len - 1] == '\n')  | ||||||
|  | 				ptr[--len] = '\0'; | ||||||
|  | 			len = len * 4 + 1; | ||||||
|  | 			if (len >= maxlen) { | ||||||
|  | 				maxlen = len + 1024; | ||||||
|  | 				char *nbuf = el_realloc(buf, maxlen); | ||||||
|  | 				if (nbuf == NULL) { | ||||||
|  | 					el_free(buf); | ||||||
|  | 					return -1; | ||||||
|  | 				} | ||||||
|  | 				buf = nbuf; | ||||||
|  | 			} | ||||||
|  | 			strvis(buf, ptr, VIS_NL); | ||||||
|  | 			(void) fprintf(el->el_outfile, "%d\t%s\n", | ||||||
|  | 			    hno++, buf); | ||||||
|  | 		} | ||||||
|  | 		el_free(buf); | ||||||
|  | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (argc != 3) | 	if (argc != 3) | ||||||
| 		return (-1); | 		return -1; | ||||||
|  |  | ||||||
| 	num = (int)Strtol(argv[2], NULL, 0); | 	num = (int)wcstol(argv[2], NULL, 0); | ||||||
|  |  | ||||||
| 	if (Strcmp(argv[1], STR("size")) == 0) | 	if (wcscmp(argv[1], L"size") == 0) | ||||||
| 		return history(el->el_history.ref, &ev, H_SETSIZE, num); | 		return history_w(el->el_history.ref, &ev, H_SETSIZE, num); | ||||||
|  |  | ||||||
| 	if (Strcmp(argv[1], STR("unique")) == 0) | 	if (wcscmp(argv[1], L"unique") == 0) | ||||||
| 		return history(el->el_history.ref, &ev, H_SETUNIQUE, num); | 		return history_w(el->el_history.ref, &ev, H_SETUNIQUE, num); | ||||||
|  |  | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
| @@ -190,11 +214,11 @@ hist_command(EditLine *el, int argc, const Char **argv) | |||||||
|  *	Enlarge history buffer to specified value. Called from el_enlargebufs(). |  *	Enlarge history buffer to specified value. Called from el_enlargebufs(). | ||||||
|  *	Return 0 for failure, 1 for success. |  *	Return 0 for failure, 1 for success. | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| hist_enlargebuf(EditLine *el, size_t oldsz, size_t newsz) | hist_enlargebuf(EditLine *el, size_t oldsz, size_t newsz) | ||||||
| { | { | ||||||
| 	Char *newbuf; | 	wchar_t *newbuf; | ||||||
|  |  | ||||||
| 	newbuf = el_realloc(el->el_history.buf, newsz * sizeof(*newbuf)); | 	newbuf = el_realloc(el->el_history.buf, newsz * sizeof(*newbuf)); | ||||||
| 	if (!newbuf) | 	if (!newbuf) | ||||||
| @@ -210,9 +234,8 @@ hist_enlargebuf(EditLine *el, size_t oldsz, size_t newsz) | |||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef WIDECHAR | libedit_private wchar_t * | ||||||
| protected wchar_t * | hist_convert(EditLine *el, int fn, void *arg) | ||||||
| hist_convert(EditLine *el, int fn, ptr_t arg) |  | ||||||
| { | { | ||||||
| 	HistEventW ev; | 	HistEventW ev; | ||||||
| 	if ((*(el)->el_history.fun)((el)->el_history.ref, &ev, fn, arg) == -1) | 	if ((*(el)->el_history.fun)((el)->el_history.ref, &ev, fn, arg) == -1) | ||||||
| @@ -220,4 +243,3 @@ hist_convert(EditLine *el, int fn, ptr_t arg) | |||||||
| 	return ct_decode_string((const char *)(const void *)ev.str, | 	return ct_decode_string((const char *)(const void *)ev.str, | ||||||
| 	    &el->el_scratch); | 	    &el->el_scratch); | ||||||
| } | } | ||||||
| #endif |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: hist.h,v 1.12 2009/12/30 23:54:52 christos Exp $	*/ | /*	$NetBSD: hist.h,v 1.22 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -40,31 +40,24 @@ | |||||||
| #ifndef _h_el_hist | #ifndef _h_el_hist | ||||||
| #define	_h_el_hist | #define	_h_el_hist | ||||||
|  |  | ||||||
| #include "histedit.h" | typedef int (*hist_fun_t)(void *, HistEventW *, int, ...); | ||||||
|  |  | ||||||
| typedef int (*hist_fun_t)(ptr_t, TYPE(HistEvent) *, int, ...); |  | ||||||
|  |  | ||||||
| typedef struct el_history_t { | typedef struct el_history_t { | ||||||
| 	Char		*buf;		/* The history buffer		*/ | 	wchar_t		*buf;		/* The history buffer		*/ | ||||||
| 	size_t		 sz;		/* Size of history buffer	*/ | 	size_t		 sz;		/* Size of history buffer	*/ | ||||||
| 	Char		*last;		/* The last character		*/ | 	wchar_t		*last;		/* The last character		*/ | ||||||
| 	int		 eventno;	/* Event we are looking for	*/ | 	int		 eventno;	/* Event we are looking for	*/ | ||||||
| 	ptr_t		 ref;		/* Argument for history fcns	*/ | 	void		*ref;		/* Argument for history fcns	*/ | ||||||
| 	hist_fun_t	 fun;		/* Event access			*/ | 	hist_fun_t	 fun;		/* Event access			*/ | ||||||
| 	TYPE(HistEvent)	 ev;		/* Event cookie			*/ | 	HistEventW	 ev;		/* Event cookie			*/ | ||||||
| } el_history_t; | } el_history_t; | ||||||
|  |  | ||||||
| #define	HIST_FUN_INTERNAL(el, fn, arg)	\ | #define	HIST_FUN_INTERNAL(el, fn, arg)	\ | ||||||
|     ((((*(el)->el_history.fun) ((el)->el_history.ref, &(el)->el_history.ev, \ |     ((((*(el)->el_history.fun) ((el)->el_history.ref, &(el)->el_history.ev, \ | ||||||
| 	fn, arg)) == -1) ? NULL : (el)->el_history.ev.str) | 	fn, arg)) == -1) ? NULL : (el)->el_history.ev.str) | ||||||
| #ifdef WIDECHAR |  | ||||||
| #define HIST_FUN(el, fn, arg) \ | #define HIST_FUN(el, fn, arg) \ | ||||||
|     (((el)->el_flags & NARROW_HISTORY) ? hist_convert(el, fn, arg) : \ |     (((el)->el_flags & NARROW_HISTORY) ? hist_convert(el, fn, arg) : \ | ||||||
| 	HIST_FUN_INTERNAL(el, fn, arg)) | 	HIST_FUN_INTERNAL(el, fn, arg)) | ||||||
| #else |  | ||||||
| #define HIST_FUN(el, fn, arg) HIST_FUN_INTERNAL(el, fn, arg) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #define	HIST_NEXT(el)		HIST_FUN(el, H_NEXT, NULL) | #define	HIST_NEXT(el)		HIST_FUN(el, H_NEXT, NULL) | ||||||
| #define	HIST_FIRST(el)		HIST_FUN(el, H_FIRST, NULL) | #define	HIST_FIRST(el)		HIST_FUN(el, H_FIRST, NULL) | ||||||
| @@ -73,15 +66,14 @@ typedef struct el_history_t { | |||||||
| #define	HIST_SET(el, num)	HIST_FUN(el, H_SET, num) | #define	HIST_SET(el, num)	HIST_FUN(el, H_SET, num) | ||||||
| #define	HIST_LOAD(el, fname)	HIST_FUN(el, H_LOAD fname) | #define	HIST_LOAD(el, fname)	HIST_FUN(el, H_LOAD fname) | ||||||
| #define	HIST_SAVE(el, fname)	HIST_FUN(el, H_SAVE fname) | #define	HIST_SAVE(el, fname)	HIST_FUN(el, H_SAVE fname) | ||||||
|  | #define	HIST_SAVE_FP(el, fp)	HIST_FUN(el, H_SAVE_FP fp) | ||||||
|  |  | ||||||
| protected int		hist_init(EditLine *); | libedit_private int		hist_init(EditLine *); | ||||||
| protected void		hist_end(EditLine *); | libedit_private void		hist_end(EditLine *); | ||||||
| protected el_action_t	hist_get(EditLine *); | libedit_private el_action_t	hist_get(EditLine *); | ||||||
| protected int		hist_set(EditLine *, hist_fun_t, ptr_t); | libedit_private int		hist_set(EditLine *, hist_fun_t, void *); | ||||||
| protected int		hist_command(EditLine *, int, const Char **); | libedit_private int		hist_command(EditLine *, int, const wchar_t **); | ||||||
| protected int		hist_enlargebuf(EditLine *, size_t, size_t); | libedit_private int		hist_enlargebuf(EditLine *, size_t, size_t); | ||||||
| #ifdef WIDECHAR | libedit_private wchar_t	*hist_convert(EditLine *, int, void *); | ||||||
| protected wchar_t 	*hist_convert(EditLine *, int, ptr_t); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif /* _h_el_hist */ | #endif /* _h_el_hist */ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: histedit.h,v 1.47 2010/08/28 15:44:59 christos Exp $	*/ | /*	$NetBSD: histedit.h,v 1.56 2016/04/19 19:50:53 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -43,10 +43,6 @@ | |||||||
| #define	LIBEDIT_MAJOR 2 | #define	LIBEDIT_MAJOR 2 | ||||||
| #define	LIBEDIT_MINOR 11 | #define	LIBEDIT_MINOR 11 | ||||||
|  |  | ||||||
| #ifdef HAVE_STDINT_H |  | ||||||
| #include <stdint.h> |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  |  | ||||||
| @@ -88,6 +84,8 @@ typedef struct lineinfo { | |||||||
|  * Initialization, cleanup, and resetting |  * Initialization, cleanup, and resetting | ||||||
|  */ |  */ | ||||||
| EditLine	*el_init(const char *, FILE *, FILE *, FILE *); | EditLine	*el_init(const char *, FILE *, FILE *, FILE *); | ||||||
|  | EditLine	*el_init_fd(const char *, FILE *, FILE *, FILE *, | ||||||
|  |     int, int, int); | ||||||
| void		 el_end(EditLine *); | void		 el_end(EditLine *); | ||||||
| void		 el_reset(EditLine *); | void		 el_reset(EditLine *); | ||||||
|  |  | ||||||
| @@ -144,7 +142,7 @@ unsigned char	_el_fn_complete(EditLine *, int); | |||||||
| #define	EL_SETTY	8	/* , const Char *, ..., NULL);        set     */ | #define	EL_SETTY	8	/* , const Char *, ..., NULL);        set     */ | ||||||
| #define	EL_ADDFN	9	/* , const Char *, const Char,        set     */ | #define	EL_ADDFN	9	/* , const Char *, const Char,        set     */ | ||||||
| 				/*   el_func_t);			      */ | 				/*   el_func_t);			      */ | ||||||
| #define	EL_HIST		10	/* , hist_fun_t, const ptr_t);	      set     */ | #define	EL_HIST		10	/* , hist_fun_t, const void *);	      set     */ | ||||||
| #define	EL_EDITMODE	11	/* , int);			      set/get */ | #define	EL_EDITMODE	11	/* , int);			      set/get */ | ||||||
| #define	EL_RPROMPT	12	/* , prompt_func);		      set/get */ | #define	EL_RPROMPT	12	/* , prompt_func);		      set/get */ | ||||||
| #define	EL_GETCFN	13	/* , el_rfunc_t);		      set/get */ | #define	EL_GETCFN	13	/* , el_rfunc_t);		      set/get */ | ||||||
| @@ -158,6 +156,7 @@ unsigned char	_el_fn_complete(EditLine *, int); | |||||||
| #define	EL_PROMPT_ESC	21	/* , prompt_func, Char);	      set/get */ | #define	EL_PROMPT_ESC	21	/* , prompt_func, Char);	      set/get */ | ||||||
| #define	EL_RPROMPT_ESC	22	/* , prompt_func, Char);	      set/get */ | #define	EL_RPROMPT_ESC	22	/* , prompt_func, Char);	      set/get */ | ||||||
| #define	EL_RESIZE	23	/* , el_zfunc_t, void *);	      set     */ | #define	EL_RESIZE	23	/* , el_zfunc_t, void *);	      set     */ | ||||||
|  | #define	EL_ALIAS_TEXT	24	/* , el_afunc_t, void *);	      set     */ | ||||||
|  |  | ||||||
| #define	EL_BUILTIN_GETCFN	(NULL) | #define	EL_BUILTIN_GETCFN	(NULL) | ||||||
|  |  | ||||||
| @@ -226,6 +225,7 @@ int		history(History *, HistEvent *, int, ...); | |||||||
| #define	H_NEXT_EVDATA	23	/* , const int, histdata_t *);	*/ | #define	H_NEXT_EVDATA	23	/* , const int, histdata_t *);	*/ | ||||||
| #define	H_DELDATA	24	/* , int, histdata_t *);*/ | #define	H_DELDATA	24	/* , int, histdata_t *);*/ | ||||||
| #define	H_REPLACE	25	/* , const char *, histdata_t);	*/ | #define	H_REPLACE	25	/* , const char *, histdata_t);	*/ | ||||||
|  | #define	H_SAVE_FP	26	/* , FILE *);		*/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -249,20 +249,9 @@ int		 tok_str(Tokenizer *, const char *, | |||||||
| /* | /* | ||||||
|  * Begin Wide Character Support |  * Begin Wide Character Support | ||||||
|  */ |  */ | ||||||
| #ifdef __linux__ |  | ||||||
| /* Apparently we need _GNU_SOURCE defined to get access to wcsdup on Linux */ |  | ||||||
| #ifndef _GNU_SOURCE |  | ||||||
| #define _GNU_SOURCE |  | ||||||
| #endif |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include <wchar.h> | #include <wchar.h> | ||||||
| #include <wctype.h> | #include <wctype.h> | ||||||
|  |  | ||||||
| /* |  | ||||||
|  * Wide character versions |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * ==== Editing ==== |  * ==== Editing ==== | ||||||
|  */ |  */ | ||||||
| @@ -272,6 +261,8 @@ typedef struct lineinfow { | |||||||
| 	const wchar_t	*lastchar; | 	const wchar_t	*lastchar; | ||||||
| } LineInfoW; | } LineInfoW; | ||||||
|  |  | ||||||
|  | typedef int	(*el_rfunc_t)(EditLine *, wchar_t *); | ||||||
|  |  | ||||||
| const wchar_t	*el_wgets(EditLine *, int *); | const wchar_t	*el_wgets(EditLine *, int *); | ||||||
| int		 el_wgetc(EditLine *, wchar_t *); | int		 el_wgetc(EditLine *, wchar_t *); | ||||||
| void		 el_wpush(EditLine *, const wchar_t *); | void		 el_wpush(EditLine *, const wchar_t *); | ||||||
| @@ -281,6 +272,7 @@ int		 el_wparse(EditLine *, int, const wchar_t **); | |||||||
| int		 el_wset(EditLine *, int, ...); | int		 el_wset(EditLine *, int, ...); | ||||||
| int		 el_wget(EditLine *, int, ...); | int		 el_wget(EditLine *, int, ...); | ||||||
|  |  | ||||||
|  | int		 el_cursor(EditLine *, int); | ||||||
| const LineInfoW	*el_wline(EditLine *); | const LineInfoW	*el_wline(EditLine *); | ||||||
| int		 el_winsertstr(EditLine *, const wchar_t *); | int		 el_winsertstr(EditLine *, const wchar_t *); | ||||||
| #define          el_wdeletestr  el_deletestr | #define          el_wdeletestr  el_deletestr | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: history.c,v 1.38 2011/01/16 03:05:51 christos Exp $	*/ | /*	$NetBSD: history.c,v 1.57 2016/04/11 18:56:31 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -32,39 +32,72 @@ | |||||||
|  * SUCH DAMAGE. |  * SUCH DAMAGE. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef NARROWCHAR |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if !defined(lint) && !defined(SCCSID) | #if !defined(lint) && !defined(SCCSID) | ||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)history.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)history.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: history.c,v 1.38 2011/01/16 03:05:51 christos Exp $"); | __RCSID("$NetBSD: history.c,v 1.57 2016/04/11 18:56:31 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * hist.c: TYPE(History) access functions |  * hist.c: TYPE(History) access functions | ||||||
|  */ |  */ | ||||||
| #include <string.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <stdarg.h> |  | ||||||
| #include <vis.h> |  | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
|  | #include <stdarg.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <vis.h> | ||||||
|  |  | ||||||
| static const char hist_cookie[] = "_HiStOrY_V2_\n"; | static const char hist_cookie[] = "_HiStOrY_V2_\n"; | ||||||
|  |  | ||||||
| #include "histedit.h" | #include "histedit.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef NARROWCHAR | ||||||
|  |  | ||||||
|  | #define	Char			char | ||||||
|  | #define	FUN(prefix, rest)	prefix ## _ ## rest | ||||||
|  | #define	FUNW(type)		type | ||||||
|  | #define	TYPE(type)		type | ||||||
|  | #define	STR(x)			x | ||||||
|  |  | ||||||
|  | #define	Strlen(s)		strlen(s) | ||||||
|  | #define	Strdup(s)		strdup(s) | ||||||
|  | #define	Strcmp(d, s)		strcmp(d, s) | ||||||
|  | #define	Strncmp(d, s, n)	strncmp(d, s, n) | ||||||
|  | #define	Strncpy(d, s, n)	strncpy(d, s, n) | ||||||
|  | #define	Strncat(d, s, n)	strncat(d, s, n) | ||||||
|  | #define	ct_decode_string(s, b)	(s) | ||||||
|  | #define	ct_encode_string(s, b)	(s) | ||||||
|  |  | ||||||
|  | #else | ||||||
| #include "chartype.h" | #include "chartype.h" | ||||||
|  |  | ||||||
| typedef int (*history_gfun_t)(ptr_t, TYPE(HistEvent) *); | #define	Char			wchar_t | ||||||
| typedef int (*history_efun_t)(ptr_t, TYPE(HistEvent) *, const Char *); | #define	FUN(prefix, rest)	prefix ## _w ## rest | ||||||
| typedef void (*history_vfun_t)(ptr_t, TYPE(HistEvent) *); | #define	FUNW(type)		type ## _w | ||||||
| typedef int (*history_sfun_t)(ptr_t, TYPE(HistEvent) *, const int); | #define	TYPE(type)		type ## W | ||||||
|  | #define	STR(x)			L ## x | ||||||
|  |  | ||||||
|  | #define	Strlen(s)		wcslen(s) | ||||||
|  | #define	Strdup(s)		wcsdup(s) | ||||||
|  | #define	Strcmp(d, s)		wcscmp(d, s) | ||||||
|  | #define	Strncmp(d, s, n)	wcsncmp(d, s, n) | ||||||
|  | #define	Strncpy(d, s, n)	wcsncpy(d, s, n) | ||||||
|  | #define	Strncat(d, s, n)	wcsncat(d, s, n) | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | typedef int (*history_gfun_t)(void *, TYPE(HistEvent) *); | ||||||
|  | typedef int (*history_efun_t)(void *, TYPE(HistEvent) *, const Char *); | ||||||
|  | typedef void (*history_vfun_t)(void *, TYPE(HistEvent) *); | ||||||
|  | typedef int (*history_sfun_t)(void *, TYPE(HistEvent) *, const int); | ||||||
|  |  | ||||||
| struct TYPE(history) { | struct TYPE(history) { | ||||||
| 	ptr_t h_ref;		/* Argument for history fcns	 */ | 	void *h_ref;		/* Argument for history fcns	 */ | ||||||
| 	int h_ent;		/* Last entry point for history	 */ | 	int h_ent;		/* Last entry point for history	 */ | ||||||
| 	history_gfun_t h_first;	/* Get the first element	 */ | 	history_gfun_t h_first;	/* Get the first element	 */ | ||||||
| 	history_gfun_t h_next;	/* Get the next element		 */ | 	history_gfun_t h_next;	/* Get the next element		 */ | ||||||
| @@ -100,18 +133,20 @@ typedef struct { | |||||||
| } HistEventPrivate; | } HistEventPrivate; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int history_setsize(TYPE(History) *, TYPE(HistEvent) *, int); | ||||||
| private int history_setsize(TYPE(History) *, TYPE(HistEvent) *, int); | static int history_getsize(TYPE(History) *, TYPE(HistEvent) *); | ||||||
| private int history_getsize(TYPE(History) *, TYPE(HistEvent) *); | static int history_setunique(TYPE(History) *, TYPE(HistEvent) *, int); | ||||||
| private int history_setunique(TYPE(History) *, TYPE(HistEvent) *, int); | static int history_getunique(TYPE(History) *, TYPE(HistEvent) *); | ||||||
| private int history_getunique(TYPE(History) *, TYPE(HistEvent) *); | static int history_set_fun(TYPE(History) *, TYPE(History) *); | ||||||
| private int history_set_fun(TYPE(History) *, TYPE(History) *); | static int history_load(TYPE(History) *, const char *); | ||||||
| private int history_load(TYPE(History) *, const char *); | static int history_save(TYPE(History) *, const char *); | ||||||
| private int history_save(TYPE(History) *, const char *); | static int history_save_fp(TYPE(History) *, FILE *); | ||||||
| private int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int); | static int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int); | ||||||
| private int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int); | static int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int); | ||||||
| private int history_next_string(TYPE(History) *, TYPE(HistEvent) *, const Char *); | static int history_next_string(TYPE(History) *, TYPE(HistEvent) *, | ||||||
| private int history_prev_string(TYPE(History) *, TYPE(HistEvent) *, const Char *); |     const Char *); | ||||||
|  | static int history_prev_string(TYPE(History) *, TYPE(HistEvent) *, | ||||||
|  |     const Char *); | ||||||
|  |  | ||||||
|  |  | ||||||
| /***********************************************************************/ | /***********************************************************************/ | ||||||
| @@ -136,23 +171,23 @@ typedef struct history_t { | |||||||
| #define H_UNIQUE	1	/* Store only unique elements	*/ | #define H_UNIQUE	1	/* Store only unique elements	*/ | ||||||
| } history_t; | } history_t; | ||||||
|  |  | ||||||
| private int history_def_next(ptr_t, TYPE(HistEvent) *); | static int history_def_next(void *, TYPE(HistEvent) *); | ||||||
| private int history_def_first(ptr_t, TYPE(HistEvent) *); | static int history_def_first(void *, TYPE(HistEvent) *); | ||||||
| private int history_def_prev(ptr_t, TYPE(HistEvent) *); | static int history_def_prev(void *, TYPE(HistEvent) *); | ||||||
| private int history_def_last(ptr_t, TYPE(HistEvent) *); | static int history_def_last(void *, TYPE(HistEvent) *); | ||||||
| private int history_def_curr(ptr_t, TYPE(HistEvent) *); | static int history_def_curr(void *, TYPE(HistEvent) *); | ||||||
| private int history_def_set(ptr_t, TYPE(HistEvent) *, const int); | static int history_def_set(void *, TYPE(HistEvent) *, const int); | ||||||
| private void history_def_clear(ptr_t, TYPE(HistEvent) *); | static void history_def_clear(void *, TYPE(HistEvent) *); | ||||||
| private int history_def_enter(ptr_t, TYPE(HistEvent) *, const Char *); | static int history_def_enter(void *, TYPE(HistEvent) *, const Char *); | ||||||
| private int history_def_add(ptr_t, TYPE(HistEvent) *, const Char *); | static int history_def_add(void *, TYPE(HistEvent) *, const Char *); | ||||||
| private int history_def_del(ptr_t, TYPE(HistEvent) *, const int); | static int history_def_del(void *, TYPE(HistEvent) *, const int); | ||||||
|  |  | ||||||
| private int history_def_init(ptr_t *, TYPE(HistEvent) *, int); | static int history_def_init(void **, TYPE(HistEvent) *, int); | ||||||
| private int history_def_insert(history_t *, TYPE(HistEvent) *, const Char *); | static int history_def_insert(history_t *, TYPE(HistEvent) *, const Char *); | ||||||
| private void history_def_delete(history_t *, TYPE(HistEvent) *, hentry_t *); | static void history_def_delete(history_t *, TYPE(HistEvent) *, hentry_t *); | ||||||
|  |  | ||||||
| private int history_deldata_nth(history_t *, TYPE(HistEvent) *, int, void **); | static int history_deldata_nth(history_t *, TYPE(HistEvent) *, int, void **); | ||||||
| private int history_set_nth(ptr_t, TYPE(HistEvent) *, int); | static int history_set_nth(void *, TYPE(HistEvent) *, int); | ||||||
|  |  | ||||||
| #define	history_def_setsize(p, num)(void) (((history_t *)p)->max = (num)) | #define	history_def_setsize(p, num)(void) (((history_t *)p)->max = (num)) | ||||||
| #define	history_def_getsize(p)  (((history_t *)p)->cur) | #define	history_def_getsize(p)  (((history_t *)p)->cur) | ||||||
| @@ -209,8 +244,8 @@ static const Char *const he_errlist[] = { | |||||||
| /* history_def_first(): | /* history_def_first(): | ||||||
|  *	Default function to return the first event in the history. |  *	Default function to return the first event in the history. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_first(ptr_t p, TYPE(HistEvent) *ev) | history_def_first(void *p, TYPE(HistEvent) *ev) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| @@ -219,18 +254,18 @@ history_def_first(ptr_t p, TYPE(HistEvent) *ev) | |||||||
| 		*ev = h->cursor->ev; | 		*ev = h->cursor->ev; | ||||||
| 	else { | 	else { | ||||||
| 		he_seterrev(ev, _HE_FIRST_NOTFOUND); | 		he_seterrev(ev, _HE_FIRST_NOTFOUND); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_def_last(): | /* history_def_last(): | ||||||
|  *	Default function to return the last event in the history. |  *	Default function to return the last event in the history. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_last(ptr_t p, TYPE(HistEvent) *ev) | history_def_last(void *p, TYPE(HistEvent) *ev) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| @@ -239,69 +274,69 @@ history_def_last(ptr_t p, TYPE(HistEvent) *ev) | |||||||
| 		*ev = h->cursor->ev; | 		*ev = h->cursor->ev; | ||||||
| 	else { | 	else { | ||||||
| 		he_seterrev(ev, _HE_LAST_NOTFOUND); | 		he_seterrev(ev, _HE_LAST_NOTFOUND); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_def_next(): | /* history_def_next(): | ||||||
|  *	Default function to return the next event in the history. |  *	Default function to return the next event in the history. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_next(ptr_t p, TYPE(HistEvent) *ev) | history_def_next(void *p, TYPE(HistEvent) *ev) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| 	if (h->cursor == &h->list) { | 	if (h->cursor == &h->list) { | ||||||
| 		he_seterrev(ev, _HE_EMPTY_LIST); | 		he_seterrev(ev, _HE_EMPTY_LIST); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (h->cursor->next == &h->list) { | 	if (h->cursor->next == &h->list) { | ||||||
| 		he_seterrev(ev, _HE_END_REACHED); | 		he_seterrev(ev, _HE_END_REACHED); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|         h->cursor = h->cursor->next; |         h->cursor = h->cursor->next; | ||||||
|         *ev = h->cursor->ev; |         *ev = h->cursor->ev; | ||||||
|  |  | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_def_prev(): | /* history_def_prev(): | ||||||
|  *	Default function to return the previous event in the history. |  *	Default function to return the previous event in the history. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_prev(ptr_t p, TYPE(HistEvent) *ev) | history_def_prev(void *p, TYPE(HistEvent) *ev) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| 	if (h->cursor == &h->list) { | 	if (h->cursor == &h->list) { | ||||||
| 		he_seterrev(ev, | 		he_seterrev(ev, | ||||||
| 		    (h->cur > 0) ? _HE_END_REACHED : _HE_EMPTY_LIST); | 		    (h->cur > 0) ? _HE_END_REACHED : _HE_EMPTY_LIST); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (h->cursor->prev == &h->list) { | 	if (h->cursor->prev == &h->list) { | ||||||
| 		he_seterrev(ev, _HE_START_REACHED); | 		he_seterrev(ev, _HE_START_REACHED); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|         h->cursor = h->cursor->prev; |         h->cursor = h->cursor->prev; | ||||||
|         *ev = h->cursor->ev; |         *ev = h->cursor->ev; | ||||||
|  |  | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_def_curr(): | /* history_def_curr(): | ||||||
|  *	Default function to return the current event in the history. |  *	Default function to return the current event in the history. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_curr(ptr_t p, TYPE(HistEvent) *ev) | history_def_curr(void *p, TYPE(HistEvent) *ev) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| @@ -310,10 +345,10 @@ history_def_curr(ptr_t p, TYPE(HistEvent) *ev) | |||||||
| 	else { | 	else { | ||||||
| 		he_seterrev(ev, | 		he_seterrev(ev, | ||||||
| 		    (h->cur > 0) ? _HE_CURR_INVALID : _HE_EMPTY_LIST); | 		    (h->cur > 0) ? _HE_CURR_INVALID : _HE_EMPTY_LIST); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -321,14 +356,14 @@ history_def_curr(ptr_t p, TYPE(HistEvent) *ev) | |||||||
|  *	Default function to set the current event in the history to the |  *	Default function to set the current event in the history to the | ||||||
|  *	given one. |  *	given one. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_set(ptr_t p, TYPE(HistEvent) *ev, const int n) | history_def_set(void *p, TYPE(HistEvent) *ev, const int n) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| 	if (h->cur == 0) { | 	if (h->cur == 0) { | ||||||
| 		he_seterrev(ev, _HE_EMPTY_LIST); | 		he_seterrev(ev, _HE_EMPTY_LIST); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	if (h->cursor == &h->list || h->cursor->ev.num != n) { | 	if (h->cursor == &h->list || h->cursor->ev.num != n) { | ||||||
| 		for (h->cursor = h->list.next; h->cursor != &h->list; | 		for (h->cursor = h->list.next; h->cursor != &h->list; | ||||||
| @@ -338,9 +373,9 @@ history_def_set(ptr_t p, TYPE(HistEvent) *ev, const int n) | |||||||
| 	} | 	} | ||||||
| 	if (h->cursor == &h->list) { | 	if (h->cursor == &h->list) { | ||||||
| 		he_seterrev(ev, _HE_NOT_FOUND); | 		he_seterrev(ev, _HE_NOT_FOUND); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -348,14 +383,14 @@ history_def_set(ptr_t p, TYPE(HistEvent) *ev, const int n) | |||||||
|  *	Default function to set the current event in the history to the |  *	Default function to set the current event in the history to the | ||||||
|  *	n-th one. |  *	n-th one. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_set_nth(ptr_t p, TYPE(HistEvent) *ev, int n) | history_set_nth(void *p, TYPE(HistEvent) *ev, int n) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| 	if (h->cur == 0) { | 	if (h->cur == 0) { | ||||||
| 		he_seterrev(ev, _HE_EMPTY_LIST); | 		he_seterrev(ev, _HE_EMPTY_LIST); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	for (h->cursor = h->list.prev; h->cursor != &h->list; | 	for (h->cursor = h->list.prev; h->cursor != &h->list; | ||||||
| 	    h->cursor = h->cursor->prev) | 	    h->cursor = h->cursor->prev) | ||||||
| @@ -363,17 +398,17 @@ history_set_nth(ptr_t p, TYPE(HistEvent) *ev, int n) | |||||||
| 			break; | 			break; | ||||||
| 	if (h->cursor == &h->list) { | 	if (h->cursor == &h->list) { | ||||||
| 		he_seterrev(ev, _HE_NOT_FOUND); | 		he_seterrev(ev, _HE_NOT_FOUND); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_def_add(): | /* history_def_add(): | ||||||
|  *	Append string to element |  *	Append string to element | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_add(ptr_t p, TYPE(HistEvent) *ev, const Char *str) | history_def_add(void *p, TYPE(HistEvent) *ev, const Char *str) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
| 	size_t len; | 	size_t len; | ||||||
| @@ -381,38 +416,38 @@ history_def_add(ptr_t p, TYPE(HistEvent) *ev, const Char *str) | |||||||
| 	HistEventPrivate *evp = (void *)&h->cursor->ev; | 	HistEventPrivate *evp = (void *)&h->cursor->ev; | ||||||
|  |  | ||||||
| 	if (h->cursor == &h->list) | 	if (h->cursor == &h->list) | ||||||
| 		return (history_def_enter(p, ev, str)); | 		return history_def_enter(p, ev, str); | ||||||
| 	len = Strlen(evp->str) + Strlen(str) + 1; | 	len = Strlen(evp->str) + Strlen(str) + 1; | ||||||
| 	s = h_malloc(len * sizeof(*s)); | 	s = h_malloc(len * sizeof(*s)); | ||||||
| 	if (s == NULL) { | 	if (s == NULL) { | ||||||
| 		he_seterrev(ev, _HE_MALLOC_FAILED); | 		he_seterrev(ev, _HE_MALLOC_FAILED); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	(void) Strncpy(s, h->cursor->ev.str, len); | 	(void) Strncpy(s, h->cursor->ev.str, len); | ||||||
|         s[len - 1] = '\0'; |         s[len - 1] = '\0'; | ||||||
| 	(void) Strncat(s, str, len - Strlen(s) - 1); | 	(void) Strncat(s, str, len - Strlen(s) - 1); | ||||||
| 	h_free((ptr_t)evp->str); | 	h_free(evp->str); | ||||||
| 	evp->str = s; | 	evp->str = s; | ||||||
| 	*ev = h->cursor->ev; | 	*ev = h->cursor->ev; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| private int | static int | ||||||
| history_deldata_nth(history_t *h, TYPE(HistEvent) *ev, | history_deldata_nth(history_t *h, TYPE(HistEvent) *ev, | ||||||
|     int num, void **data) |     int num, void **data) | ||||||
| { | { | ||||||
| 	if (history_set_nth(h, ev, num) != 0) | 	if (history_set_nth(h, ev, num) != 0) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	/* magic value to skip delete (just set to n-th history) */ | 	/* magic value to skip delete (just set to n-th history) */ | ||||||
| 	if (data == (void **)-1) | 	if (data == (void **)-1) | ||||||
| 		return (0); | 		return 0; | ||||||
| 	ev->str = Strdup(h->cursor->ev.str); | 	ev->str = Strdup(h->cursor->ev.str); | ||||||
| 	ev->num = h->cursor->ev.num; | 	ev->num = h->cursor->ev.num; | ||||||
| 	if (data) | 	if (data) | ||||||
| 		*data = h->cursor->data; | 		*data = h->cursor->data; | ||||||
| 	history_def_delete(h, ev, h->cursor); | 	history_def_delete(h, ev, h->cursor); | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -420,17 +455,17 @@ history_deldata_nth(history_t *h, TYPE(HistEvent) *ev, | |||||||
|  *	Delete element hp of the h list |  *	Delete element hp of the h list | ||||||
|  */ |  */ | ||||||
| /* ARGSUSED */ | /* ARGSUSED */ | ||||||
| private int | static int | ||||||
| history_def_del(ptr_t p, TYPE(HistEvent) *ev __attribute__((__unused__)), | history_def_del(void *p, TYPE(HistEvent) *ev __attribute__((__unused__)), | ||||||
|     const int num) |     const int num) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
| 	if (history_def_set(h, ev, num) != 0) | 	if (history_def_set(h, ev, num) != 0) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	ev->str = Strdup(h->cursor->ev.str); | 	ev->str = Strdup(h->cursor->ev.str); | ||||||
| 	ev->num = h->cursor->ev.num; | 	ev->num = h->cursor->ev.num; | ||||||
| 	history_def_delete(h, ev, h->cursor); | 	history_def_delete(h, ev, h->cursor); | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -438,7 +473,7 @@ history_def_del(ptr_t p, TYPE(HistEvent) *ev __attribute__((__unused__)), | |||||||
|  *	Delete element hp of the h list |  *	Delete element hp of the h list | ||||||
|  */ |  */ | ||||||
| /* ARGSUSED */ | /* ARGSUSED */ | ||||||
| private void | static void | ||||||
| history_def_delete(history_t *h, | history_def_delete(history_t *h, | ||||||
| 		   TYPE(HistEvent) *ev __attribute__((__unused__)), hentry_t *hp) | 		   TYPE(HistEvent) *ev __attribute__((__unused__)), hentry_t *hp) | ||||||
| { | { | ||||||
| @@ -452,7 +487,7 @@ history_def_delete(history_t *h, | |||||||
| 	} | 	} | ||||||
| 	hp->prev->next = hp->next; | 	hp->prev->next = hp->next; | ||||||
| 	hp->next->prev = hp->prev; | 	hp->next->prev = hp->prev; | ||||||
| 	h_free((ptr_t) evp->str); | 	h_free(evp->str); | ||||||
| 	h_free(hp); | 	h_free(hp); | ||||||
| 	h->cur--; | 	h->cur--; | ||||||
| } | } | ||||||
| @@ -461,47 +496,49 @@ history_def_delete(history_t *h, | |||||||
| /* history_def_insert(): | /* history_def_insert(): | ||||||
|  *	Insert element with string str in the h list |  *	Insert element with string str in the h list | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_insert(history_t *h, TYPE(HistEvent) *ev, const Char *str) | history_def_insert(history_t *h, TYPE(HistEvent) *ev, const Char *str) | ||||||
| { | { | ||||||
|  | 	hentry_t *c; | ||||||
|  |  | ||||||
| 	h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t)); | 	c = h_malloc(sizeof(*c)); | ||||||
| 	if (h->cursor == NULL) | 	if (c == NULL) | ||||||
| 		goto oomem; | 		goto oomem; | ||||||
| 	if ((h->cursor->ev.str = h_strdup(str)) == NULL) { | 	if ((c->ev.str = h_strdup(str)) == NULL) { | ||||||
| 		h_free((ptr_t)h->cursor); | 		h_free(c); | ||||||
| 		goto oomem; | 		goto oomem; | ||||||
| 	} | 	} | ||||||
| 	h->cursor->data = NULL; | 	c->data = NULL; | ||||||
| 	h->cursor->ev.num = ++h->eventid; | 	c->ev.num = ++h->eventid; | ||||||
| 	h->cursor->next = h->list.next; | 	c->next = h->list.next; | ||||||
| 	h->cursor->prev = &h->list; | 	c->prev = &h->list; | ||||||
| 	h->list.next->prev = h->cursor; | 	h->list.next->prev = c; | ||||||
| 	h->list.next = h->cursor; | 	h->list.next = c; | ||||||
| 	h->cur++; | 	h->cur++; | ||||||
|  | 	h->cursor = c; | ||||||
|  |  | ||||||
| 	*ev = h->cursor->ev; | 	*ev = c->ev; | ||||||
| 	return (0); | 	return 0; | ||||||
| oomem: | oomem: | ||||||
| 	he_seterrev(ev, _HE_MALLOC_FAILED); | 	he_seterrev(ev, _HE_MALLOC_FAILED); | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_def_enter(): | /* history_def_enter(): | ||||||
|  *	Default function to enter an item in the history |  *	Default function to enter an item in the history | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_def_enter(ptr_t p, TYPE(HistEvent) *ev, const Char *str) | history_def_enter(void *p, TYPE(HistEvent) *ev, const Char *str) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| 	if ((h->flags & H_UNIQUE) != 0 && h->list.next != &h->list && | 	if ((h->flags & H_UNIQUE) != 0 && h->list.next != &h->list && | ||||||
| 	    Strcmp(h->list.next->ev.str, str) == 0) | 	    Strcmp(h->list.next->ev.str, str) == 0) | ||||||
| 	    return (0); | 	    return 0; | ||||||
|  |  | ||||||
| 	if (history_def_insert(h, ev, str) == -1) | 	if (history_def_insert(h, ev, str) == -1) | ||||||
| 		return (-1);	/* error, keep error message */ | 		return -1;	/* error, keep error message */ | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
|          * Always keep at least one entry. |          * Always keep at least one entry. | ||||||
| @@ -510,7 +547,7 @@ history_def_enter(ptr_t p, TYPE(HistEvent) *ev, const Char *str) | |||||||
| 	while (h->cur > h->max && h->cur > 0) | 	while (h->cur > h->max && h->cur > 0) | ||||||
| 		history_def_delete(h, ev, h->list.prev); | 		history_def_delete(h, ev, h->list.prev); | ||||||
|  |  | ||||||
| 	return (1); | 	return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -518,10 +555,10 @@ history_def_enter(ptr_t p, TYPE(HistEvent) *ev, const Char *str) | |||||||
|  *	Default history initialization function |  *	Default history initialization function | ||||||
|  */ |  */ | ||||||
| /* ARGSUSED */ | /* ARGSUSED */ | ||||||
| private int | static int | ||||||
| history_def_init(ptr_t *p, TYPE(HistEvent) *ev __attribute__((__unused__)), int n) | history_def_init(void **p, TYPE(HistEvent) *ev __attribute__((__unused__)), int n) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) h_malloc(sizeof(history_t)); | 	history_t *h = (history_t *) h_malloc(sizeof(*h)); | ||||||
| 	if (h == NULL) | 	if (h == NULL) | ||||||
| 		return -1; | 		return -1; | ||||||
|  |  | ||||||
| @@ -535,7 +572,7 @@ history_def_init(ptr_t *p, TYPE(HistEvent) *ev __attribute__((__unused__)), int | |||||||
| 	h->list.ev.num = 0; | 	h->list.ev.num = 0; | ||||||
| 	h->cursor = &h->list; | 	h->cursor = &h->list; | ||||||
| 	h->flags = 0; | 	h->flags = 0; | ||||||
| 	*p = (ptr_t) h; | 	*p = h; | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -543,13 +580,14 @@ history_def_init(ptr_t *p, TYPE(HistEvent) *ev __attribute__((__unused__)), int | |||||||
| /* history_def_clear(): | /* history_def_clear(): | ||||||
|  *	Default history cleanup function |  *	Default history cleanup function | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| history_def_clear(ptr_t p, TYPE(HistEvent) *ev) | history_def_clear(void *p, TYPE(HistEvent) *ev) | ||||||
| { | { | ||||||
| 	history_t *h = (history_t *) p; | 	history_t *h = (history_t *) p; | ||||||
|  |  | ||||||
| 	while (h->list.prev != &h->list) | 	while (h->list.prev != &h->list) | ||||||
| 		history_def_delete(h, ev, h->list.prev); | 		history_def_delete(h, ev, h->list.prev); | ||||||
|  | 	h->cursor = &h->list; | ||||||
| 	h->eventid = 0; | 	h->eventid = 0; | ||||||
| 	h->cur = 0; | 	h->cur = 0; | ||||||
| } | } | ||||||
| @@ -562,16 +600,16 @@ history_def_clear(ptr_t p, TYPE(HistEvent) *ev) | |||||||
| /* history_init(): | /* history_init(): | ||||||
|  *	Initialization function. |  *	Initialization function. | ||||||
|  */ |  */ | ||||||
| public TYPE(History) * | TYPE(History) * | ||||||
| FUN(history,init)(void) | FUN(history,init)(void) | ||||||
| { | { | ||||||
| 	TYPE(HistEvent) ev; | 	TYPE(HistEvent) ev; | ||||||
| 	TYPE(History) *h = (TYPE(History) *) h_malloc(sizeof(TYPE(History))); | 	TYPE(History) *h = (TYPE(History) *) h_malloc(sizeof(*h)); | ||||||
| 	if (h == NULL) | 	if (h == NULL) | ||||||
| 		return NULL; | 		return NULL; | ||||||
|  |  | ||||||
| 	if (history_def_init(&h->h_ref, &ev, 0) == -1) { | 	if (history_def_init(&h->h_ref, &ev, 0) == -1) { | ||||||
| 		h_free((ptr_t)h); | 		h_free(h); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 	h->h_ent = -1; | 	h->h_ent = -1; | ||||||
| @@ -586,14 +624,14 @@ FUN(history,init)(void) | |||||||
| 	h->h_add = history_def_add; | 	h->h_add = history_def_add; | ||||||
| 	h->h_del = history_def_del; | 	h->h_del = history_def_del; | ||||||
|  |  | ||||||
| 	return (h); | 	return h; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_end(): | /* history_end(): | ||||||
|  *	clean up history; |  *	clean up history; | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| FUN(history,end)(TYPE(History) *h) | FUN(history,end)(TYPE(History) *h) | ||||||
| { | { | ||||||
| 	TYPE(HistEvent) ev; | 	TYPE(HistEvent) ev; | ||||||
| @@ -609,77 +647,77 @@ FUN(history,end)(TYPE(History) *h) | |||||||
| /* history_setsize(): | /* history_setsize(): | ||||||
|  *	Set history number of events |  *	Set history number of events | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_setsize(TYPE(History) *h, TYPE(HistEvent) *ev, int num) | history_setsize(TYPE(History) *h, TYPE(HistEvent) *ev, int num) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (h->h_next != history_def_next) { | 	if (h->h_next != history_def_next) { | ||||||
| 		he_seterrev(ev, _HE_NOT_ALLOWED); | 		he_seterrev(ev, _HE_NOT_ALLOWED); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	if (num < 0) { | 	if (num < 0) { | ||||||
| 		he_seterrev(ev, _HE_BAD_PARAM); | 		he_seterrev(ev, _HE_BAD_PARAM); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	history_def_setsize(h->h_ref, num); | 	history_def_setsize(h->h_ref, num); | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_getsize(): | /* history_getsize(): | ||||||
|  *      Get number of events currently in history |  *      Get number of events currently in history | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_getsize(TYPE(History) *h, TYPE(HistEvent) *ev) | history_getsize(TYPE(History) *h, TYPE(HistEvent) *ev) | ||||||
| { | { | ||||||
| 	if (h->h_next != history_def_next) { | 	if (h->h_next != history_def_next) { | ||||||
| 		he_seterrev(ev, _HE_NOT_ALLOWED); | 		he_seterrev(ev, _HE_NOT_ALLOWED); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	ev->num = history_def_getsize(h->h_ref); | 	ev->num = history_def_getsize(h->h_ref); | ||||||
| 	if (ev->num < -1) { | 	if (ev->num < -1) { | ||||||
| 		he_seterrev(ev, _HE_SIZE_NEGATIVE); | 		he_seterrev(ev, _HE_SIZE_NEGATIVE); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_setunique(): | /* history_setunique(): | ||||||
|  *	Set if adjacent equal events should not be entered in history. |  *	Set if adjacent equal events should not be entered in history. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_setunique(TYPE(History) *h, TYPE(HistEvent) *ev, int uni) | history_setunique(TYPE(History) *h, TYPE(HistEvent) *ev, int uni) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (h->h_next != history_def_next) { | 	if (h->h_next != history_def_next) { | ||||||
| 		he_seterrev(ev, _HE_NOT_ALLOWED); | 		he_seterrev(ev, _HE_NOT_ALLOWED); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	history_def_setunique(h->h_ref, uni); | 	history_def_setunique(h->h_ref, uni); | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_getunique(): | /* history_getunique(): | ||||||
|  *	Get if adjacent equal events should not be entered in history. |  *	Get if adjacent equal events should not be entered in history. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_getunique(TYPE(History) *h, TYPE(HistEvent) *ev) | history_getunique(TYPE(History) *h, TYPE(HistEvent) *ev) | ||||||
| { | { | ||||||
| 	if (h->h_next != history_def_next) { | 	if (h->h_next != history_def_next) { | ||||||
| 		he_seterrev(ev, _HE_NOT_ALLOWED); | 		he_seterrev(ev, _HE_NOT_ALLOWED); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	ev->num = history_def_getunique(h->h_ref); | 	ev->num = history_def_getunique(h->h_ref); | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_set_fun(): | /* history_set_fun(): | ||||||
|  *	Set history functions |  *	Set history functions | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_set_fun(TYPE(History) *h, TYPE(History) *nh) | history_set_fun(TYPE(History) *h, TYPE(History) *nh) | ||||||
| { | { | ||||||
| 	TYPE(HistEvent) ev; | 	TYPE(HistEvent) ev; | ||||||
| @@ -689,7 +727,8 @@ history_set_fun(TYPE(History) *h, TYPE(History) *nh) | |||||||
| 	    nh->h_enter == NULL || nh->h_add == NULL || nh->h_clear == NULL || | 	    nh->h_enter == NULL || nh->h_add == NULL || nh->h_clear == NULL || | ||||||
| 	    nh->h_del == NULL || nh->h_ref == NULL) { | 	    nh->h_del == NULL || nh->h_ref == NULL) { | ||||||
| 		if (h->h_next != history_def_next) { | 		if (h->h_next != history_def_next) { | ||||||
| 			history_def_init(&h->h_ref, &ev, 0); | 			if (history_def_init(&h->h_ref, &ev, 0) == -1) | ||||||
|  | 				return -1; | ||||||
| 			h->h_first = history_def_first; | 			h->h_first = history_def_first; | ||||||
| 			h->h_next = history_def_next; | 			h->h_next = history_def_next; | ||||||
| 			h->h_last = history_def_last; | 			h->h_last = history_def_last; | ||||||
| @@ -701,7 +740,7 @@ history_set_fun(TYPE(History) *h, TYPE(History) *nh) | |||||||
| 			h->h_add = history_def_add; | 			h->h_add = history_def_add; | ||||||
| 			h->h_del = history_def_del; | 			h->h_del = history_def_del; | ||||||
| 		} | 		} | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	if (h->h_next == history_def_next) | 	if (h->h_next == history_def_next) | ||||||
| 		history_def_clear(h->h_ref, &ev); | 		history_def_clear(h->h_ref, &ev); | ||||||
| @@ -718,50 +757,49 @@ history_set_fun(TYPE(History) *h, TYPE(History) *nh) | |||||||
| 	h->h_add = nh->h_add; | 	h->h_add = nh->h_add; | ||||||
| 	h->h_del = nh->h_del; | 	h->h_del = nh->h_del; | ||||||
|  |  | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_load(): | /* history_load(): | ||||||
|  *	TYPE(History) load function |  *	TYPE(History) load function | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_load(TYPE(History) *h, const char *fname) | history_load(TYPE(History) *h, const char *fname) | ||||||
| { | { | ||||||
| 	FILE *fp; | 	FILE *fp; | ||||||
| 	char *line; | 	char *line; | ||||||
| 	size_t sz, max_size; | 	size_t llen; | ||||||
|  | 	ssize_t sz; | ||||||
|  | 	size_t max_size; | ||||||
| 	char *ptr; | 	char *ptr; | ||||||
| 	int i = -1; | 	int i = -1; | ||||||
| 	TYPE(HistEvent) ev; | 	TYPE(HistEvent) ev; | ||||||
| #ifdef WIDECHAR | #ifndef NARROWCHAR | ||||||
| 	static ct_buffer_t conv; | 	static ct_buffer_t conv; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	if ((fp = fopen(fname, "r")) == NULL) | 	if ((fp = fopen(fname, "r")) == NULL) | ||||||
| 		return (i); | 		return i; | ||||||
|  |  | ||||||
| 	if ((line = fgetln(fp, &sz)) == NULL) | 	line = NULL; | ||||||
|  | 	llen = 0; | ||||||
|  | 	if ((sz = getline(&line, &llen, fp)) == -1) | ||||||
| 		goto done; | 		goto done; | ||||||
|  |  | ||||||
| 	if (strncmp(line, hist_cookie, sz) != 0) | 	if (strncmp(line, hist_cookie, (size_t)sz) != 0) | ||||||
| 		goto done; | 		goto done; | ||||||
|  |  | ||||||
| 	ptr = h_malloc(max_size = 1024); | 	ptr = h_malloc((max_size = 1024) * sizeof(*ptr)); | ||||||
| 	if (ptr == NULL) | 	if (ptr == NULL) | ||||||
| 		goto done; | 		goto done; | ||||||
| 	for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) { | 	for (i = 0; (sz = getline(&line, &llen, fp)) != -1; i++) { | ||||||
| 		char c = line[sz]; | 		if (sz > 0 && line[sz - 1] == '\n') | ||||||
|  |  | ||||||
| 		if (sz != 0 && line[sz - 1] == '\n') |  | ||||||
| 			line[--sz] = '\0'; | 			line[--sz] = '\0'; | ||||||
| 		else | 		if (max_size < (size_t)sz) { | ||||||
| 			line[sz] = '\0'; |  | ||||||
|  |  | ||||||
| 		if (max_size < sz) { |  | ||||||
| 			char *nptr; | 			char *nptr; | ||||||
| 			max_size = (sz + 1024) & ~1023; | 			max_size = ((size_t)sz + 1024) & (size_t)~1023; | ||||||
| 			nptr = h_realloc(ptr, max_size); | 			nptr = h_realloc(ptr, max_size * sizeof(*ptr)); | ||||||
| 			if (nptr == NULL) { | 			if (nptr == NULL) { | ||||||
| 				i = -1; | 				i = -1; | ||||||
| 				goto oomem; | 				goto oomem; | ||||||
| @@ -769,88 +807,104 @@ history_load(TYPE(History) *h, const char *fname) | |||||||
| 			ptr = nptr; | 			ptr = nptr; | ||||||
| 		} | 		} | ||||||
| 		(void) strunvis(ptr, line); | 		(void) strunvis(ptr, line); | ||||||
| 		line[sz] = c; |  | ||||||
| 		if (HENTER(h, &ev, ct_decode_string(ptr, &conv)) == -1) { | 		if (HENTER(h, &ev, ct_decode_string(ptr, &conv)) == -1) { | ||||||
| 			i = -1; | 			i = -1; | ||||||
| 			goto oomem; | 			goto oomem; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| oomem: | oomem: | ||||||
| 	h_free((ptr_t)ptr); | 	h_free(ptr); | ||||||
| done: | done: | ||||||
|  | 	free(line); | ||||||
| 	(void) fclose(fp); | 	(void) fclose(fp); | ||||||
| 	return (i); | 	return i; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_save(): | /* history_save_fp(): | ||||||
|  *	TYPE(History) save function |  *	TYPE(History) save function | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_save(TYPE(History) *h, const char *fname) | history_save_fp(TYPE(History) *h, FILE *fp) | ||||||
| { | { | ||||||
| 	FILE *fp; |  | ||||||
| 	TYPE(HistEvent) ev; | 	TYPE(HistEvent) ev; | ||||||
| 	int i = -1, retval; | 	int i = -1, retval; | ||||||
| 	size_t len, max_size; | 	size_t len, max_size; | ||||||
| 	char *ptr; | 	char *ptr; | ||||||
| #ifdef WIDECHAR | 	const char *str; | ||||||
|  | #ifndef NARROWCHAR | ||||||
| 	static ct_buffer_t conv; | 	static ct_buffer_t conv; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	if ((fp = fopen(fname, "w")) == NULL) |  | ||||||
| 		return (-1); |  | ||||||
|  |  | ||||||
| 	if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1) | 	if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1) | ||||||
| 		goto done; | 		goto done; | ||||||
| 	if (fputs(hist_cookie, fp) == EOF) | 	if (fputs(hist_cookie, fp) == EOF) | ||||||
| 		goto done; | 		goto done; | ||||||
| 	ptr = h_malloc(max_size = 1024); | 	ptr = h_malloc((max_size = 1024) * sizeof(*ptr)); | ||||||
| 	if (ptr == NULL) | 	if (ptr == NULL) | ||||||
| 		goto done; | 		goto done; | ||||||
| 	for (i = 0, retval = HLAST(h, &ev); | 	for (i = 0, retval = HLAST(h, &ev); | ||||||
| 	    retval != -1; | 	    retval != -1; | ||||||
| 	    retval = HPREV(h, &ev), i++) { | 	    retval = HPREV(h, &ev), i++) { | ||||||
| 		len = Strlen(ev.str) * 4; | 		str = ct_encode_string(ev.str, &conv); | ||||||
| 		if (len >= max_size) { | 		len = strlen(str) * 4 + 1; | ||||||
|  | 		if (len > max_size) { | ||||||
| 			char *nptr; | 			char *nptr; | ||||||
| 			max_size = (len + 1024) & ~1023; | 			max_size = (len + 1024) & (size_t)~1023; | ||||||
| 			nptr = h_realloc(ptr, max_size); | 			nptr = h_realloc(ptr, max_size * sizeof(*ptr)); | ||||||
| 			if (nptr == NULL) { | 			if (nptr == NULL) { | ||||||
| 				i = -1; | 				i = -1; | ||||||
| 				goto oomem; | 				goto oomem; | ||||||
| 			} | 			} | ||||||
| 			ptr = nptr; | 			ptr = nptr; | ||||||
| 		} | 		} | ||||||
| 		(void) strvis(ptr, ct_encode_string(ev.str, &conv), VIS_WHITE); | 		(void) strvis(ptr, str, VIS_WHITE); | ||||||
| 		(void) fprintf(fp, "%s\n", ptr); | 		(void) fprintf(fp, "%s\n", ptr); | ||||||
| 	} | 	} | ||||||
| oomem: | oomem: | ||||||
| 	h_free((ptr_t)ptr); | 	h_free(ptr); | ||||||
| done: | done: | ||||||
|  | 	return i; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* history_save(): | ||||||
|  |  *    History save function | ||||||
|  |  */ | ||||||
|  | static int | ||||||
|  | history_save(TYPE(History) *h, const char *fname) | ||||||
|  | { | ||||||
|  |     FILE *fp; | ||||||
|  |     int i; | ||||||
|  |  | ||||||
|  |     if ((fp = fopen(fname, "w")) == NULL) | ||||||
|  | 	return -1; | ||||||
|  |  | ||||||
|  |     i = history_save_fp(h, fp); | ||||||
|  |  | ||||||
|     (void) fclose(fp); |     (void) fclose(fp); | ||||||
| 	return (i); |     return i; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_prev_event(): | /* history_prev_event(): | ||||||
|  *	Find the previous event, with number given |  *	Find the previous event, with number given | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_prev_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num) | history_prev_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num) | ||||||
| { | { | ||||||
| 	int retval; | 	int retval; | ||||||
|  |  | ||||||
| 	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev)) | 	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev)) | ||||||
| 		if (ev->num == num) | 		if (ev->num == num) | ||||||
| 			return (0); | 			return 0; | ||||||
|  |  | ||||||
| 	he_seterrev(ev, _HE_NOT_FOUND); | 	he_seterrev(ev, _HE_NOT_FOUND); | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| private int | static int | ||||||
| history_next_evdata(TYPE(History) *h, TYPE(HistEvent) *ev, int num, void **d) | history_next_evdata(TYPE(History) *h, TYPE(HistEvent) *ev, int num, void **d) | ||||||
| { | { | ||||||
| 	int retval; | 	int retval; | ||||||
| @@ -859,35 +913,35 @@ history_next_evdata(TYPE(History) *h, TYPE(HistEvent) *ev, int num, void **d) | |||||||
| 		if (ev->num == num) { | 		if (ev->num == num) { | ||||||
| 			if (d) | 			if (d) | ||||||
| 				*d = ((history_t *)h->h_ref)->cursor->data; | 				*d = ((history_t *)h->h_ref)->cursor->data; | ||||||
| 			return (0); | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	he_seterrev(ev, _HE_NOT_FOUND); | 	he_seterrev(ev, _HE_NOT_FOUND); | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_next_event(): | /* history_next_event(): | ||||||
|  *	Find the next event, with number given |  *	Find the next event, with number given | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_next_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num) | history_next_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num) | ||||||
| { | { | ||||||
| 	int retval; | 	int retval; | ||||||
|  |  | ||||||
| 	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev)) | 	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev)) | ||||||
| 		if (ev->num == num) | 		if (ev->num == num) | ||||||
| 			return (0); | 			return 0; | ||||||
|  |  | ||||||
| 	he_seterrev(ev, _HE_NOT_FOUND); | 	he_seterrev(ev, _HE_NOT_FOUND); | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_prev_string(): | /* history_prev_string(): | ||||||
|  *	Find the previous event beginning with string |  *	Find the previous event beginning with string | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_prev_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str) | history_prev_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str) | ||||||
| { | { | ||||||
| 	size_t len = Strlen(str); | 	size_t len = Strlen(str); | ||||||
| @@ -895,17 +949,17 @@ history_prev_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str) | |||||||
|  |  | ||||||
| 	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev)) | 	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev)) | ||||||
| 		if (Strncmp(str, ev->str, len) == 0) | 		if (Strncmp(str, ev->str, len) == 0) | ||||||
| 			return (0); | 			return 0; | ||||||
|  |  | ||||||
| 	he_seterrev(ev, _HE_NOT_FOUND); | 	he_seterrev(ev, _HE_NOT_FOUND); | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* history_next_string(): | /* history_next_string(): | ||||||
|  *	Find the next event beginning with string |  *	Find the next event beginning with string | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| history_next_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str) | history_next_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str) | ||||||
| { | { | ||||||
| 	size_t len = Strlen(str); | 	size_t len = Strlen(str); | ||||||
| @@ -913,10 +967,10 @@ history_next_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str) | |||||||
|  |  | ||||||
| 	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev)) | 	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev)) | ||||||
| 		if (Strncmp(str, ev->str, len) == 0) | 		if (Strncmp(str, ev->str, len) == 0) | ||||||
| 			return (0); | 			return 0; | ||||||
|  |  | ||||||
| 	he_seterrev(ev, _HE_NOT_FOUND); | 	he_seterrev(ev, _HE_NOT_FOUND); | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1013,6 +1067,12 @@ FUNW(history)(TYPE(History) *h, TYPE(HistEvent) *ev, int fun, ...) | |||||||
| 			he_seterrev(ev, _HE_HIST_WRITE); | 			he_seterrev(ev, _HE_HIST_WRITE); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
|  | 	case H_SAVE_FP: | ||||||
|  | 		retval = history_save_fp(h, va_arg(va, FILE *)); | ||||||
|  | 		if (retval == -1) | ||||||
|  | 		    he_seterrev(ev, _HE_HIST_WRITE); | ||||||
|  | 		break; | ||||||
|  |  | ||||||
| 	case H_PREV_EVENT: | 	case H_PREV_EVENT: | ||||||
| 		retval = history_prev_event(h, ev, va_arg(va, int)); | 		retval = history_prev_event(h, ev, va_arg(va, int)); | ||||||
| 		break; | 		break; | ||||||
| @@ -1033,7 +1093,7 @@ FUNW(history)(TYPE(History) *h, TYPE(HistEvent) *ev, int fun, ...) | |||||||
| 	{ | 	{ | ||||||
| 		TYPE(History) hf; | 		TYPE(History) hf; | ||||||
|  |  | ||||||
| 		hf.h_ref = va_arg(va, ptr_t); | 		hf.h_ref = va_arg(va, void *); | ||||||
| 		h->h_ent = -1; | 		h->h_ent = -1; | ||||||
| 		hf.h_first = va_arg(va, history_gfun_t); | 		hf.h_first = va_arg(va, history_gfun_t); | ||||||
| 		hf.h_next = va_arg(va, history_gfun_t); | 		hf.h_next = va_arg(va, history_gfun_t); | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								lib/libedit/src/historyn.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lib/libedit/src/historyn.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | #include "config.h" | ||||||
|  | #define NARROWCHAR | ||||||
|  | #include "history.c" | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: key.c,v 1.23 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: keymacro.c,v 1.23 2016/05/24 15:00:45 christos Exp $	*/ | ||||||
| 
 | 
 | ||||||
| /*-
 | /*-
 | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,235 +37,239 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)key.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)key.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: key.c,v 1.23 2009/12/30 22:37:40 christos Exp $"); | __RCSID("$NetBSD: keymacro.c,v 1.23 2016/05/24 15:00:45 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * key.c: This module contains the procedures for maintaining |  * keymacro.c: This module contains the procedures for maintaining | ||||||
|  *	       the extended-key map. |  *	       the extended-key map. | ||||||
|  * |  * | ||||||
|  *      An extended-key (key) is a sequence of keystrokes introduced |  *      An extended-key (key) is a sequence of keystrokes introduced | ||||||
|  *	with a sequence introducer and consisting of an arbitrary |  *	with a sequence introducer and consisting of an arbitrary | ||||||
|  *	number of characters.  This module maintains a map (the el->el_key.map) |  *	number of characters.  This module maintains a map (the | ||||||
|  |  *	el->el_keymacro.map) | ||||||
|  *	to convert these extended-key sequences into input strs |  *	to convert these extended-key sequences into input strs | ||||||
|  *	(XK_STR), editor functions (XK_CMD), or unix commands (XK_EXE). |  *	(XK_STR) or editor functions (XK_CMD). | ||||||
|  * |  * | ||||||
|  *      Warning: |  *      Warning: | ||||||
|  *	  If key is a substr of some other keys, then the longer |  *	  If key is a substr of some other keys, then the longer | ||||||
|  *	  keys are lost!!  That is, if the keys "abcd" and "abcef" |  *	  keys are lost!!  That is, if the keys "abcd" and "abcef" | ||||||
|  *	  are in el->el_key.map, adding the key "abc" will cause the first two |  *	  are in el->el_keymacro.map, adding the key "abc" will cause | ||||||
|  *	  definitions to be lost. |  *	  the first two definitions to be lost. | ||||||
|  * |  * | ||||||
|  *      Restrictions: |  *      Restrictions: | ||||||
|  *      ------------- |  *      ------------- | ||||||
|  *      1) It is not possible to have one key that is a |  *      1) It is not possible to have one key that is a | ||||||
|  *	   substr of another. |  *	   substr of another. | ||||||
|  */ |  */ | ||||||
| #include <string.h> |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
| 
 | 
 | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  | #include "fcns.h" | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * The Nodes of the el->el_key.map.  The el->el_key.map is a linked list |  * The Nodes of the el->el_keymacro.map.  The el->el_keymacro.map is a | ||||||
|  * of these node elements |  * linked list of these node elements | ||||||
|  */ |  */ | ||||||
| struct key_node_t { | struct keymacro_node_t { | ||||||
| 	Char		ch;		/* single character of key 	 */ | 	wchar_t		 ch;		/* single character of key	 */ | ||||||
| 	int		 type;		/* node type			 */ | 	int		 type;		/* node type			 */ | ||||||
| 	key_value_t	val;		/* command code or pointer to str,  */ | 	keymacro_value_t val;		/* command code or pointer to str,  */ | ||||||
| 					/* if this is a leaf		 */ | 					/* if this is a leaf		 */ | ||||||
| 	struct key_node_t *next;	/* ptr to next char of this key  */ | 	struct keymacro_node_t *next;	/* ptr to next char of this key  */ | ||||||
| 	struct key_node_t *sibling;	/* ptr to another key with same prefix*/ | 	struct keymacro_node_t *sibling;/* ptr to another key with same prefix*/ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| private int		 node_trav(EditLine *, key_node_t *, Char *, | static int		 node_trav(EditLine *, keymacro_node_t *, wchar_t *, | ||||||
|     key_value_t *); |     keymacro_value_t *); | ||||||
| private int		 node__try(EditLine *, key_node_t *, const Char *, | static int		 node__try(EditLine *, keymacro_node_t *, | ||||||
|     key_value_t *, int); |     const wchar_t *, keymacro_value_t *, int); | ||||||
| private key_node_t	*node__get(Int); | static keymacro_node_t	*node__get(wint_t); | ||||||
| private void		 node__free(key_node_t *); | static void		 node__free(keymacro_node_t *); | ||||||
| private void		 node__put(EditLine *, key_node_t *); | static void		 node__put(EditLine *, keymacro_node_t *); | ||||||
| private int		 node__delete(EditLine *, key_node_t **, const Char *); | static int		 node__delete(EditLine *, keymacro_node_t **, | ||||||
| private int		 node_lookup(EditLine *, const Char *, key_node_t *, |     const wchar_t *); | ||||||
|     size_t); | static int		 node_lookup(EditLine *, const wchar_t *, | ||||||
| private int		 node_enum(EditLine *, key_node_t *, size_t); |     keymacro_node_t *, size_t); | ||||||
|  | static int		 node_enum(EditLine *, keymacro_node_t *, size_t); | ||||||
| 
 | 
 | ||||||
| #define	KEY_BUFSIZ	EL_BUFSIZ | #define	KEY_BUFSIZ	EL_BUFSIZ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_init():
 | /* keymacro_init():
 | ||||||
|  *	Initialize the key maps |  *	Initialize the key maps | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| key_init(EditLine *el) | keymacro_init(EditLine *el) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	el->el_key.buf = el_malloc(KEY_BUFSIZ * sizeof(*el->el_key.buf)); | 	el->el_keymacro.buf = el_malloc(KEY_BUFSIZ * | ||||||
| 	if (el->el_key.buf == NULL) | 	    sizeof(*el->el_keymacro.buf)); | ||||||
| 		return (-1); | 	if (el->el_keymacro.buf == NULL) | ||||||
| 	el->el_key.map = NULL; | 		return -1; | ||||||
| 	key_reset(el); | 	el->el_keymacro.map = NULL; | ||||||
| 	return (0); | 	keymacro_reset(el); | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* key_end():
 | /* keymacro_end():
 | ||||||
|  *	Free the key maps |  *	Free the key maps | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| key_end(EditLine *el) | keymacro_end(EditLine *el) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	el_free((ptr_t) el->el_key.buf); | 	el_free(el->el_keymacro.buf); | ||||||
| 	el->el_key.buf = NULL; | 	el->el_keymacro.buf = NULL; | ||||||
| 	node__free(el->el_key.map); | 	node__free(el->el_keymacro.map); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_map_cmd():
 | /* keymacro_map_cmd():
 | ||||||
|  *	Associate cmd with a key value |  *	Associate cmd with a key value | ||||||
|  */ |  */ | ||||||
| protected key_value_t * | libedit_private keymacro_value_t * | ||||||
| key_map_cmd(EditLine *el, int cmd) | keymacro_map_cmd(EditLine *el, int cmd) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	el->el_key.val.cmd = (el_action_t) cmd; | 	el->el_keymacro.val.cmd = (el_action_t) cmd; | ||||||
| 	return (&el->el_key.val); | 	return &el->el_keymacro.val; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_map_str():
 | /* keymacro_map_str():
 | ||||||
|  *	Associate str with a key value |  *	Associate str with a key value | ||||||
|  */ |  */ | ||||||
| protected key_value_t * | libedit_private keymacro_value_t * | ||||||
| key_map_str(EditLine *el, Char *str) | keymacro_map_str(EditLine *el, wchar_t *str) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	el->el_key.val.str = str; | 	el->el_keymacro.val.str = str; | ||||||
| 	return (&el->el_key.val); | 	return &el->el_keymacro.val; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_reset():
 | /* keymacro_reset():
 | ||||||
|  *	Takes all nodes on el->el_key.map and puts them on free list.  Then |  *	Takes all nodes on el->el_keymacro.map and puts them on free list. | ||||||
|  *	initializes el->el_key.map with arrow keys |  *	Then initializes el->el_keymacro.map with arrow keys | ||||||
|  *	[Always bind the ansi arrow keys?] |  *	[Always bind the ansi arrow keys?] | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| key_reset(EditLine *el) | keymacro_reset(EditLine *el) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	node__put(el, el->el_key.map); | 	node__put(el, el->el_keymacro.map); | ||||||
| 	el->el_key.map = NULL; | 	el->el_keymacro.map = NULL; | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_get():
 | /* keymacro_get():
 | ||||||
|  *	Calls the recursive function with entry point el->el_key.map |  *	Calls the recursive function with entry point el->el_keymacro.map | ||||||
|  *      Looks up *ch in map and then reads characters until a |  *      Looks up *ch in map and then reads characters until a | ||||||
|  *      complete match is found or a mismatch occurs. Returns the |  *      complete match is found or a mismatch occurs. Returns the | ||||||
|  *      type of the match found (XK_STR, XK_CMD, or XK_EXE). |  *      type of the match found (XK_STR or XK_CMD). | ||||||
|  *      Returns NULL in val.str and XK_STR for no match. |  *      Returns NULL in val.str and XK_STR for no match. | ||||||
|  |  *      Returns XK_NOD for end of file or read error. | ||||||
|  *      The last character read is returned in *ch. |  *      The last character read is returned in *ch. | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| key_get(EditLine *el, Char *ch, key_value_t *val) | keymacro_get(EditLine *el, wchar_t *ch, keymacro_value_t *val) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	return (node_trav(el, el->el_key.map, ch, val)); | 	return node_trav(el, el->el_keymacro.map, ch, val); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_add():
 | /* keymacro_add():
 | ||||||
|  *      Adds key to the el->el_key.map and associates the value in val with it. |  *      Adds key to the el->el_keymacro.map and associates the value in | ||||||
|  *      If key is already is in el->el_key.map, the new code is applied to the |  *	val with it. If key is already is in el->el_keymacro.map, the new | ||||||
|  *      existing key. Ntype specifies if code is a command, an |  *	code is applied to the existing key. Ntype specifies if code is a | ||||||
|  *      out str or a unix command. |  *	command, an out str or a unix command. | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| key_add(EditLine *el, const Char *key, key_value_t *val, int ntype) | keymacro_add(EditLine *el, const wchar_t *key, keymacro_value_t *val, | ||||||
|  |     int ntype) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	if (key[0] == '\0') { | 	if (key[0] == '\0') { | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, | ||||||
| 		    "key_add: Null extended-key not allowed.\n"); | 		    "keymacro_add: Null extended-key not allowed.\n"); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 	if (ntype == XK_CMD && val->cmd == ED_SEQUENCE_LEAD_IN) { | 	if (ntype == XK_CMD && val->cmd == ED_SEQUENCE_LEAD_IN) { | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, | ||||||
| 		    "key_add: sequence-lead-in command not allowed\n"); | 		    "keymacro_add: sequence-lead-in command not allowed\n"); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 	if (el->el_key.map == NULL) | 	if (el->el_keymacro.map == NULL) | ||||||
| 		/* tree is initially empty.  Set up new node to match key[0] */ | 		/* tree is initially empty.  Set up new node to match key[0] */ | ||||||
| 		el->el_key.map = node__get(key[0]); | 		el->el_keymacro.map = node__get(key[0]); | ||||||
| 			/* it is properly initialized */ | 			/* it is properly initialized */ | ||||||
| 
 | 
 | ||||||
| 	/* Now recurse through el->el_key.map */ | 	/* Now recurse through el->el_keymacro.map */ | ||||||
| 	(void) node__try(el, el->el_key.map, key, val, ntype); | 	(void) node__try(el, el->el_keymacro.map, key, val, ntype); | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_clear():
 | /* keymacro_clear():
 | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| key_clear(EditLine *el, el_action_t *map, const Char *in) | keymacro_clear(EditLine *el, el_action_t *map, const wchar_t *in) | ||||||
| { | { | ||||||
| #ifdef WIDECHAR |  | ||||||
|         if (*in > N_KEYS) /* can't be in the map */ |         if (*in > N_KEYS) /* can't be in the map */ | ||||||
|                 return; |                 return; | ||||||
| #endif |  | ||||||
| 	if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) && | 	if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) && | ||||||
| 	    ((map == el->el_map.key && | 	    ((map == el->el_map.key && | ||||||
| 	    el->el_map.alt[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN) || | 	    el->el_map.alt[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN) || | ||||||
| 	    (map == el->el_map.alt && | 	    (map == el->el_map.alt && | ||||||
| 	    el->el_map.key[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN))) | 	    el->el_map.key[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN))) | ||||||
| 		(void) key_delete(el, in); | 		(void) keymacro_delete(el, in); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_delete():
 | /* keymacro_delete():
 | ||||||
|  *      Delete the key and all longer keys staring with key, if |  *      Delete the key and all longer keys staring with key, if | ||||||
|  *      they exists. |  *      they exists. | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| key_delete(EditLine *el, const Char *key) | keymacro_delete(EditLine *el, const wchar_t *key) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	if (key[0] == '\0') { | 	if (key[0] == '\0') { | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, | ||||||
| 		    "key_delete: Null extended-key not allowed.\n"); | 		    "keymacro_delete: Null extended-key not allowed.\n"); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	if (el->el_key.map == NULL) | 	if (el->el_keymacro.map == NULL) | ||||||
| 		return (0); | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	(void) node__delete(el, &el->el_key.map, key); | 	(void) node__delete(el, &el->el_keymacro.map, key); | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_print():
 | /* keymacro_print():
 | ||||||
|  *	Print the binding associated with key key. |  *	Print the binding associated with key key. | ||||||
|  *	Print entire el->el_key.map if null |  *	Print entire el->el_keymacro.map if null | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| key_print(EditLine *el, const Char *key) | keymacro_print(EditLine *el, const wchar_t *key) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	/* do nothing if el->el_key.map is empty and null key specified */ | 	/* do nothing if el->el_keymacro.map is empty and null key specified */ | ||||||
| 	if (el->el_key.map == NULL && *key == 0) | 	if (el->el_keymacro.map == NULL && *key == 0) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	el->el_key.buf[0] = '"'; | 	el->el_keymacro.buf[0] = '"'; | ||||||
| 	if (node_lookup(el, key, el->el_key.map, 1) <= -1) | 	if (node_lookup(el, key, el->el_keymacro.map, (size_t)1) <= -1) | ||||||
| 		/* key is not bound */ | 		/* key is not bound */ | ||||||
| 		(void) fprintf(el->el_errfile, "Unbound extended key \"" FSTR "\"\n", | 		(void) fprintf(el->el_errfile, "Unbound extended key \"%ls" | ||||||
| 		    key); | 		    "\"\n", key); | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -274,35 +278,33 @@ key_print(EditLine *el, const Char *key) | |||||||
|  *	recursively traverses node in tree until match or mismatch is |  *	recursively traverses node in tree until match or mismatch is | ||||||
|  *	found.  May read in more characters. |  *	found.  May read in more characters. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| node_trav(EditLine *el, key_node_t *ptr, Char *ch, key_value_t *val) | node_trav(EditLine *el, keymacro_node_t *ptr, wchar_t *ch, | ||||||
|  |     keymacro_value_t *val) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	if (ptr->ch == *ch) { | 	if (ptr->ch == *ch) { | ||||||
| 		/* match found */ | 		/* match found */ | ||||||
| 		if (ptr->next) { | 		if (ptr->next) { | ||||||
| 			/* key not complete so get next char */ | 			/* key not complete so get next char */ | ||||||
| 			if (FUN(el,getc)(el, ch) != 1) {/* if EOF or error */ | 			if (el_wgetc(el, ch) != 1) | ||||||
| 				val->cmd = ED_END_OF_FILE; | 				return XK_NOD; | ||||||
| 				return (XK_CMD); | 			return node_trav(el, ptr->next, ch, val); | ||||||
| 				/* PWP: Pretend we just read an end-of-file */ |  | ||||||
| 			} |  | ||||||
| 			return (node_trav(el, ptr->next, ch, val)); |  | ||||||
| 		} else { | 		} else { | ||||||
| 			*val = ptr->val; | 			*val = ptr->val; | ||||||
| 			if (ptr->type != XK_CMD) | 			if (ptr->type != XK_CMD) | ||||||
| 				*ch = '\0'; | 				*ch = '\0'; | ||||||
| 			return (ptr->type); | 			return ptr->type; | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		/* no match found here */ | 		/* no match found here */ | ||||||
| 		if (ptr->sibling) { | 		if (ptr->sibling) { | ||||||
| 			/* try next sibling */ | 			/* try next sibling */ | ||||||
| 			return (node_trav(el, ptr->sibling, ch, val)); | 			return node_trav(el, ptr->sibling, ch, val); | ||||||
| 		} else { | 		} else { | ||||||
| 			/* no next sibling -- mismatch */ | 			/* no next sibling -- mismatch */ | ||||||
| 			val->str = NULL; | 			val->str = NULL; | ||||||
| 			return (XK_STR); | 			return XK_STR; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -311,12 +313,13 @@ node_trav(EditLine *el, key_node_t *ptr, Char *ch, key_value_t *val) | |||||||
| /* node__try():
 | /* node__try():
 | ||||||
|  *	Find a node that matches *str or allocate a new one |  *	Find a node that matches *str or allocate a new one | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| node__try(EditLine *el, key_node_t *ptr, const Char *str, key_value_t *val, int ntype) | node__try(EditLine *el, keymacro_node_t *ptr, const wchar_t *str, | ||||||
|  |     keymacro_value_t *val, int ntype) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	if (ptr->ch != *str) { | 	if (ptr->ch != *str) { | ||||||
| 		key_node_t *xm; | 		keymacro_node_t *xm; | ||||||
| 
 | 
 | ||||||
| 		for (xm = ptr; xm->sibling != NULL; xm = xm->sibling) | 		for (xm = ptr; xm->sibling != NULL; xm = xm->sibling) | ||||||
| 			if (xm->sibling->ch == *str) | 			if (xm->sibling->ch == *str) | ||||||
| @@ -337,9 +340,8 @@ node__try(EditLine *el, key_node_t *ptr, const Char *str, key_value_t *val, int | |||||||
| 		case XK_NOD: | 		case XK_NOD: | ||||||
| 			break; | 			break; | ||||||
| 		case XK_STR: | 		case XK_STR: | ||||||
| 		case XK_EXE: |  | ||||||
| 			if (ptr->val.str) | 			if (ptr->val.str) | ||||||
| 				el_free((ptr_t) ptr->val.str); | 				el_free(ptr->val.str); | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", | 			EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", | ||||||
| @@ -352,8 +354,7 @@ node__try(EditLine *el, key_node_t *ptr, const Char *str, key_value_t *val, int | |||||||
| 			ptr->val = *val; | 			ptr->val = *val; | ||||||
| 			break; | 			break; | ||||||
| 		case XK_STR: | 		case XK_STR: | ||||||
| 		case XK_EXE: | 			if ((ptr->val.str = wcsdup(val->str)) == NULL) | ||||||
| 			if ((ptr->val.str = Strdup(val->str)) == NULL) |  | ||||||
| 				return -1; | 				return -1; | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| @@ -366,29 +367,29 @@ node__try(EditLine *el, key_node_t *ptr, const Char *str, key_value_t *val, int | |||||||
| 			ptr->next = node__get(*str);	/* setup new node */ | 			ptr->next = node__get(*str);	/* setup new node */ | ||||||
| 		(void) node__try(el, ptr->next, str, val, ntype); | 		(void) node__try(el, ptr->next, str, val, ntype); | ||||||
| 	} | 	} | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* node__delete():
 | /* node__delete():
 | ||||||
|  *	Delete node that matches str |  *	Delete node that matches str | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| node__delete(EditLine *el, key_node_t **inptr, const Char *str) | node__delete(EditLine *el, keymacro_node_t **inptr, const wchar_t *str) | ||||||
| { | { | ||||||
| 	key_node_t *ptr; | 	keymacro_node_t *ptr; | ||||||
| 	key_node_t *prev_ptr = NULL; | 	keymacro_node_t *prev_ptr = NULL; | ||||||
| 
 | 
 | ||||||
| 	ptr = *inptr; | 	ptr = *inptr; | ||||||
| 
 | 
 | ||||||
| 	if (ptr->ch != *str) { | 	if (ptr->ch != *str) { | ||||||
| 		key_node_t *xm; | 		keymacro_node_t *xm; | ||||||
| 
 | 
 | ||||||
| 		for (xm = ptr; xm->sibling != NULL; xm = xm->sibling) | 		for (xm = ptr; xm->sibling != NULL; xm = xm->sibling) | ||||||
| 			if (xm->sibling->ch == *str) | 			if (xm->sibling->ch == *str) | ||||||
| 				break; | 				break; | ||||||
| 		if (xm->sibling == NULL) | 		if (xm->sibling == NULL) | ||||||
| 			return (0); | 			return 0; | ||||||
| 		prev_ptr = xm; | 		prev_ptr = xm; | ||||||
| 		ptr = xm->sibling; | 		ptr = xm->sibling; | ||||||
| 	} | 	} | ||||||
| @@ -400,20 +401,20 @@ node__delete(EditLine *el, key_node_t **inptr, const Char *str) | |||||||
| 			prev_ptr->sibling = ptr->sibling; | 			prev_ptr->sibling = ptr->sibling; | ||||||
| 		ptr->sibling = NULL; | 		ptr->sibling = NULL; | ||||||
| 		node__put(el, ptr); | 		node__put(el, ptr); | ||||||
| 		return (1); | 		return 1; | ||||||
| 	} else if (ptr->next != NULL && | 	} else if (ptr->next != NULL && | ||||||
| 	    node__delete(el, &ptr->next, str) == 1) { | 	    node__delete(el, &ptr->next, str) == 1) { | ||||||
| 		if (ptr->next != NULL) | 		if (ptr->next != NULL) | ||||||
| 			return (0); | 			return 0; | ||||||
| 		if (prev_ptr == NULL) | 		if (prev_ptr == NULL) | ||||||
| 			*inptr = ptr->sibling; | 			*inptr = ptr->sibling; | ||||||
| 		else | 		else | ||||||
| 			prev_ptr->sibling = ptr->sibling; | 			prev_ptr->sibling = ptr->sibling; | ||||||
| 		ptr->sibling = NULL; | 		ptr->sibling = NULL; | ||||||
| 		node__put(el, ptr); | 		node__put(el, ptr); | ||||||
| 		return (1); | 		return 1; | ||||||
| 	} else { | 	} else { | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -421,8 +422,8 @@ node__delete(EditLine *el, key_node_t **inptr, const Char *str) | |||||||
| /* node__put():
 | /* node__put():
 | ||||||
|  *	Puts a tree of nodes onto free list using free(3). |  *	Puts a tree of nodes onto free list using free(3). | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| node__put(EditLine *el, key_node_t *ptr) | node__put(EditLine *el, keymacro_node_t *ptr) | ||||||
| { | { | ||||||
| 	if (ptr == NULL) | 	if (ptr == NULL) | ||||||
| 		return; | 		return; | ||||||
| @@ -437,28 +438,27 @@ node__put(EditLine *el, key_node_t *ptr) | |||||||
| 	case XK_CMD: | 	case XK_CMD: | ||||||
| 	case XK_NOD: | 	case XK_NOD: | ||||||
| 		break; | 		break; | ||||||
| 	case XK_EXE: |  | ||||||
| 	case XK_STR: | 	case XK_STR: | ||||||
| 		if (ptr->val.str != NULL) | 		if (ptr->val.str != NULL) | ||||||
| 			el_free((ptr_t) ptr->val.str); | 			el_free(ptr->val.str); | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type)); | 		EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type)); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	el_free((ptr_t) ptr); | 	el_free(ptr); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* node__get():
 | /* node__get():
 | ||||||
|  *	Returns pointer to a key_node_t for ch. |  *	Returns pointer to a keymacro_node_t for ch. | ||||||
|  */ |  */ | ||||||
| private key_node_t * | static keymacro_node_t * | ||||||
| node__get(Int ch) | node__get(wint_t ch) | ||||||
| { | { | ||||||
| 	key_node_t *ptr; | 	keymacro_node_t *ptr; | ||||||
| 
 | 
 | ||||||
| 	ptr = (key_node_t *) el_malloc((size_t) sizeof(key_node_t)); | 	ptr = el_malloc(sizeof(*ptr)); | ||||||
| 	if (ptr == NULL) | 	if (ptr == NULL) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	ptr->ch = ch; | 	ptr->ch = ch; | ||||||
| @@ -466,57 +466,59 @@ node__get(Int ch) | |||||||
| 	ptr->val.str = NULL; | 	ptr->val.str = NULL; | ||||||
| 	ptr->next = NULL; | 	ptr->next = NULL; | ||||||
| 	ptr->sibling = NULL; | 	ptr->sibling = NULL; | ||||||
| 	return (ptr); | 	return ptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| private void | static void | ||||||
| node__free(key_node_t *k) | node__free(keymacro_node_t *k) | ||||||
| { | { | ||||||
| 	if (k == NULL) | 	if (k == NULL) | ||||||
| 		return; | 		return; | ||||||
| 	node__free(k->sibling); | 	node__free(k->sibling); | ||||||
| 	node__free(k->next); | 	node__free(k->next); | ||||||
| 	el_free((ptr_t) k); | 	el_free(k); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* node_lookup():
 | /* node_lookup():
 | ||||||
|  *	look for the str starting at node ptr. |  *	look for the str starting at node ptr. | ||||||
|  *	Print if last node |  *	Print if last node | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| node_lookup(EditLine *el, const Char *str, key_node_t *ptr, size_t cnt) | node_lookup(EditLine *el, const wchar_t *str, keymacro_node_t *ptr, | ||||||
|  |     size_t cnt) | ||||||
| { | { | ||||||
| 	ssize_t used; | 	ssize_t used; | ||||||
| 
 | 
 | ||||||
| 	if (ptr == NULL) | 	if (ptr == NULL) | ||||||
| 		return (-1);	/* cannot have null ptr */ | 		return -1;	/* cannot have null ptr */ | ||||||
| 
 | 
 | ||||||
| 	if (!str || *str == 0) { | 	if (!str || *str == 0) { | ||||||
| 		/* no more chars in str.  node_enum from here. */ | 		/* no more chars in str.  node_enum from here. */ | ||||||
| 		(void) node_enum(el, ptr, cnt); | 		(void) node_enum(el, ptr, cnt); | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} else { | 	} else { | ||||||
| 		/* If match put this char into el->el_key.buf.  Recurse */ | 		/* If match put this char into el->el_keymacro.buf.  Recurse */ | ||||||
| 		if (ptr->ch == *str) { | 		if (ptr->ch == *str) { | ||||||
| 			/* match found */ | 			/* match found */ | ||||||
| 			used = ct_visual_char(el->el_key.buf + cnt, | 			used = ct_visual_char(el->el_keymacro.buf + cnt, | ||||||
| 			    KEY_BUFSIZ - cnt, ptr->ch); | 			    KEY_BUFSIZ - cnt, ptr->ch); | ||||||
| 			if (used == -1) | 			if (used == -1) | ||||||
| 				return (-1); /* ran out of buffer space */ | 				return -1; /* ran out of buffer space */ | ||||||
| 			if (ptr->next != NULL) | 			if (ptr->next != NULL) | ||||||
| 				/* not yet at leaf */ | 				/* not yet at leaf */ | ||||||
| 				return (node_lookup(el, str + 1, ptr->next, | 				return (node_lookup(el, str + 1, ptr->next, | ||||||
| 				    used + cnt)); | 				    (size_t)used + cnt)); | ||||||
| 			else { | 			else { | ||||||
| 			    /* next node is null so key should be complete */ | 			    /* next node is null so key should be complete */ | ||||||
| 				if (str[1] == 0) { | 				if (str[1] == 0) { | ||||||
| 					el->el_key.buf[cnt + used    ] = '"'; | 					size_t px = cnt + (size_t)used; | ||||||
| 					el->el_key.buf[cnt + used + 1] = '\0'; | 					el->el_keymacro.buf[px] = '"'; | ||||||
| 					key_kprint(el, el->el_key.buf, | 					el->el_keymacro.buf[px + 1] = '\0'; | ||||||
|  | 					keymacro_kprint(el, el->el_keymacro.buf, | ||||||
| 					    &ptr->val, ptr->type); | 					    &ptr->val, ptr->type); | ||||||
| 					return (0); | 					return 0; | ||||||
| 				} else | 				} else | ||||||
| 					return (-1); | 					return -1; | ||||||
| 					/* mismatch -- str still has chars */ | 					/* mismatch -- str still has chars */ | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| @@ -525,7 +527,7 @@ node_lookup(EditLine *el, const Char *str, key_node_t *ptr, size_t cnt) | |||||||
| 				return (node_lookup(el, str, ptr->sibling, | 				return (node_lookup(el, str, ptr->sibling, | ||||||
| 				    cnt)); | 				    cnt)); | ||||||
| 			else | 			else | ||||||
| 				return (-1); | 				return -1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -534,49 +536,52 @@ node_lookup(EditLine *el, const Char *str, key_node_t *ptr, size_t cnt) | |||||||
| /* node_enum():
 | /* node_enum():
 | ||||||
|  *	Traverse the node printing the characters it is bound in buffer |  *	Traverse the node printing the characters it is bound in buffer | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| node_enum(EditLine *el, key_node_t *ptr, size_t cnt) | node_enum(EditLine *el, keymacro_node_t *ptr, size_t cnt) | ||||||
| { | { | ||||||
|         ssize_t used; |         ssize_t used; | ||||||
| 
 | 
 | ||||||
| 	if (cnt >= KEY_BUFSIZ - 5) {	/* buffer too small */ | 	if (cnt >= KEY_BUFSIZ - 5) {	/* buffer too small */ | ||||||
| 		el->el_key.buf[++cnt] = '"'; | 		el->el_keymacro.buf[++cnt] = '"'; | ||||||
| 		el->el_key.buf[++cnt] = '\0'; | 		el->el_keymacro.buf[++cnt] = '\0'; | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, | ||||||
| 		    "Some extended keys too long for internal print buffer"); | 		    "Some extended keys too long for internal print buffer"); | ||||||
| 		(void) fprintf(el->el_errfile, " \"" FSTR "...\"\n", el->el_key.buf); | 		(void) fprintf(el->el_errfile, " \"%ls...\"\n", | ||||||
| 		return (0); | 		    el->el_keymacro.buf); | ||||||
|  | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	if (ptr == NULL) { | 	if (ptr == NULL) { | ||||||
| #ifdef DEBUG_EDIT | #ifdef DEBUG_EDIT | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, | ||||||
| 		    "node_enum: BUG!! Null ptr passed\n!"); | 		    "node_enum: BUG!! Null ptr passed\n!"); | ||||||
| #endif | #endif | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	/* put this char at end of str */ | 	/* put this char at end of str */ | ||||||
|         used = ct_visual_char(el->el_key.buf + cnt, KEY_BUFSIZ - cnt, ptr->ch); |         used = ct_visual_char(el->el_keymacro.buf + cnt, KEY_BUFSIZ - cnt, | ||||||
|  | 	    ptr->ch); | ||||||
| 	if (ptr->next == NULL) { | 	if (ptr->next == NULL) { | ||||||
| 		/* print this key and function */ | 		/* print this key and function */ | ||||||
| 		el->el_key.buf[cnt + used   ] = '"'; | 		el->el_keymacro.buf[cnt + (size_t)used   ] = '"'; | ||||||
| 		el->el_key.buf[cnt + used + 1] = '\0'; | 		el->el_keymacro.buf[cnt + (size_t)used + 1] = '\0'; | ||||||
| 		key_kprint(el, el->el_key.buf, &ptr->val, ptr->type); | 		keymacro_kprint(el, el->el_keymacro.buf, &ptr->val, ptr->type); | ||||||
| 	} else | 	} else | ||||||
| 		(void) node_enum(el, ptr->next, cnt + used); | 		(void) node_enum(el, ptr->next, cnt + (size_t)used); | ||||||
| 
 | 
 | ||||||
| 	/* go to sibling if there is one */ | 	/* go to sibling if there is one */ | ||||||
| 	if (ptr->sibling) | 	if (ptr->sibling) | ||||||
| 		(void) node_enum(el, ptr->sibling, cnt); | 		(void) node_enum(el, ptr->sibling, cnt); | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* key_kprint():
 | /* keymacro_kprint():
 | ||||||
|  *	Print the specified key and its associated |  *	Print the specified key and its associated | ||||||
|  *	function specified by val |  *	function specified by val | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| key_kprint(EditLine *el, const Char *key, key_value_t *val, int ntype) | keymacro_kprint(EditLine *el, const wchar_t *key, keymacro_value_t *val, | ||||||
|  |     int ntype) | ||||||
| { | { | ||||||
| 	el_bindings_t *fp; | 	el_bindings_t *fp; | ||||||
| 	char unparsbuf[EL_BUFSIZ]; | 	char unparsbuf[EL_BUFSIZ]; | ||||||
| @@ -585,8 +590,7 @@ key_kprint(EditLine *el, const Char *key, key_value_t *val, int ntype) | |||||||
| 	if (val != NULL) | 	if (val != NULL) | ||||||
| 		switch (ntype) { | 		switch (ntype) { | ||||||
| 		case XK_STR: | 		case XK_STR: | ||||||
| 		case XK_EXE: | 			(void) keymacro__decode_str(val->str, unparsbuf, | ||||||
| 			(void) key__decode_str(val->str, unparsbuf, |  | ||||||
| 			    sizeof(unparsbuf), | 			    sizeof(unparsbuf), | ||||||
| 			    ntype == XK_STR ? "\"\"" : "[]"); | 			    ntype == XK_STR ? "\"\"" : "[]"); | ||||||
| 			(void) fprintf(el->el_outfile, fmt, | 			(void) fprintf(el->el_outfile, fmt, | ||||||
| @@ -595,7 +599,7 @@ key_kprint(EditLine *el, const Char *key, key_value_t *val, int ntype) | |||||||
| 		case XK_CMD: | 		case XK_CMD: | ||||||
| 			for (fp = el->el_map.help; fp->name; fp++) | 			for (fp = el->el_map.help; fp->name; fp++) | ||||||
| 				if (val->cmd == fp->func) { | 				if (val->cmd == fp->func) { | ||||||
|                     ct_wcstombs(unparsbuf, fp->name, sizeof(unparsbuf)); |                     wcstombs(unparsbuf, fp->name, sizeof(unparsbuf)); | ||||||
|                     unparsbuf[sizeof(unparsbuf) -1] = '\0'; |                     unparsbuf[sizeof(unparsbuf) -1] = '\0'; | ||||||
| 					(void) fprintf(el->el_outfile, fmt, | 					(void) fprintf(el->el_outfile, fmt, | ||||||
|                         ct_encode_string(key, &el->el_scratch), unparsbuf); |                         ct_encode_string(key, &el->el_scratch), unparsbuf); | ||||||
| @@ -623,14 +627,15 @@ key_kprint(EditLine *el, const Char *key, key_value_t *val, int ntype) | |||||||
| 		*b++ = c; \ | 		*b++ = c; \ | ||||||
| 	else \ | 	else \ | ||||||
| 		b++ | 		b++ | ||||||
| /* key__decode_str():
 | /* keymacro__decode_str():
 | ||||||
|  *	Make a printable version of the ey |  *	Make a printable version of the ey | ||||||
|  */ |  */ | ||||||
| protected size_t | libedit_private size_t | ||||||
| key__decode_str(const Char *str, char *buf, size_t len, const char *sep) | keymacro__decode_str(const wchar_t *str, char *buf, size_t len, | ||||||
|  |     const char *sep) | ||||||
| { | { | ||||||
| 	char *b = buf, *eb = b + len; | 	char *b = buf, *eb = b + len; | ||||||
| 	const Char *p; | 	const wchar_t *p; | ||||||
| 
 | 
 | ||||||
| 	b = buf; | 	b = buf; | ||||||
| 	if (sep[0] != '\0') { | 	if (sep[0] != '\0') { | ||||||
| @@ -642,8 +647,8 @@ key__decode_str(const Char *str, char *buf, size_t len, const char *sep) | |||||||
| 		goto add_endsep; | 		goto add_endsep; | ||||||
| 	} | 	} | ||||||
| 	for (p = str; *p != 0; p++) { | 	for (p = str; *p != 0; p++) { | ||||||
| 		Char dbuf[VISUAL_WIDTH_MAX]; | 		wchar_t dbuf[VISUAL_WIDTH_MAX]; | ||||||
| 		Char *p2 = dbuf; | 		wchar_t *p2 = dbuf; | ||||||
| 		ssize_t l = ct_visual_char(dbuf, VISUAL_WIDTH_MAX, *p); | 		ssize_t l = ct_visual_char(dbuf, VISUAL_WIDTH_MAX, *p); | ||||||
| 		while (l-- > 0) { | 		while (l-- > 0) { | ||||||
| 			ssize_t n = ct_encode_char(b, (size_t)(eb - b), *p2++); | 			ssize_t n = ct_encode_char(b, (size_t)(eb - b), *p2++); | ||||||
| @@ -662,4 +667,3 @@ add_endsep: | |||||||
| 	    buf[len - 1] = '\0'; | 	    buf[len - 1] = '\0'; | ||||||
| 	return (size_t)(b - buf); | 	return (size_t)(b - buf); | ||||||
| } | } | ||||||
| 
 |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: key.h,v 1.13 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: keymacro.h,v 1.6 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
| 
 | 
 | ||||||
| /*-
 | /*-
 | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -35,46 +35,42 @@ | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * el.key.h: Key macro header |  * el.keymacro.h: Key macro header | ||||||
|  */ |  */ | ||||||
| #ifndef _h_el_key | #ifndef _h_el_keymacro | ||||||
| #define	_h_el_key | #define	_h_el_keymacro | ||||||
| 
 | 
 | ||||||
| typedef union key_value_t { | typedef union keymacro_value_t { | ||||||
| 	el_action_t	 cmd;	/* If it is a command the #	*/ | 	el_action_t	 cmd;	/* If it is a command the #	*/ | ||||||
| 	Char		*str;	/* If it is a string...		*/ | 	wchar_t		*str;	/* If it is a string...		*/ | ||||||
| } key_value_t; | } keymacro_value_t; | ||||||
| 
 | 
 | ||||||
| typedef struct key_node_t key_node_t; | typedef struct keymacro_node_t keymacro_node_t; | ||||||
| 
 | 
 | ||||||
| typedef struct el_key_t { | typedef struct el_keymacro_t { | ||||||
| 	Char		*buf;	/* Key print buffer		*/ | 	wchar_t		*buf;	/* Key print buffer		*/ | ||||||
| 	key_node_t	*map;	/* Key map			*/ | 	keymacro_node_t	*map;	/* Key map			*/ | ||||||
| 	key_value_t	 val;	/* Local conversion buffer	*/ | 	keymacro_value_t val;	/* Local conversion buffer	*/ | ||||||
| } el_key_t; | } el_keymacro_t; | ||||||
| 
 | 
 | ||||||
| #define	XK_CMD	0 | #define	XK_CMD	0 | ||||||
| #define	XK_STR	1 | #define	XK_STR	1 | ||||||
| #define	XK_NOD	2 | #define	XK_NOD	2 | ||||||
| #define	XK_EXE	3 |  | ||||||
| 
 | 
 | ||||||
| #undef key_end | libedit_private int keymacro_init(EditLine *); | ||||||
| #undef key_clear | libedit_private void keymacro_end(EditLine *); | ||||||
| #undef key_print | libedit_private keymacro_value_t *keymacro_map_cmd(EditLine *, int); | ||||||
| 
 | libedit_private keymacro_value_t *keymacro_map_str(EditLine *, wchar_t *); | ||||||
| protected int		 key_init(EditLine *); | libedit_private void keymacro_reset(EditLine *); | ||||||
| protected void		 key_end(EditLine *); | libedit_private int keymacro_get(EditLine *, wchar_t *, keymacro_value_t *); | ||||||
| protected key_value_t	*key_map_cmd(EditLine *, int); | libedit_private void keymacro_add(EditLine *, const wchar_t *, | ||||||
| protected key_value_t	*key_map_str(EditLine *, Char *); |     keymacro_value_t *, int); | ||||||
| protected void		 key_reset(EditLine *); | libedit_private void keymacro_clear(EditLine *, el_action_t *, const wchar_t *); | ||||||
| protected int		 key_get(EditLine *, Char *, key_value_t *); | libedit_private int keymacro_delete(EditLine *, const wchar_t *); | ||||||
| protected void		 key_add(EditLine *, const Char *, key_value_t *, int); | libedit_private void keymacro_print(EditLine *, const wchar_t *); | ||||||
| protected void		 key_clear(EditLine *, el_action_t *, const Char *); | libedit_private void keymacro_kprint(EditLine *, const wchar_t *, | ||||||
| protected int		 key_delete(EditLine *, const Char *); |     keymacro_value_t *, int); | ||||||
| protected void		 key_print(EditLine *, const Char *); | libedit_private size_t keymacro__decode_str(const wchar_t *, char *, size_t, | ||||||
| protected void	         key_kprint(EditLine *, const Char *, key_value_t *, |  | ||||||
|     int); |  | ||||||
| protected size_t	 key__decode_str(const Char *, char *, size_t, |  | ||||||
|     const char *); |     const char *); | ||||||
| 
 | 
 | ||||||
| #endif /* _h_el_key */ | #endif /* _h_el_keymacro */ | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| #!/bin/sh - | #!/bin/sh - | ||||||
| #	$NetBSD: makelist,v 1.16 2010/04/18 21:17:05 christos Exp $ | #	$NetBSD: makelist,v 1.29 2016/05/09 21:46:56 christos Exp $ | ||||||
| # | # | ||||||
| # Copyright (c) 1992, 1993 | # Copyright (c) 1992, 1993 | ||||||
| #	The Regents of the University of California.  All rights reserved. | #	The Regents of the University of California.  All rights reserved. | ||||||
| @@ -35,7 +35,8 @@ | |||||||
|  |  | ||||||
| # makelist.sh: Automatically generate header files... | # makelist.sh: Automatically generate header files... | ||||||
|  |  | ||||||
| USAGE="Usage: $0 -n|-h|-e|-fc|-fh|-bc|-bh|-m <filenames>" | AWK=awk | ||||||
|  | USAGE="Usage: $0 -h|-fc|-fh|-bh <filenames>" | ||||||
|  |  | ||||||
| if [ "x$1" = "x" ] | if [ "x$1" = "x" ] | ||||||
| then | then | ||||||
| @@ -50,17 +51,6 @@ FILES="$@" | |||||||
|  |  | ||||||
| case $FLAG in | case $FLAG in | ||||||
|  |  | ||||||
| #	generate foo.h file from foo.c |  | ||||||
| # |  | ||||||
| -n) |  | ||||||
|     cat << _EOF |  | ||||||
| #include "config.h" |  | ||||||
| #undef WIDECHAR |  | ||||||
| #define NARROWCHAR |  | ||||||
| #include "${FILES}" |  | ||||||
| _EOF |  | ||||||
|     ;; |  | ||||||
|      |  | ||||||
| -h) | -h) | ||||||
|     set - `echo $FILES | sed -e 's/\\./_/g'` |     set - `echo $FILES | sed -e 's/\\./_/g'` | ||||||
|     hdr="_h_`basename $1`" |     hdr="_h_`basename $1`" | ||||||
| @@ -77,7 +67,8 @@ _EOF | |||||||
| # XXX:	need a space between name and prototype so that -fc and -fh | # XXX:	need a space between name and prototype so that -fc and -fh | ||||||
| #	parsing is much easier | #	parsing is much easier | ||||||
| # | # | ||||||
| 		printf("protected el_action_t\t%s (EditLine *, Int);\n", name); | 		printf("libedit_private el_action_t\t%s (EditLine *, wint_t);\n", | ||||||
|  | 		    name); | ||||||
| 	    } | 	    } | ||||||
| 	} | 	} | ||||||
| 	END { | 	END { | ||||||
| @@ -85,15 +76,13 @@ _EOF | |||||||
| 	}' | 	}' | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
| #	generate help.c from various .c files | #	generate help.h from various .c files | ||||||
| # | # | ||||||
| -bc) | -bh) | ||||||
|     cat $FILES | $AWK ' |     cat $FILES | $AWK ' | ||||||
| 	BEGIN { | 	BEGIN { | ||||||
| 	    printf("/* Automatically generated file, do not edit */\n"); | 	    printf("/* Automatically generated file, do not edit */\n"); | ||||||
| 	    printf("#include \"config.h\"\n#include \"el.h\"\n"); | 	    printf("static const struct el_bindings_t el_func_help[] = {\n"); | ||||||
| 	    printf("#include \"chartype.h\"\n"); |  | ||||||
| 	    printf("private const struct el_bindings_t el_func_help[] = {\n"); |  | ||||||
| 	    low = "abcdefghijklmnopqrstuvwxyz_"; | 	    low = "abcdefghijklmnopqrstuvwxyz_"; | ||||||
| 	    high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_"; | 	    high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_"; | ||||||
| 	    for (i = 1; i <= length(low); i++) | 	    for (i = 1; i <= length(low); i++) | ||||||
| @@ -113,46 +102,31 @@ _EOF | |||||||
| 		    fname = fname s; | 		    fname = fname s; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		printf("    { %-30.30s %-30.30s\n","STR(\"" fname "\"),", uname ","); | 		printf("    { %-30.30s %-30.30s\n","L\"" fname "\",", uname ","); | ||||||
| 		ok = 1; | 		ok = 1; | ||||||
| 	    } | 	    } | ||||||
| 	} | 	} | ||||||
| 	/^ \*/ { | 	/^ \*/ { | ||||||
| 	    if (ok) { | 	    if (ok) { | ||||||
| 		printf("      STR(\""); | 		printf("      L\""); | ||||||
| 		for (i = 2; i < NF; i++) | 		for (i = 2; i < NF; i++) | ||||||
| 		    printf("%s ", $i); | 		    printf("%s ", $i); | ||||||
| 		printf("%s\") },\n", $i); | 		printf("%s\" },\n", $i); | ||||||
| 		ok = 0; | 		ok = 0; | ||||||
| 	    } | 	    } | ||||||
| 	} | 	} | ||||||
| 	END { | 	END { | ||||||
| 	    printf("};\n"); | 	    printf("};\n"); | ||||||
| 	    printf("\nprotected const el_bindings_t* help__get()"); |  | ||||||
| 	    printf("{ return el_func_help; }\n"); |  | ||||||
| 	}' | 	}' | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
| #	generate help.h from various .c files |  | ||||||
| # |  | ||||||
| -bh) |  | ||||||
|     $AWK ' |  | ||||||
| 	BEGIN { |  | ||||||
| 	    printf("/* Automatically generated file, do not edit */\n"); |  | ||||||
| 	    printf("#ifndef _h_help_c\n#define _h_help_c\n"); |  | ||||||
| 	    printf("protected const el_bindings_t *help__get(void);\n"); |  | ||||||
| 	    printf("#endif /* _h_help_c */\n"); |  | ||||||
| 	}' /dev/null |  | ||||||
| 	;; |  | ||||||
|  |  | ||||||
| #	generate fcns.h from various .h files | #	generate fcns.h from various .h files | ||||||
| # | # | ||||||
| -fh) | -fh) | ||||||
|     cat $FILES | $AWK '/el_action_t/ { print $3 }' | \ |     cat $FILES | $AWK '/el_action_t/ { print $3 }' | \ | ||||||
|     sort | tr '[a-z]' '[A-Z]' | $AWK ' |     sort | tr '[:lower:]' '[:upper:]' | $AWK ' | ||||||
| 	BEGIN { | 	BEGIN { | ||||||
| 	    printf("/* Automatically generated file, do not edit */\n"); | 	    printf("/* Automatically generated file, do not edit */\n"); | ||||||
| 	    printf("#ifndef _h_fcns_c\n#define _h_fcns_c\n"); |  | ||||||
| 	    count = 0; | 	    count = 0; | ||||||
| 	} | 	} | ||||||
| 	{ | 	{ | ||||||
| @@ -160,21 +134,16 @@ _EOF | |||||||
| 	} | 	} | ||||||
| 	END { | 	END { | ||||||
| 	    printf("#define\t%-30.30s\t%3d\n", "EL_NUM_FCNS", count); | 	    printf("#define\t%-30.30s\t%3d\n", "EL_NUM_FCNS", count); | ||||||
|  |  | ||||||
| 	    printf("typedef el_action_t (*el_func_t)(EditLine *, Int);"); |  | ||||||
| 	    printf("\nprotected const el_func_t* func__get(void);\n"); |  | ||||||
| 	    printf("#endif /* _h_fcns_c */\n"); |  | ||||||
| 	}' | 	}' | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
| #	generate fcns.c from various .h files | #	generate func.h from various .h files | ||||||
| # | # | ||||||
| -fc) | -fc) | ||||||
|     cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK ' |     cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK ' | ||||||
| 	BEGIN { | 	BEGIN { | ||||||
| 	    printf("/* Automatically generated file, do not edit */\n"); | 	    printf("/* Automatically generated file, do not edit */\n"); | ||||||
| 	    printf("#include \"config.h\"\n#include \"el.h\"\n"); | 	    printf("static const el_func_t el_func[] = {"); | ||||||
| 	    printf("private const el_func_t el_func[] = {"); |  | ||||||
| 	    maxlen = 80; | 	    maxlen = 80; | ||||||
| 	    needn = 1; | 	    needn = 1; | ||||||
| 	    len = 0; | 	    len = 0; | ||||||
| @@ -194,59 +163,6 @@ _EOF | |||||||
| 	} | 	} | ||||||
| 	END { | 	END { | ||||||
| 	    printf("\n};\n"); | 	    printf("\n};\n"); | ||||||
| 	    printf("\nprotected const el_func_t* func__get() { return el_func; }\n"); |  | ||||||
| 	}' |  | ||||||
| 	;; |  | ||||||
|  |  | ||||||
| #	generate editline.c from various .c files |  | ||||||
| # |  | ||||||
| -e) |  | ||||||
| 	echo "$FILES" | tr ' ' '\012' | $AWK ' |  | ||||||
| 	BEGIN { |  | ||||||
| 	    printf("/* Automatically generated file, do not edit */\n"); |  | ||||||
| 	    printf("#define protected static\n"); |  | ||||||
| 	    printf("#define SCCSID\n"); |  | ||||||
| 	} |  | ||||||
| 	{ |  | ||||||
| 	    printf("#include \"%s\"\n", $1); |  | ||||||
| 	}' |  | ||||||
| 	;; |  | ||||||
|  |  | ||||||
| #	generate man page fragment from various .c files |  | ||||||
| # |  | ||||||
| -m) |  | ||||||
|     cat $FILES | $AWK ' |  | ||||||
| 	BEGIN { |  | ||||||
| 	    printf(".\\\" Section automatically generated with makelist\n"); |  | ||||||
| 	    printf(".Bl -tag -width 4n\n"); |  | ||||||
| 	} |  | ||||||
| 	/\(\):/ { |  | ||||||
| 	    pr = substr($2, 1, 2); |  | ||||||
| 	    if (pr == "vi" || pr == "em" || pr == "ed") { |  | ||||||
| 		name = substr($2, 1, length($2) - 3); |  | ||||||
| 		fname = ""; |  | ||||||
| 		for (i = 1; i <= length(name); i++) { |  | ||||||
| 		    s = substr(name, i, 1); |  | ||||||
| 		    if (s == "_") |  | ||||||
| 			s = "-"; |  | ||||||
| 		    fname = fname s; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		printf(".It Ic %s\n", fname); |  | ||||||
| 		ok = 1; |  | ||||||
| 	    } |  | ||||||
| 	} |  | ||||||
| 	/^ \*/ { |  | ||||||
| 	    if (ok) { |  | ||||||
| 		for (i = 2; i < NF; i++) |  | ||||||
| 		    printf("%s ", $i); |  | ||||||
| 		printf("%s.\n", $i); |  | ||||||
| 		ok = 0; |  | ||||||
| 	    } |  | ||||||
| 	} |  | ||||||
| 	END { |  | ||||||
| 	    printf(".El\n"); |  | ||||||
| 	    printf(".\\\" End of section automatically generated with makelist\n"); |  | ||||||
| 	}' | 	}' | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: map.c,v 1.25 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: map.c,v 1.51 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,30 +37,40 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)map.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)map.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: map.c,v 1.25 2009/12/30 22:37:40 christos Exp $"); | __RCSID("$NetBSD: map.c,v 1.51 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * map.c: Editor function definitions |  * map.c: Editor function definitions | ||||||
|  */ |  */ | ||||||
|  | #include <ctype.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include "el.h" | #include <string.h> | ||||||
|  |  | ||||||
| private void	map_print_key(EditLine *, el_action_t *, const Char *); | #include "el.h" | ||||||
| private void	map_print_some_keys(EditLine *, el_action_t *, Int, Int); | #include "common.h" | ||||||
| private void	map_print_all_keys(EditLine *); | #include "emacs.h" | ||||||
| private void	map_init_nls(EditLine *); | #include "vi.h" | ||||||
| private void	map_init_meta(EditLine *); | #include "fcns.h" | ||||||
|  | #include "func.h" | ||||||
|  | #include "help.h" | ||||||
|  | #include "parse.h" | ||||||
|  |  | ||||||
|  | static void	map_print_key(EditLine *, el_action_t *, const wchar_t *); | ||||||
|  | static void	map_print_some_keys(EditLine *, el_action_t *, wint_t, wint_t); | ||||||
|  | static void	map_print_all_keys(EditLine *); | ||||||
|  | static void	map_init_nls(EditLine *); | ||||||
|  | static void	map_init_meta(EditLine *); | ||||||
|  |  | ||||||
| /* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */ | /* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */ | ||||||
|  |  | ||||||
|  |  | ||||||
| private const el_action_t  el_map_emacs[] = { | static const el_action_t  el_map_emacs[] = { | ||||||
| 	/*   0 */	EM_SET_MARK,		/* ^@ */ | 	/*   0 */	EM_SET_MARK,		/* ^@ */ | ||||||
| 	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */ | 	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */ | ||||||
| 	/*   2 */	ED_PREV_CHAR,		/* ^B */ | 	/*   2 */	ED_PREV_CHAR,		/* ^B */ | ||||||
| 	/*   3 */	ED_TTY_SIGINT,		/* ^C */ | 	/*   3 */	ED_IGNORE,		/* ^C */ | ||||||
| 	/*   4 */	EM_DELETE_OR_LIST,	/* ^D */ | 	/*   4 */	EM_DELETE_OR_LIST,	/* ^D */ | ||||||
| 	/*   5 */	ED_MOVE_TO_END,		/* ^E */ | 	/*   5 */	ED_MOVE_TO_END,		/* ^E */ | ||||||
| 	/*   6 */	ED_NEXT_CHAR,		/* ^F */ | 	/*   6 */	ED_NEXT_CHAR,		/* ^F */ | ||||||
| @@ -72,21 +82,21 @@ private const el_action_t  el_map_emacs[] = { | |||||||
| 	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */ | 	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */ | ||||||
| 	/*  13 */	ED_NEWLINE,		/* ^M */ | 	/*  13 */	ED_NEWLINE,		/* ^M */ | ||||||
| 	/*  14 */	ED_NEXT_HISTORY,	/* ^N */ | 	/*  14 */	ED_NEXT_HISTORY,	/* ^N */ | ||||||
| 	/*  15 */	ED_TTY_FLUSH_OUTPUT,	/* ^O */ | 	/*  15 */	ED_IGNORE,		/* ^O */ | ||||||
| 	/*  16 */	ED_PREV_HISTORY,	/* ^P */ | 	/*  16 */	ED_PREV_HISTORY,	/* ^P */ | ||||||
| 	/*  17 */	ED_TTY_START_OUTPUT,	/* ^Q */ | 	/*  17 */	ED_IGNORE,		/* ^Q */ | ||||||
| 	/*  18 */	ED_REDISPLAY,		/* ^R */ | 	/*  18 */	ED_REDISPLAY,		/* ^R */ | ||||||
| 	/*  19 */	ED_TTY_STOP_OUTPUT,	/* ^S */ | 	/*  19 */	ED_IGNORE,		/* ^S */ | ||||||
| 	/*  20 */	ED_TRANSPOSE_CHARS,	/* ^T */ | 	/*  20 */	ED_TRANSPOSE_CHARS,	/* ^T */ | ||||||
| 	/*  21 */	EM_KILL_LINE,		/* ^U */ | 	/*  21 */	EM_KILL_LINE,		/* ^U */ | ||||||
| 	/*  22 */	ED_QUOTED_INSERT,	/* ^V */ | 	/*  22 */	ED_QUOTED_INSERT,	/* ^V */ | ||||||
| 	/*  23 */	EM_KILL_REGION,		/* ^W */ | 	/*  23 */	EM_KILL_REGION,		/* ^W */ | ||||||
| 	/*  24 */	ED_SEQUENCE_LEAD_IN,	/* ^X */ | 	/*  24 */	ED_SEQUENCE_LEAD_IN,	/* ^X */ | ||||||
| 	/*  25 */	EM_YANK,		/* ^Y */ | 	/*  25 */	EM_YANK,		/* ^Y */ | ||||||
| 	/*  26 */	ED_TTY_SIGTSTP,		/* ^Z */ | 	/*  26 */	ED_IGNORE,		/* ^Z */ | ||||||
| 	/*  27 */	EM_META_NEXT,		/* ^[ */ | 	/*  27 */	EM_META_NEXT,		/* ^[ */ | ||||||
| 	/*  28 */	ED_TTY_SIGQUIT,		/* ^\ */ | 	/*  28 */	ED_IGNORE,		/* ^\ */ | ||||||
| 	/*  29 */	ED_TTY_DSUSP,		/* ^] */ | 	/*  29 */	ED_IGNORE,		/* ^] */ | ||||||
| 	/*  30 */	ED_UNASSIGNED,		/* ^^ */ | 	/*  30 */	ED_UNASSIGNED,		/* ^^ */ | ||||||
| 	/*  31 */	ED_UNASSIGNED,		/* ^_ */ | 	/*  31 */	ED_UNASSIGNED,		/* ^_ */ | ||||||
| 	/*  32 */	ED_INSERT,		/* SPACE */ | 	/*  32 */	ED_INSERT,		/* SPACE */ | ||||||
| @@ -323,7 +333,7 @@ private const el_action_t  el_map_emacs[] = { | |||||||
|  * insert mode characters are in the normal keymap, and command mode |  * insert mode characters are in the normal keymap, and command mode | ||||||
|  * in the extended keymap. |  * in the extended keymap. | ||||||
|  */ |  */ | ||||||
| private const el_action_t  el_map_vi_insert[] = { | static const el_action_t  el_map_vi_insert[] = { | ||||||
| #ifdef KSHVI | #ifdef KSHVI | ||||||
| 	/*   0 */	ED_UNASSIGNED,		/* ^@ */ | 	/*   0 */	ED_UNASSIGNED,		/* ^@ */ | ||||||
| 	/*   1 */	ED_INSERT,		/* ^A */ | 	/*   1 */	ED_INSERT,		/* ^A */ | ||||||
| @@ -342,9 +352,9 @@ private const el_action_t  el_map_vi_insert[] = { | |||||||
| 	/*  14 */	ED_INSERT,		/* ^N */ | 	/*  14 */	ED_INSERT,		/* ^N */ | ||||||
| 	/*  15 */	ED_INSERT,		/* ^O */ | 	/*  15 */	ED_INSERT,		/* ^O */ | ||||||
| 	/*  16 */	ED_INSERT,		/* ^P */ | 	/*  16 */	ED_INSERT,		/* ^P */ | ||||||
| 	/*  17 */	ED_TTY_START_OUTPUT,	/* ^Q */ | 	/*  17 */	ED_IGNORE,		/* ^Q */ | ||||||
| 	/*  18 */	ED_INSERT,		/* ^R */ | 	/*  18 */	ED_INSERT,		/* ^R */ | ||||||
| 	/*  19 */	ED_TTY_STOP_OUTPUT,	/* ^S */ | 	/*  19 */	ED_IGNORE,		/* ^S */ | ||||||
| 	/*  20 */	ED_INSERT,		/* ^T */ | 	/*  20 */	ED_INSERT,		/* ^T */ | ||||||
| 	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */ | 	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */ | ||||||
| 	/*  22 */	ED_QUOTED_INSERT,	/* ^V */ | 	/*  22 */	ED_QUOTED_INSERT,	/* ^V */ | ||||||
| @@ -354,7 +364,7 @@ private const el_action_t  el_map_vi_insert[] = { | |||||||
| 	/*  25 */	ED_INSERT,		/* ^Y */ | 	/*  25 */	ED_INSERT,		/* ^Y */ | ||||||
| 	/*  26 */	ED_INSERT,		/* ^Z */ | 	/*  26 */	ED_INSERT,		/* ^Z */ | ||||||
| 	/*  27 */	VI_COMMAND_MODE,	/* ^[ */  /* [ Esc ] key */ | 	/*  27 */	VI_COMMAND_MODE,	/* ^[ */  /* [ Esc ] key */ | ||||||
| 	/*  28 */	ED_TTY_SIGQUIT,		/* ^\ */ | 	/*  28 */	ED_IGNORE,		/* ^\ */ | ||||||
| 	/*  29 */	ED_INSERT,		/* ^] */ | 	/*  29 */	ED_INSERT,		/* ^] */ | ||||||
| 	/*  30 */	ED_INSERT,		/* ^^ */ | 	/*  30 */	ED_INSERT,		/* ^^ */ | ||||||
| 	/*  31 */	ED_INSERT,		/* ^_ */ | 	/*  31 */	ED_INSERT,		/* ^_ */ | ||||||
| @@ -368,7 +378,7 @@ private const el_action_t  el_map_vi_insert[] = { | |||||||
| 	/*   0 */	ED_UNASSIGNED,		/* ^@ */ | 	/*   0 */	ED_UNASSIGNED,		/* ^@ */ | ||||||
| 	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */ | 	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */ | ||||||
| 	/*   2 */	ED_PREV_CHAR,		/* ^B */ | 	/*   2 */	ED_PREV_CHAR,		/* ^B */ | ||||||
| 	/*   3 */	ED_TTY_SIGINT,		/* ^C */ | 	/*   3 */	ED_IGNORE,		/* ^C */ | ||||||
| 	/*   4 */	VI_LIST_OR_EOF,		/* ^D */ | 	/*   4 */	VI_LIST_OR_EOF,		/* ^D */ | ||||||
| 	/*   5 */	ED_MOVE_TO_END,		/* ^E */ | 	/*   5 */	ED_MOVE_TO_END,		/* ^E */ | ||||||
| 	/*   6 */	ED_NEXT_CHAR,		/* ^F */ | 	/*   6 */	ED_NEXT_CHAR,		/* ^F */ | ||||||
| @@ -380,20 +390,20 @@ private const el_action_t  el_map_vi_insert[] = { | |||||||
| 	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */ | 	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */ | ||||||
| 	/*  13 */	ED_NEWLINE,		/* ^M */ | 	/*  13 */	ED_NEWLINE,		/* ^M */ | ||||||
| 	/*  14 */	ED_NEXT_HISTORY,	/* ^N */ | 	/*  14 */	ED_NEXT_HISTORY,	/* ^N */ | ||||||
| 	/*  15 */	ED_TTY_FLUSH_OUTPUT,	/* ^O */ | 	/*  15 */	ED_IGNORE,		/* ^O */ | ||||||
| 	/*  16 */	ED_PREV_HISTORY,	/* ^P */ | 	/*  16 */	ED_PREV_HISTORY,	/* ^P */ | ||||||
| 	/*  17 */	ED_TTY_START_OUTPUT,	/* ^Q */ | 	/*  17 */	ED_IGNORE,		/* ^Q */ | ||||||
| 	/*  18 */	ED_REDISPLAY,		/* ^R */ | 	/*  18 */	ED_REDISPLAY,		/* ^R */ | ||||||
| 	/*  19 */	ED_TTY_STOP_OUTPUT,	/* ^S */ | 	/*  19 */	ED_IGNORE,		/* ^S */ | ||||||
| 	/*  20 */	ED_TRANSPOSE_CHARS,	/* ^T */ | 	/*  20 */	ED_TRANSPOSE_CHARS,	/* ^T */ | ||||||
| 	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */ | 	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */ | ||||||
| 	/*  22 */	ED_QUOTED_INSERT,	/* ^V */ | 	/*  22 */	ED_QUOTED_INSERT,	/* ^V */ | ||||||
| 	/*  23 */	ED_DELETE_PREV_WORD,	/* ^W */ | 	/*  23 */	ED_DELETE_PREV_WORD,	/* ^W */ | ||||||
| 	/*  24 */	ED_UNASSIGNED,		/* ^X */ | 	/*  24 */	ED_UNASSIGNED,		/* ^X */ | ||||||
| 	/*  25 */	ED_TTY_DSUSP,		/* ^Y */ | 	/*  25 */	ED_IGNORE,		/* ^Y */ | ||||||
| 	/*  26 */	ED_TTY_SIGTSTP,		/* ^Z */ | 	/*  26 */	ED_IGNORE,		/* ^Z */ | ||||||
| 	/*  27 */	VI_COMMAND_MODE,	/* ^[ */ | 	/*  27 */	VI_COMMAND_MODE,	/* ^[ */ | ||||||
| 	/*  28 */	ED_TTY_SIGQUIT,		/* ^\ */ | 	/*  28 */	ED_IGNORE,		/* ^\ */ | ||||||
| 	/*  29 */	ED_UNASSIGNED,		/* ^] */ | 	/*  29 */	ED_UNASSIGNED,		/* ^] */ | ||||||
| 	/*  30 */	ED_UNASSIGNED,		/* ^^ */ | 	/*  30 */	ED_UNASSIGNED,		/* ^^ */ | ||||||
| 	/*  31 */	ED_UNASSIGNED,		/* ^_ */ | 	/*  31 */	ED_UNASSIGNED,		/* ^_ */ | ||||||
| @@ -624,11 +634,11 @@ private const el_action_t  el_map_vi_insert[] = { | |||||||
| 	/* 255 */	ED_INSERT		/* M-^? */ | 	/* 255 */	ED_INSERT		/* M-^? */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| private const el_action_t el_map_vi_command[] = { | static const el_action_t el_map_vi_command[] = { | ||||||
| 	/*   0 */	ED_UNASSIGNED,		/* ^@ */ | 	/*   0 */	ED_UNASSIGNED,		/* ^@ */ | ||||||
| 	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */ | 	/*   1 */	ED_MOVE_TO_BEG,		/* ^A */ | ||||||
| 	/*   2 */	ED_UNASSIGNED,		/* ^B */ | 	/*   2 */	ED_UNASSIGNED,		/* ^B */ | ||||||
| 	/*   3 */	ED_TTY_SIGINT,		/* ^C */ | 	/*   3 */	ED_IGNORE,		/* ^C */ | ||||||
| 	/*   4 */	ED_UNASSIGNED,		/* ^D */ | 	/*   4 */	ED_UNASSIGNED,		/* ^D */ | ||||||
| 	/*   5 */	ED_MOVE_TO_END,		/* ^E */ | 	/*   5 */	ED_MOVE_TO_END,		/* ^E */ | ||||||
| 	/*   6 */	ED_UNASSIGNED,		/* ^F */ | 	/*   6 */	ED_UNASSIGNED,		/* ^F */ | ||||||
| @@ -640,11 +650,11 @@ private const el_action_t el_map_vi_command[] = { | |||||||
| 	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */ | 	/*  12 */	ED_CLEAR_SCREEN,	/* ^L */ | ||||||
| 	/*  13 */	ED_NEWLINE,		/* ^M */ | 	/*  13 */	ED_NEWLINE,		/* ^M */ | ||||||
| 	/*  14 */	ED_NEXT_HISTORY,	/* ^N */ | 	/*  14 */	ED_NEXT_HISTORY,	/* ^N */ | ||||||
| 	/*  15 */	ED_TTY_FLUSH_OUTPUT,	/* ^O */ | 	/*  15 */	ED_IGNORE,		/* ^O */ | ||||||
| 	/*  16 */	ED_PREV_HISTORY,	/* ^P */ | 	/*  16 */	ED_PREV_HISTORY,	/* ^P */ | ||||||
| 	/*  17 */	ED_TTY_START_OUTPUT,	/* ^Q */ | 	/*  17 */	ED_IGNORE,		/* ^Q */ | ||||||
| 	/*  18 */	ED_REDISPLAY,		/* ^R */ | 	/*  18 */	ED_REDISPLAY,		/* ^R */ | ||||||
| 	/*  19 */	ED_TTY_STOP_OUTPUT,	/* ^S */ | 	/*  19 */	ED_IGNORE,		/* ^S */ | ||||||
| 	/*  20 */	ED_UNASSIGNED,		/* ^T */ | 	/*  20 */	ED_UNASSIGNED,		/* ^T */ | ||||||
| 	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */ | 	/*  21 */	VI_KILL_LINE_PREV,	/* ^U */ | ||||||
| 	/*  22 */	ED_UNASSIGNED,		/* ^V */ | 	/*  22 */	ED_UNASSIGNED,		/* ^V */ | ||||||
| @@ -653,7 +663,7 @@ private const el_action_t el_map_vi_command[] = { | |||||||
| 	/*  25 */	ED_UNASSIGNED,		/* ^Y */ | 	/*  25 */	ED_UNASSIGNED,		/* ^Y */ | ||||||
| 	/*  26 */	ED_UNASSIGNED,		/* ^Z */ | 	/*  26 */	ED_UNASSIGNED,		/* ^Z */ | ||||||
| 	/*  27 */	EM_META_NEXT,		/* ^[ */ | 	/*  27 */	EM_META_NEXT,		/* ^[ */ | ||||||
| 	/*  28 */	ED_TTY_SIGQUIT,		/* ^\ */ | 	/*  28 */	ED_IGNORE,		/* ^\ */ | ||||||
| 	/*  29 */	ED_UNASSIGNED,		/* ^] */ | 	/*  29 */	ED_UNASSIGNED,		/* ^] */ | ||||||
| 	/*  30 */	ED_UNASSIGNED,		/* ^^ */ | 	/*  30 */	ED_UNASSIGNED,		/* ^^ */ | ||||||
| 	/*  31 */	ED_UNASSIGNED,		/* ^_ */ | 	/*  31 */	ED_UNASSIGNED,		/* ^_ */ | ||||||
| @@ -887,7 +897,7 @@ private const el_action_t el_map_vi_command[] = { | |||||||
| /* map_init(): | /* map_init(): | ||||||
|  *	Initialize and allocate the maps |  *	Initialize and allocate the maps | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| map_init(EditLine *el) | map_init(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -903,26 +913,25 @@ map_init(EditLine *el) | |||||||
| 		EL_ABORT((el->errfile, "Vi insert map incorrect\n")); | 		EL_ABORT((el->errfile, "Vi insert map incorrect\n")); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	el->el_map.alt = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS); | 	el->el_map.alt = el_malloc(sizeof(*el->el_map.alt) * N_KEYS); | ||||||
| 	if (el->el_map.alt == NULL) | 	if (el->el_map.alt == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	el->el_map.key = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS); | 	el->el_map.key = el_malloc(sizeof(*el->el_map.key) * N_KEYS); | ||||||
| 	if (el->el_map.key == NULL) | 	if (el->el_map.key == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	el->el_map.emacs = el_map_emacs; | 	el->el_map.emacs = el_map_emacs; | ||||||
| 	el->el_map.vic = el_map_vi_command; | 	el->el_map.vic = el_map_vi_command; | ||||||
| 	el->el_map.vii = el_map_vi_insert; | 	el->el_map.vii = el_map_vi_insert; | ||||||
| 	el->el_map.help = (el_bindings_t *) el_malloc(sizeof(el_bindings_t) * | 	el->el_map.help = el_malloc(sizeof(*el->el_map.help) * EL_NUM_FCNS); | ||||||
| 	    EL_NUM_FCNS); |  | ||||||
| 	if (el->el_map.help == NULL) | 	if (el->el_map.help == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	(void) memcpy(el->el_map.help, help__get(), | 	(void) memcpy(el->el_map.help, el_func_help, | ||||||
| 	    sizeof(el_bindings_t) * EL_NUM_FCNS); | 	    sizeof(*el->el_map.help) * EL_NUM_FCNS); | ||||||
| 	el->el_map.func = (el_func_t *)el_malloc(sizeof(el_func_t) * | 	el->el_map.func = el_malloc(sizeof(*el->el_map.func) * EL_NUM_FCNS); | ||||||
| 	    EL_NUM_FCNS); |  | ||||||
| 	if (el->el_map.func == NULL) | 	if (el->el_map.func == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	memcpy(el->el_map.func, func__get(), sizeof(el_func_t) * EL_NUM_FCNS); | 	memcpy(el->el_map.func, el_func, sizeof(*el->el_map.func) | ||||||
|  | 	    * EL_NUM_FCNS); | ||||||
| 	el->el_map.nfunc = EL_NUM_FCNS; | 	el->el_map.nfunc = EL_NUM_FCNS; | ||||||
|  |  | ||||||
| #ifdef VIDEFAULT | #ifdef VIDEFAULT | ||||||
| @@ -930,27 +939,27 @@ map_init(EditLine *el) | |||||||
| #else | #else | ||||||
| 	map_init_emacs(el); | 	map_init_emacs(el); | ||||||
| #endif /* VIDEFAULT */ | #endif /* VIDEFAULT */ | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* map_end(): | /* map_end(): | ||||||
|  *	Free the space taken by the editor maps |  *	Free the space taken by the editor maps | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| map_end(EditLine *el) | map_end(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el_free((ptr_t) el->el_map.alt); | 	el_free(el->el_map.alt); | ||||||
| 	el->el_map.alt = NULL; | 	el->el_map.alt = NULL; | ||||||
| 	el_free((ptr_t) el->el_map.key); | 	el_free(el->el_map.key); | ||||||
| 	el->el_map.key = NULL; | 	el->el_map.key = NULL; | ||||||
| 	el->el_map.emacs = NULL; | 	el->el_map.emacs = NULL; | ||||||
| 	el->el_map.vic = NULL; | 	el->el_map.vic = NULL; | ||||||
| 	el->el_map.vii = NULL; | 	el->el_map.vii = NULL; | ||||||
| 	el_free((ptr_t) el->el_map.help); | 	el_free(el->el_map.help); | ||||||
| 	el->el_map.help = NULL; | 	el->el_map.help = NULL; | ||||||
| 	el_free((ptr_t) el->el_map.func); | 	el_free(el->el_map.func); | ||||||
| 	el->el_map.func = NULL; | 	el->el_map.func = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -958,7 +967,7 @@ map_end(EditLine *el) | |||||||
| /* map_init_nls(): | /* map_init_nls(): | ||||||
|  *	Find all the printable keys and bind them to self insert |  *	Find all the printable keys and bind them to self insert | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| map_init_nls(EditLine *el) | map_init_nls(EditLine *el) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| @@ -966,7 +975,7 @@ map_init_nls(EditLine *el) | |||||||
| 	el_action_t *map = el->el_map.key; | 	el_action_t *map = el->el_map.key; | ||||||
|  |  | ||||||
| 	for (i = 0200; i <= 0377; i++) | 	for (i = 0200; i <= 0377; i++) | ||||||
| 		if (Isprint(i)) | 		if (iswprint(i)) | ||||||
| 			map[i] = ED_INSERT; | 			map[i] = ED_INSERT; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -974,10 +983,10 @@ map_init_nls(EditLine *el) | |||||||
| /* map_init_meta(): | /* map_init_meta(): | ||||||
|  *	Bind all the meta keys to the appropriate ESC-<key> sequence |  *	Bind all the meta keys to the appropriate ESC-<key> sequence | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| map_init_meta(EditLine *el) | map_init_meta(EditLine *el) | ||||||
| { | { | ||||||
| 	Char buf[3]; | 	wchar_t buf[3]; | ||||||
| 	int i; | 	int i; | ||||||
| 	el_action_t *map = el->el_map.key; | 	el_action_t *map = el->el_map.key; | ||||||
| 	el_action_t *alt = el->el_map.alt; | 	el_action_t *alt = el->el_map.alt; | ||||||
| @@ -995,7 +1004,7 @@ map_init_meta(EditLine *el) | |||||||
| 		} else | 		} else | ||||||
| 			map = alt; | 			map = alt; | ||||||
| 	} | 	} | ||||||
| 	buf[0] = (Char) i; | 	buf[0] = (wchar_t)i; | ||||||
| 	buf[2] = 0; | 	buf[2] = 0; | ||||||
| 	for (i = 0200; i <= 0377; i++) | 	for (i = 0200; i <= 0377; i++) | ||||||
| 		switch (map[i]) { | 		switch (map[i]) { | ||||||
| @@ -1005,7 +1014,7 @@ map_init_meta(EditLine *el) | |||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			buf[1] = i & 0177; | 			buf[1] = i & 0177; | ||||||
| 			key_add(el, buf, key_map_cmd(el, (int) map[i]), XK_CMD); | 			keymacro_add(el, buf, keymacro_map_cmd(el, (int) map[i]), XK_CMD); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 	map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN; | 	map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN; | ||||||
| @@ -1015,7 +1024,7 @@ map_init_meta(EditLine *el) | |||||||
| /* map_init_vi(): | /* map_init_vi(): | ||||||
|  *	Initialize the vi bindings |  *	Initialize the vi bindings | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| map_init_vi(EditLine *el) | map_init_vi(EditLine *el) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| @@ -1027,7 +1036,7 @@ map_init_vi(EditLine *el) | |||||||
| 	el->el_map.type = MAP_VI; | 	el->el_map.type = MAP_VI; | ||||||
| 	el->el_map.current = el->el_map.key; | 	el->el_map.current = el->el_map.key; | ||||||
|  |  | ||||||
| 	key_reset(el); | 	keymacro_reset(el); | ||||||
|  |  | ||||||
| 	for (i = 0; i < N_KEYS; i++) { | 	for (i = 0; i < N_KEYS; i++) { | ||||||
| 		key[i] = vii[i]; | 		key[i] = vii[i]; | ||||||
| @@ -1038,25 +1047,25 @@ map_init_vi(EditLine *el) | |||||||
| 	map_init_nls(el); | 	map_init_nls(el); | ||||||
|  |  | ||||||
| 	tty_bind_char(el, 1); | 	tty_bind_char(el, 1); | ||||||
| 	term_bind_arrow(el); | 	terminal_bind_arrow(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* map_init_emacs(): | /* map_init_emacs(): | ||||||
|  *	Initialize the emacs bindings |  *	Initialize the emacs bindings | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| map_init_emacs(EditLine *el) | map_init_emacs(EditLine *el) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| 	Char buf[3]; | 	wchar_t buf[3]; | ||||||
| 	el_action_t *key = el->el_map.key; | 	el_action_t *key = el->el_map.key; | ||||||
| 	el_action_t *alt = el->el_map.alt; | 	el_action_t *alt = el->el_map.alt; | ||||||
| 	const el_action_t *emacs = el->el_map.emacs; | 	const el_action_t *emacs = el->el_map.emacs; | ||||||
|  |  | ||||||
| 	el->el_map.type = MAP_EMACS; | 	el->el_map.type = MAP_EMACS; | ||||||
| 	el->el_map.current = el->el_map.key; | 	el->el_map.current = el->el_map.key; | ||||||
| 	key_reset(el); | 	keymacro_reset(el); | ||||||
|  |  | ||||||
| 	for (i = 0; i < N_KEYS; i++) { | 	for (i = 0; i < N_KEYS; i++) { | ||||||
| 		key[i] = emacs[i]; | 		key[i] = emacs[i]; | ||||||
| @@ -1069,84 +1078,84 @@ map_init_emacs(EditLine *el) | |||||||
| 	buf[0] = CONTROL('X'); | 	buf[0] = CONTROL('X'); | ||||||
| 	buf[1] = CONTROL('X'); | 	buf[1] = CONTROL('X'); | ||||||
| 	buf[2] = 0; | 	buf[2] = 0; | ||||||
| 	key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD); | 	keymacro_add(el, buf, keymacro_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD); | ||||||
|  |  | ||||||
| 	tty_bind_char(el, 1); | 	tty_bind_char(el, 1); | ||||||
| 	term_bind_arrow(el); | 	terminal_bind_arrow(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* map_set_editor(): | /* map_set_editor(): | ||||||
|  *	Set the editor |  *	Set the editor | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| map_set_editor(EditLine *el, Char *editor) | map_set_editor(EditLine *el, wchar_t *editor) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (Strcmp(editor, STR("emacs")) == 0) { | 	if (wcscmp(editor, L"emacs") == 0) { | ||||||
| 		map_init_emacs(el); | 		map_init_emacs(el); | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	if (Strcmp(editor, STR("vi")) == 0) { | 	if (wcscmp(editor, L"vi") == 0) { | ||||||
| 		map_init_vi(el); | 		map_init_vi(el); | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* map_get_editor(): | /* map_get_editor(): | ||||||
|  *	Retrieve the editor |  *	Retrieve the editor | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| map_get_editor(EditLine *el, const Char **editor) | map_get_editor(EditLine *el, const wchar_t **editor) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (editor == NULL) | 	if (editor == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	switch (el->el_map.type) { | 	switch (el->el_map.type) { | ||||||
| 	case MAP_EMACS: | 	case MAP_EMACS: | ||||||
| 		*editor = STR("emacs"); | 		*editor = L"emacs"; | ||||||
| 		return (0); | 		return 0; | ||||||
| 	case MAP_VI: | 	case MAP_VI: | ||||||
| 		*editor = STR("vi"); | 		*editor = L"vi"; | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* map_print_key(): | /* map_print_key(): | ||||||
|  *	Print the function description for 1 key |  *	Print the function description for 1 key | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| map_print_key(EditLine *el, el_action_t *map, const Char *in) | map_print_key(EditLine *el, el_action_t *map, const wchar_t *in) | ||||||
| { | { | ||||||
| 	char outbuf[EL_BUFSIZ]; | 	char outbuf[EL_BUFSIZ]; | ||||||
| 	el_bindings_t *bp, *ep; | 	el_bindings_t *bp, *ep; | ||||||
|  |  | ||||||
| 	if (in[0] == '\0' || in[1] == '\0') { | 	if (in[0] == '\0' || in[1] == '\0') { | ||||||
| 		(void) key__decode_str(in, outbuf, sizeof(outbuf), ""); | 		(void) keymacro__decode_str(in, outbuf, sizeof(outbuf), ""); | ||||||
| 		ep = &el->el_map.help[el->el_map.nfunc]; | 		ep = &el->el_map.help[el->el_map.nfunc]; | ||||||
| 		for (bp = el->el_map.help; bp < ep; bp++) | 		for (bp = el->el_map.help; bp < ep; bp++) | ||||||
| 			if (bp->func == map[(unsigned char) *in]) { | 			if (bp->func == map[(unsigned char) *in]) { | ||||||
| 				(void) fprintf(el->el_outfile, | 				(void) fprintf(el->el_outfile, | ||||||
| 				    "%s\t->\t" FSTR "\n", outbuf, bp->name); | 				    "%s\t->\t%ls\n", outbuf, bp->name); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| 	} else | 	} else | ||||||
| 		key_print(el, in); | 		keymacro_print(el, in); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* map_print_some_keys(): | /* map_print_some_keys(): | ||||||
|  *	Print keys from first to last |  *	Print keys from first to last | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last) | map_print_some_keys(EditLine *el, el_action_t *map, wint_t first, wint_t last) | ||||||
| { | { | ||||||
| 	el_bindings_t *bp, *ep; | 	el_bindings_t *bp, *ep; | ||||||
| 	Char firstbuf[2], lastbuf[2]; | 	wchar_t firstbuf[2], lastbuf[2]; | ||||||
| 	char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ]; | 	char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ]; | ||||||
|  |  | ||||||
| 	firstbuf[0] = first; | 	firstbuf[0] = first; | ||||||
| @@ -1155,7 +1164,7 @@ map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last) | |||||||
| 	lastbuf[1] = 0; | 	lastbuf[1] = 0; | ||||||
| 	if (map[first] == ED_UNASSIGNED) { | 	if (map[first] == ED_UNASSIGNED) { | ||||||
| 		if (first == last) { | 		if (first == last) { | ||||||
| 			(void) key__decode_str(firstbuf, unparsbuf, | 			(void) keymacro__decode_str(firstbuf, unparsbuf, | ||||||
| 			    sizeof(unparsbuf), STRQQ); | 			    sizeof(unparsbuf), STRQQ); | ||||||
| 			(void) fprintf(el->el_outfile, | 			(void) fprintf(el->el_outfile, | ||||||
| 			    "%-15s->  is undefined\n", unparsbuf); | 			    "%-15s->  is undefined\n", unparsbuf); | ||||||
| @@ -1166,17 +1175,17 @@ map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last) | |||||||
| 	for (bp = el->el_map.help; bp < ep; bp++) { | 	for (bp = el->el_map.help; bp < ep; bp++) { | ||||||
| 		if (bp->func == map[first]) { | 		if (bp->func == map[first]) { | ||||||
| 			if (first == last) { | 			if (first == last) { | ||||||
| 				(void) key__decode_str(firstbuf, unparsbuf, | 				(void) keymacro__decode_str(firstbuf, unparsbuf, | ||||||
| 				    sizeof(unparsbuf), STRQQ); | 				    sizeof(unparsbuf), STRQQ); | ||||||
| 				(void) fprintf(el->el_outfile, "%-15s->  " FSTR "\n", | 				(void) fprintf(el->el_outfile, "%-15s->  %ls\n", | ||||||
| 				    unparsbuf, bp->name); | 				    unparsbuf, bp->name); | ||||||
| 			} else { | 			} else { | ||||||
| 				(void) key__decode_str(firstbuf, unparsbuf, | 				(void) keymacro__decode_str(firstbuf, unparsbuf, | ||||||
| 				    sizeof(unparsbuf), STRQQ); | 				    sizeof(unparsbuf), STRQQ); | ||||||
| 				(void) key__decode_str(lastbuf, extrabuf, | 				(void) keymacro__decode_str(lastbuf, extrabuf, | ||||||
| 				    sizeof(extrabuf), STRQQ); | 				    sizeof(extrabuf), STRQQ); | ||||||
| 				(void) fprintf(el->el_outfile, | 				(void) fprintf(el->el_outfile, | ||||||
| 				    "%-4s to %-7s->  " FSTR "\n", | 				    "%-4s to %-7s->  %ls\n", | ||||||
| 				    unparsbuf, extrabuf, bp->name); | 				    unparsbuf, extrabuf, bp->name); | ||||||
| 			} | 			} | ||||||
| 			return; | 			return; | ||||||
| @@ -1184,14 +1193,14 @@ map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last) | |||||||
| 	} | 	} | ||||||
| #ifdef MAP_DEBUG | #ifdef MAP_DEBUG | ||||||
| 	if (map == el->el_map.key) { | 	if (map == el->el_map.key) { | ||||||
| 		(void) key__decode_str(firstbuf, unparsbuf, | 		(void) keymacro__decode_str(firstbuf, unparsbuf, | ||||||
| 		    sizeof(unparsbuf), STRQQ); | 		    sizeof(unparsbuf), STRQQ); | ||||||
| 		(void) fprintf(el->el_outfile, | 		(void) fprintf(el->el_outfile, | ||||||
| 		    "BUG!!! %s isn't bound to anything.\n", unparsbuf); | 		    "BUG!!! %s isn't bound to anything.\n", unparsbuf); | ||||||
| 		(void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n", | 		(void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n", | ||||||
| 		    first, el->el_map.key[first]); | 		    first, el->el_map.key[first]); | ||||||
| 	} else { | 	} else { | ||||||
| 		(void) key__decode_str(firstbuf, unparsbuf, | 		(void) keymacro__decode_str(firstbuf, unparsbuf, | ||||||
| 		    sizeof(unparsbuf), STRQQ); | 		    sizeof(unparsbuf), STRQQ); | ||||||
| 		(void) fprintf(el->el_outfile, | 		(void) fprintf(el->el_outfile, | ||||||
| 		    "BUG!!! %s isn't bound to anything.\n", unparsbuf); | 		    "BUG!!! %s isn't bound to anything.\n", unparsbuf); | ||||||
| @@ -1206,7 +1215,7 @@ map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last) | |||||||
| /* map_print_all_keys(): | /* map_print_all_keys(): | ||||||
|  *	Print the function description for all keys. |  *	Print the function description for all keys. | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| map_print_all_keys(EditLine *el) | map_print_all_keys(EditLine *el) | ||||||
| { | { | ||||||
| 	int prev, i; | 	int prev, i; | ||||||
| @@ -1232,31 +1241,31 @@ map_print_all_keys(EditLine *el) | |||||||
| 	map_print_some_keys(el, el->el_map.alt, prev, i - 1); | 	map_print_some_keys(el, el->el_map.alt, prev, i - 1); | ||||||
|  |  | ||||||
| 	(void) fprintf(el->el_outfile, "Multi-character bindings\n"); | 	(void) fprintf(el->el_outfile, "Multi-character bindings\n"); | ||||||
| 	key_print(el, STR("")); | 	keymacro_print(el, L""); | ||||||
| 	(void) fprintf(el->el_outfile, "Arrow key bindings\n"); | 	(void) fprintf(el->el_outfile, "Arrow key bindings\n"); | ||||||
| 	term_print_arrow(el, STR("")); | 	terminal_print_arrow(el, L""); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* map_bind(): | /* map_bind(): | ||||||
|  *	Add/remove/change bindings |  *	Add/remove/change bindings | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| map_bind(EditLine *el, int argc, const Char **argv) | map_bind(EditLine *el, int argc, const wchar_t **argv) | ||||||
| { | { | ||||||
| 	el_action_t *map; | 	el_action_t *map; | ||||||
| 	int ntype, rem; | 	int ntype, rem; | ||||||
| 	const Char *p; | 	const wchar_t *p; | ||||||
| 	Char inbuf[EL_BUFSIZ]; | 	wchar_t inbuf[EL_BUFSIZ]; | ||||||
| 	Char outbuf[EL_BUFSIZ]; | 	wchar_t outbuf[EL_BUFSIZ]; | ||||||
| 	const Char *in = NULL; | 	const wchar_t *in = NULL; | ||||||
| 	Char *out = NULL; | 	wchar_t *out; | ||||||
| 	el_bindings_t *bp, *ep; | 	el_bindings_t *bp, *ep; | ||||||
| 	int cmd; | 	int cmd; | ||||||
| 	int key; | 	int key; | ||||||
|  |  | ||||||
| 	if (argv == NULL) | 	if (argv == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
|  |  | ||||||
| 	map = el->el_map.key; | 	map = el->el_map.key; | ||||||
| 	ntype = XK_CMD; | 	ntype = XK_CMD; | ||||||
| @@ -1271,11 +1280,6 @@ map_bind(EditLine *el, int argc, const Char **argv) | |||||||
| 			case 's': | 			case 's': | ||||||
| 				ntype = XK_STR; | 				ntype = XK_STR; | ||||||
| 				break; | 				break; | ||||||
| #ifdef notyet |  | ||||||
| 			case 'c': |  | ||||||
| 				ntype = XK_EXE; |  | ||||||
| 				break; |  | ||||||
| #endif |  | ||||||
| 			case 'k': | 			case 'k': | ||||||
| 				key = 1; | 				key = 1; | ||||||
| 				break; | 				break; | ||||||
| @@ -1286,136 +1290,138 @@ map_bind(EditLine *el, int argc, const Char **argv) | |||||||
|  |  | ||||||
| 			case 'v': | 			case 'v': | ||||||
| 				map_init_vi(el); | 				map_init_vi(el); | ||||||
| 				return (0); | 				return 0; | ||||||
|  |  | ||||||
| 			case 'e': | 			case 'e': | ||||||
| 				map_init_emacs(el); | 				map_init_emacs(el); | ||||||
| 				return (0); | 				return 0; | ||||||
|  |  | ||||||
| 			case 'l': | 			case 'l': | ||||||
| 				ep = &el->el_map.help[el->el_map.nfunc]; | 				ep = &el->el_map.help[el->el_map.nfunc]; | ||||||
| 				for (bp = el->el_map.help; bp < ep; bp++) | 				for (bp = el->el_map.help; bp < ep; bp++) | ||||||
| 					(void) fprintf(el->el_outfile, | 					(void) fprintf(el->el_outfile, | ||||||
| 					    "" FSTR "\n\t" FSTR "\n", | 					    "%ls\n\t%ls\n", | ||||||
| 					    bp->name, bp->description); | 					    bp->name, bp->description); | ||||||
| 				return (0); | 				return 0; | ||||||
| 			default: | 			default: | ||||||
| 				(void) fprintf(el->el_errfile, | 				(void) fprintf(el->el_errfile, | ||||||
| 				    "" FSTR ": Invalid switch `%c'.\n", | 				    "%ls: Invalid switch `%lc'.\n", | ||||||
| 				    argv[0], p[1]); | 				    argv[0], (wint_t)p[1]); | ||||||
| 			} | 			} | ||||||
| 		else | 		else | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 	if (argv[argc] == NULL) { | 	if (argv[argc] == NULL) { | ||||||
| 		map_print_all_keys(el); | 		map_print_all_keys(el); | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	if (key) | 	if (key) | ||||||
| 		in = argv[argc++]; | 		in = argv[argc++]; | ||||||
| 	else if ((in = parse__string(inbuf, argv[argc++])) == NULL) { | 	else if ((in = parse__string(inbuf, argv[argc++])) == NULL) { | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, | ||||||
| 		    "" FSTR ": Invalid \\ or ^ in instring.\n", | 		    "%ls: Invalid \\ or ^ in instring.\n", | ||||||
| 		    argv[0]); | 		    argv[0]); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	if (rem) { | 	if (rem) { | ||||||
| 		if (key) { | 		if (key) { | ||||||
| 			(void) term_clear_arrow(el, in); | 			(void) terminal_clear_arrow(el, in); | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		} | 		} | ||||||
| 		if (in[1]) | 		if (in[1]) | ||||||
| 			(void) key_delete(el, in); | 			(void) keymacro_delete(el, in); | ||||||
| 		else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN) | 		else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN) | ||||||
| 			(void) key_delete(el, in); | 			(void) keymacro_delete(el, in); | ||||||
| 		else | 		else | ||||||
| 			map[(unsigned char) *in] = ED_UNASSIGNED; | 			map[(unsigned char) *in] = ED_UNASSIGNED; | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	if (argv[argc] == NULL) { | 	if (argv[argc] == NULL) { | ||||||
| 		if (key) | 		if (key) | ||||||
| 			term_print_arrow(el, in); | 			terminal_print_arrow(el, in); | ||||||
| 		else | 		else | ||||||
| 			map_print_key(el, map, in); | 			map_print_key(el, map, in); | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} | 	} | ||||||
| #ifdef notyet | #ifdef notyet | ||||||
| 	if (argv[argc + 1] != NULL) { | 	if (argv[argc + 1] != NULL) { | ||||||
| 		bindkey_usage(); | 		bindkeymacro_usage(); | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	switch (ntype) { | 	switch (ntype) { | ||||||
| 	case XK_STR: | 	case XK_STR: | ||||||
| 	case XK_EXE: |  | ||||||
| 		if ((out = parse__string(outbuf, argv[argc])) == NULL) { | 		if ((out = parse__string(outbuf, argv[argc])) == NULL) { | ||||||
| 			(void) fprintf(el->el_errfile, | 			(void) fprintf(el->el_errfile, | ||||||
| 			    "" FSTR ": Invalid \\ or ^ in outstring.\n", argv[0]); | 			    "%ls: Invalid \\ or ^ in outstring.\n", argv[0]); | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		} | 		} | ||||||
| 		if (key) | 		if (key) | ||||||
| 			term_set_arrow(el, in, key_map_str(el, out), ntype); | 			terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype); | ||||||
| 		else | 		else | ||||||
| 			key_add(el, in, key_map_str(el, out), ntype); | 			keymacro_add(el, in, keymacro_map_str(el, out), ntype); | ||||||
| 		map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; | 		map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case XK_CMD: | 	case XK_CMD: | ||||||
| 		if ((cmd = parse_cmd(el, argv[argc])) == -1) { | 		if ((cmd = parse_cmd(el, argv[argc])) == -1) { | ||||||
| 			(void) fprintf(el->el_errfile, | 			(void) fprintf(el->el_errfile, | ||||||
| 			    "" FSTR ": Invalid command `" FSTR "'.\n", | 			    "%ls: Invalid command `%ls'.\n", | ||||||
| 			    argv[0], argv[argc]); | 			    argv[0], argv[argc]); | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		} | 		} | ||||||
| 		if (key) | 		if (key) | ||||||
| 			term_set_arrow(el, in, key_map_str(el, out), ntype); | 			terminal_set_arrow(el, in, keymacro_map_cmd(el, cmd), ntype); | ||||||
| 		else { | 		else { | ||||||
| 			if (in[1]) { | 			if (in[1]) { | ||||||
| 				key_add(el, in, key_map_cmd(el, cmd), ntype); | 				keymacro_add(el, in, keymacro_map_cmd(el, cmd), ntype); | ||||||
| 				map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; | 				map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; | ||||||
| 			} else { | 			} else { | ||||||
| 				key_clear(el, map, in); | 				keymacro_clear(el, map, in); | ||||||
| 				map[(unsigned char) *in] = cmd; | 				map[(unsigned char) *in] = (el_action_t)cmd; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
|  | 	/* coverity[dead_error_begin] */ | ||||||
| 	default: | 	default: | ||||||
| 		EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); | 		EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* map_addfunc(): | /* map_addfunc(): | ||||||
|  *	add a user defined function |  *	add a user defined function | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| map_addfunc(EditLine *el, const Char *name, const Char *help, el_func_t func) | map_addfunc(EditLine *el, const wchar_t *name, const wchar_t *help, | ||||||
|  |     el_func_t func) | ||||||
| { | { | ||||||
| 	void *p; | 	void *p; | ||||||
| 	int nf = el->el_map.nfunc + 1; | 	size_t nf = el->el_map.nfunc + 1; | ||||||
|  |  | ||||||
| 	if (name == NULL || help == NULL || func == NULL) | 	if (name == NULL || help == NULL || func == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
|  |  | ||||||
| 	if ((p = el_realloc(el->el_map.func, nf * sizeof(el_func_t))) == NULL) | 	if ((p = el_realloc(el->el_map.func, nf * | ||||||
| 		return (-1); | 	    sizeof(*el->el_map.func))) == NULL) | ||||||
| 	el->el_map.func = (el_func_t *) p; | 		return -1; | ||||||
| 	if ((p = el_realloc(el->el_map.help, nf * sizeof(el_bindings_t))) | 	el->el_map.func = p; | ||||||
|  | 	if ((p = el_realloc(el->el_map.help, nf * sizeof(*el->el_map.help))) | ||||||
| 	    == NULL) | 	    == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	el->el_map.help = (el_bindings_t *) p; | 	el->el_map.help = p; | ||||||
|  |  | ||||||
| 	nf = el->el_map.nfunc; | 	nf = (size_t)el->el_map.nfunc; | ||||||
| 	el->el_map.func[nf] = func; | 	el->el_map.func[nf] = func; | ||||||
|  |  | ||||||
| 	el->el_map.help[nf].name = name; | 	el->el_map.help[nf].name = name; | ||||||
| 	el->el_map.help[nf].func = nf; | 	el->el_map.help[nf].func = (int)nf; | ||||||
| 	el->el_map.help[nf].description = help; | 	el->el_map.help[nf].description = help; | ||||||
| 	el->el_map.nfunc++; | 	el->el_map.nfunc++; | ||||||
|  |  | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: map.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: map.h,v 1.13 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -40,12 +40,13 @@ | |||||||
| #ifndef _h_el_map | #ifndef _h_el_map | ||||||
| #define	_h_el_map | #define	_h_el_map | ||||||
|  |  | ||||||
| typedef struct el_bindings_t {	/* for the "bind" shell command */ | typedef el_action_t (*el_func_t)(EditLine *, wint_t); | ||||||
| 	const Char	*name;		/* function name for bind command */ |  | ||||||
| 	int		 func;		/* function numeric value */ |  | ||||||
| 	const Char	*description;	/* description of function */ |  | ||||||
| } el_bindings_t; |  | ||||||
|  |  | ||||||
|  | typedef struct el_bindings_t {	/* for the "bind" shell command */ | ||||||
|  | 	const wchar_t	*name;		/* function name for bind command */ | ||||||
|  | 	int		 func;		/* function numeric value */ | ||||||
|  | 	const wchar_t	*description;	/* description of function */ | ||||||
|  | } el_bindings_t; | ||||||
|  |  | ||||||
| typedef struct el_map_t { | typedef struct el_map_t { | ||||||
| 	el_action_t	*alt;		/* The current alternate key map */ | 	el_action_t	*alt;		/* The current alternate key map */ | ||||||
| @@ -57,7 +58,7 @@ typedef struct el_map_t { | |||||||
| 	int		 type;		/* Emacs or vi			*/ | 	int		 type;		/* Emacs or vi			*/ | ||||||
| 	el_bindings_t	*help;		/* The help for the editor functions */ | 	el_bindings_t	*help;		/* The help for the editor functions */ | ||||||
| 	el_func_t	*func;		/* List of available functions	*/ | 	el_func_t	*func;		/* List of available functions	*/ | ||||||
| 	int		 nfunc;		/* The number of functions/help items */ | 	size_t		 nfunc;		/* The number of functions/help items */ | ||||||
| } el_map_t; | } el_map_t; | ||||||
|  |  | ||||||
| #define	MAP_EMACS	0 | #define	MAP_EMACS	0 | ||||||
| @@ -65,13 +66,14 @@ typedef struct el_map_t { | |||||||
|  |  | ||||||
| #define N_KEYS      256 | #define N_KEYS      256 | ||||||
|  |  | ||||||
| protected int	map_bind(EditLine *, int, const Char **); | libedit_private int	map_bind(EditLine *, int, const wchar_t **); | ||||||
| protected int	map_init(EditLine *); | libedit_private int	map_init(EditLine *); | ||||||
| protected void	map_end(EditLine *); | libedit_private void	map_end(EditLine *); | ||||||
| protected void	map_init_vi(EditLine *); | libedit_private void	map_init_vi(EditLine *); | ||||||
| protected void	map_init_emacs(EditLine *); | libedit_private void	map_init_emacs(EditLine *); | ||||||
| protected int	map_set_editor(EditLine *, Char *); | libedit_private int	map_set_editor(EditLine *, wchar_t *); | ||||||
| protected int	map_get_editor(EditLine *, const Char **); | libedit_private int	map_get_editor(EditLine *, const wchar_t **); | ||||||
| protected int	map_addfunc(EditLine *, const Char *, const Char *, el_func_t); | libedit_private int	map_addfunc(EditLine *, const wchar_t *, const wchar_t *, | ||||||
|  |     el_func_t); | ||||||
|  |  | ||||||
| #endif /* _h_el_map */ | #endif /* _h_el_map */ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: parse.c,v 1.23 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: parse.c,v 1.40 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,7 +37,7 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)parse.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)parse.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: parse.c,v 1.23 2009/12/30 22:37:40 christos Exp $"); | __RCSID("$NetBSD: parse.c,v 1.40 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| @@ -54,20 +54,23 @@ __RCSID("$NetBSD: parse.c,v 1.23 2009/12/30 22:37:40 christos Exp $"); | |||||||
|  *	settc |  *	settc | ||||||
|  *	setty |  *	setty | ||||||
|  */ |  */ | ||||||
| #include "el.h" |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| private const struct { | #include "el.h" | ||||||
| 	const Char *name; | #include "parse.h" | ||||||
| 	int (*func)(EditLine *, int, const Char **); |  | ||||||
|  | static const struct { | ||||||
|  | 	const wchar_t *name; | ||||||
|  | 	int (*func)(EditLine *, int, const wchar_t **); | ||||||
| } cmds[] = { | } cmds[] = { | ||||||
| 	{ STR("bind"),  	map_bind	}, | 	{ L"bind",		map_bind	}, | ||||||
| 	{ STR("echotc"),	term_echotc	}, | 	{ L"echotc",		terminal_echotc	}, | ||||||
| 	{ STR("edit"),  	el_editmode	}, | 	{ L"edit",		el_editmode	}, | ||||||
| 	{ STR("history"),	hist_command	}, | 	{ L"history",		hist_command	}, | ||||||
| 	{ STR("telltc"),	term_telltc	}, | 	{ L"telltc",		terminal_telltc	}, | ||||||
| 	{ STR("settc"),	        term_settc	}, | 	{ L"settc",		terminal_settc	}, | ||||||
| 	{ STR("setty"),	        tty_stty	}, | 	{ L"setty",		tty_stty	}, | ||||||
| 	{ NULL,			NULL		} | 	{ NULL,			NULL		} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -75,59 +78,59 @@ private const struct { | |||||||
| /* parse_line(): | /* parse_line(): | ||||||
|  *	Parse a line and dispatch it |  *	Parse a line and dispatch it | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| parse_line(EditLine *el, const Char *line) | parse_line(EditLine *el, const wchar_t *line) | ||||||
| { | { | ||||||
| 	const Char **argv; | 	const wchar_t **argv; | ||||||
| 	int argc; | 	int argc; | ||||||
| 	TYPE(Tokenizer) *tok; | 	TokenizerW *tok; | ||||||
|  |  | ||||||
| 	tok = FUN(tok,init)(NULL); | 	tok = tok_winit(NULL); | ||||||
| 	FUN(tok,str)(tok, line, &argc, &argv); | 	tok_wstr(tok, line, &argc, &argv); | ||||||
| 	argc = FUN(el,parse)(el, argc, argv); | 	argc = el_wparse(el, argc, argv); | ||||||
| 	FUN(tok,end)(tok); | 	tok_wend(tok); | ||||||
| 	return (argc); | 	return argc; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_parse(): | /* el_parse(): | ||||||
|  *	Command dispatcher |  *	Command dispatcher | ||||||
|  */ |  */ | ||||||
| public int | int | ||||||
| FUN(el,parse)(EditLine *el, int argc, const Char *argv[]) | el_wparse(EditLine *el, int argc, const wchar_t *argv[]) | ||||||
| { | { | ||||||
| 	const Char *ptr; | 	const wchar_t *ptr; | ||||||
| 	int i; | 	int i; | ||||||
|  |  | ||||||
| 	if (argc < 1) | 	if (argc < 1) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	ptr = Strchr(argv[0], ':'); | 	ptr = wcschr(argv[0], L':'); | ||||||
| 	if (ptr != NULL) { | 	if (ptr != NULL) { | ||||||
| 		Char *tprog; | 		wchar_t *tprog; | ||||||
| 		size_t l; | 		size_t l; | ||||||
|  |  | ||||||
| 		if (ptr == argv[0]) | 		if (ptr == argv[0]) | ||||||
| 			return (0); | 			return 0; | ||||||
| 		l = ptr - argv[0] - 1; | 		l = (size_t)(ptr - argv[0] - 1); | ||||||
| 		tprog = el_malloc((l + 1) * sizeof(*tprog)); | 		tprog = el_malloc((l + 1) * sizeof(*tprog)); | ||||||
| 		if (tprog == NULL) | 		if (tprog == NULL) | ||||||
| 			return (0); | 			return 0; | ||||||
| 		(void) Strncpy(tprog, argv[0], l); | 		(void) wcsncpy(tprog, argv[0], l); | ||||||
| 		tprog[l] = '\0'; | 		tprog[l] = '\0'; | ||||||
| 		ptr++; | 		ptr++; | ||||||
| 		l = el_match(el->el_prog, tprog); | 		l = (size_t)el_match(el->el_prog, tprog); | ||||||
| 		el_free(tprog); | 		el_free(tprog); | ||||||
| 		if (!l) | 		if (!l) | ||||||
| 			return (0); | 			return 0; | ||||||
| 	} else | 	} else | ||||||
| 		ptr = argv[0]; | 		ptr = argv[0]; | ||||||
|  |  | ||||||
| 	for (i = 0; cmds[i].name != NULL; i++) | 	for (i = 0; cmds[i].name != NULL; i++) | ||||||
| 		if (Strcmp(cmds[i].name, ptr) == 0) { | 		if (wcscmp(cmds[i].name, ptr) == 0) { | ||||||
| 			i = (*cmds[i].func) (el, argc, argv); | 			i = (*cmds[i].func) (el, argc, argv); | ||||||
| 			return (-i); | 			return -i; | ||||||
| 		} | 		} | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -135,16 +138,16 @@ FUN(el,parse)(EditLine *el, int argc, const Char *argv[]) | |||||||
|  *	Parse a string of the form ^<char> \<odigit> \<char> \U+xxxx and return |  *	Parse a string of the form ^<char> \<odigit> \<char> \U+xxxx and return | ||||||
|  *	the appropriate character or -1 if the escape is not valid |  *	the appropriate character or -1 if the escape is not valid | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| parse__escape(const Char **ptr) | parse__escape(const wchar_t **ptr) | ||||||
| { | { | ||||||
| 	const Char *p; | 	const wchar_t *p; | ||||||
| 	Int c; | 	wint_t c; | ||||||
|  |  | ||||||
| 	p = *ptr; | 	p = *ptr; | ||||||
|  |  | ||||||
| 	if (p[1] == 0) | 	if (p[1] == 0) | ||||||
| 		return (-1); | 		return -1; | ||||||
|  |  | ||||||
| 	if (*p == '\\') { | 	if (*p == '\\') { | ||||||
| 		p++; | 		p++; | ||||||
| @@ -176,16 +179,16 @@ parse__escape(const Char **ptr) | |||||||
| 		case 'U':		/* Unicode \U+xxxx or \U+xxxxx format */ | 		case 'U':		/* Unicode \U+xxxx or \U+xxxxx format */ | ||||||
| 		{ | 		{ | ||||||
| 			int i; | 			int i; | ||||||
|                         const Char hex[] = STR("0123456789ABCDEF"); | 			const wchar_t hex[] = L"0123456789ABCDEF"; | ||||||
|                         const Char *h; | 			const wchar_t *h; | ||||||
| 			++p; | 			++p; | ||||||
| 			if (*p++ != '+') | 			if (*p++ != '+') | ||||||
|                                 return (-1); | 				return -1; | ||||||
| 			c = 0; | 			c = 0; | ||||||
| 			for (i = 0; i < 5; ++i) { | 			for (i = 0; i < 5; ++i) { | ||||||
|                                 h = Strchr(hex, *p++); | 				h = wcschr(hex, *p++); | ||||||
| 				if (!h && i < 4) | 				if (!h && i < 4) | ||||||
|                                         return (-1); | 					return -1; | ||||||
| 				else if (h) | 				else if (h) | ||||||
| 					c = (c << 4) | ((int)(h - hex)); | 					c = (c << 4) | ((int)(h - hex)); | ||||||
| 				else | 				else | ||||||
| @@ -214,8 +217,8 @@ parse__escape(const Char **ptr) | |||||||
| 				} | 				} | ||||||
| 				c = (c << 3) | (ch - '0'); | 				c = (c << 3) | (ch - '0'); | ||||||
| 			} | 			} | ||||||
| 			if ((c & 0xffffff00) != 0) | 			if ((c & (wint_t)0xffffff00) != (wint_t)0) | ||||||
| 				return (-1); | 				return -1; | ||||||
| 			--p; | 			--p; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| @@ -229,29 +232,29 @@ parse__escape(const Char **ptr) | |||||||
| 	} else | 	} else | ||||||
| 		c = *p; | 		c = *p; | ||||||
| 	*ptr = ++p; | 	*ptr = ++p; | ||||||
| 	return (c); | 	return c; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* parse__string(): | /* parse__string(): | ||||||
|  *	Parse the escapes from in and put the raw string out |  *	Parse the escapes from in and put the raw string out | ||||||
|  */ |  */ | ||||||
| protected Char * | libedit_private wchar_t * | ||||||
| parse__string(Char *out, const Char *in) | parse__string(wchar_t *out, const wchar_t *in) | ||||||
| { | { | ||||||
| 	Char *rv = out; | 	wchar_t *rv = out; | ||||||
| 	int n; | 	int n; | ||||||
|  |  | ||||||
| 	for (;;) | 	for (;;) | ||||||
| 		switch (*in) { | 		switch (*in) { | ||||||
| 		case '\0': | 		case '\0': | ||||||
| 			*out = '\0'; | 			*out = '\0'; | ||||||
| 			return (rv); | 			return rv; | ||||||
|  |  | ||||||
| 		case '\\': | 		case '\\': | ||||||
| 		case '^': | 		case '^': | ||||||
| 			if ((n = parse__escape(&in)) == -1) | 			if ((n = parse__escape(&in)) == -1) | ||||||
| 				return (NULL); | 				return NULL; | ||||||
| 			*out++ = n; | 			*out++ = (wchar_t)n; | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case 'M': | 		case 'M': | ||||||
| @@ -273,13 +276,14 @@ parse__string(Char *out, const Char *in) | |||||||
|  *	Return the command number for the command string given |  *	Return the command number for the command string given | ||||||
|  *	or -1 if one is not found |  *	or -1 if one is not found | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| parse_cmd(EditLine *el, const Char *cmd) | parse_cmd(EditLine *el, const wchar_t *cmd) | ||||||
| { | { | ||||||
| 	el_bindings_t *b; | 	el_bindings_t *b = el->el_map.help; | ||||||
|  | 	size_t i; | ||||||
|  |  | ||||||
| 	for (b = el->el_map.help; b->name != NULL; b++) | 	for (i = 0; i < el->el_map.nfunc; i++) | ||||||
| 		if (Strcmp(b->name, cmd) == 0) | 		if (wcscmp(b[i].name, cmd) == 0) | ||||||
| 			return (b->func); | 			return b[i].func; | ||||||
| 	return (-1); | 	return -1; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: parse.h,v 1.7 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: parse.h,v 1.9 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -40,9 +40,9 @@ | |||||||
| #ifndef _h_el_parse | #ifndef _h_el_parse | ||||||
| #define	_h_el_parse | #define	_h_el_parse | ||||||
|  |  | ||||||
| protected int	 parse_line(EditLine *, const Char *); | libedit_private int	 parse_line(EditLine *, const wchar_t *); | ||||||
| protected int	 parse__escape(const Char **); | libedit_private int	 parse__escape(const wchar_t **); | ||||||
| protected Char	*parse__string(Char *, const Char *); | libedit_private wchar_t *parse__string(wchar_t *, const wchar_t *); | ||||||
| protected int	 parse_cmd(EditLine *, const Char *); | libedit_private int	 parse_cmd(EditLine *, const wchar_t *); | ||||||
|  |  | ||||||
| #endif /* _h_el_parse */ | #endif /* _h_el_parse */ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: prompt.c,v 1.18 2009/12/31 15:58:26 christos Exp $	*/ | /*	$NetBSD: prompt.c,v 1.26 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,7 +37,7 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)prompt.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)prompt.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: prompt.c,v 1.18 2009/12/31 15:58:26 christos Exp $"); | __RCSID("$NetBSD: prompt.c,v 1.26 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| @@ -47,43 +47,43 @@ __RCSID("$NetBSD: prompt.c,v 1.18 2009/12/31 15:58:26 christos Exp $"); | |||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  |  | ||||||
| private Char	*prompt_default(EditLine *); | static wchar_t	*prompt_default(EditLine *); | ||||||
| private Char	*prompt_default_r(EditLine *); | static wchar_t	*prompt_default_r(EditLine *); | ||||||
|  |  | ||||||
| /* prompt_default(): | /* prompt_default(): | ||||||
|  *	Just a default prompt, in case the user did not provide one |  *	Just a default prompt, in case the user did not provide one | ||||||
|  */ |  */ | ||||||
| private Char * | static wchar_t * | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| prompt_default(EditLine *el __attribute__((__unused__))) | prompt_default(EditLine *el __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	static Char a[3] = {'?', ' ', '\0'}; | 	static wchar_t a[3] = L"? "; | ||||||
|  |  | ||||||
| 	return (a); | 	return a; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* prompt_default_r(): | /* prompt_default_r(): | ||||||
|  *	Just a default rprompt, in case the user did not provide one |  *	Just a default rprompt, in case the user did not provide one | ||||||
|  */ |  */ | ||||||
| private Char * | static wchar_t * | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| prompt_default_r(EditLine *el __attribute__((__unused__))) | prompt_default_r(EditLine *el __attribute__((__unused__))) | ||||||
| { | { | ||||||
| 	static Char a[1] = {'\0'}; | 	static wchar_t a[1] = L""; | ||||||
|  |  | ||||||
| 	return (a); | 	return a; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* prompt_print(): | /* prompt_print(): | ||||||
|  *	Print the prompt and update the prompt position. |  *	Print the prompt and update the prompt position. | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| prompt_print(EditLine *el, int op) | prompt_print(EditLine *el, int op) | ||||||
| { | { | ||||||
| 	el_prompt_t *elp; | 	el_prompt_t *elp; | ||||||
| 	Char *p; | 	wchar_t *p; | ||||||
| 	int ignore = 0; | 	int ignore = 0; | ||||||
|  |  | ||||||
| 	if (op == EL_PROMPT) | 	if (op == EL_PROMPT) | ||||||
| @@ -103,7 +103,7 @@ prompt_print(EditLine *el, int op) | |||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		if (ignore) | 		if (ignore) | ||||||
| 			term__putc(el, *p); | 			terminal__putc(el, *p); | ||||||
| 		else | 		else | ||||||
| 			re_putc(el, *p, 1); | 			re_putc(el, *p, 1); | ||||||
| 	} | 	} | ||||||
| @@ -116,7 +116,7 @@ prompt_print(EditLine *el, int op) | |||||||
| /* prompt_init(): | /* prompt_init(): | ||||||
|  *	Initialize the prompt stuff |  *	Initialize the prompt stuff | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| prompt_init(EditLine *el) | prompt_init(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -135,7 +135,7 @@ prompt_init(EditLine *el) | |||||||
| /* prompt_end(): | /* prompt_end(): | ||||||
|  *	Clean up the prompt stuff |  *	Clean up the prompt stuff | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| prompt_end(EditLine *el __attribute__((__unused__))) | prompt_end(EditLine *el __attribute__((__unused__))) | ||||||
| { | { | ||||||
| @@ -145,8 +145,8 @@ prompt_end(EditLine *el __attribute__((__unused__))) | |||||||
| /* prompt_set(): | /* prompt_set(): | ||||||
|  *	Install a prompt printing function |  *	Install a prompt printing function | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| prompt_set(EditLine *el, el_pfunc_t prf, Char c, int op, int wide) | prompt_set(EditLine *el, el_pfunc_t prf, wchar_t c, int op, int wide) | ||||||
| { | { | ||||||
| 	el_prompt_t *p; | 	el_prompt_t *p; | ||||||
|  |  | ||||||
| @@ -177,8 +177,8 @@ prompt_set(EditLine *el, el_pfunc_t prf, Char c, int op, int wide) | |||||||
| /* prompt_get(): | /* prompt_get(): | ||||||
|  *	Retrieve the prompt printing function |  *	Retrieve the prompt printing function | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| prompt_get(EditLine *el, el_pfunc_t *prf, Char *c, int op) | prompt_get(EditLine *el, el_pfunc_t *prf, wchar_t *c, int op) | ||||||
| { | { | ||||||
| 	el_prompt_t *p; | 	el_prompt_t *p; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: prompt.h,v 1.10 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: prompt.h,v 1.15 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -40,21 +40,19 @@ | |||||||
| #ifndef _h_el_prompt | #ifndef _h_el_prompt | ||||||
| #define	_h_el_prompt | #define	_h_el_prompt | ||||||
|  |  | ||||||
| #include "histedit.h" | typedef wchar_t    *(*el_pfunc_t)(EditLine *); | ||||||
|  |  | ||||||
| typedef Char    *(*el_pfunc_t)(EditLine *); |  | ||||||
|  |  | ||||||
| typedef struct el_prompt_t { | typedef struct el_prompt_t { | ||||||
| 	el_pfunc_t	p_func;		/* Function to return the prompt */ | 	el_pfunc_t	p_func;		/* Function to return the prompt */ | ||||||
| 	coord_t		p_pos;		/* position in the line after prompt */ | 	coord_t		p_pos;		/* position in the line after prompt */ | ||||||
| 	Char		p_ignore;	/* character to start/end literal */ | 	wchar_t		p_ignore;	/* character to start/end literal */ | ||||||
| 	int		p_wide; | 	int		p_wide; | ||||||
| } el_prompt_t; | } el_prompt_t; | ||||||
|  |  | ||||||
| protected void	prompt_print(EditLine *, int); | libedit_private void	prompt_print(EditLine *, int); | ||||||
| protected int	prompt_set(EditLine *, el_pfunc_t, Char, int, int); | libedit_private int	prompt_set(EditLine *, el_pfunc_t, wchar_t, int, int); | ||||||
| protected int	prompt_get(EditLine *, el_pfunc_t *, Char *, int); | libedit_private int	prompt_get(EditLine *, el_pfunc_t *, wchar_t *, int); | ||||||
| protected int	prompt_init(EditLine *); | libedit_private int	prompt_init(EditLine *); | ||||||
| protected void	prompt_end(EditLine *); | libedit_private void	prompt_end(EditLine *); | ||||||
|  |  | ||||||
| #endif /* _h_el_prompt */ | #endif /* _h_el_prompt */ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: read.c,v 1.58 2011/02/18 20:53:05 christos Exp $	*/ | /*	$NetBSD: read.c,v 1.101 2016/05/25 13:01:11 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,49 +37,90 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)read.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)read.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: read.c,v 1.58 2011/02/18 20:53:05 christos Exp $"); | __RCSID("$NetBSD: read.c,v 1.101 2016/05/25 13:01:11 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * read.c: Clean this junk up! This is horrible code. |  * read.c: Terminal read functions | ||||||
|  *	   Terminal read functions |  | ||||||
|  */ |  */ | ||||||
|  | #include <ctype.h> | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #include <unistd.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <limits.h> | #include <limits.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  | #include "fcns.h" | ||||||
|  | #include "read.h" | ||||||
|  |  | ||||||
| #define	OKCMD	-1	/* must be -1! */ | #define	EL_MAXMACRO	10 | ||||||
|  |  | ||||||
| private int	read__fixio(int, int); | struct macros { | ||||||
| private int	read_preread(EditLine *); | 	wchar_t	**macro; | ||||||
| private int	read_char(EditLine *, Char *); | 	int	  level; | ||||||
| private int	read_getcmd(EditLine *, el_action_t *, Char *); | 	int	  offset; | ||||||
| private void	read_pop(c_macro_t *); | }; | ||||||
|  |  | ||||||
|  | struct el_read_t { | ||||||
|  | 	struct macros	 macros; | ||||||
|  | 	el_rfunc_t	 read_char;	/* Function to read a character. */ | ||||||
|  | 	int		 read_errno; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static int	read__fixio(int, int); | ||||||
|  | static int	read_char(EditLine *, wchar_t *); | ||||||
|  | static int	read_getcmd(EditLine *, el_action_t *, wchar_t *); | ||||||
|  | static void	read_clearmacros(struct macros *); | ||||||
|  | static void	read_pop(struct macros *); | ||||||
|  | static const wchar_t *noedit_wgets(EditLine *, int *); | ||||||
|  |  | ||||||
| /* read_init(): | /* read_init(): | ||||||
|  *	Initialize the read stuff |  *	Initialize the read stuff | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| read_init(EditLine *el) | read_init(EditLine *el) | ||||||
| { | { | ||||||
|  | 	struct macros *ma; | ||||||
|  |  | ||||||
|  | 	if ((el->el_read = el_malloc(sizeof(*el->el_read))) == NULL) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	ma = &el->el_read->macros; | ||||||
|  | 	if ((ma->macro = el_malloc(EL_MAXMACRO * | ||||||
|  | 	    sizeof(*ma->macro))) == NULL) { | ||||||
|  | 		free(el->el_read); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 	ma->level = -1; | ||||||
|  | 	ma->offset = 0; | ||||||
|  |  | ||||||
| 	/* builtin read_char */ | 	/* builtin read_char */ | ||||||
| 	el->el_read.read_char = read_char; | 	el->el_read->read_char = read_char; | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* el_read_end(): | ||||||
|  |  *	Free the data structures used by the read stuff. | ||||||
|  |  */ | ||||||
|  | libedit_private void | ||||||
|  | read_end(struct el_read_t *el_read) | ||||||
|  | { | ||||||
|  | 	read_clearmacros(&el_read->macros); | ||||||
|  | 	el_free(el_read->macros.macro); | ||||||
|  | 	el_read->macros.macro = NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
| /* el_read_setfn(): | /* el_read_setfn(): | ||||||
|  *	Set the read char function to the one provided. |  *	Set the read char function to the one provided. | ||||||
|  *	If it is set to EL_BUILTIN_GETCFN, then reset to the builtin one. |  *	If it is set to EL_BUILTIN_GETCFN, then reset to the builtin one. | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| el_read_setfn(EditLine *el, el_rfunc_t rc) | el_read_setfn(struct el_read_t *el_read, el_rfunc_t rc) | ||||||
| { | { | ||||||
| 	el->el_read.read_char = (rc == EL_BUILTIN_GETCFN) ? read_char : rc; | 	el_read->read_char = (rc == EL_BUILTIN_GETCFN) ? read_char : rc; | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -88,42 +129,19 @@ el_read_setfn(EditLine *el, el_rfunc_t rc) | |||||||
|  *	return the current read char function, or EL_BUILTIN_GETCFN |  *	return the current read char function, or EL_BUILTIN_GETCFN | ||||||
|  *	if it is the default one |  *	if it is the default one | ||||||
|  */ |  */ | ||||||
| protected el_rfunc_t | libedit_private el_rfunc_t | ||||||
| el_read_getfn(EditLine *el) | el_read_getfn(struct el_read_t *el_read) | ||||||
| { | { | ||||||
|        return (el->el_read.read_char == read_char) ? |        return el_read->read_char == read_char ? | ||||||
| 	    EL_BUILTIN_GETCFN : el->el_read.read_char; | 	    EL_BUILTIN_GETCFN : el_read->read_char; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef MIN |  | ||||||
| #define MIN(A,B) ((A) < (B) ? (A) : (B)) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef DEBUG_EDIT |  | ||||||
| private void |  | ||||||
| read_debug(EditLine *el) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor > el->el_line.lastchar) |  | ||||||
| 		(void) fprintf(el->el_errfile, "cursor > lastchar\r\n"); |  | ||||||
| 	if (el->el_line.cursor < el->el_line.buffer) |  | ||||||
| 		(void) fprintf(el->el_errfile, "cursor < buffer\r\n"); |  | ||||||
| 	if (el->el_line.cursor > el->el_line.limit) |  | ||||||
| 		(void) fprintf(el->el_errfile, "cursor > limit\r\n"); |  | ||||||
| 	if (el->el_line.lastchar > el->el_line.limit) |  | ||||||
| 		(void) fprintf(el->el_errfile, "lastchar > limit\r\n"); |  | ||||||
| 	if (el->el_line.limit != &el->el_line.buffer[EL_BUFSIZ - 2]) |  | ||||||
| 		(void) fprintf(el->el_errfile, "limit != &buffer[EL_BUFSIZ-2]\r\n"); |  | ||||||
| } |  | ||||||
| #endif /* DEBUG_EDIT */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* read__fixio(): | /* read__fixio(): | ||||||
|  *	Try to recover from a read error |  *	Try to recover from a read error | ||||||
|  */ |  */ | ||||||
| /* ARGSUSED */ | /* ARGSUSED */ | ||||||
| private int | static int | ||||||
| read__fixio(int fd __attribute__((__unused__)), int e) | read__fixio(int fd __attribute__((__unused__)), int e) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -150,10 +168,10 @@ read__fixio(int fd __attribute__((__unused__)), int e) | |||||||
| #ifdef TRY_AGAIN | #ifdef TRY_AGAIN | ||||||
| #if defined(F_SETFL) && defined(O_NDELAY) | #if defined(F_SETFL) && defined(O_NDELAY) | ||||||
| 		if ((e = fcntl(fd, F_GETFL, 0)) == -1) | 		if ((e = fcntl(fd, F_GETFL, 0)) == -1) | ||||||
| 			return (-1); | 			return -1; | ||||||
|  |  | ||||||
| 		if (fcntl(fd, F_SETFL, e & ~O_NDELAY) == -1) | 		if (fcntl(fd, F_SETFL, e & ~O_NDELAY) == -1) | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		else | 		else | ||||||
| 			e = 1; | 			e = 1; | ||||||
| #endif /* F_SETFL && O_NDELAY */ | #endif /* F_SETFL && O_NDELAY */ | ||||||
| @@ -162,95 +180,62 @@ read__fixio(int fd __attribute__((__unused__)), int e) | |||||||
| 		{ | 		{ | ||||||
| 			int zero = 0; | 			int zero = 0; | ||||||
|  |  | ||||||
| 			if (ioctl(fd, FIONBIO, (ioctl_t) & zero) == -1) | 			if (ioctl(fd, FIONBIO, &zero) == -1) | ||||||
| 				return (-1); | 				return -1; | ||||||
| 			else | 			else | ||||||
| 				e = 1; | 				e = 1; | ||||||
| 		} | 		} | ||||||
| #endif /* FIONBIO */ | #endif /* FIONBIO */ | ||||||
|  |  | ||||||
| #endif /* TRY_AGAIN */ | #endif /* TRY_AGAIN */ | ||||||
| 		return (e ? 0 : -1); | 		return e ? 0 : -1; | ||||||
|  |  | ||||||
| 	case EINTR: | 	case EINTR: | ||||||
| 		return (0); | 		return 0; | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* read_preread(): |  | ||||||
|  *	Try to read the stuff in the input queue; |  | ||||||
|  */ |  | ||||||
| private int |  | ||||||
| read_preread(EditLine *el) |  | ||||||
| { |  | ||||||
| 	int chrs = 0; |  | ||||||
|  |  | ||||||
| 	if (el->el_tty.t_mode == ED_IO) |  | ||||||
| 		return (0); |  | ||||||
|  |  | ||||||
| #ifndef WIDECHAR |  | ||||||
| /* FIONREAD attempts to buffer up multiple bytes, and to make that work |  | ||||||
|  * properly with partial wide/UTF-8 characters would need some careful work. */ |  | ||||||
| #ifdef FIONREAD |  | ||||||
| 	(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs); |  | ||||||
| 	if (chrs > 0) { |  | ||||||
| 		char buf[EL_BUFSIZ]; |  | ||||||
|  |  | ||||||
| 		chrs = read(el->el_infd, buf, |  | ||||||
| 		    (size_t) MIN(chrs, EL_BUFSIZ - 1)); |  | ||||||
| 		if (chrs > 0) { |  | ||||||
| 			buf[chrs] = '\0'; |  | ||||||
| 			el_push(el, buf); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| #endif /* FIONREAD */ |  | ||||||
| #endif |  | ||||||
| 	return (chrs > 0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* el_push(): | /* el_push(): | ||||||
|  *	Push a macro |  *	Push a macro | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| FUN(el,push)(EditLine *el, const Char *str) | el_wpush(EditLine *el, const wchar_t *str) | ||||||
| { | { | ||||||
| 	c_macro_t *ma = &el->el_chared.c_macro; | 	struct macros *ma = &el->el_read->macros; | ||||||
|  |  | ||||||
| 	if (str != NULL && ma->level + 1 < EL_MAXMACRO) { | 	if (str != NULL && ma->level + 1 < EL_MAXMACRO) { | ||||||
| 		ma->level++; | 		ma->level++; | ||||||
| 		if ((ma->macro[ma->level] = Strdup(str)) != NULL) | 		if ((ma->macro[ma->level] = wcsdup(str)) != NULL) | ||||||
| 			return; | 			return; | ||||||
| 		ma->level--; | 		ma->level--; | ||||||
| 	} | 	} | ||||||
| 	term_beep(el); | 	terminal_beep(el); | ||||||
| 	term__flush(el); | 	terminal__flush(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* read_getcmd(): | /* read_getcmd(): | ||||||
|  *	Return next command from the input stream. |  *	Get next command from the input stream, | ||||||
|  |  *	return 0 on success or -1 on EOF or error. | ||||||
|  *	Character values > 255 are not looked up in the map, but inserted. |  *	Character values > 255 are not looked up in the map, but inserted. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| read_getcmd(EditLine *el, el_action_t *cmdnum, Char *ch) | read_getcmd(EditLine *el, el_action_t *cmdnum, wchar_t *ch) | ||||||
| { | { | ||||||
|  | 	static const wchar_t meta = (wchar_t)0x80; | ||||||
| 	el_action_t cmd; | 	el_action_t cmd; | ||||||
| 	int num; | 	int num; | ||||||
|  |  | ||||||
| 	el->el_errno = 0; |  | ||||||
| 	do { | 	do { | ||||||
| 		if ((num = FUN(el,getc)(el, ch)) != 1) {/* if EOF or error */ | 		if ((num = el_wgetc(el, ch)) != 1) | ||||||
| 			el->el_errno = num == 0 ? 0 : errno; | 			return -1; | ||||||
| 			return (num); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| #ifdef	KANJI | #ifdef	KANJI | ||||||
| 		if ((*ch & 0200)) { | 		if ((*ch & meta)) { | ||||||
| 			el->el_state.metanext = 0; | 			el->el_state.metanext = 0; | ||||||
| 			cmd = CcViMap[' ']; | 			cmd = CcViMap[' ']; | ||||||
| 			break; | 			break; | ||||||
| @@ -259,71 +244,52 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, Char *ch) | |||||||
|  |  | ||||||
| 		if (el->el_state.metanext) { | 		if (el->el_state.metanext) { | ||||||
| 			el->el_state.metanext = 0; | 			el->el_state.metanext = 0; | ||||||
| 			*ch |= 0200; | 			*ch |= meta; | ||||||
| 		} | 		} | ||||||
| #ifdef WIDECHAR |  | ||||||
| 		if (*ch >= N_KEYS) | 		if (*ch >= N_KEYS) | ||||||
| 			cmd = ED_INSERT; | 			cmd = ED_INSERT; | ||||||
| 		else | 		else | ||||||
| #endif |  | ||||||
| 			cmd = el->el_map.current[(unsigned char) *ch]; | 			cmd = el->el_map.current[(unsigned char) *ch]; | ||||||
| 		if (cmd == ED_SEQUENCE_LEAD_IN) { | 		if (cmd == ED_SEQUENCE_LEAD_IN) { | ||||||
| 			key_value_t val; | 			keymacro_value_t val; | ||||||
| 			switch (key_get(el, ch, &val)) { | 			switch (keymacro_get(el, ch, &val)) { | ||||||
| 			case XK_CMD: | 			case XK_CMD: | ||||||
| 				cmd = val.cmd; | 				cmd = val.cmd; | ||||||
| 				break; | 				break; | ||||||
| 			case XK_STR: | 			case XK_STR: | ||||||
| 				FUN(el,push)(el, val.str); | 				el_wpush(el, val.str); | ||||||
| 				break; | 				break; | ||||||
| #ifdef notyet | 			case XK_NOD: | ||||||
| 			case XK_EXE: | 				return -1; | ||||||
| 				/* XXX: In the future to run a user function */ |  | ||||||
| 				RunCommand(val.str); |  | ||||||
| 				break; |  | ||||||
| #endif |  | ||||||
| 			default: | 			default: | ||||||
| 				EL_ABORT((el->el_errfile, "Bad XK_ type \n")); | 				EL_ABORT((el->el_errfile, "Bad XK_ type \n")); | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if (el->el_map.alt == NULL) |  | ||||||
| 			el->el_map.current = el->el_map.key; |  | ||||||
| 	} while (cmd == ED_SEQUENCE_LEAD_IN); | 	} while (cmd == ED_SEQUENCE_LEAD_IN); | ||||||
| 	*cmdnum = cmd; | 	*cmdnum = cmd; | ||||||
| 	return (OKCMD); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef WIDECHAR |  | ||||||
| /* utf8_islead(): |  | ||||||
|  *      Test whether a byte is a leading byte of a UTF-8 sequence. |  | ||||||
|  */ |  | ||||||
| private int |  | ||||||
| utf8_islead(unsigned char c) |  | ||||||
| { |  | ||||||
|         return (c < 0x80) ||             /* single byte char */ |  | ||||||
|                (c >= 0xc2 && c <= 0xf4); /* start of multibyte sequence */ |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* read_char(): | /* read_char(): | ||||||
|  *	Read a character from the tty. |  *	Read a character from the tty. | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| read_char(EditLine *el, Char *cp) | read_char(EditLine *el, wchar_t *cp) | ||||||
| { | { | ||||||
| 	ssize_t num_read; | 	ssize_t num_read; | ||||||
| 	int tried = 0; | 	int tried = 0; | ||||||
| 	char cbuf[MB_LEN_MAX]; | 	char cbuf[MB_LEN_MAX]; | ||||||
|         int cbp = 0; | 	size_t cbp = 0; | ||||||
|         int bytes = 0; | 	int save_errno = errno; | ||||||
|  |  | ||||||
|  again: |  again: | ||||||
| 	el->el_signal->sig_no = 0; | 	el->el_signal->sig_no = 0; | ||||||
| 	while ((num_read = read(el->el_infd, cbuf + cbp, 1)) == -1) { | 	while ((num_read = read(el->el_infd, cbuf + cbp, (size_t)1)) == -1) { | ||||||
|  | 		int e = errno; | ||||||
| 		switch (el->el_signal->sig_no) { | 		switch (el->el_signal->sig_no) { | ||||||
| 		case SIGCONT: | 		case SIGCONT: | ||||||
| 			el_set(el, EL_REFRESH); | 			el_wset(el, EL_REFRESH); | ||||||
| 			/*FALLTHROUGH*/ | 			/*FALLTHROUGH*/ | ||||||
| 		case SIGWINCH: | 		case SIGWINCH: | ||||||
| 			sig_set(el); | 			sig_set(el); | ||||||
| @@ -331,44 +297,69 @@ read_char(EditLine *el, Char *cp) | |||||||
| 		default: | 		default: | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		if (!tried && read__fixio(el->el_infd, errno) == 0) | 		if (!tried && read__fixio(el->el_infd, e) == 0) { | ||||||
|  | 			errno = save_errno; | ||||||
| 			tried = 1; | 			tried = 1; | ||||||
| 		else { | 		} else { | ||||||
| 			*cp = '\0'; | 			errno = e; | ||||||
| 			return (-1); | 			*cp = L'\0'; | ||||||
|  | 			return -1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #ifdef WIDECHAR | 	/* Test for EOF */ | ||||||
| 	if (el->el_flags & CHARSET_IS_UTF8) { | 	if (num_read == 0) { | ||||||
| 		if (!utf8_islead((unsigned char)cbuf[0])) | 		*cp = L'\0'; | ||||||
| 			goto again; /* discard the byte we read and try again */ | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for (;;) { | ||||||
|  | 		mbstate_t mbs; | ||||||
|  |  | ||||||
| 		++cbp; | 		++cbp; | ||||||
| 		if ((bytes = ct_mbtowc(cp, cbuf, cbp)) == -1) { | 		/* This only works because UTF8 is stateless. */ | ||||||
| 			ct_mbtowc_reset; | 		memset(&mbs, 0, sizeof(mbs)); | ||||||
| 			if (cbp >= MB_LEN_MAX) { /* "shouldn't happen" */ | 		switch (mbrtowc(cp, cbuf, cbp, &mbs)) { | ||||||
| 				*cp = '\0'; | 		case (size_t)-1: | ||||||
| 				return (-1); | 			if (cbp > 1) { | ||||||
| 			} | 				/* | ||||||
|  | 				 * Invalid sequence, discard all bytes | ||||||
|  | 				 * except the last one. | ||||||
|  | 				 */ | ||||||
|  | 				cbuf[0] = cbuf[cbp - 1]; | ||||||
|  | 				cbp = 0; | ||||||
|  | 				break; | ||||||
|  | 			} else { | ||||||
|  | 				/* Invalid byte, discard it. */ | ||||||
|  | 				cbp = 0; | ||||||
| 				goto again; | 				goto again; | ||||||
| 			} | 			} | ||||||
| 	} else  /* we don't support other multibyte charsets */ | 		case (size_t)-2: | ||||||
| #endif | 			/* | ||||||
| 		*cp = (unsigned char)cbuf[0]; | 			 * We don't support other multibyte charsets. | ||||||
|  | 			 * The second condition shouldn't happen | ||||||
| 	if ((el->el_flags & IGNORE_EXTCHARS) && bytes > 1) { | 			 * and is here merely for additional safety. | ||||||
| 		cbp = 0; /* skip this character */ | 			 */ | ||||||
| 		goto again; | 			if ((el->el_flags & CHARSET_IS_UTF8) == 0 || | ||||||
|  | 			    cbp >= MB_LEN_MAX) { | ||||||
|  | 				errno = EILSEQ; | ||||||
|  | 				*cp = L'\0'; | ||||||
|  | 				return -1; | ||||||
|  | 			} | ||||||
|  | 			/* Incomplete sequence, read another byte. */ | ||||||
|  | 			goto again; | ||||||
|  | 		default: | ||||||
|  | 			/* Valid character, process it. */ | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return (int)num_read; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* read_pop(): | /* read_pop(): | ||||||
|  *	Pop a macro from the stack |  *	Pop a macro from the stack | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| read_pop(c_macro_t *ma) | read_pop(struct macros *ma) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
|  |  | ||||||
| @@ -379,22 +370,25 @@ read_pop(c_macro_t *ma) | |||||||
| 	ma->offset = 0; | 	ma->offset = 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* el_getc(): | static void | ||||||
|  *	Read a character | read_clearmacros(struct macros *ma) | ||||||
|  */ |  | ||||||
| public int |  | ||||||
| FUN(el,getc)(EditLine *el, Char *cp) |  | ||||||
| { | { | ||||||
|  | 	while (ma->level >= 0) | ||||||
|  | 		el_free(ma->macro[ma->level--]); | ||||||
|  | 	ma->offset = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* el_wgetc(): | ||||||
|  |  *	Read a wide character | ||||||
|  |  */ | ||||||
|  | int | ||||||
|  | el_wgetc(EditLine *el, wchar_t *cp) | ||||||
|  | { | ||||||
|  | 	struct macros *ma = &el->el_read->macros; | ||||||
| 	int num_read; | 	int num_read; | ||||||
| 	c_macro_t *ma = &el->el_chared.c_macro; |  | ||||||
|  |  | ||||||
| 	term__flush(el); | 	terminal__flush(el); | ||||||
| 	for (;;) { | 	for (;;) { | ||||||
| 		if (ma->level < 0) { |  | ||||||
| 			if (!read_preread(el)) |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if (ma->level < 0) | 		if (ma->level < 0) | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| @@ -410,30 +404,26 @@ FUN(el,getc)(EditLine *el, Char *cp) | |||||||
| 			read_pop(ma); | 			read_pop(ma); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return (1); | 		return 1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #ifdef DEBUG_READ |  | ||||||
| 	(void) fprintf(el->el_errfile, "Turning raw mode on\n"); |  | ||||||
| #endif /* DEBUG_READ */ |  | ||||||
| 	if (tty_rawmode(el) < 0)/* make sure the tty is set up correctly */ | 	if (tty_rawmode(el) < 0)/* make sure the tty is set up correctly */ | ||||||
| 		return (0); | 		return 0; | ||||||
|  |  | ||||||
| #ifdef DEBUG_READ | 	num_read = (*el->el_read->read_char)(el, cp); | ||||||
| 	(void) fprintf(el->el_errfile, "Reading a character\n"); |  | ||||||
| #endif /* DEBUG_READ */ | 	/* | ||||||
| 	num_read = (*el->el_read.read_char)(el, cp); | 	 * Remember the original reason of a read failure | ||||||
| #ifdef WIDECHAR | 	 * such that el_wgets() can restore it after doing | ||||||
| 	if (el->el_flags & NARROW_READ) | 	 * various cleanup operation that might change errno. | ||||||
| 		*cp = *(char *)(void *)cp; | 	 */ | ||||||
| #endif | 	if (num_read < 0) | ||||||
| #ifdef DEBUG_READ | 		el->el_read->read_errno = errno; | ||||||
| 	(void) fprintf(el->el_errfile, "Got it %c\n", *cp); |  | ||||||
| #endif /* DEBUG_READ */ | 	return num_read; | ||||||
| 	return (num_read); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| protected void | libedit_private void | ||||||
| read_prepare(EditLine *el) | read_prepare(EditLine *el) | ||||||
| { | { | ||||||
| 	if (el->el_flags & HANDLE_SIGNALS) | 	if (el->el_flags & HANDLE_SIGNALS) | ||||||
| @@ -447,14 +437,14 @@ read_prepare(EditLine *el) | |||||||
| 	   we have the wrong size. */ | 	   we have the wrong size. */ | ||||||
| 	el_resize(el); | 	el_resize(el); | ||||||
| 	re_clear_display(el);	/* reset the display stuff */ | 	re_clear_display(el);	/* reset the display stuff */ | ||||||
| 	ch_reset(el, 0); | 	ch_reset(el); | ||||||
| 	re_refresh(el);		/* print the prompt */ | 	re_refresh(el);		/* print the prompt */ | ||||||
|  |  | ||||||
| 	if (el->el_flags & UNBUFFERED) | 	if (el->el_flags & UNBUFFERED) | ||||||
| 		term__flush(el); | 		terminal__flush(el); | ||||||
| } | } | ||||||
|  |  | ||||||
| protected void | libedit_private void | ||||||
| read_finish(EditLine *el) | read_finish(EditLine *el) | ||||||
| { | { | ||||||
| 	if ((el->el_flags & UNBUFFERED) == 0) | 	if ((el->el_flags & UNBUFFERED) == 0) | ||||||
| @@ -463,61 +453,59 @@ read_finish(EditLine *el) | |||||||
| 		sig_clr(el); | 		sig_clr(el); | ||||||
| } | } | ||||||
|  |  | ||||||
| public const Char * | static const wchar_t * | ||||||
| FUN(el,gets)(EditLine *el, int *nread) | noedit_wgets(EditLine *el, int *nread) | ||||||
|  | { | ||||||
|  | 	el_line_t	*lp = &el->el_line; | ||||||
|  | 	int		 num; | ||||||
|  |  | ||||||
|  | 	while ((num = (*el->el_read->read_char)(el, lp->lastchar)) == 1) { | ||||||
|  | 		if (lp->lastchar + 1 >= lp->limit && | ||||||
|  | 		    !ch_enlargebufs(el, (size_t)2)) | ||||||
|  | 			break; | ||||||
|  | 		lp->lastchar++; | ||||||
|  | 		if (el->el_flags & UNBUFFERED || | ||||||
|  | 		    lp->lastchar[-1] == '\r' || | ||||||
|  | 		    lp->lastchar[-1] == '\n') | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
|  | 	if (num == -1 && errno == EINTR) | ||||||
|  | 		lp->lastchar = lp->buffer; | ||||||
|  | 	lp->cursor = lp->lastchar; | ||||||
|  | 	*lp->lastchar = '\0'; | ||||||
|  | 	*nread = (int)(lp->lastchar - lp->buffer); | ||||||
|  | 	return *nread ? lp->buffer : NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const wchar_t * | ||||||
|  | el_wgets(EditLine *el, int *nread) | ||||||
| { | { | ||||||
| 	int retval; | 	int retval; | ||||||
| 	el_action_t cmdnum = 0; | 	el_action_t cmdnum = 0; | ||||||
| 	int num;		/* how many chars we have read at NL */ | 	int num;		/* how many chars we have read at NL */ | ||||||
| 	Char ch, *cp; | 	wchar_t ch; | ||||||
| 	int crlf = 0; |  | ||||||
| 	int nrb; | 	int nrb; | ||||||
| #ifdef FIONREAD |  | ||||||
| 	c_macro_t *ma = &el->el_chared.c_macro; |  | ||||||
| #endif /* FIONREAD */ |  | ||||||
|  |  | ||||||
| 	if (nread == NULL) | 	if (nread == NULL) | ||||||
| 		nread = &nrb; | 		nread = &nrb; | ||||||
| 	*nread = 0; | 	*nread = 0; | ||||||
|  | 	el->el_read->read_errno = 0; | ||||||
|  |  | ||||||
| 	if (el->el_flags & NO_TTY) { | 	if (el->el_flags & NO_TTY) { | ||||||
| 		size_t idx; | 		el->el_line.lastchar = el->el_line.buffer; | ||||||
|  | 		return noedit_wgets(el, nread); | ||||||
| 		cp = el->el_line.buffer; |  | ||||||
| 		while ((num = (*el->el_read.read_char)(el, cp)) == 1) { |  | ||||||
| 			/* make sure there is space for next character */ |  | ||||||
| 			if (cp + 1 >= el->el_line.limit) { |  | ||||||
| 				idx = (cp - el->el_line.buffer); |  | ||||||
| 				if (!ch_enlargebufs(el, 2)) |  | ||||||
| 					break; |  | ||||||
| 				cp = &el->el_line.buffer[idx]; |  | ||||||
| 	} | 	} | ||||||
| 			cp++; |  | ||||||
| 			if (el->el_flags & UNBUFFERED) |  | ||||||
| 				break; |  | ||||||
| 			if (cp[-1] == '\r' || cp[-1] == '\n') |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
| 		if (num == -1) { |  | ||||||
| 			if (errno == EINTR) |  | ||||||
| 				cp = el->el_line.buffer; |  | ||||||
| 			el->el_errno = errno; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		goto noedit; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef FIONREAD | #ifdef FIONREAD | ||||||
| 	if (el->el_tty.t_mode == EX_IO && ma->level < 0) { | 	if (el->el_tty.t_mode == EX_IO && el->el_read->macros.level < 0) { | ||||||
| 		long chrs = 0; | 		int chrs = 0; | ||||||
|  |  | ||||||
| 		(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs); | 		(void) ioctl(el->el_infd, FIONREAD, &chrs); | ||||||
| 		if (chrs == 0) { | 		if (chrs == 0) { | ||||||
| 			if (tty_rawmode(el) < 0) { | 			if (tty_rawmode(el) < 0) { | ||||||
| 				errno = 0; | 				errno = 0; | ||||||
| 				*nread = 0; | 				*nread = 0; | ||||||
| 				return (NULL); | 				return NULL; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -527,81 +515,19 @@ FUN(el,gets)(EditLine *el, int *nread) | |||||||
| 		read_prepare(el); | 		read_prepare(el); | ||||||
|  |  | ||||||
| 	if (el->el_flags & EDIT_DISABLED) { | 	if (el->el_flags & EDIT_DISABLED) { | ||||||
| 		size_t idx; |  | ||||||
|  |  | ||||||
| 		if ((el->el_flags & UNBUFFERED) == 0) | 		if ((el->el_flags & UNBUFFERED) == 0) | ||||||
| 			cp = el->el_line.buffer; | 			el->el_line.lastchar = el->el_line.buffer; | ||||||
| 		else | 		terminal__flush(el); | ||||||
| 			cp = el->el_line.lastchar; | 		return noedit_wgets(el, nread); | ||||||
|  |  | ||||||
| 		term__flush(el); |  | ||||||
|  |  | ||||||
| 		while ((num = (*el->el_read.read_char)(el, cp)) == 1) { |  | ||||||
| 			/* make sure there is space next character */ |  | ||||||
| 			if (cp + 1 >= el->el_line.limit) { |  | ||||||
| 				idx = (cp - el->el_line.buffer); |  | ||||||
| 				if (!ch_enlargebufs(el, 2)) |  | ||||||
| 					break; |  | ||||||
| 				cp = &el->el_line.buffer[idx]; |  | ||||||
| 			} |  | ||||||
| 			cp++; |  | ||||||
| 			crlf = cp[-1] == '\r' || cp[-1] == '\n'; |  | ||||||
| 			if (el->el_flags & UNBUFFERED) |  | ||||||
| 				break; |  | ||||||
| 			if (crlf) |  | ||||||
| 				break; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 		if (num == -1) { | 	for (num = -1; num == -1;) {  /* while still editing this line */ | ||||||
| 			if (errno == EINTR) |  | ||||||
| 				cp = el->el_line.buffer; |  | ||||||
| 			el->el_errno = errno; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		goto noedit; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for (num = OKCMD; num == OKCMD;) {	/* while still editing this |  | ||||||
| 						 * line */ |  | ||||||
| #ifdef DEBUG_EDIT |  | ||||||
| 		read_debug(el); |  | ||||||
| #endif /* DEBUG_EDIT */ |  | ||||||
| 		/* if EOF or error */ | 		/* if EOF or error */ | ||||||
| 		if ((num = read_getcmd(el, &cmdnum, &ch)) != OKCMD) { | 		if (read_getcmd(el, &cmdnum, &ch) == -1) | ||||||
| #ifdef DEBUG_READ |  | ||||||
| 			(void) fprintf(el->el_errfile, |  | ||||||
| 			    "Returning from el_gets %d\n", num); |  | ||||||
| #endif /* DEBUG_READ */ |  | ||||||
| 			break; | 			break; | ||||||
| 		} | 		if ((size_t)cmdnum >= el->el_map.nfunc) /* BUG CHECK command */ | ||||||
| 		if (el->el_errno == EINTR) { |  | ||||||
| 			el->el_line.buffer[0] = '\0'; |  | ||||||
| 			el->el_line.lastchar = |  | ||||||
| 			    el->el_line.cursor = el->el_line.buffer; |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		if ((unsigned int)cmdnum >= (unsigned int)el->el_map.nfunc) {	/* BUG CHECK command */ |  | ||||||
| #ifdef DEBUG_EDIT |  | ||||||
| 			(void) fprintf(el->el_errfile, |  | ||||||
| 			    "ERROR: illegal command from key 0%o\r\n", ch); |  | ||||||
| #endif /* DEBUG_EDIT */ |  | ||||||
| 			continue;	/* try again */ | 			continue;	/* try again */ | ||||||
| 		} |  | ||||||
| 		/* now do the real command */ | 		/* now do the real command */ | ||||||
| #ifdef DEBUG_READ |  | ||||||
| 		{ |  | ||||||
| 			el_bindings_t *b; |  | ||||||
| 			for (b = el->el_map.help; b->name; b++) |  | ||||||
| 				if (b->func == cmdnum) |  | ||||||
| 					break; |  | ||||||
| 			if (b->name) |  | ||||||
| 				(void) fprintf(el->el_errfile, |  | ||||||
| 				    "Executing %s\n", b->name); |  | ||||||
| 			else |  | ||||||
| 				(void) fprintf(el->el_errfile, |  | ||||||
| 				    "Error command = %d\n", cmdnum); |  | ||||||
| 		} |  | ||||||
| #endif /* DEBUG_READ */ |  | ||||||
| 		/* vi redo needs these way down the levels... */ | 		/* vi redo needs these way down the levels... */ | ||||||
| 		el->el_state.thiscmd = cmdnum; | 		el->el_state.thiscmd = cmdnum; | ||||||
| 		el->el_state.thisch = ch; | 		el->el_state.thisch = ch; | ||||||
| @@ -610,16 +536,12 @@ FUN(el,gets)(EditLine *el, int *nread) | |||||||
| 		    el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) { | 		    el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) { | ||||||
| 			if (cmdnum == VI_DELETE_PREV_CHAR && | 			if (cmdnum == VI_DELETE_PREV_CHAR && | ||||||
| 			    el->el_chared.c_redo.pos != el->el_chared.c_redo.buf | 			    el->el_chared.c_redo.pos != el->el_chared.c_redo.buf | ||||||
| 			    && Isprint(el->el_chared.c_redo.pos[-1])) | 			    && iswprint(el->el_chared.c_redo.pos[-1])) | ||||||
| 				el->el_chared.c_redo.pos--; | 				el->el_chared.c_redo.pos--; | ||||||
| 			else | 			else | ||||||
| 				*el->el_chared.c_redo.pos++ = ch; | 				*el->el_chared.c_redo.pos++ = ch; | ||||||
| 		} | 		} | ||||||
| 		retval = (*el->el_map.func[cmdnum]) (el, ch); | 		retval = (*el->el_map.func[cmdnum]) (el, ch); | ||||||
| #ifdef DEBUG_READ |  | ||||||
| 		(void) fprintf(el->el_errfile, |  | ||||||
| 			"Returned state %d\n", retval ); |  | ||||||
| #endif /* DEBUG_READ */ |  | ||||||
|  |  | ||||||
| 		/* save the last command here */ | 		/* save the last command here */ | ||||||
| 		el->el_state.lastcmd = cmdnum; | 		el->el_state.lastcmd = cmdnum; | ||||||
| @@ -641,7 +563,7 @@ FUN(el,gets)(EditLine *el, int *nread) | |||||||
|  |  | ||||||
| 		case CC_REFRESH_BEEP: | 		case CC_REFRESH_BEEP: | ||||||
| 			re_refresh(el); | 			re_refresh(el); | ||||||
| 			term_beep(el); | 			terminal_beep(el); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case CC_NORM:	/* normal char */ | 		case CC_NORM:	/* normal char */ | ||||||
| @@ -666,24 +588,17 @@ FUN(el,gets)(EditLine *el, int *nread) | |||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case CC_FATAL:	/* fatal error, reset to known state */ | 		case CC_FATAL:	/* fatal error, reset to known state */ | ||||||
| #ifdef DEBUG_READ |  | ||||||
| 			(void) fprintf(el->el_errfile, |  | ||||||
| 			    "*** editor fatal ERROR ***\r\n\n"); |  | ||||||
| #endif /* DEBUG_READ */ |  | ||||||
| 			/* put (real) cursor in a known place */ | 			/* put (real) cursor in a known place */ | ||||||
| 			re_clear_display(el);	/* reset the display stuff */ | 			re_clear_display(el);	/* reset the display stuff */ | ||||||
| 			ch_reset(el, 1);	/* reset the input pointers */ | 			ch_reset(el);	/* reset the input pointers */ | ||||||
|  | 			read_clearmacros(&el->el_read->macros); | ||||||
| 			re_refresh(el); /* print the prompt again */ | 			re_refresh(el); /* print the prompt again */ | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		case CC_ERROR: | 		case CC_ERROR: | ||||||
| 		default:	/* functions we don't know about */ | 		default:	/* functions we don't know about */ | ||||||
| #ifdef DEBUG_READ | 			terminal_beep(el); | ||||||
| 			(void) fprintf(el->el_errfile, | 			terminal__flush(el); | ||||||
| 			    "*** editor ERROR ***\r\n\n"); |  | ||||||
| #endif /* DEBUG_READ */ |  | ||||||
| 			term_beep(el); |  | ||||||
| 			term__flush(el); |  | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		el->el_state.argument = 1; | 		el->el_state.argument = 1; | ||||||
| @@ -693,24 +608,19 @@ FUN(el,gets)(EditLine *el, int *nread) | |||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	term__flush(el);		/* flush any buffered output */ | 	terminal__flush(el);		/* flush any buffered output */ | ||||||
| 	/* make sure the tty is set up correctly */ | 	/* make sure the tty is set up correctly */ | ||||||
| 	if ((el->el_flags & UNBUFFERED) == 0) { | 	if ((el->el_flags & UNBUFFERED) == 0) { | ||||||
| 		read_finish(el); | 		read_finish(el); | ||||||
| 		*nread = num != -1 ? num : 0; | 		*nread = num != -1 ? num : 0; | ||||||
| 	} else { | 	} else | ||||||
| 		*nread = (int)(el->el_line.lastchar - el->el_line.buffer); | 		*nread = (int)(el->el_line.lastchar - el->el_line.buffer); | ||||||
| 	} |  | ||||||
| 	goto done; |  | ||||||
| noedit: |  | ||||||
| 	el->el_line.cursor = el->el_line.lastchar = cp; |  | ||||||
| 	*cp = '\0'; |  | ||||||
| 	*nread = (int)(el->el_line.cursor - el->el_line.buffer); |  | ||||||
| done: |  | ||||||
| 	if (*nread == 0) { | 	if (*nread == 0) { | ||||||
| 		if (num == -1) { | 		if (num == -1) { | ||||||
| 			*nread = -1; | 			*nread = -1; | ||||||
| 			errno = el->el_errno; | 			if (el->el_read->read_errno) | ||||||
|  | 				errno = el->el_read->read_errno; | ||||||
| 		} | 		} | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} else | 	} else | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: read.h,v 1.7 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: read.h,v 1.12 2016/05/22 19:44:26 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 2001 The NetBSD Foundation, Inc. |  * Copyright (c) 2001 The NetBSD Foundation, Inc. | ||||||
| @@ -35,16 +35,11 @@ | |||||||
| #ifndef	_h_el_read | #ifndef	_h_el_read | ||||||
| #define	_h_el_read | #define	_h_el_read | ||||||
|  |  | ||||||
| typedef int (*el_rfunc_t)(EditLine *, Char *); | libedit_private int		read_init(EditLine *); | ||||||
|  | libedit_private void		read_end(struct el_read_t *); | ||||||
| typedef struct el_read_t { | libedit_private void		read_prepare(EditLine *); | ||||||
| 	el_rfunc_t	read_char;	/* Function to read a character */ | libedit_private void		read_finish(EditLine *); | ||||||
| } el_read_t; | libedit_private int		el_read_setfn(struct el_read_t *, el_rfunc_t); | ||||||
|  | libedit_private el_rfunc_t	el_read_getfn(struct el_read_t *); | ||||||
| protected int		read_init(EditLine *); |  | ||||||
| protected void		read_prepare(EditLine *); |  | ||||||
| protected void		read_finish(EditLine *); |  | ||||||
| protected int		el_read_setfn(EditLine *, el_rfunc_t); |  | ||||||
| protected el_rfunc_t	el_read_getfn(EditLine *); |  | ||||||
|  |  | ||||||
| #endif /* _h_el_read */ | #endif /* _h_el_read */ | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: readline.h,v 1.32 2010/09/16 20:08:52 christos Exp $	*/ | /*	$NetBSD: readline.h,v 1.41 2016/10/28 18:32:35 christos Exp $	*/ | ||||||
| 
 | 
 | ||||||
| /*-
 | /*-
 | ||||||
|  * Copyright (c) 1997 The NetBSD Foundation, Inc. |  * Copyright (c) 1997 The NetBSD Foundation, Inc. | ||||||
| @@ -39,9 +39,8 @@ | |||||||
| /* typedefs */ | /* typedefs */ | ||||||
| typedef int	  Function(const char *, int); | typedef int	  Function(const char *, int); | ||||||
| typedef void	  VFunction(void); | typedef void	  VFunction(void); | ||||||
| typedef void	  VCPFunction(char *); | typedef void	  rl_vcpfunc_t(char *); | ||||||
| typedef char	 *CPFunction(const char *, int); | typedef char	**rl_completion_func_t(const char *, int, int); | ||||||
| typedef char	**CPPFunction(const char *, int, int); |  | ||||||
| typedef char     *rl_compentry_func_t(const char *, int); | typedef char     *rl_compentry_func_t(const char *, int); | ||||||
| typedef int	  rl_command_func_t(int, int); | typedef int	  rl_command_func_t(int, int); | ||||||
| 
 | 
 | ||||||
| @@ -108,8 +107,9 @@ extern int		 max_input_history; | |||||||
| extern char		*rl_basic_word_break_characters; | extern char		*rl_basic_word_break_characters; | ||||||
| extern char		*rl_completer_word_break_characters; | extern char		*rl_completer_word_break_characters; | ||||||
| extern char		*rl_completer_quote_characters; | extern char		*rl_completer_quote_characters; | ||||||
| extern Function		*rl_completion_entry_function; | extern rl_compentry_func_t *rl_completion_entry_function; | ||||||
| extern CPPFunction	*rl_attempted_completion_function; | extern char		*(*rl_completion_word_break_hook)(void); | ||||||
|  | extern rl_completion_func_t *rl_attempted_completion_function; | ||||||
| extern int		 rl_attempted_completion_over; | extern int		 rl_attempted_completion_over; | ||||||
| extern int		rl_completion_type; | extern int		rl_completion_type; | ||||||
| extern int		rl_completion_query_items; | extern int		rl_completion_query_items; | ||||||
| @@ -121,9 +121,12 @@ extern Function		*rl_startup_hook; | |||||||
| extern char		*rl_terminal_name; | extern char		*rl_terminal_name; | ||||||
| extern int		rl_already_prompted; | extern int		rl_already_prompted; | ||||||
| extern char		*rl_prompt; | extern char		*rl_prompt; | ||||||
|  | extern int		rl_done; | ||||||
| /*
 | /*
 | ||||||
|  * The following is not implemented |  * The following is not implemented | ||||||
|  */ |  */ | ||||||
|  | extern int		rl_catch_signals; | ||||||
|  | extern int		rl_catch_sigwinch; | ||||||
| extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, | extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, | ||||||
| 			emacs_meta_keymap, | 			emacs_meta_keymap, | ||||||
| 			emacs_ctlx_keymap; | 			emacs_ctlx_keymap; | ||||||
| @@ -156,6 +159,7 @@ int		 history_total_bytes(void); | |||||||
| int		 history_set_pos(int); | int		 history_set_pos(int); | ||||||
| HIST_ENTRY	*previous_history(void); | HIST_ENTRY	*previous_history(void); | ||||||
| HIST_ENTRY	*next_history(void); | HIST_ENTRY	*next_history(void); | ||||||
|  | HIST_ENTRY     **history_list(void); | ||||||
| int		 history_search(const char *, int); | int		 history_search(const char *, int); | ||||||
| int		 history_search_prefix(const char *, int); | int		 history_search_prefix(const char *, int); | ||||||
| int		 history_search_pos(const char *, int, int); | int		 history_search_pos(const char *, int, int); | ||||||
| @@ -172,7 +176,7 @@ char		*filename_completion_function(const char *, int); | |||||||
| char		*username_completion_function(const char *, int); | char		*username_completion_function(const char *, int); | ||||||
| int		 rl_complete(int, int); | int		 rl_complete(int, int); | ||||||
| int		 rl_read_key(void); | int		 rl_read_key(void); | ||||||
| char	       **completion_matches(const char *, CPFunction *); | char	       **completion_matches(const char *, rl_compentry_func_t *); | ||||||
| void		 rl_display_match_list(char **, int, int); | void		 rl_display_match_list(char **, int, int); | ||||||
| 
 | 
 | ||||||
| int		 rl_insert(int, int); | int		 rl_insert(int, int); | ||||||
| @@ -181,7 +185,7 @@ void		 rl_reset_terminal(const char *); | |||||||
| int		 rl_bind_key(int, rl_command_func_t *); | int		 rl_bind_key(int, rl_command_func_t *); | ||||||
| int		 rl_newline(int, int); | int		 rl_newline(int, int); | ||||||
| void		 rl_callback_read_char(void); | void		 rl_callback_read_char(void); | ||||||
| void		 rl_callback_handler_install(const char *, VCPFunction *); | void		 rl_callback_handler_install(const char *, rl_vcpfunc_t *); | ||||||
| void		 rl_callback_handler_remove(void); | void		 rl_callback_handler_remove(void); | ||||||
| void		 rl_redisplay(void); | void		 rl_redisplay(void); | ||||||
| int		 rl_get_previous_history(int, int); | int		 rl_get_previous_history(int, int); | ||||||
| @@ -191,7 +195,7 @@ int		 rl_read_init_file(const char *); | |||||||
| int		 rl_parse_and_bind(const char *); | int		 rl_parse_and_bind(const char *); | ||||||
| int		 rl_variable_bind(const char *, const char *); | int		 rl_variable_bind(const char *, const char *); | ||||||
| void		 rl_stuff_char(int); | void		 rl_stuff_char(int); | ||||||
| int		 rl_add_defun(const char *, Function *, int); | int		 rl_add_defun(const char *, rl_command_func_t *, int); | ||||||
| HISTORY_STATE	*history_get_history_state(void); | HISTORY_STATE	*history_get_history_state(void); | ||||||
| void		 rl_get_screen_size(int *, int *); | void		 rl_get_screen_size(int *, int *); | ||||||
| void		 rl_set_screen_size(int, int); | void		 rl_set_screen_size(int, int); | ||||||
| @@ -214,6 +218,8 @@ int		 rl_generic_bind(int, const char *, const char *, Keymap); | |||||||
| int		 rl_bind_key_in_map(int, rl_command_func_t *, Keymap); | int		 rl_bind_key_in_map(int, rl_command_func_t *, Keymap); | ||||||
| void		 rl_cleanup_after_signal(void); | void		 rl_cleanup_after_signal(void); | ||||||
| void		 rl_free_line_state(void); | void		 rl_free_line_state(void); | ||||||
|  | int		 rl_set_keyboard_input_timeout(int); | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: refresh.c,v 1.35 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: refresh.c,v 1.51 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,7 +37,7 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)refresh.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)refresh.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: refresh.c,v 1.35 2009/12/30 22:37:40 christos Exp $"); | __RCSID("$NetBSD: refresh.c,v 1.51 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| @@ -45,24 +45,23 @@ __RCSID("$NetBSD: refresh.c,v 1.35 2009/12/30 22:37:40 christos Exp $"); | |||||||
|  * refresh.c: Lower level screen refreshing functions |  * refresh.c: Lower level screen refreshing functions | ||||||
|  */ |  */ | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <ctype.h> |  | ||||||
| #include <unistd.h> |  | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  |  | ||||||
| private void	re_nextline(EditLine *); | static void	re_nextline(EditLine *); | ||||||
| private void	re_addc(EditLine *, Int); | static void	re_addc(EditLine *, wint_t); | ||||||
| private void	re_update_line(EditLine *, Char *, Char *, int); | static void	re_update_line(EditLine *, wchar_t *, wchar_t *, int); | ||||||
| private void	re_insert (EditLine *, Char *, int, int, Char *, int); | static void	re_insert (EditLine *, wchar_t *, int, int, wchar_t *, int); | ||||||
| private void	re_delete(EditLine *, Char *, int, int, int); | static void	re_delete(EditLine *, wchar_t *, int, int, int); | ||||||
| private void	re_fastputc(EditLine *, Int); | static void	re_fastputc(EditLine *, wint_t); | ||||||
| private void	re_clear_eol(EditLine *, int, int, int); | static void	re_clear_eol(EditLine *, int, int, int); | ||||||
| private void	re__strncopy(Char *, Char *, size_t); | static void	re__strncopy(wchar_t *, wchar_t *, size_t); | ||||||
| private void	re__copy_and_pad(Char *, const Char *, size_t); | static void	re__copy_and_pad(wchar_t *, const wchar_t *, size_t); | ||||||
|  |  | ||||||
| #ifdef DEBUG_REFRESH | #ifdef DEBUG_REFRESH | ||||||
| private void	re_printstr(EditLine *, const char *, char *, char *); | static void	re_printstr(EditLine *, const char *, wchar_t *, wchar_t *); | ||||||
| #define	__F el->el_errfile | #define	__F el->el_errfile | ||||||
| #define	ELRE_ASSERT(a, b, c)	do				\ | #define	ELRE_ASSERT(a, b, c)	do				\ | ||||||
| 				    if (/*CONSTCOND*/ a) {	\ | 				    if (/*CONSTCOND*/ a) {	\ | ||||||
| @@ -75,8 +74,8 @@ private void	re_printstr(EditLine *, const char *, char *, char *); | |||||||
| /* re_printstr(): | /* re_printstr(): | ||||||
|  *	Print a string on the debugging pty |  *	Print a string on the debugging pty | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| re_printstr(EditLine *el, const char *str, char *f, char *t) | re_printstr(EditLine *el, const char *str, wchar_t *f, wchar_t *t) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	ELRE_DEBUG(1, (__F, "%s:\"", str)); | 	ELRE_DEBUG(1, (__F, "%s:\"", str)); | ||||||
| @@ -92,7 +91,7 @@ re_printstr(EditLine *el, const char *str, char *f, char *t) | |||||||
| /* re_nextline(): | /* re_nextline(): | ||||||
|  *	Move to the next line or scroll |  *	Move to the next line or scroll | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| re_nextline(EditLine *el) | re_nextline(EditLine *el) | ||||||
| { | { | ||||||
| 	el->el_refresh.r_cursor.h = 0;	/* reset it. */ | 	el->el_refresh.r_cursor.h = 0;	/* reset it. */ | ||||||
| @@ -103,9 +102,9 @@ re_nextline(EditLine *el) | |||||||
| 	 * We do this via pointer shuffling - it's safe in this case | 	 * We do this via pointer shuffling - it's safe in this case | ||||||
| 	 * and we avoid memcpy(). | 	 * and we avoid memcpy(). | ||||||
| 	 */ | 	 */ | ||||||
| 	if (el->el_refresh.r_cursor.v + 1 >= el->el_term.t_size.v) { | 	if (el->el_refresh.r_cursor.v + 1 >= el->el_terminal.t_size.v) { | ||||||
| 		int i, lins = el->el_term.t_size.v; | 		int i, lins = el->el_terminal.t_size.v; | ||||||
| 		Char *firstline = el->el_vdisplay[0]; | 		wchar_t *firstline = el->el_vdisplay[0]; | ||||||
|  |  | ||||||
| 		for(i = 1; i < lins; i++) | 		for(i = 1; i < lins; i++) | ||||||
| 			el->el_vdisplay[i - 1] = el->el_vdisplay[i]; | 			el->el_vdisplay[i - 1] = el->el_vdisplay[i]; | ||||||
| @@ -115,19 +114,19 @@ re_nextline(EditLine *el) | |||||||
| 	} else | 	} else | ||||||
| 		el->el_refresh.r_cursor.v++; | 		el->el_refresh.r_cursor.v++; | ||||||
|  |  | ||||||
| 	ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_term.t_size.v, | 	ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_terminal.t_size.v, | ||||||
| 	    (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n", | 	    (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n", | ||||||
| 	    el->el_refresh.r_cursor.v, el->el_term.t_size.v), | 	    el->el_refresh.r_cursor.v, el->el_terminal.t_size.v), | ||||||
| 	    abort()); | 	    abort()); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* re_addc(): | /* re_addc(): | ||||||
|  *	Draw c, expanding tabs, control chars etc. |  *	Draw c, expanding tabs, control chars etc. | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| re_addc(EditLine *el, Int c) | re_addc(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
| 	switch (ct_chr_class((Char)c)) { | 	switch (ct_chr_class(c)) { | ||||||
| 	case CHTYPE_TAB:        /* expand the tab */ | 	case CHTYPE_TAB:        /* expand the tab */ | ||||||
| 		for (;;) { | 		for (;;) { | ||||||
| 			re_putc(el, ' ', 1); | 			re_putc(el, ' ', 1); | ||||||
| @@ -146,9 +145,9 @@ re_addc(EditLine *el, Int c) | |||||||
| 		re_putc(el, c, 1); | 		re_putc(el, c, 1); | ||||||
| 		break; | 		break; | ||||||
| 	default: { | 	default: { | ||||||
| 		Char visbuf[VISUAL_WIDTH_MAX]; | 		wchar_t visbuf[VISUAL_WIDTH_MAX]; | ||||||
| 		ssize_t i, n = | 		ssize_t i, n = | ||||||
| 		    ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c); | 		    ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c); | ||||||
| 		for (i = 0; n-- > 0; ++i) | 		for (i = 0; n-- > 0; ++i) | ||||||
| 		    re_putc(el, visbuf[i], 1); | 		    re_putc(el, visbuf[i], 1); | ||||||
| 		break; | 		break; | ||||||
| @@ -160,13 +159,15 @@ re_addc(EditLine *el, Int c) | |||||||
| /* re_putc(): | /* re_putc(): | ||||||
|  *	Draw the character given |  *	Draw the character given | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| re_putc(EditLine *el, Int c, int shift) | re_putc(EditLine *el, wint_t c, int shift) | ||||||
| { | { | ||||||
| 	int i, w = Width(c); | 	int i, w = wcwidth(c); | ||||||
| 	ELRE_DEBUG(1, (__F, "printing %5x '%c'\r\n", c, c)); | 	ELRE_DEBUG(1, (__F, "printing %5x '%lc'\r\n", c, c)); | ||||||
|  | 	if (w == -1) | ||||||
|  | 		w = 0; | ||||||
|  |  | ||||||
| 	while (shift && (el->el_refresh.r_cursor.h + w > el->el_term.t_size.h)) | 	while (shift && (el->el_refresh.r_cursor.h + w > el->el_terminal.t_size.h)) | ||||||
| 	    re_putc(el, ' ', 1); | 	    re_putc(el, ' ', 1); | ||||||
|  |  | ||||||
| 	el->el_vdisplay[el->el_refresh.r_cursor.v] | 	el->el_vdisplay[el->el_refresh.r_cursor.v] | ||||||
| @@ -181,9 +182,9 @@ re_putc(EditLine *el, Int c, int shift) | |||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	el->el_refresh.r_cursor.h += w;	/* advance to next place */ | 	el->el_refresh.r_cursor.h += w;	/* advance to next place */ | ||||||
| 	if (el->el_refresh.r_cursor.h >= el->el_term.t_size.h) { | 	if (el->el_refresh.r_cursor.h >= el->el_terminal.t_size.h) { | ||||||
| 		/* assure end of line */ | 		/* assure end of line */ | ||||||
| 		el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_term.t_size.h] | 		el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_terminal.t_size.h] | ||||||
| 		    = '\0'; | 		    = '\0'; | ||||||
| 		re_nextline(el); | 		re_nextline(el); | ||||||
| 	} | 	} | ||||||
| @@ -196,17 +197,17 @@ re_putc(EditLine *el, Int c, int shift) | |||||||
|  *	virtual image. The routine to re-draw a line can be replaced |  *	virtual image. The routine to re-draw a line can be replaced | ||||||
|  *	easily in hopes of a smarter one being placed there. |  *	easily in hopes of a smarter one being placed there. | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| re_refresh(EditLine *el) | re_refresh(EditLine *el) | ||||||
| { | { | ||||||
| 	int i, rhdiff; | 	int i, rhdiff; | ||||||
| 	Char *cp, *st; | 	wchar_t *cp, *st; | ||||||
| 	coord_t cur; | 	coord_t cur; | ||||||
| #ifdef notyet | #ifdef notyet | ||||||
| 	size_t termsz; | 	size_t termsz; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	ELRE_DEBUG(1, (__F, "el->el_line.buffer = :%s:\r\n", | 	ELRE_DEBUG(1, (__F, "el->el_line.buffer = :%ls:\r\n", | ||||||
| 	    el->el_line.buffer)); | 	    el->el_line.buffer)); | ||||||
|  |  | ||||||
| 	/* reset the Drawing cursor */ | 	/* reset the Drawing cursor */ | ||||||
| @@ -235,7 +236,7 @@ re_refresh(EditLine *el) | |||||||
|  |  | ||||||
| 	/* draw the current input buffer */ | 	/* draw the current input buffer */ | ||||||
| #if notyet | #if notyet | ||||||
| 	termsz = el->el_term.t_size.h * el->el_term.t_size.v; | 	termsz = el->el_terminal.t_size.h * el->el_terminal.t_size.v; | ||||||
| 	if (el->el_line.lastchar - el->el_line.buffer > termsz) { | 	if (el->el_line.lastchar - el->el_line.buffer > termsz) { | ||||||
| 		/* | 		/* | ||||||
| 		 * If line is longer than terminal, process only part | 		 * If line is longer than terminal, process only part | ||||||
| @@ -244,21 +245,21 @@ re_refresh(EditLine *el) | |||||||
| 		size_t rem = (el->el_line.lastchar-el->el_line.buffer)%termsz; | 		size_t rem = (el->el_line.lastchar-el->el_line.buffer)%termsz; | ||||||
|  |  | ||||||
| 		st = el->el_line.lastchar - rem | 		st = el->el_line.lastchar - rem | ||||||
| 			- (termsz - (((rem / el->el_term.t_size.v) - 1) | 			- (termsz - (((rem / el->el_terminal.t_size.v) - 1) | ||||||
| 					* el->el_term.t_size.v)); | 					* el->el_terminal.t_size.v)); | ||||||
| 	} else | 	} else | ||||||
| #endif | #endif | ||||||
| 		st = el->el_line.buffer; | 		st = el->el_line.buffer; | ||||||
|  |  | ||||||
| 	for (cp = st; cp < el->el_line.lastchar; cp++) { | 	for (cp = st; cp < el->el_line.lastchar; cp++) { | ||||||
| 		if (cp == el->el_line.cursor) { | 		if (cp == el->el_line.cursor) { | ||||||
|                         int w = Width(*cp); |                         int w = wcwidth(*cp); | ||||||
| 			/* save for later */ | 			/* save for later */ | ||||||
| 			cur.h = el->el_refresh.r_cursor.h; | 			cur.h = el->el_refresh.r_cursor.h; | ||||||
| 			cur.v = el->el_refresh.r_cursor.v; | 			cur.v = el->el_refresh.r_cursor.v; | ||||||
|                         /* handle being at a linebroken doublewidth char */ |                         /* handle being at a linebroken doublewidth char */ | ||||||
|                         if (w > 1 && el->el_refresh.r_cursor.h + w > |                         if (w > 1 && el->el_refresh.r_cursor.h + w > | ||||||
| 			    el->el_term.t_size.h) { | 			    el->el_terminal.t_size.h) { | ||||||
| 				cur.h = 0; | 				cur.h = 0; | ||||||
| 				cur.v++; | 				cur.v++; | ||||||
|                         } |                         } | ||||||
| @@ -270,7 +271,7 @@ re_refresh(EditLine *el) | |||||||
| 		cur.h = el->el_refresh.r_cursor.h; | 		cur.h = el->el_refresh.r_cursor.h; | ||||||
| 		cur.v = el->el_refresh.r_cursor.v; | 		cur.v = el->el_refresh.r_cursor.v; | ||||||
| 	} | 	} | ||||||
| 	rhdiff = el->el_term.t_size.h - el->el_refresh.r_cursor.h - | 	rhdiff = el->el_terminal.t_size.h - el->el_refresh.r_cursor.h - | ||||||
| 	    el->el_rprompt.p_pos.h; | 	    el->el_rprompt.p_pos.h; | ||||||
| 	if (el->el_rprompt.p_pos.h && !el->el_rprompt.p_pos.v && | 	if (el->el_rprompt.p_pos.h && !el->el_rprompt.p_pos.v && | ||||||
| 	    !el->el_refresh.r_cursor.v && rhdiff > 1) { | 	    !el->el_refresh.r_cursor.v && rhdiff > 1) { | ||||||
| @@ -293,8 +294,9 @@ re_refresh(EditLine *el) | |||||||
|  |  | ||||||
| 	ELRE_DEBUG(1, (__F, | 	ELRE_DEBUG(1, (__F, | ||||||
| 		"term.h=%d vcur.h=%d vcur.v=%d vdisplay[0]=\r\n:%80.80s:\r\n", | 		"term.h=%d vcur.h=%d vcur.v=%d vdisplay[0]=\r\n:%80.80s:\r\n", | ||||||
| 		el->el_term.t_size.h, el->el_refresh.r_cursor.h, | 		el->el_terminal.t_size.h, el->el_refresh.r_cursor.h, | ||||||
| 		el->el_refresh.r_cursor.v, ct_encode_string(el->el_vdisplay[0]))); | 		el->el_refresh.r_cursor.v, ct_encode_string(el->el_vdisplay[0], | ||||||
|  | 		&el->el_scratch))); | ||||||
|  |  | ||||||
| 	ELRE_DEBUG(1, (__F, "updating %d lines.\r\n", el->el_refresh.r_newcv)); | 	ELRE_DEBUG(1, (__F, "updating %d lines.\r\n", el->el_refresh.r_newcv)); | ||||||
| 	for (i = 0; i <= el->el_refresh.r_newcv; i++) { | 	for (i = 0; i <= el->el_refresh.r_newcv; i++) { | ||||||
| @@ -309,7 +311,7 @@ re_refresh(EditLine *el) | |||||||
| 		 * leftover stuff. | 		 * leftover stuff. | ||||||
| 		 */ | 		 */ | ||||||
| 		re__copy_and_pad(el->el_display[i], el->el_vdisplay[i], | 		re__copy_and_pad(el->el_display[i], el->el_vdisplay[i], | ||||||
| 		    (size_t) el->el_term.t_size.h); | 		    (size_t) el->el_terminal.t_size.h); | ||||||
| 	} | 	} | ||||||
| 	ELRE_DEBUG(1, (__F, | 	ELRE_DEBUG(1, (__F, | ||||||
| 	"\r\nel->el_refresh.r_cursor.v=%d,el->el_refresh.r_oldcv=%d i=%d\r\n", | 	"\r\nel->el_refresh.r_cursor.v=%d,el->el_refresh.r_oldcv=%d i=%d\r\n", | ||||||
| @@ -317,12 +319,12 @@ re_refresh(EditLine *el) | |||||||
|  |  | ||||||
| 	if (el->el_refresh.r_oldcv > el->el_refresh.r_newcv) | 	if (el->el_refresh.r_oldcv > el->el_refresh.r_newcv) | ||||||
| 		for (; i <= el->el_refresh.r_oldcv; i++) { | 		for (; i <= el->el_refresh.r_oldcv; i++) { | ||||||
| 			term_move_to_line(el, i); | 			terminal_move_to_line(el, i); | ||||||
| 			term_move_to_char(el, 0); | 			terminal_move_to_char(el, 0); | ||||||
|                         /* This Strlen should be safe even with MB_FILL_CHARs */ |                         /* This wcslen should be safe even with MB_FILL_CHARs */ | ||||||
| 			term_clear_EOL(el, (int) Strlen(el->el_display[i])); | 			terminal_clear_EOL(el, (int) wcslen(el->el_display[i])); | ||||||
| #ifdef DEBUG_REFRESH | #ifdef DEBUG_REFRESH | ||||||
| 			term_overwrite(el, "C\b", (size_t)2); | 			terminal_overwrite(el, L"C\b", 2); | ||||||
| #endif /* DEBUG_REFRESH */ | #endif /* DEBUG_REFRESH */ | ||||||
| 			el->el_display[i][0] = '\0'; | 			el->el_display[i][0] = '\0'; | ||||||
| 		} | 		} | ||||||
| @@ -332,22 +334,22 @@ re_refresh(EditLine *el) | |||||||
| 	    "\r\ncursor.h = %d, cursor.v = %d, cur.h = %d, cur.v = %d\r\n", | 	    "\r\ncursor.h = %d, cursor.v = %d, cur.h = %d, cur.v = %d\r\n", | ||||||
| 	    el->el_refresh.r_cursor.h, el->el_refresh.r_cursor.v, | 	    el->el_refresh.r_cursor.h, el->el_refresh.r_cursor.v, | ||||||
| 	    cur.h, cur.v)); | 	    cur.h, cur.v)); | ||||||
| 	term_move_to_line(el, cur.v);	/* go to where the cursor is */ | 	terminal_move_to_line(el, cur.v);	/* go to where the cursor is */ | ||||||
| 	term_move_to_char(el, cur.h); | 	terminal_move_to_char(el, cur.h); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* re_goto_bottom(): | /* re_goto_bottom(): | ||||||
|  *	 used to go to last used screen line |  *	 used to go to last used screen line | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| re_goto_bottom(EditLine *el) | re_goto_bottom(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	term_move_to_line(el, el->el_refresh.r_oldcv); | 	terminal_move_to_line(el, el->el_refresh.r_oldcv); | ||||||
| 	term__putc(el, '\n'); | 	terminal__putc(el, '\n'); | ||||||
| 	re_clear_display(el); | 	re_clear_display(el); | ||||||
| 	term__flush(el); | 	terminal__flush(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -355,12 +357,12 @@ re_goto_bottom(EditLine *el) | |||||||
|  *	insert num characters of s into d (in front of the character) |  *	insert num characters of s into d (in front of the character) | ||||||
|  *	at dat, maximum length of d is dlen |  *	at dat, maximum length of d is dlen | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| re_insert(EditLine *el __attribute__((__unused__)), | re_insert(EditLine *el __attribute__((__unused__)), | ||||||
|     Char *d, int dat, int dlen, Char *s, int num) |     wchar_t *d, int dat, int dlen, wchar_t *s, int num) | ||||||
| { | { | ||||||
| 	Char *a, *b; | 	wchar_t *a, *b; | ||||||
|  |  | ||||||
| 	if (num <= 0) | 	if (num <= 0) | ||||||
| 		return; | 		return; | ||||||
| @@ -369,8 +371,9 @@ re_insert(EditLine *el __attribute__((__unused__)), | |||||||
|  |  | ||||||
| 	ELRE_DEBUG(1, | 	ELRE_DEBUG(1, | ||||||
| 	    (__F, "re_insert() starting: %d at %d max %d, d == \"%s\"\n", | 	    (__F, "re_insert() starting: %d at %d max %d, d == \"%s\"\n", | ||||||
| 	    num, dat, dlen, ct_encode_string(d))); | 	    num, dat, dlen, ct_encode_string(d, &el->el_scratch))); | ||||||
| 	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s))); | 	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s, | ||||||
|  | 	    &el->el_scratch))); | ||||||
|  |  | ||||||
| 	/* open up the space for num chars */ | 	/* open up the space for num chars */ | ||||||
| 	if (num > 0) { | 	if (num > 0) { | ||||||
| @@ -383,8 +386,9 @@ re_insert(EditLine *el __attribute__((__unused__)), | |||||||
|  |  | ||||||
| 	ELRE_DEBUG(1, (__F, | 	ELRE_DEBUG(1, (__F, | ||||||
| 		"re_insert() after insert: %d at %d max %d, d == \"%s\"\n", | 		"re_insert() after insert: %d at %d max %d, d == \"%s\"\n", | ||||||
| 		num, dat, dlen, ct_encode_string(d))); | 		num, dat, dlen, ct_encode_string(d, &el->el_scratch))); | ||||||
| 	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s))); | 	ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s, | ||||||
|  | 		&el->el_scratch))); | ||||||
|  |  | ||||||
| 	/* copy the characters */ | 	/* copy the characters */ | ||||||
| 	for (a = d + dat; (a < d + dlen) && (num > 0); num--) | 	for (a = d + dat; (a < d + dlen) && (num > 0); num--) | ||||||
| @@ -404,12 +408,12 @@ re_insert(EditLine *el __attribute__((__unused__)), | |||||||
| /* re_delete(): | /* re_delete(): | ||||||
|  *	delete num characters d at dat, maximum length of d is dlen |  *	delete num characters d at dat, maximum length of d is dlen | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| re_delete(EditLine *el __attribute__((__unused__)), | re_delete(EditLine *el __attribute__((__unused__)), | ||||||
|     Char *d, int dat, int dlen, int num) |     wchar_t *d, int dat, int dlen, int num) | ||||||
| { | { | ||||||
| 	Char *a, *b; | 	wchar_t *a, *b; | ||||||
|  |  | ||||||
| 	if (num <= 0) | 	if (num <= 0) | ||||||
| 		return; | 		return; | ||||||
| @@ -419,7 +423,7 @@ re_delete(EditLine *el __attribute__((__unused__)), | |||||||
| 	} | 	} | ||||||
| 	ELRE_DEBUG(1, | 	ELRE_DEBUG(1, | ||||||
| 	    (__F, "re_delete() starting: %d at %d max %d, d == \"%s\"\n", | 	    (__F, "re_delete() starting: %d at %d max %d, d == \"%s\"\n", | ||||||
| 	    num, dat, dlen, ct_encode_string(d))); | 	    num, dat, dlen, ct_encode_string(d, &el->el_scratch))); | ||||||
|  |  | ||||||
| 	/* open up the space for num chars */ | 	/* open up the space for num chars */ | ||||||
| 	if (num > 0) { | 	if (num > 0) { | ||||||
| @@ -431,15 +435,15 @@ re_delete(EditLine *el __attribute__((__unused__)), | |||||||
| 	} | 	} | ||||||
| 	ELRE_DEBUG(1, | 	ELRE_DEBUG(1, | ||||||
| 	    (__F, "re_delete() after delete: %d at %d max %d, d == \"%s\"\n", | 	    (__F, "re_delete() after delete: %d at %d max %d, d == \"%s\"\n", | ||||||
| 	    num, dat, dlen, ct_encode_string(d))); | 	    num, dat, dlen, ct_encode_string(d, &el->el_scratch))); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* re__strncopy(): | /* re__strncopy(): | ||||||
|  *	Like strncpy without padding. |  *	Like strncpy without padding. | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| re__strncopy(Char *a, Char *b, size_t n) | re__strncopy(wchar_t *a, wchar_t *b, size_t n) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	while (n-- && *b) | 	while (n-- && *b) | ||||||
| @@ -453,7 +457,7 @@ re__strncopy(Char *a, Char *b, size_t n) | |||||||
|  *	in the first or second diff, diff is the difference between the |  *	in the first or second diff, diff is the difference between the | ||||||
|  *	number of characters between the new and old line. |  *	number of characters between the new and old line. | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| re_clear_eol(EditLine *el, int fx, int sx, int diff) | re_clear_eol(EditLine *el, int fx, int sx, int diff) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -470,7 +474,7 @@ re_clear_eol(EditLine *el, int fx, int sx, int diff) | |||||||
| 		diff = sx; | 		diff = sx; | ||||||
|  |  | ||||||
| 	ELRE_DEBUG(1, (__F, "re_clear_eol %d\n", diff)); | 	ELRE_DEBUG(1, (__F, "re_clear_eol %d\n", diff)); | ||||||
| 	term_clear_EOL(el, diff); | 	terminal_clear_EOL(el, diff); | ||||||
| } | } | ||||||
|  |  | ||||||
| /***************************************************************** | /***************************************************************** | ||||||
| @@ -497,12 +501,12 @@ new:	eddie> Oh, my little buggy says to me, as lurgid as | |||||||
|  */ |  */ | ||||||
| #define	MIN_END_KEEP	4 | #define	MIN_END_KEEP	4 | ||||||
|  |  | ||||||
| private void | static void | ||||||
| re_update_line(EditLine *el, Char *old, Char *new, int i) | re_update_line(EditLine *el, wchar_t *old, wchar_t *new, int i) | ||||||
| { | { | ||||||
| 	Char *o, *n, *p, c; | 	wchar_t *o, *n, *p, c; | ||||||
| 	Char *ofd, *ols, *oe, *nfd, *nls, *ne; | 	wchar_t *ofd, *ols, *oe, *nfd, *nls, *ne; | ||||||
| 	Char *osb, *ose, *nsb, *nse; | 	wchar_t *osb, *ose, *nsb, *nse; | ||||||
| 	int fx, sx; | 	int fx, sx; | ||||||
| 	size_t len; | 	size_t len; | ||||||
|  |  | ||||||
| @@ -559,7 +563,7 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 	nls = ++n; | 	nls = ++n; | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
|          * find same begining and same end |          * find same beginning and same end | ||||||
|          */ |          */ | ||||||
| 	osb = ols; | 	osb = ols; | ||||||
| 	nsb = nls; | 	nsb = nls; | ||||||
| @@ -689,9 +693,9 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 	sx = (int)((nls - nse) - (ols - ose)); | 	sx = (int)((nls - nse) - (ols - ose)); | ||||||
|  |  | ||||||
| 	ELRE_DEBUG(1, (__F, "fx %d, sx %d\n", fx, sx)); | 	ELRE_DEBUG(1, (__F, "fx %d, sx %d\n", fx, sx)); | ||||||
| 	ELRE_DEBUG(1, (__F, "ofd %d, osb %d, ose %d, ols %d, oe %d\n", | 	ELRE_DEBUG(1, (__F, "ofd %td, osb %td, ose %td, ols %td, oe %td\n", | ||||||
| 		ofd - old, osb - old, ose - old, ols - old, oe - old)); | 		ofd - old, osb - old, ose - old, ols - old, oe - old)); | ||||||
| 	ELRE_DEBUG(1, (__F, "nfd %d, nsb %d, nse %d, nls %d, ne %d\n", | 	ELRE_DEBUG(1, (__F, "nfd %td, nsb %td, nse %td, nls %td, ne %td\n", | ||||||
| 		nfd - new, nsb - new, nse - new, nls - new, ne - new)); | 		nfd - new, nsb - new, nse - new, nls - new, ne - new)); | ||||||
| 	ELRE_DEBUG(1, (__F, | 	ELRE_DEBUG(1, (__F, | ||||||
| 		"xxx-xxx:\"00000000001111111111222222222233333333334\"\r\n")); | 		"xxx-xxx:\"00000000001111111111222222222233333333334\"\r\n")); | ||||||
| @@ -717,7 +721,7 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
|          * don't have to change the line, we don't move to it. el_cursor.h to |          * don't have to change the line, we don't move to it. el_cursor.h to | ||||||
|          * first diff char |          * first diff char | ||||||
|          */ |          */ | ||||||
| 	term_move_to_line(el, i); | 	terminal_move_to_line(el, i); | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
|          * at this point we have something like this: |          * at this point we have something like this: | ||||||
| @@ -741,7 +745,7 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
|          * if we have a net insert on the first difference, AND inserting the |          * if we have a net insert on the first difference, AND inserting the | ||||||
|          * net amount ((nsb-nfd) - (osb-ofd)) won't push the last useful |          * net amount ((nsb-nfd) - (osb-ofd)) won't push the last useful | ||||||
|          * character (which is ne if nls != ne, otherwise is nse) off the edge |          * character (which is ne if nls != ne, otherwise is nse) off the edge | ||||||
| 	 * of the screen (el->el_term.t_size.h) else we do the deletes first | 	 * of the screen (el->el_terminal.t_size.h) else we do the deletes first | ||||||
| 	 * so that we keep everything we need to. | 	 * so that we keep everything we need to. | ||||||
|          */ |          */ | ||||||
|  |  | ||||||
| @@ -763,13 +767,13 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 	 *	No insert or delete | 	 *	No insert or delete | ||||||
|          */ |          */ | ||||||
| 	if ((nsb != nfd) && fx > 0 && | 	if ((nsb != nfd) && fx > 0 && | ||||||
| 	    ((p - old) + fx <= el->el_term.t_size.h)) { | 	    ((p - old) + fx <= el->el_terminal.t_size.h)) { | ||||||
| 		ELRE_DEBUG(1, | 		ELRE_DEBUG(1, | ||||||
| 		    (__F, "first diff insert at %d...\r\n", nfd - new)); | 		    (__F, "first diff insert at %td...\r\n", nfd - new)); | ||||||
| 		/* | 		/* | ||||||
| 		 * Move to the first char to insert, where the first diff is. | 		 * Move to the first char to insert, where the first diff is. | ||||||
| 		 */ | 		 */ | ||||||
| 		term_move_to_char(el, (int)(nfd - new)); | 		terminal_move_to_char(el, (int)(nfd - new)); | ||||||
| 		/* | 		/* | ||||||
| 		 * Check if we have stuff to keep at end | 		 * Check if we have stuff to keep at end | ||||||
| 		 */ | 		 */ | ||||||
| @@ -781,21 +785,21 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 			if (fx > 0) { | 			if (fx > 0) { | ||||||
| 				ELRE_DEBUG(!EL_CAN_INSERT, (__F, | 				ELRE_DEBUG(!EL_CAN_INSERT, (__F, | ||||||
| 				"ERROR: cannot insert in early first diff\n")); | 				"ERROR: cannot insert in early first diff\n")); | ||||||
| 				term_insertwrite(el, nfd, fx); | 				terminal_insertwrite(el, nfd, fx); | ||||||
| 				re_insert(el, old, (int)(ofd - old), | 				re_insert(el, old, (int)(ofd - old), | ||||||
| 				    el->el_term.t_size.h, nfd, fx); | 				    el->el_terminal.t_size.h, nfd, fx); | ||||||
| 			} | 			} | ||||||
| 			/* | 			/* | ||||||
| 		         * write (nsb-nfd) - fx chars of new starting at | 		         * write (nsb-nfd) - fx chars of new starting at | ||||||
| 		         * (nfd + fx) | 		         * (nfd + fx) | ||||||
| 			 */ | 			 */ | ||||||
| 			len = (size_t) ((nsb - nfd) - fx); | 			len = (size_t) ((nsb - nfd) - fx); | ||||||
| 			term_overwrite(el, (nfd + fx), len); | 			terminal_overwrite(el, (nfd + fx), len); | ||||||
| 			re__strncopy(ofd + fx, nfd + fx, len); | 			re__strncopy(ofd + fx, nfd + fx, len); | ||||||
| 		} else { | 		} else { | ||||||
| 			ELRE_DEBUG(1, (__F, "without anything to save\r\n")); | 			ELRE_DEBUG(1, (__F, "without anything to save\r\n")); | ||||||
| 			len = (size_t)(nsb - nfd); | 			len = (size_t)(nsb - nfd); | ||||||
| 			term_overwrite(el, nfd, len); | 			terminal_overwrite(el, nfd, len); | ||||||
| 			re__strncopy(ofd, nfd, len); | 			re__strncopy(ofd, nfd, len); | ||||||
| 			/* | 			/* | ||||||
| 		         * Done | 		         * Done | ||||||
| @@ -804,11 +808,11 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 		} | 		} | ||||||
| 	} else if (fx < 0) { | 	} else if (fx < 0) { | ||||||
| 		ELRE_DEBUG(1, | 		ELRE_DEBUG(1, | ||||||
| 		    (__F, "first diff delete at %d...\r\n", ofd - old)); | 		    (__F, "first diff delete at %td...\r\n", ofd - old)); | ||||||
| 		/* | 		/* | ||||||
| 		 * move to the first char to delete where the first diff is | 		 * move to the first char to delete where the first diff is | ||||||
| 		 */ | 		 */ | ||||||
| 		term_move_to_char(el, (int)(ofd - old)); | 		terminal_move_to_char(el, (int)(ofd - old)); | ||||||
| 		/* | 		/* | ||||||
| 		 * Check if we have stuff to save | 		 * Check if we have stuff to save | ||||||
| 		 */ | 		 */ | ||||||
| @@ -821,15 +825,15 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 			if (fx < 0) { | 			if (fx < 0) { | ||||||
| 				ELRE_DEBUG(!EL_CAN_DELETE, (__F, | 				ELRE_DEBUG(!EL_CAN_DELETE, (__F, | ||||||
| 				    "ERROR: cannot delete in first diff\n")); | 				    "ERROR: cannot delete in first diff\n")); | ||||||
| 				term_deletechars(el, -fx); | 				terminal_deletechars(el, -fx); | ||||||
| 				re_delete(el, old, (int)(ofd - old), | 				re_delete(el, old, (int)(ofd - old), | ||||||
| 				    el->el_term.t_size.h, -fx); | 				    el->el_terminal.t_size.h, -fx); | ||||||
| 			} | 			} | ||||||
| 			/* | 			/* | ||||||
| 		         * write (nsb-nfd) chars of new starting at nfd | 		         * write (nsb-nfd) chars of new starting at nfd | ||||||
| 		         */ | 		         */ | ||||||
| 			len = (size_t) (nsb - nfd); | 			len = (size_t) (nsb - nfd); | ||||||
| 			term_overwrite(el, nfd, len); | 			terminal_overwrite(el, nfd, len); | ||||||
| 			re__strncopy(ofd, nfd, len); | 			re__strncopy(ofd, nfd, len); | ||||||
|  |  | ||||||
| 		} else { | 		} else { | ||||||
| @@ -838,7 +842,7 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 			/* | 			/* | ||||||
| 		         * write (nsb-nfd) chars of new starting at nfd | 		         * write (nsb-nfd) chars of new starting at nfd | ||||||
| 		         */ | 		         */ | ||||||
| 			term_overwrite(el, nfd, (size_t)(nsb - nfd)); | 			terminal_overwrite(el, nfd, (size_t)(nsb - nfd)); | ||||||
| 			re_clear_eol(el, fx, sx, | 			re_clear_eol(el, fx, sx, | ||||||
| 			    (int)((oe - old) - (ne - new))); | 			    (int)((oe - old) - (ne - new))); | ||||||
| 			/* | 			/* | ||||||
| @@ -849,9 +853,9 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 	} else | 	} else | ||||||
| 		fx = 0; | 		fx = 0; | ||||||
|  |  | ||||||
| 	if (sx < 0 && (ose - old) + fx < el->el_term.t_size.h) { | 	if (sx < 0 && (ose - old) + fx < el->el_terminal.t_size.h) { | ||||||
| 		ELRE_DEBUG(1, (__F, | 		ELRE_DEBUG(1, (__F, | ||||||
| 		    "second diff delete at %d...\r\n", (ose - old) + fx)); | 		    "second diff delete at %td...\r\n", (ose - old) + fx)); | ||||||
| 		/* | 		/* | ||||||
| 		 * Check if we have stuff to delete | 		 * Check if we have stuff to delete | ||||||
| 		 */ | 		 */ | ||||||
| @@ -859,7 +863,7 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 		 * fx is the number of characters inserted (+) or deleted (-) | 		 * fx is the number of characters inserted (+) or deleted (-) | ||||||
| 		 */ | 		 */ | ||||||
|  |  | ||||||
| 		term_move_to_char(el, (int)((ose - old) + fx)); | 		terminal_move_to_char(el, (int)((ose - old) + fx)); | ||||||
| 		/* | 		/* | ||||||
| 		 * Check if we have stuff to save | 		 * Check if we have stuff to save | ||||||
| 		 */ | 		 */ | ||||||
| @@ -871,16 +875,16 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 			if (sx < 0) { | 			if (sx < 0) { | ||||||
| 				ELRE_DEBUG(!EL_CAN_DELETE, (__F, | 				ELRE_DEBUG(!EL_CAN_DELETE, (__F, | ||||||
| 				    "ERROR: cannot delete in second diff\n")); | 				    "ERROR: cannot delete in second diff\n")); | ||||||
| 				term_deletechars(el, -sx); | 				terminal_deletechars(el, -sx); | ||||||
| 			} | 			} | ||||||
| 			/* | 			/* | ||||||
| 		         * write (nls-nse) chars of new starting at nse | 		         * write (nls-nse) chars of new starting at nse | ||||||
| 		         */ | 		         */ | ||||||
| 			term_overwrite(el, nse, (size_t)(nls - nse)); | 			terminal_overwrite(el, nse, (size_t)(nls - nse)); | ||||||
| 		} else { | 		} else { | ||||||
| 			ELRE_DEBUG(1, (__F, | 			ELRE_DEBUG(1, (__F, | ||||||
| 			    "but with nothing left to save\r\n")); | 			    "but with nothing left to save\r\n")); | ||||||
| 			term_overwrite(el, nse, (size_t)(nls - nse)); | 			terminal_overwrite(el, nse, (size_t)(nls - nse)); | ||||||
| 			re_clear_eol(el, fx, sx, | 			re_clear_eol(el, fx, sx, | ||||||
| 			    (int)((oe - old) - (ne - new))); | 			    (int)((oe - old) - (ne - new))); | ||||||
| 		} | 		} | ||||||
| @@ -889,10 +893,10 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
|          * if we have a first insert AND WE HAVEN'T ALREADY DONE IT... |          * if we have a first insert AND WE HAVEN'T ALREADY DONE IT... | ||||||
|          */ |          */ | ||||||
| 	if ((nsb != nfd) && (osb - ofd) <= (nsb - nfd) && (fx == 0)) { | 	if ((nsb != nfd) && (osb - ofd) <= (nsb - nfd) && (fx == 0)) { | ||||||
| 		ELRE_DEBUG(1, (__F, "late first diff insert at %d...\r\n", | 		ELRE_DEBUG(1, (__F, "late first diff insert at %td...\r\n", | ||||||
| 		    nfd - new)); | 		    nfd - new)); | ||||||
|  |  | ||||||
| 		term_move_to_char(el, (int)(nfd - new)); | 		terminal_move_to_char(el, (int)(nfd - new)); | ||||||
| 		/* | 		/* | ||||||
| 		 * Check if we have stuff to keep at the end | 		 * Check if we have stuff to keep at the end | ||||||
| 		 */ | 		 */ | ||||||
| @@ -910,21 +914,21 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 				 */ | 				 */ | ||||||
| 				ELRE_DEBUG(!EL_CAN_INSERT, (__F, | 				ELRE_DEBUG(!EL_CAN_INSERT, (__F, | ||||||
| 				 "ERROR: cannot insert in late first diff\n")); | 				 "ERROR: cannot insert in late first diff\n")); | ||||||
| 				term_insertwrite(el, nfd, fx); | 				terminal_insertwrite(el, nfd, fx); | ||||||
| 				re_insert(el, old, (int)(ofd - old), | 				re_insert(el, old, (int)(ofd - old), | ||||||
| 				    el->el_term.t_size.h, nfd, fx); | 				    el->el_terminal.t_size.h, nfd, fx); | ||||||
| 			} | 			} | ||||||
| 			/* | 			/* | ||||||
| 		         * write (nsb-nfd) - fx chars of new starting at | 		         * write (nsb-nfd) - fx chars of new starting at | ||||||
| 		         * (nfd + fx) | 		         * (nfd + fx) | ||||||
| 			 */ | 			 */ | ||||||
| 			len = (size_t) ((nsb - nfd) - fx); | 			len = (size_t) ((nsb - nfd) - fx); | ||||||
| 			term_overwrite(el, (nfd + fx), len); | 			terminal_overwrite(el, (nfd + fx), len); | ||||||
| 			re__strncopy(ofd + fx, nfd + fx, len); | 			re__strncopy(ofd + fx, nfd + fx, len); | ||||||
| 		} else { | 		} else { | ||||||
| 			ELRE_DEBUG(1, (__F, "without anything to save\r\n")); | 			ELRE_DEBUG(1, (__F, "without anything to save\r\n")); | ||||||
| 			len = (size_t) (nsb - nfd); | 			len = (size_t) (nsb - nfd); | ||||||
| 			term_overwrite(el, nfd, len); | 			terminal_overwrite(el, nfd, len); | ||||||
| 			re__strncopy(ofd, nfd, len); | 			re__strncopy(ofd, nfd, len); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -934,24 +938,24 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| 	if (sx >= 0) { | 	if (sx >= 0) { | ||||||
| 		ELRE_DEBUG(1, (__F, | 		ELRE_DEBUG(1, (__F, | ||||||
| 		    "second diff insert at %d...\r\n", (int)(nse - new))); | 		    "second diff insert at %d...\r\n", (int)(nse - new))); | ||||||
| 		term_move_to_char(el, (int)(nse - new)); | 		terminal_move_to_char(el, (int)(nse - new)); | ||||||
| 		if (ols != oe) { | 		if (ols != oe) { | ||||||
| 			ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n")); | 			ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n")); | ||||||
| 			if (sx > 0) { | 			if (sx > 0) { | ||||||
| 				/* insert sx chars of new starting at nse */ | 				/* insert sx chars of new starting at nse */ | ||||||
| 				ELRE_DEBUG(!EL_CAN_INSERT, (__F, | 				ELRE_DEBUG(!EL_CAN_INSERT, (__F, | ||||||
| 				    "ERROR: cannot insert in second diff\n")); | 				    "ERROR: cannot insert in second diff\n")); | ||||||
| 				term_insertwrite(el, nse, sx); | 				terminal_insertwrite(el, nse, sx); | ||||||
| 			} | 			} | ||||||
| 			/* | 			/* | ||||||
| 		         * write (nls-nse) - sx chars of new starting at | 		         * write (nls-nse) - sx chars of new starting at | ||||||
| 			 * (nse + sx) | 			 * (nse + sx) | ||||||
| 		         */ | 		         */ | ||||||
| 			term_overwrite(el, (nse + sx), | 			terminal_overwrite(el, (nse + sx), | ||||||
| 			    (size_t)((nls - nse) - sx)); | 			    (size_t)((nls - nse) - sx)); | ||||||
| 		} else { | 		} else { | ||||||
| 			ELRE_DEBUG(1, (__F, "without anything to save\r\n")); | 			ELRE_DEBUG(1, (__F, "without anything to save\r\n")); | ||||||
| 			term_overwrite(el, nse, (size_t)(nls - nse)); | 			terminal_overwrite(el, nse, (size_t)(nls - nse)); | ||||||
|  |  | ||||||
| 			/* | 			/* | ||||||
| 	                 * No need to do a clear-to-end here because we were | 	                 * No need to do a clear-to-end here because we were | ||||||
| @@ -967,8 +971,8 @@ re_update_line(EditLine *el, Char *old, Char *new, int i) | |||||||
| /* re__copy_and_pad(): | /* re__copy_and_pad(): | ||||||
|  *	Copy string and pad with spaces |  *	Copy string and pad with spaces | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| re__copy_and_pad(Char *dst, const Char *src, size_t width) | re__copy_and_pad(wchar_t *dst, const wchar_t *src, size_t width) | ||||||
| { | { | ||||||
| 	size_t i; | 	size_t i; | ||||||
|  |  | ||||||
| @@ -988,10 +992,10 @@ re__copy_and_pad(Char *dst, const Char *src, size_t width) | |||||||
| /* re_refresh_cursor(): | /* re_refresh_cursor(): | ||||||
|  *	Move to the new cursor position |  *	Move to the new cursor position | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| re_refresh_cursor(EditLine *el) | re_refresh_cursor(EditLine *el) | ||||||
| { | { | ||||||
| 	Char *cp; | 	wchar_t *cp; | ||||||
| 	int h, v, th, w; | 	int h, v, th, w; | ||||||
|  |  | ||||||
| 	if (el->el_line.cursor >= el->el_line.lastchar) { | 	if (el->el_line.cursor >= el->el_line.lastchar) { | ||||||
| @@ -1005,7 +1009,7 @@ re_refresh_cursor(EditLine *el) | |||||||
| 	/* first we must find where the cursor is... */ | 	/* first we must find where the cursor is... */ | ||||||
| 	h = el->el_prompt.p_pos.h; | 	h = el->el_prompt.p_pos.h; | ||||||
| 	v = el->el_prompt.p_pos.v; | 	v = el->el_prompt.p_pos.v; | ||||||
| 	th = el->el_term.t_size.h;	/* optimize for speed */ | 	th = el->el_terminal.t_size.h;	/* optimize for speed */ | ||||||
|  |  | ||||||
| 	/* do input buffer to el->el_line.cursor */ | 	/* do input buffer to el->el_line.cursor */ | ||||||
| 	for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) { | 	for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) { | ||||||
| @@ -1019,7 +1023,7 @@ re_refresh_cursor(EditLine *el) | |||||||
| 				continue; | 				continue; | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			w = Width(*cp); | 			w = wcwidth(*cp); | ||||||
| 			if (w > 1 && h + w > th) { /* won't fit on line */ | 			if (w > 1 && h + w > th) { /* won't fit on line */ | ||||||
| 				h = 0; | 				h = 0; | ||||||
| 				v++; | 				v++; | ||||||
| @@ -1035,36 +1039,36 @@ re_refresh_cursor(EditLine *el) | |||||||
| 	} | 	} | ||||||
|         /* if we have a next character, and it's a doublewidth one, we need to |         /* if we have a next character, and it's a doublewidth one, we need to | ||||||
|          * check whether we need to linebreak for it to fit */ |          * check whether we need to linebreak for it to fit */ | ||||||
|         if (cp < el->el_line.lastchar && (w = Width(*cp)) > 1) |         if (cp < el->el_line.lastchar && (w = wcwidth(*cp)) > 1) | ||||||
|                 if (h + w > th) { |                 if (h + w > th) { | ||||||
|                     h = 0; |                     h = 0; | ||||||
|                     v++; |                     v++; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| 	/* now go there */ | 	/* now go there */ | ||||||
| 	term_move_to_line(el, v); | 	terminal_move_to_line(el, v); | ||||||
| 	term_move_to_char(el, h); | 	terminal_move_to_char(el, h); | ||||||
| 	term__flush(el); | 	terminal__flush(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* re_fastputc(): | /* re_fastputc(): | ||||||
|  *	Add a character fast. |  *	Add a character fast. | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| re_fastputc(EditLine *el, Int c) | re_fastputc(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
| 	int w = Width((Char)c); | 	int w = wcwidth(c); | ||||||
| 	while (w > 1 && el->el_cursor.h + w > el->el_term.t_size.h) | 	while (w > 1 && el->el_cursor.h + w > el->el_terminal.t_size.h) | ||||||
| 	    re_fastputc(el, ' '); | 	    re_fastputc(el, ' '); | ||||||
|  |  | ||||||
| 	term__putc(el, c); | 	terminal__putc(el, c); | ||||||
| 	el->el_display[el->el_cursor.v][el->el_cursor.h++] = c; | 	el->el_display[el->el_cursor.v][el->el_cursor.h++] = c; | ||||||
| 	while (--w > 0) | 	while (--w > 0) | ||||||
| 		el->el_display[el->el_cursor.v][el->el_cursor.h++] | 		el->el_display[el->el_cursor.v][el->el_cursor.h++] | ||||||
| 			= MB_FILL_CHAR; | 			= MB_FILL_CHAR; | ||||||
|  |  | ||||||
| 	if (el->el_cursor.h >= el->el_term.t_size.h) { | 	if (el->el_cursor.h >= el->el_terminal.t_size.h) { | ||||||
| 		/* if we must overflow */ | 		/* if we must overflow */ | ||||||
| 		el->el_cursor.h = 0; | 		el->el_cursor.h = 0; | ||||||
|  |  | ||||||
| @@ -1074,14 +1078,14 @@ re_fastputc(EditLine *el, Int c) | |||||||
| 		 * We do this via pointer shuffling - it's safe in this case | 		 * We do this via pointer shuffling - it's safe in this case | ||||||
| 		 * and we avoid memcpy(). | 		 * and we avoid memcpy(). | ||||||
| 		 */ | 		 */ | ||||||
| 		if (el->el_cursor.v + 1 >= el->el_term.t_size.v) { | 		if (el->el_cursor.v + 1 >= el->el_terminal.t_size.v) { | ||||||
| 			int i, lins = el->el_term.t_size.v; | 			int i, lins = el->el_terminal.t_size.v; | ||||||
| 			Char *firstline = el->el_display[0]; | 			wchar_t *firstline = el->el_display[0]; | ||||||
|  |  | ||||||
| 			for(i = 1; i < lins; i++) | 			for(i = 1; i < lins; i++) | ||||||
| 				el->el_display[i - 1] = el->el_display[i]; | 				el->el_display[i - 1] = el->el_display[i]; | ||||||
|  |  | ||||||
| 			re__copy_and_pad(firstline, STR(""), 0); | 			re__copy_and_pad(firstline, L"", (size_t)0); | ||||||
| 			el->el_display[i - 1] = firstline; | 			el->el_display[i - 1] = firstline; | ||||||
| 		} else { | 		} else { | ||||||
| 			el->el_cursor.v++; | 			el->el_cursor.v++; | ||||||
| @@ -1089,12 +1093,12 @@ re_fastputc(EditLine *el, Int c) | |||||||
| 		} | 		} | ||||||
| 		if (EL_HAS_AUTO_MARGINS) { | 		if (EL_HAS_AUTO_MARGINS) { | ||||||
| 			if (EL_HAS_MAGIC_MARGINS) { | 			if (EL_HAS_MAGIC_MARGINS) { | ||||||
| 				term__putc(el, ' '); | 				terminal__putc(el, ' '); | ||||||
| 				term__putc(el, '\b'); | 				terminal__putc(el, '\b'); | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			term__putc(el, '\r'); | 			terminal__putc(el, '\r'); | ||||||
| 			term__putc(el, '\n'); | 			terminal__putc(el, '\n'); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -1104,10 +1108,10 @@ re_fastputc(EditLine *el, Int c) | |||||||
|  *	we added just one char, handle it fast. |  *	we added just one char, handle it fast. | ||||||
|  *	Assumes that screen cursor == real cursor |  *	Assumes that screen cursor == real cursor | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| re_fastaddc(EditLine *el) | re_fastaddc(EditLine *el) | ||||||
| { | { | ||||||
| 	Char c; | 	wchar_t c; | ||||||
| 	int rhdiff; | 	int rhdiff; | ||||||
|  |  | ||||||
| 	c = el->el_line.cursor[-1]; | 	c = el->el_line.cursor[-1]; | ||||||
| @@ -1116,7 +1120,7 @@ re_fastaddc(EditLine *el) | |||||||
| 		re_refresh(el);	/* too hard to handle */ | 		re_refresh(el);	/* too hard to handle */ | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 	rhdiff = el->el_term.t_size.h - el->el_cursor.h - | 	rhdiff = el->el_terminal.t_size.h - el->el_cursor.h - | ||||||
| 	    el->el_rprompt.p_pos.h; | 	    el->el_rprompt.p_pos.h; | ||||||
| 	if (el->el_rprompt.p_pos.h && rhdiff < 3) { | 	if (el->el_rprompt.p_pos.h && rhdiff < 3) { | ||||||
| 		re_refresh(el);	/* clear out rprompt if less than 1 char gap */ | 		re_refresh(el);	/* clear out rprompt if less than 1 char gap */ | ||||||
| @@ -1131,29 +1135,29 @@ re_fastaddc(EditLine *el) | |||||||
| 		break; | 		break; | ||||||
| 	case CHTYPE_ASCIICTL: | 	case CHTYPE_ASCIICTL: | ||||||
| 	case CHTYPE_NONPRINT: { | 	case CHTYPE_NONPRINT: { | ||||||
| 		Char visbuf[VISUAL_WIDTH_MAX]; | 		wchar_t visbuf[VISUAL_WIDTH_MAX]; | ||||||
| 		ssize_t i, n = | 		ssize_t i, n = | ||||||
| 		    ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c); | 		    ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c); | ||||||
| 		for (i = 0; n-- > 0; ++i) | 		for (i = 0; n-- > 0; ++i) | ||||||
| 			re_fastputc(el, visbuf[i]); | 			re_fastputc(el, visbuf[i]); | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	} | 	} | ||||||
| 	term__flush(el); | 	terminal__flush(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* re_clear_display(): | /* re_clear_display(): | ||||||
|  *	clear the screen buffers so that new new prompt starts fresh. |  *	clear the screen buffers so that new new prompt starts fresh. | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| re_clear_display(EditLine *el) | re_clear_display(EditLine *el) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
|  |  | ||||||
| 	el->el_cursor.v = 0; | 	el->el_cursor.v = 0; | ||||||
| 	el->el_cursor.h = 0; | 	el->el_cursor.h = 0; | ||||||
| 	for (i = 0; i < el->el_term.t_size.v; i++) | 	for (i = 0; i < el->el_terminal.t_size.v; i++) | ||||||
| 		el->el_display[i][0] = '\0'; | 		el->el_display[i][0] = '\0'; | ||||||
| 	el->el_refresh.r_oldcv = 0; | 	el->el_refresh.r_oldcv = 0; | ||||||
| } | } | ||||||
| @@ -1162,7 +1166,7 @@ re_clear_display(EditLine *el) | |||||||
| /* re_clear_lines(): | /* re_clear_lines(): | ||||||
|  *	Make sure all lines are *really* blank |  *	Make sure all lines are *really* blank | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| re_clear_lines(EditLine *el) | re_clear_lines(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -1170,14 +1174,14 @@ re_clear_lines(EditLine *el) | |||||||
| 		int i; | 		int i; | ||||||
| 		for (i = el->el_refresh.r_oldcv; i >= 0; i--) { | 		for (i = el->el_refresh.r_oldcv; i >= 0; i--) { | ||||||
| 			/* for each line on the screen */ | 			/* for each line on the screen */ | ||||||
| 			term_move_to_line(el, i); | 			terminal_move_to_line(el, i); | ||||||
| 			term_move_to_char(el, 0); | 			terminal_move_to_char(el, 0); | ||||||
| 			term_clear_EOL(el, el->el_term.t_size.h); | 			terminal_clear_EOL(el, el->el_terminal.t_size.h); | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		term_move_to_line(el, el->el_refresh.r_oldcv); | 		terminal_move_to_line(el, el->el_refresh.r_oldcv); | ||||||
| 					/* go to last line */ | 					/* go to last line */ | ||||||
| 		term__putc(el, '\r');	/* go to BOL */ | 		terminal__putc(el, '\r');	/* go to BOL */ | ||||||
| 		term__putc(el, '\n');	/* go to new line */ | 		terminal__putc(el, '\n');	/* go to new line */ | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: refresh.h,v 1.6 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: refresh.h,v 1.10 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -40,20 +40,18 @@ | |||||||
| #ifndef _h_el_refresh | #ifndef _h_el_refresh | ||||||
| #define	_h_el_refresh | #define	_h_el_refresh | ||||||
|  |  | ||||||
| #include "histedit.h" |  | ||||||
|  |  | ||||||
| typedef struct { | typedef struct { | ||||||
| 	coord_t	r_cursor;	/* Refresh cursor position	*/ | 	coord_t	r_cursor;	/* Refresh cursor position	*/ | ||||||
| 	int	r_oldcv;	/* Vertical locations		*/ | 	int	r_oldcv;	/* Vertical locations		*/ | ||||||
| 	int	r_newcv; | 	int	r_newcv; | ||||||
| } el_refresh_t; | } el_refresh_t; | ||||||
|  |  | ||||||
| protected void	re_putc(EditLine *, Int, int); | libedit_private void	re_putc(EditLine *, wint_t, int); | ||||||
| protected void	re_clear_lines(EditLine *); | libedit_private void	re_clear_lines(EditLine *); | ||||||
| protected void	re_clear_display(EditLine *); | libedit_private void	re_clear_display(EditLine *); | ||||||
| protected void	re_refresh(EditLine *); | libedit_private void	re_refresh(EditLine *); | ||||||
| protected void	re_refresh_cursor(EditLine *); | libedit_private void	re_refresh_cursor(EditLine *); | ||||||
| protected void	re_fastaddc(EditLine *); | libedit_private void	re_fastaddc(EditLine *); | ||||||
| protected void	re_goto_bottom(EditLine *); | libedit_private void	re_goto_bottom(EditLine *); | ||||||
|  |  | ||||||
| #endif /* _h_el_refresh */ | #endif /* _h_el_refresh */ | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: search.c,v 1.24 2010/04/15 00:57:33 christos Exp $	*/ | /*	$NetBSD: search.c,v 1.47 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,7 +37,7 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)search.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)search.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: search.c,v 1.24 2010/04/15 00:57:33 christos Exp $"); | __RCSID("$NetBSD: search.c,v 1.47 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| @@ -45,13 +45,16 @@ __RCSID("$NetBSD: search.c,v 1.24 2010/04/15 00:57:33 christos Exp $"); | |||||||
|  * search.c: History and character search functions |  * search.c: History and character search functions | ||||||
|  */ |  */ | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <sys/types.h> | #include <string.h> | ||||||
| #if defined(REGEX) | #if defined(REGEX) | ||||||
| #include <regex.h> | #include <regex.h> | ||||||
| #elif defined(REGEXP) | #elif defined(REGEXP) | ||||||
| #include <regexp.h> | #include <regexp.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
|  | #include "common.h" | ||||||
|  | #include "fcns.h" | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Adjust cursor in vi mode to include the character under it |  * Adjust cursor in vi mode to include the character under it | ||||||
| @@ -63,31 +66,32 @@ __RCSID("$NetBSD: search.c,v 1.24 2010/04/15 00:57:33 christos Exp $"); | |||||||
| /* search_init(): | /* search_init(): | ||||||
|  *	Initialize the search stuff |  *	Initialize the search stuff | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| search_init(EditLine *el) | search_init(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_search.patbuf = el_malloc(EL_BUFSIZ * | 	el->el_search.patbuf = el_malloc(EL_BUFSIZ * | ||||||
| 	    sizeof(*el->el_search.patbuf)); | 	    sizeof(*el->el_search.patbuf)); | ||||||
| 	if (el->el_search.patbuf == NULL) | 	if (el->el_search.patbuf == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
|  | 	el->el_search.patbuf[0] = L'\0'; | ||||||
| 	el->el_search.patlen = 0; | 	el->el_search.patlen = 0; | ||||||
| 	el->el_search.patdir = -1; | 	el->el_search.patdir = -1; | ||||||
| 	el->el_search.chacha = '\0'; | 	el->el_search.chacha = L'\0'; | ||||||
| 	el->el_search.chadir = CHAR_FWD; | 	el->el_search.chadir = CHAR_FWD; | ||||||
| 	el->el_search.chatflg = 0; | 	el->el_search.chatflg = 0; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* search_end(): | /* search_end(): | ||||||
|  *	Initialize the search stuff |  *	Initialize the search stuff | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| search_end(EditLine *el) | search_end(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el_free((ptr_t) el->el_search.patbuf); | 	el_free(el->el_search.patbuf); | ||||||
| 	el->el_search.patbuf = NULL; | 	el->el_search.patbuf = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -96,7 +100,7 @@ search_end(EditLine *el) | |||||||
| /* regerror(): | /* regerror(): | ||||||
|  *	Handle regular expression errors |  *	Handle regular expression errors | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| regerror(const char *msg) | regerror(const char *msg) | ||||||
| { | { | ||||||
| @@ -107,12 +111,10 @@ regerror(const char *msg) | |||||||
| /* el_match(): | /* el_match(): | ||||||
|  *	Return if string matches pattern |  *	Return if string matches pattern | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| el_match(const Char *str, const Char *pat) | el_match(const wchar_t *str, const wchar_t *pat) | ||||||
| { | { | ||||||
| #ifdef WIDECHAR |  | ||||||
| 	static ct_buffer_t conv; | 	static ct_buffer_t conv; | ||||||
| #endif |  | ||||||
| #if defined (REGEX) | #if defined (REGEX) | ||||||
| 	regex_t re; | 	regex_t re; | ||||||
| 	int rv; | 	int rv; | ||||||
| @@ -124,30 +126,31 @@ el_match(const Char *str, const Char *pat) | |||||||
| 	extern int	 re_exec(const char *); | 	extern int	 re_exec(const char *); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	if (Strstr(str, pat) != 0) | 	if (wcsstr(str, pat) != 0) | ||||||
| 		return (1); | 		return 1; | ||||||
|  |  | ||||||
| #if defined(REGEX) | #if defined(REGEX) | ||||||
| 	if (regcomp(&re, ct_encode_string(pat, &conv), 0) == 0) { | 	if (regcomp(&re, ct_encode_string(pat, &conv), 0) == 0) { | ||||||
| 		rv = regexec(&re, ct_encode_string(str, &conv), 0, NULL, 0) == 0; | 		rv = regexec(&re, ct_encode_string(str, &conv), (size_t)0, NULL, | ||||||
|  | 		    0) == 0; | ||||||
| 		regfree(&re); | 		regfree(&re); | ||||||
| 	} else { | 	} else { | ||||||
| 		rv = 0; | 		rv = 0; | ||||||
| 	} | 	} | ||||||
| 	return (rv); | 	return rv; | ||||||
| #elif defined(REGEXP) | #elif defined(REGEXP) | ||||||
| 	if ((re = regcomp(ct_encode_string(pat, &conv))) != NULL) { | 	if ((re = regcomp(ct_encode_string(pat, &conv))) != NULL) { | ||||||
| 		rv = regexec(re, ct_encode_string(str, &conv)); | 		rv = regexec(re, ct_encode_string(str, &conv)); | ||||||
| 		free((ptr_t) re); | 		el_free(re); | ||||||
| 	} else { | 	} else { | ||||||
| 		rv = 0; | 		rv = 0; | ||||||
| 	} | 	} | ||||||
| 	return (rv); | 	return rv; | ||||||
| #else | #else | ||||||
| 	if (re_comp(ct_encode_string(pat, &conv)) != NULL) | 	if (re_comp(ct_encode_string(pat, &conv)) != NULL) | ||||||
| 		return (0); | 		return 0; | ||||||
| 	else | 	else | ||||||
| 		return (re_exec(ct_encode_string(str, &conv)) == 1); | 		return re_exec(ct_encode_string(str, &conv)) == 1; | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -155,35 +158,36 @@ el_match(const Char *str, const Char *pat) | |||||||
| /* c_hmatch(): | /* c_hmatch(): | ||||||
|  *	 return True if the pattern matches the prefix |  *	 return True if the pattern matches the prefix | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| c_hmatch(EditLine *el, const Char *str) | c_hmatch(EditLine *el, const wchar_t *str) | ||||||
| { | { | ||||||
| #ifdef SDEBUG | #ifdef SDEBUG | ||||||
| 	(void) fprintf(el->el_errfile, "match `%s' with `%s'\n", | 	(void) fprintf(el->el_errfile, "match `%s' with `%s'\n", | ||||||
| 	    el->el_search.patbuf, str); | 	    el->el_search.patbuf, str); | ||||||
| #endif /* SDEBUG */ | #endif /* SDEBUG */ | ||||||
|  |  | ||||||
| 	return (el_match(str, el->el_search.patbuf)); | 	return el_match(str, el->el_search.patbuf); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* c_setpat(): | /* c_setpat(): | ||||||
|  *	Set the history seatch pattern |  *	Set the history seatch pattern | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| c_setpat(EditLine *el) | c_setpat(EditLine *el) | ||||||
| { | { | ||||||
| 	if (el->el_state.lastcmd != ED_SEARCH_PREV_HISTORY && | 	if (el->el_state.lastcmd != ED_SEARCH_PREV_HISTORY && | ||||||
| 	    el->el_state.lastcmd != ED_SEARCH_NEXT_HISTORY) { | 	    el->el_state.lastcmd != ED_SEARCH_NEXT_HISTORY) { | ||||||
| 		el->el_search.patlen = EL_CURSOR(el) - el->el_line.buffer; | 		el->el_search.patlen = | ||||||
|  | 		    (size_t)(EL_CURSOR(el) - el->el_line.buffer); | ||||||
| 		if (el->el_search.patlen >= EL_BUFSIZ) | 		if (el->el_search.patlen >= EL_BUFSIZ) | ||||||
| 			el->el_search.patlen = EL_BUFSIZ - 1; | 			el->el_search.patlen = EL_BUFSIZ - 1; | ||||||
| 		if (el->el_search.patlen != 0) { | 		if (el->el_search.patlen != 0) { | ||||||
| 			(void) Strncpy(el->el_search.patbuf, el->el_line.buffer, | 			(void) wcsncpy(el->el_search.patbuf, el->el_line.buffer, | ||||||
| 			    el->el_search.patlen); | 			    el->el_search.patlen); | ||||||
| 			el->el_search.patbuf[el->el_search.patlen] = '\0'; | 			el->el_search.patbuf[el->el_search.patlen] = '\0'; | ||||||
| 		} else | 		} else | ||||||
| 			el->el_search.patlen = Strlen(el->el_search.patbuf); | 			el->el_search.patlen = wcslen(el->el_search.patbuf); | ||||||
| 	} | 	} | ||||||
| #ifdef SDEBUG | #ifdef SDEBUG | ||||||
| 	(void) fprintf(el->el_errfile, "\neventno = %d\n", | 	(void) fprintf(el->el_errfile, "\neventno = %d\n", | ||||||
| @@ -201,15 +205,14 @@ c_setpat(EditLine *el) | |||||||
| /* ce_inc_search(): | /* ce_inc_search(): | ||||||
|  *	Emacs incremental search |  *	Emacs incremental search | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| ce_inc_search(EditLine *el, int dir) | ce_inc_search(EditLine *el, int dir) | ||||||
| { | { | ||||||
| 	static const Char STRfwd[] = {'f', 'w', 'd', '\0'}, | 	static const wchar_t STRfwd[] = L"fwd", STRbck[] = L"bck"; | ||||||
| 	     STRbck[] = {'b', 'c', 'k', '\0'}; | 	static wchar_t pchar = L':';  /* ':' = normal, '?' = failed */ | ||||||
| 	static Char pchar = ':';/* ':' = normal, '?' = failed */ | 	static wchar_t endcmd[2] = {'\0', '\0'}; | ||||||
| 	static Char endcmd[2] = {'\0', '\0'}; | 	wchar_t *ocursor = el->el_line.cursor, oldpchar = pchar, ch; | ||||||
| 	Char ch, *ocursor = el->el_line.cursor, oldpchar = pchar; | 	const wchar_t *cp; | ||||||
| 	const Char *cp; |  | ||||||
|  |  | ||||||
| 	el_action_t ret = CC_NORM; | 	el_action_t ret = CC_NORM; | ||||||
|  |  | ||||||
| @@ -221,7 +224,7 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| 	if (el->el_line.lastchar + sizeof(STRfwd) / | 	if (el->el_line.lastchar + sizeof(STRfwd) / | ||||||
| 	    sizeof(*el->el_line.lastchar) + 2 + | 	    sizeof(*el->el_line.lastchar) + 2 + | ||||||
| 	    el->el_search.patlen >= el->el_line.limit) | 	    el->el_search.patlen >= el->el_line.limit) | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	for (;;) { | 	for (;;) { | ||||||
|  |  | ||||||
| @@ -248,14 +251,14 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| 		*el->el_line.lastchar = '\0'; | 		*el->el_line.lastchar = '\0'; | ||||||
| 		re_refresh(el); | 		re_refresh(el); | ||||||
|  |  | ||||||
| 		if (FUN(el,getc)(el, &ch) != 1) | 		if (el_wgetc(el, &ch) != 1) | ||||||
| 			return (ed_end_of_file(el, 0)); | 			return ed_end_of_file(el, 0); | ||||||
|  |  | ||||||
| 		switch (el->el_map.current[(unsigned char) ch]) { | 		switch (el->el_map.current[(unsigned char) ch]) { | ||||||
| 		case ED_INSERT: | 		case ED_INSERT: | ||||||
| 		case ED_DIGIT: | 		case ED_DIGIT: | ||||||
| 			if (el->el_search.patlen >= EL_BUFSIZ - LEN) | 			if (el->el_search.patlen >= EL_BUFSIZ - LEN) | ||||||
| 				term_beep(el); | 				terminal_beep(el); | ||||||
| 			else { | 			else { | ||||||
| 				el->el_search.patbuf[el->el_search.patlen++] = | 				el->el_search.patbuf[el->el_search.patlen++] = | ||||||
| 				    ch; | 				    ch; | ||||||
| @@ -280,7 +283,7 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| 			if (el->el_search.patlen > LEN) | 			if (el->el_search.patlen > LEN) | ||||||
| 				done++; | 				done++; | ||||||
| 			else | 			else | ||||||
| 				term_beep(el); | 				terminal_beep(el); | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		default: | 		default: | ||||||
| @@ -304,7 +307,7 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| 					    *el->el_line.cursor != '\n') { | 					    *el->el_line.cursor != '\n') { | ||||||
| 						if (el->el_search.patlen >= | 						if (el->el_search.patlen >= | ||||||
| 						    EL_BUFSIZ - LEN) { | 						    EL_BUFSIZ - LEN) { | ||||||
| 							term_beep(el); | 							terminal_beep(el); | ||||||
| 							break; | 							break; | ||||||
| 						} | 						} | ||||||
| 						el->el_search.patbuf[el->el_search.patlen++] = | 						el->el_search.patbuf[el->el_search.patlen++] = | ||||||
| @@ -317,14 +320,14 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| 					re_refresh(el); | 					re_refresh(el); | ||||||
| 					break; | 					break; | ||||||
| 				    } else if (isglob(*cp)) { | 				    } else if (isglob(*cp)) { | ||||||
| 					    term_beep(el); | 					    terminal_beep(el); | ||||||
| 					    break; | 					    break; | ||||||
| 				    } | 				    } | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			default:	/* Terminate and execute cmd */ | 			default:	/* Terminate and execute cmd */ | ||||||
| 				endcmd[0] = ch; | 				endcmd[0] = ch; | ||||||
| 				FUN(el,push)(el, endcmd); | 				el_wpush(el, endcmd); | ||||||
| 				/* FALLTHROUGH */ | 				/* FALLTHROUGH */ | ||||||
|  |  | ||||||
| 			case 0033:	/* ESC: Terminate */ | 			case 0033:	/* ESC: Terminate */ | ||||||
| @@ -344,14 +347,14 @@ ce_inc_search(EditLine *el, int dir) | |||||||
|  |  | ||||||
| 			/* Can't search if unmatched '[' */ | 			/* Can't search if unmatched '[' */ | ||||||
| 			for (cp = &el->el_search.patbuf[el->el_search.patlen-1], | 			for (cp = &el->el_search.patbuf[el->el_search.patlen-1], | ||||||
| 			    ch = ']'; | 			    ch = L']'; | ||||||
| 			    cp >= &el->el_search.patbuf[LEN]; | 			    cp >= &el->el_search.patbuf[LEN]; | ||||||
| 			    cp--) | 			    cp--) | ||||||
| 				if (*cp == '[' || *cp == ']') { | 				if (*cp == '[' || *cp == ']') { | ||||||
| 					ch = *cp; | 					ch = *cp; | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| 			if (el->el_search.patlen > LEN && ch != '[') { | 			if (el->el_search.patlen > LEN && ch != L'[') { | ||||||
| 				if (redo && newdir == dir) { | 				if (redo && newdir == dir) { | ||||||
| 					if (pchar == '?') { /* wrap around */ | 					if (pchar == '?') { /* wrap around */ | ||||||
| 						el->el_history.eventno = | 						el->el_history.eventno = | ||||||
| @@ -386,9 +389,10 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| 					/* avoid c_setpat */ | 					/* avoid c_setpat */ | ||||||
| 					el->el_state.lastcmd = | 					el->el_state.lastcmd = | ||||||
| 					    (el_action_t) newdir; | 					    (el_action_t) newdir; | ||||||
| 					ret = newdir == ED_SEARCH_PREV_HISTORY ? | 					ret = (el_action_t) | ||||||
|  | 					    (newdir == ED_SEARCH_PREV_HISTORY ? | ||||||
| 					    ed_search_prev_history(el, 0) : | 					    ed_search_prev_history(el, 0) : | ||||||
| 					    ed_search_next_history(el, 0); | 					    ed_search_next_history(el, 0)); | ||||||
| 					if (ret != CC_ERROR) { | 					if (ret != CC_ERROR) { | ||||||
| 						el->el_line.cursor = newdir == | 						el->el_line.cursor = newdir == | ||||||
| 						    ED_SEARCH_PREV_HISTORY ? | 						    ED_SEARCH_PREV_HISTORY ? | ||||||
| @@ -402,13 +406,13 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| 				el->el_search.patbuf[el->el_search.patlen] = | 				el->el_search.patbuf[el->el_search.patlen] = | ||||||
| 				    '\0'; | 				    '\0'; | ||||||
| 				if (ret == CC_ERROR) { | 				if (ret == CC_ERROR) { | ||||||
| 					term_beep(el); | 					terminal_beep(el); | ||||||
| 					if (el->el_history.eventno != | 					if (el->el_history.eventno != | ||||||
| 					    ohisteventno) { | 					    ohisteventno) { | ||||||
| 						el->el_history.eventno = | 						el->el_history.eventno = | ||||||
| 						    ohisteventno; | 						    ohisteventno; | ||||||
| 						if (hist_get(el) == CC_ERROR) | 						if (hist_get(el) == CC_ERROR) | ||||||
| 							return (CC_ERROR); | 							return CC_ERROR; | ||||||
| 					} | 					} | ||||||
| 					el->el_line.cursor = ocursor; | 					el->el_line.cursor = ocursor; | ||||||
| 					pchar = '?'; | 					pchar = '?'; | ||||||
| @@ -433,14 +437,14 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| 			if (el->el_history.eventno != ohisteventno) { | 			if (el->el_history.eventno != ohisteventno) { | ||||||
| 				el->el_history.eventno = ohisteventno; | 				el->el_history.eventno = ohisteventno; | ||||||
| 				if (hist_get(el) == CC_ERROR) | 				if (hist_get(el) == CC_ERROR) | ||||||
| 					return (CC_ERROR); | 					return CC_ERROR; | ||||||
| 			} | 			} | ||||||
| 			el->el_line.cursor = ocursor; | 			el->el_line.cursor = ocursor; | ||||||
| 			if (ret == CC_ERROR) | 			if (ret == CC_ERROR) | ||||||
| 				re_refresh(el); | 				re_refresh(el); | ||||||
| 		} | 		} | ||||||
| 		if (done || ret != CC_NORM) | 		if (done || ret != CC_NORM) | ||||||
| 			return (ret); | 			return ret; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -448,12 +452,12 @@ ce_inc_search(EditLine *el, int dir) | |||||||
| /* cv_search(): | /* cv_search(): | ||||||
|  *	Vi search. |  *	Vi search. | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| cv_search(EditLine *el, int dir) | cv_search(EditLine *el, int dir) | ||||||
| { | { | ||||||
| 	Char ch; | 	wchar_t ch; | ||||||
| 	Char tmpbuf[EL_BUFSIZ]; | 	wchar_t tmpbuf[EL_BUFSIZ]; | ||||||
| 	int tmplen; | 	ssize_t tmplen; | ||||||
|  |  | ||||||
| #ifdef ANCHOR | #ifdef ANCHOR | ||||||
| 	tmpbuf[0] = '.'; | 	tmpbuf[0] = '.'; | ||||||
| @@ -464,7 +468,7 @@ cv_search(EditLine *el, int dir) | |||||||
| 	el->el_search.patdir = dir; | 	el->el_search.patdir = dir; | ||||||
|  |  | ||||||
| 	tmplen = c_gets(el, &tmpbuf[LEN], | 	tmplen = c_gets(el, &tmpbuf[LEN], | ||||||
| 		dir == ED_SEARCH_PREV_HISTORY ? STR("\n/") : STR("\n?") ); | 		dir == ED_SEARCH_PREV_HISTORY ? L"\n/" : L"\n?" ); | ||||||
| 	if (tmplen == -1) | 	if (tmplen == -1) | ||||||
| 		return CC_REFRESH; | 		return CC_REFRESH; | ||||||
|  |  | ||||||
| @@ -478,16 +482,16 @@ cv_search(EditLine *el, int dir) | |||||||
| 		 */ | 		 */ | ||||||
| 		if (el->el_search.patlen == 0) { | 		if (el->el_search.patlen == 0) { | ||||||
| 			re_refresh(el); | 			re_refresh(el); | ||||||
| 			return (CC_ERROR); | 			return CC_ERROR; | ||||||
| 		} | 		} | ||||||
| #ifdef ANCHOR | #ifdef ANCHOR | ||||||
| 		if (el->el_search.patbuf[0] != '.' && | 		if (el->el_search.patbuf[0] != '.' && | ||||||
| 		    el->el_search.patbuf[0] != '*') { | 		    el->el_search.patbuf[0] != '*') { | ||||||
| 			(void) Strncpy(tmpbuf, el->el_search.patbuf, | 			(void) wcsncpy(tmpbuf, el->el_search.patbuf, | ||||||
| 			    sizeof(tmpbuf) / sizeof(*tmpbuf) - 1); | 			    sizeof(tmpbuf) / sizeof(*tmpbuf) - 1); | ||||||
| 			el->el_search.patbuf[0] = '.'; | 			el->el_search.patbuf[0] = '.'; | ||||||
| 			el->el_search.patbuf[1] = '*'; | 			el->el_search.patbuf[1] = '*'; | ||||||
| 			(void) Strncpy(&el->el_search.patbuf[2], tmpbuf, | 			(void) wcsncpy(&el->el_search.patbuf[2], tmpbuf, | ||||||
| 			    EL_BUFSIZ - 3); | 			    EL_BUFSIZ - 3); | ||||||
| 			el->el_search.patlen++; | 			el->el_search.patlen++; | ||||||
| 			el->el_search.patbuf[el->el_search.patlen++] = '.'; | 			el->el_search.patbuf[el->el_search.patlen++] = '.'; | ||||||
| @@ -501,33 +505,33 @@ cv_search(EditLine *el, int dir) | |||||||
| 		tmpbuf[tmplen++] = '*'; | 		tmpbuf[tmplen++] = '*'; | ||||||
| #endif | #endif | ||||||
| 		tmpbuf[tmplen] = '\0'; | 		tmpbuf[tmplen] = '\0'; | ||||||
| 		(void) Strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1); | 		(void) wcsncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1); | ||||||
| 		el->el_search.patlen = tmplen; | 		el->el_search.patlen = (size_t)tmplen; | ||||||
| 	} | 	} | ||||||
| 	el->el_state.lastcmd = (el_action_t) dir;	/* avoid c_setpat */ | 	el->el_state.lastcmd = (el_action_t) dir;	/* avoid c_setpat */ | ||||||
| 	el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer; | 	el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer; | ||||||
| 	if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) : | 	if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) : | ||||||
| 	    ed_search_next_history(el, 0)) == CC_ERROR) { | 	    ed_search_next_history(el, 0)) == CC_ERROR) { | ||||||
| 		re_refresh(el); | 		re_refresh(el); | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| 	} | 	} | ||||||
| 	if (ch == 0033) { | 	if (ch == 0033) { | ||||||
| 		re_refresh(el); | 		re_refresh(el); | ||||||
| 		return ed_newline(el, 0); | 		return ed_newline(el, 0); | ||||||
| 	} | 	} | ||||||
| 	return (CC_REFRESH); | 	return CC_REFRESH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ce_search_line(): | /* ce_search_line(): | ||||||
|  *	Look for a pattern inside a line |  *	Look for a pattern inside a line | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| ce_search_line(EditLine *el, int dir) | ce_search_line(EditLine *el, int dir) | ||||||
| { | { | ||||||
| 	Char *cp = el->el_line.cursor; | 	wchar_t *cp = el->el_line.cursor; | ||||||
| 	Char *pattern = el->el_search.patbuf; | 	wchar_t *pattern = el->el_search.patbuf; | ||||||
| 	Char oc, *ocp; | 	wchar_t oc, *ocp; | ||||||
| #ifdef ANCHOR | #ifdef ANCHOR | ||||||
| 	ocp = &pattern[1]; | 	ocp = &pattern[1]; | ||||||
| 	oc = *ocp; | 	oc = *ocp; | ||||||
| @@ -542,21 +546,21 @@ ce_search_line(EditLine *el, int dir) | |||||||
| 			if (el_match(cp, ocp)) { | 			if (el_match(cp, ocp)) { | ||||||
| 				*ocp = oc; | 				*ocp = oc; | ||||||
| 				el->el_line.cursor = cp; | 				el->el_line.cursor = cp; | ||||||
| 				return (CC_NORM); | 				return CC_NORM; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		*ocp = oc; | 		*ocp = oc; | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| 	} else { | 	} else { | ||||||
| 		for (; *cp != '\0' && cp < el->el_line.limit; cp++) { | 		for (; *cp != '\0' && cp < el->el_line.limit; cp++) { | ||||||
| 			if (el_match(cp, ocp)) { | 			if (el_match(cp, ocp)) { | ||||||
| 				*ocp = oc; | 				*ocp = oc; | ||||||
| 				el->el_line.cursor = cp; | 				el->el_line.cursor = cp; | ||||||
| 				return (CC_NORM); | 				return CC_NORM; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		*ocp = oc; | 		*ocp = oc; | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -564,8 +568,8 @@ ce_search_line(EditLine *el, int dir) | |||||||
| /* cv_repeat_srch(): | /* cv_repeat_srch(): | ||||||
|  *	Vi repeat search |  *	Vi repeat search | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| cv_repeat_srch(EditLine *el, Int c) | cv_repeat_srch(EditLine *el, wint_t c) | ||||||
| { | { | ||||||
|  |  | ||||||
| #ifdef SDEBUG | #ifdef SDEBUG | ||||||
| @@ -578,11 +582,11 @@ cv_repeat_srch(EditLine *el, Int c) | |||||||
|  |  | ||||||
| 	switch (c) { | 	switch (c) { | ||||||
| 	case ED_SEARCH_NEXT_HISTORY: | 	case ED_SEARCH_NEXT_HISTORY: | ||||||
| 		return (ed_search_next_history(el, 0)); | 		return ed_search_next_history(el, 0); | ||||||
| 	case ED_SEARCH_PREV_HISTORY: | 	case ED_SEARCH_PREV_HISTORY: | ||||||
| 		return (ed_search_prev_history(el, 0)); | 		return ed_search_prev_history(el, 0); | ||||||
| 	default: | 	default: | ||||||
| 		return (CC_ERROR); | 		return CC_ERROR; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -590,36 +594,34 @@ cv_repeat_srch(EditLine *el, Int c) | |||||||
| /* cv_csearch(): | /* cv_csearch(): | ||||||
|  *	Vi character search |  *	Vi character search | ||||||
|  */ |  */ | ||||||
| protected el_action_t | libedit_private el_action_t | ||||||
| cv_csearch(EditLine *el, int direction, Int ch, int count, int tflag) | cv_csearch(EditLine *el, int direction, wint_t ch, int count, int tflag) | ||||||
| { | { | ||||||
| 	Char *cp; | 	wchar_t *cp; | ||||||
|  |  | ||||||
| 	if (ch == 0) | 	if (ch == 0) | ||||||
| 		return CC_ERROR; | 		return CC_ERROR; | ||||||
|  |  | ||||||
| 	if (ch == -1) { | 	if (ch == (wint_t)-1) { | ||||||
| 		Char c; | 		if (el_wgetc(el, &ch) != 1) | ||||||
| 		if (FUN(el,getc)(el, &c) != 1) |  | ||||||
| 			return ed_end_of_file(el, 0); | 			return ed_end_of_file(el, 0); | ||||||
| 		ch = c; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Save for ';' and ',' commands */ | 	/* Save for ';' and ',' commands */ | ||||||
| 	el->el_search.chacha = ch; | 	el->el_search.chacha = ch; | ||||||
| 	el->el_search.chadir = direction; | 	el->el_search.chadir = direction; | ||||||
| 	el->el_search.chatflg = tflag; | 	el->el_search.chatflg = (char)tflag; | ||||||
|  |  | ||||||
| 	cp = el->el_line.cursor; | 	cp = el->el_line.cursor; | ||||||
| 	while (count--) { | 	while (count--) { | ||||||
| 		if (*cp == ch) | 		if ((wint_t)*cp == ch) | ||||||
| 			cp += direction; | 			cp += direction; | ||||||
| 		for (;;cp += direction) { | 		for (;;cp += direction) { | ||||||
| 			if (cp >= el->el_line.lastchar) | 			if (cp >= el->el_line.lastchar) | ||||||
| 				return CC_ERROR; | 				return CC_ERROR; | ||||||
| 			if (cp < el->el_line.buffer) | 			if (cp < el->el_line.buffer) | ||||||
| 				return CC_ERROR; | 				return CC_ERROR; | ||||||
| 			if (*cp == ch) | 			if ((wint_t)*cp == ch) | ||||||
| 				break; | 				break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: search.h,v 1.9 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: search.h,v 1.14 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -40,27 +40,25 @@ | |||||||
| #ifndef _h_el_search | #ifndef _h_el_search | ||||||
| #define	_h_el_search | #define	_h_el_search | ||||||
|  |  | ||||||
| #include "histedit.h" |  | ||||||
|  |  | ||||||
| typedef struct el_search_t { | typedef struct el_search_t { | ||||||
| 	Char	*patbuf;		/* The pattern buffer		*/ | 	wchar_t	*patbuf;		/* The pattern buffer		*/ | ||||||
| 	size_t	 patlen;		/* Length of the pattern buffer	*/ | 	size_t	 patlen;		/* Length of the pattern buffer	*/ | ||||||
| 	int	 patdir;		/* Direction of the last search	*/ | 	int	 patdir;		/* Direction of the last search	*/ | ||||||
| 	int	 chadir;		/* Character search direction	*/ | 	int	 chadir;		/* Character search direction	*/ | ||||||
| 	Char	 chacha;		/* Character we are looking for	*/ | 	wchar_t	 chacha;		/* Character we are looking for	*/ | ||||||
| 	char	 chatflg;		/* 0 if f, 1 if t */ | 	char	 chatflg;		/* 0 if f, 1 if t */ | ||||||
| } el_search_t; | } el_search_t; | ||||||
|  |  | ||||||
|  |  | ||||||
| protected int		el_match(const Char *, const Char *); | libedit_private int		el_match(const wchar_t *, const wchar_t *); | ||||||
| protected int		search_init(EditLine *); | libedit_private int		search_init(EditLine *); | ||||||
| protected void		search_end(EditLine *); | libedit_private void		search_end(EditLine *); | ||||||
| protected int		c_hmatch(EditLine *, const Char *); | libedit_private int		c_hmatch(EditLine *, const wchar_t *); | ||||||
| protected void		c_setpat(EditLine *); | libedit_private void		c_setpat(EditLine *); | ||||||
| protected el_action_t	ce_inc_search(EditLine *, int); | libedit_private el_action_t	ce_inc_search(EditLine *, int); | ||||||
| protected el_action_t	cv_search(EditLine *, int); | libedit_private el_action_t	cv_search(EditLine *, int); | ||||||
| protected el_action_t	ce_search_line(EditLine *, int); | libedit_private el_action_t	ce_search_line(EditLine *, int); | ||||||
| protected el_action_t	cv_repeat_srch(EditLine *, Int); | libedit_private el_action_t	cv_repeat_srch(EditLine *, wint_t); | ||||||
| protected el_action_t	cv_csearch(EditLine *, int, Int, int, int); | libedit_private el_action_t	cv_csearch(EditLine *, int, wint_t, int, int); | ||||||
|  |  | ||||||
| #endif /* _h_el_search */ | #endif /* _h_el_search */ | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| #	$NetBSD: shlib_version,v 1.18 2009/01/11 03:07:48 christos Exp $ | #	$NetBSD: shlib_version,v 1.19 2013/01/22 20:23:21 christos Exp $ | ||||||
| #	Remember to update distrib/sets/lists/base/shl.* when changing | #	Remember to update distrib/sets/lists/base/shl.* when changing | ||||||
| # | # | ||||||
| major=3 | major=3 | ||||||
| minor=0 | minor=1 | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: sig.c,v 1.15 2009/02/19 15:20:22 christos Exp $	*/ | /*	$NetBSD: sig.c,v 1.26 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,7 +37,7 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)sig.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)sig.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: sig.c,v 1.15 2009/02/19 15:20:22 christos Exp $"); | __RCSID("$NetBSD: sig.c,v 1.26 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| @@ -46,31 +46,35 @@ __RCSID("$NetBSD: sig.c,v 1.15 2009/02/19 15:20:22 christos Exp $"); | |||||||
|  *	  our policy is to trap all signals, set a good state |  *	  our policy is to trap all signals, set a good state | ||||||
|  *	  and pass the ball to our caller. |  *	  and pass the ball to our caller. | ||||||
|  */ |  */ | ||||||
| #include "el.h" | #include <errno.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  |  | ||||||
| private EditLine *sel = NULL; | #include "el.h" | ||||||
|  | #include "common.h" | ||||||
|  |  | ||||||
| private const int sighdl[] = { | static EditLine *sel = NULL; | ||||||
|  |  | ||||||
|  | static const int sighdl[] = { | ||||||
| #define	_DO(a)	(a), | #define	_DO(a)	(a), | ||||||
| 	ALLSIGS | 	ALLSIGS | ||||||
| #undef	_DO | #undef	_DO | ||||||
| 	- 1 | 	- 1 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| private void sig_handler(int); | static void sig_handler(int); | ||||||
|  |  | ||||||
| /* sig_handler(): | /* sig_handler(): | ||||||
|  *	This is the handler called for all signals |  *	This is the handler called for all signals | ||||||
|  *	XXX: we cannot pass any data so we just store the old editline |  *	XXX: we cannot pass any data so we just store the old editline | ||||||
|  *	state in a private variable |  *	state in a private variable | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| sig_handler(int signo) | sig_handler(int signo) | ||||||
| { | { | ||||||
| 	int i; | 	int i, save_errno; | ||||||
| 	sigset_t nset, oset; | 	sigset_t nset, oset; | ||||||
|  |  | ||||||
|  | 	save_errno = errno; | ||||||
| 	(void) sigemptyset(&nset); | 	(void) sigemptyset(&nset); | ||||||
| 	(void) sigaddset(&nset, signo); | 	(void) sigaddset(&nset, signo); | ||||||
| 	(void) sigprocmask(SIG_BLOCK, &nset, &oset); | 	(void) sigprocmask(SIG_BLOCK, &nset, &oset); | ||||||
| @@ -82,7 +86,7 @@ sig_handler(int signo) | |||||||
| 		tty_rawmode(sel); | 		tty_rawmode(sel); | ||||||
| 		if (ed_redisplay(sel, 0) == CC_REFRESH) | 		if (ed_redisplay(sel, 0) == CC_REFRESH) | ||||||
| 			re_refresh(sel); | 			re_refresh(sel); | ||||||
| 		term__flush(sel); | 		terminal__flush(sel); | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case SIGWINCH: | 	case SIGWINCH: | ||||||
| @@ -104,13 +108,14 @@ sig_handler(int signo) | |||||||
| 	sigemptyset(&sel->el_signal->sig_action[i].sa_mask); | 	sigemptyset(&sel->el_signal->sig_action[i].sa_mask); | ||||||
| 	(void) sigprocmask(SIG_SETMASK, &oset, NULL); | 	(void) sigprocmask(SIG_SETMASK, &oset, NULL); | ||||||
| 	(void) kill(0, signo); | 	(void) kill(0, signo); | ||||||
|  | 	errno = save_errno; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* sig_init(): | /* sig_init(): | ||||||
|  *	Initialize all signal stuff |  *	Initialize all signal stuff | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| sig_init(EditLine *el) | sig_init(EditLine *el) | ||||||
| { | { | ||||||
| 	size_t i; | 	size_t i; | ||||||
| @@ -142,11 +147,11 @@ sig_init(EditLine *el) | |||||||
| /* sig_end(): | /* sig_end(): | ||||||
|  *	Clear all signal stuff |  *	Clear all signal stuff | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| sig_end(EditLine *el) | sig_end(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el_free((ptr_t) el->el_signal); | 	el_free(el->el_signal); | ||||||
| 	el->el_signal = NULL; | 	el->el_signal = NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -154,7 +159,7 @@ sig_end(EditLine *el) | |||||||
| /* sig_set(): | /* sig_set(): | ||||||
|  *	set all the signal handlers |  *	set all the signal handlers | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| sig_set(EditLine *el) | sig_set(EditLine *el) | ||||||
| { | { | ||||||
| 	size_t i; | 	size_t i; | ||||||
| @@ -181,7 +186,7 @@ sig_set(EditLine *el) | |||||||
| /* sig_clr(): | /* sig_clr(): | ||||||
|  *	clear all the signal handlers |  *	clear all the signal handlers | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| sig_clr(EditLine *el) | sig_clr(EditLine *el) | ||||||
| { | { | ||||||
| 	size_t i; | 	size_t i; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: sig.h,v 1.8 2009/02/19 15:20:22 christos Exp $	*/ | /*	$NetBSD: sig.h,v 1.11 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -42,8 +42,6 @@ | |||||||
|  |  | ||||||
| #include <signal.h> | #include <signal.h> | ||||||
|  |  | ||||||
| #include "histedit.h" |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Define here all the signals we are going to handle |  * Define here all the signals we are going to handle | ||||||
|  * The _DO macro is used to iterate in the source code |  * The _DO macro is used to iterate in the source code | ||||||
| @@ -64,9 +62,9 @@ typedef struct { | |||||||
| 	volatile sig_atomic_t sig_no; | 	volatile sig_atomic_t sig_no; | ||||||
| } *el_signal_t; | } *el_signal_t; | ||||||
|  |  | ||||||
| protected void	sig_end(EditLine*); | libedit_private void	sig_end(EditLine*); | ||||||
| protected int	sig_init(EditLine*); | libedit_private int	sig_init(EditLine*); | ||||||
| protected void	sig_set(EditLine*); | libedit_private void	sig_set(EditLine*); | ||||||
| protected void	sig_clr(EditLine*); | libedit_private void	sig_clr(EditLine*); | ||||||
|  |  | ||||||
| #endif /* _h_el_sig */ | #endif /* _h_el_sig */ | ||||||
|   | |||||||
| @@ -1,74 +0,0 @@ | |||||||
| /*	$NetBSD: strlcat.c,v 1.3 2007/06/04 18:19:27 christos Exp $	*/ |  | ||||||
| /*	$OpenBSD: strlcat.c,v 1.10 2003/04/12 21:56:39 millert Exp $	*/ |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> |  | ||||||
|  * |  | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  | ||||||
|  * purpose with or without fee is hereby granted, provided that the above |  | ||||||
|  * copyright notice and this permission notice appear in all copies. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL |  | ||||||
|  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES |  | ||||||
|  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE |  | ||||||
|  * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |  | ||||||
|  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |  | ||||||
|  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "config.h" |  | ||||||
|  |  | ||||||
| #if defined(LIBC_SCCS) && !defined(lint) |  | ||||||
| __RCSID("$NetBSD: strlcat.c,v 1.3 2007/06/04 18:19:27 christos Exp $"); |  | ||||||
| #endif /* LIBC_SCCS and not lint */ |  | ||||||
|  |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <assert.h> |  | ||||||
| #include <string.h> |  | ||||||
|  |  | ||||||
| #ifdef _LIBC |  | ||||||
| # ifdef __weak_alias |  | ||||||
| __weak_alias(strlcat, _strlcat) |  | ||||||
| # endif |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if !HAVE_STRLCAT |  | ||||||
| /* |  | ||||||
|  * Appends src to string dst of size siz (unlike strncat, siz is the |  | ||||||
|  * full size of dst, not space left).  At most siz-1 characters |  | ||||||
|  * will be copied.  Always NUL terminates (unless siz <= strlen(dst)). |  | ||||||
|  * Returns strlen(src) + MIN(siz, strlen(initial dst)). |  | ||||||
|  * If retval >= siz, truncation occurred. |  | ||||||
|  */ |  | ||||||
| size_t |  | ||||||
| strlcat(char *dst, const char *src, size_t siz) |  | ||||||
| { |  | ||||||
| 	char *d = dst; |  | ||||||
| 	const char *s = src; |  | ||||||
| 	size_t n = siz; |  | ||||||
| 	size_t dlen; |  | ||||||
|  |  | ||||||
| 	_DIAGASSERT(dst != NULL); |  | ||||||
| 	_DIAGASSERT(src != NULL); |  | ||||||
|  |  | ||||||
| 	/* Find the end of dst and adjust bytes left but don't go past end */ |  | ||||||
| 	while (n-- != 0 && *d != '\0') |  | ||||||
| 		d++; |  | ||||||
| 	dlen = d - dst; |  | ||||||
| 	n = siz - dlen; |  | ||||||
|  |  | ||||||
| 	if (n == 0) |  | ||||||
| 		return(dlen + strlen(s)); |  | ||||||
| 	while (*s != '\0') { |  | ||||||
| 		if (n != 1) { |  | ||||||
| 			*d++ = *s; |  | ||||||
| 			n--; |  | ||||||
| 		} |  | ||||||
| 		s++; |  | ||||||
| 	} |  | ||||||
| 	*d = '\0'; |  | ||||||
|  |  | ||||||
| 	return(dlen + (s - src));	/* count does not include NUL */ |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| @@ -1,70 +0,0 @@ | |||||||
| /*	$NetBSD: strlcpy.c,v 1.3 2007/06/04 18:19:27 christos Exp $	*/ |  | ||||||
| /*	$OpenBSD: strlcpy.c,v 1.7 2003/04/12 21:56:39 millert Exp $	*/ |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> |  | ||||||
|  * |  | ||||||
|  * Permission to use, copy, modify, and distribute this software for any |  | ||||||
|  * purpose with or without fee is hereby granted, provided that the above |  | ||||||
|  * copyright notice and this permission notice appear in all copies. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL |  | ||||||
|  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES |  | ||||||
|  * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE |  | ||||||
|  * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |  | ||||||
|  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |  | ||||||
|  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "config.h" |  | ||||||
|  |  | ||||||
| #if defined(LIBC_SCCS) && !defined(lint) |  | ||||||
| __RCSID("$NetBSD: strlcpy.c,v 1.3 2007/06/04 18:19:27 christos Exp $"); |  | ||||||
| #endif /* LIBC_SCCS and not lint */ |  | ||||||
|  |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <assert.h> |  | ||||||
| #include <string.h> |  | ||||||
|  |  | ||||||
| #ifdef _LIBC |  | ||||||
| # ifdef __weak_alias |  | ||||||
| __weak_alias(strlcpy, _strlcpy) |  | ||||||
| # endif |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if !HAVE_STRLCPY |  | ||||||
| /* |  | ||||||
|  * Copy src to string dst of size siz.  At most siz-1 characters |  | ||||||
|  * will be copied.  Always NUL terminates (unless siz == 0). |  | ||||||
|  * Returns strlen(src); if retval >= siz, truncation occurred. |  | ||||||
|  */ |  | ||||||
| size_t |  | ||||||
| strlcpy(char *dst, const char *src, size_t siz) |  | ||||||
| { |  | ||||||
| 	char *d = dst; |  | ||||||
| 	const char *s = src; |  | ||||||
| 	size_t n = siz; |  | ||||||
|  |  | ||||||
| 	_DIAGASSERT(dst != NULL); |  | ||||||
| 	_DIAGASSERT(src != NULL); |  | ||||||
|  |  | ||||||
| 	/* Copy as many bytes as will fit */ |  | ||||||
| 	if (n != 0 && --n != 0) { |  | ||||||
| 		do { |  | ||||||
| 			if ((*d++ = *s++) == 0) |  | ||||||
| 				break; |  | ||||||
| 		} while (--n != 0); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Not enough room in dst, add NUL and traverse rest of src */ |  | ||||||
| 	if (n == 0) { |  | ||||||
| 		if (siz != 0) |  | ||||||
| 			*d = '\0';		/* NUL-terminate dst */ |  | ||||||
| 		while (*s++) |  | ||||||
| 			; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return(s - src - 1);	/* count does not include NUL */ |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: sys.h,v 1.13 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: sys.h,v 1.27 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -48,10 +48,6 @@ | |||||||
| # define __attribute__(A) | # define __attribute__(A) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef _DIAGASSERT |  | ||||||
| # define _DIAGASSERT(x) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef __BEGIN_DECLS | #ifndef __BEGIN_DECLS | ||||||
| # ifdef  __cplusplus | # ifdef  __cplusplus | ||||||
| #  define __BEGIN_DECLS  extern "C" { | #  define __BEGIN_DECLS  extern "C" { | ||||||
| @@ -62,37 +58,13 @@ | |||||||
| # endif | # endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef public | /* If your compiler does not support this, define it to be empty. */ | ||||||
| # define public		/* Externally visible functions/variables */ | #define libedit_private __attribute__((__visibility__("hidden"))) | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef private |  | ||||||
| # define private	static	/* Always hidden internals */ |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef protected |  | ||||||
| # define protected	/* Redefined from elsewhere to "static" */ |  | ||||||
| 			/* When we want to hide everything	*/ |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef __arraycount | #ifndef __arraycount | ||||||
| # define __arraycount(a) (sizeof(a) / sizeof(*(a))) | # define __arraycount(a) (sizeof(a) / sizeof(*(a))) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef HAVE_U_INT32_T |  | ||||||
| typedef unsigned int  u_int32_t; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef _PTR_T |  | ||||||
| # define _PTR_T |  | ||||||
| typedef void	*ptr_t; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef _IOCTL_T |  | ||||||
| # define _IOCTL_T |  | ||||||
| typedef void	*ioctl_t; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  |  | ||||||
| #ifndef HAVE_STRLCAT | #ifndef HAVE_STRLCAT | ||||||
| @@ -105,48 +77,37 @@ size_t	strlcat(char *dst, const char *src, size_t size); | |||||||
| size_t	strlcpy(char *dst, const char *src, size_t size); | size_t	strlcpy(char *dst, const char *src, size_t size); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef HAVE_FGETLN | #ifndef HAVE_GETLINE | ||||||
| #define	fgetln libedit_fgetln | #define	getline libedit_getline | ||||||
| char	*fgetln(FILE *fp, size_t *len); | ssize_t	getline(char **line, size_t *len, FILE *fp); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef _DIAGASSERT | ||||||
|  | #define _DIAGASSERT(x) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef __RCSID | ||||||
|  | #define __RCSID(x) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef HAVE_U_INT32_T | ||||||
|  | typedef unsigned int	u_int32_t; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef HAVE_SIZE_MAX | ||||||
|  | #define SIZE_MAX	((size_t)-1) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #define	REGEX		/* Use POSIX.2 regular expression functions */ | #define	REGEX		/* Use POSIX.2 regular expression functions */ | ||||||
| #undef	REGEXP		/* Use UNIX V8 regular expression functions */ | #undef	REGEXP		/* Use UNIX V8 regular expression functions */ | ||||||
|  |  | ||||||
| #ifdef notdef | #if defined(__sun) | ||||||
| # undef REGEX | extern int tgetent(char *, const char *); | ||||||
| # undef REGEXP | extern int tgetflag(char *); | ||||||
| # include <malloc.h> | extern int tgetnum(char *); | ||||||
| # ifdef __GNUC__ | extern int tputs(const char *, int, int (*)(int)); | ||||||
| /* | extern char* tgoto(const char*, int, int); | ||||||
|  * Broken hdrs. | extern char* tgetstr(char*, char**); | ||||||
|  */ |  | ||||||
| extern int	tgetent(const char *bp, char *name); |  | ||||||
| extern int	tgetflag(const char *id); |  | ||||||
| extern int	tgetnum(const char *id); |  | ||||||
| extern char    *tgetstr(const char *id, char **area); |  | ||||||
| extern char    *tgoto(const char *cap, int col, int row); |  | ||||||
| extern int	tputs(const char *str, int affcnt, int (*putc)(int)); |  | ||||||
| extern char    *getenv(const char *); |  | ||||||
| extern int	fprintf(FILE *, const char *, ...); |  | ||||||
| extern int	sigsetmask(int); |  | ||||||
| extern int	sigblock(int); |  | ||||||
| extern int	fputc(int, FILE *); |  | ||||||
| extern int	fgetc(FILE *); |  | ||||||
| extern int	fflush(FILE *); |  | ||||||
| extern int	tolower(int); |  | ||||||
| extern int	toupper(int); |  | ||||||
| extern int	errno, sys_nerr; |  | ||||||
| extern char	*sys_errlist[]; |  | ||||||
| extern void	perror(const char *); |  | ||||||
| #  include <string.h> |  | ||||||
| #  define strerror(e)	sys_errlist[e] |  | ||||||
| # endif |  | ||||||
| # ifdef SABER |  | ||||||
| extern ptr_t    memcpy(ptr_t, const ptr_t, size_t); |  | ||||||
| extern ptr_t    memset(ptr_t, int, size_t); |  | ||||||
| # endif |  | ||||||
| extern char    *fgetline(FILE *, int *); |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* _h_sys */ | #endif /* _h_sys */ | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: term.h,v 1.21 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: terminal.h,v 1.9 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
| 
 | 
 | ||||||
| /*-
 | /*-
 | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,17 +37,15 @@ | |||||||
| /*
 | /*
 | ||||||
|  * el.term.h: Termcap header |  * el.term.h: Termcap header | ||||||
|  */ |  */ | ||||||
| #ifndef _h_el_term | #ifndef _h_el_terminal | ||||||
| #define	_h_el_term | #define	_h_el_terminal | ||||||
| 
 |  | ||||||
| #include "histedit.h" |  | ||||||
| 
 | 
 | ||||||
| typedef struct {		/* Symbolic function key bindings	*/ | typedef struct {		/* Symbolic function key bindings	*/ | ||||||
| 	const Char	*name;	/* name of the key			*/ | 	const wchar_t	*name;	/* name of the key			*/ | ||||||
| 	int		 key;	/* Index in termcap table		*/ | 	int		 key;	/* Index in termcap table		*/ | ||||||
| 	key_value_t	 fun;	/* Function bound to it			*/ | 	keymacro_value_t	 fun;	/* Function bound to it			*/ | ||||||
| 	int		 type;	/* Type of function			*/ | 	int		 type;	/* Type of function			*/ | ||||||
| } fkey_t; | } funckey_t; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| 	const char *t_name;		/* the terminal name	*/ | 	const char *t_name;		/* the terminal name	*/ | ||||||
| @@ -63,12 +61,12 @@ typedef struct { | |||||||
| #define	TERM_HAS_AUTO_MARGINS	0x080	/* Has auto margins	*/ | #define	TERM_HAS_AUTO_MARGINS	0x080	/* Has auto margins	*/ | ||||||
| #define	TERM_HAS_MAGIC_MARGINS	0x100	/* Has magic margins	*/ | #define	TERM_HAS_MAGIC_MARGINS	0x100	/* Has magic margins	*/ | ||||||
| 	char	 *t_buf;		/* Termcap buffer	*/ | 	char	 *t_buf;		/* Termcap buffer	*/ | ||||||
| 	int	  t_loc;		/* location used	*/ | 	size_t	  t_loc;		/* location used	*/ | ||||||
| 	char	**t_str;		/* termcap strings	*/ | 	char	**t_str;		/* termcap strings	*/ | ||||||
| 	int	 *t_val;		/* termcap values	*/ | 	int	 *t_val;		/* termcap values	*/ | ||||||
| 	char	 *t_cap;		/* Termcap buffer	*/ | 	char	 *t_cap;		/* Termcap buffer	*/ | ||||||
| 	fkey_t	 *t_fkey;		/* Array of keys	*/ | 	funckey_t	 *t_fkey;		/* Array of keys	*/ | ||||||
| } el_term_t; | } el_terminal_t; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * fKey indexes |  * fKey indexes | ||||||
| @@ -79,38 +77,40 @@ typedef struct { | |||||||
| #define	A_K_RT		3 | #define	A_K_RT		3 | ||||||
| #define	A_K_HO		4 | #define	A_K_HO		4 | ||||||
| #define	A_K_EN		5 | #define	A_K_EN		5 | ||||||
| #define	A_K_NKEYS	6 | #define	A_K_DE		6 | ||||||
|  | #define	A_K_NKEYS	7 | ||||||
| 
 | 
 | ||||||
| protected void	term_move_to_line(EditLine *, int); | libedit_private void	terminal_move_to_line(EditLine *, int); | ||||||
| protected void	term_move_to_char(EditLine *, int); | libedit_private void	terminal_move_to_char(EditLine *, int); | ||||||
| protected void	term_clear_EOL(EditLine *, int); | libedit_private void	terminal_clear_EOL(EditLine *, int); | ||||||
| protected void	term_overwrite(EditLine *, const Char *, size_t); | libedit_private void	terminal_overwrite(EditLine *, const wchar_t *, size_t); | ||||||
| protected void	term_insertwrite(EditLine *, Char *, int); | libedit_private void	terminal_insertwrite(EditLine *, wchar_t *, int); | ||||||
| protected void	term_deletechars(EditLine *, int); | libedit_private void	terminal_deletechars(EditLine *, int); | ||||||
| protected void	term_clear_screen(EditLine *); | libedit_private void	terminal_clear_screen(EditLine *); | ||||||
| protected void	term_beep(EditLine *); | libedit_private void	terminal_beep(EditLine *); | ||||||
| protected int	term_change_size(EditLine *, int, int); | libedit_private int	terminal_change_size(EditLine *, int, int); | ||||||
| protected int	term_get_size(EditLine *, int *, int *); | libedit_private int	terminal_get_size(EditLine *, int *, int *); | ||||||
| protected int	term_init(EditLine *); | libedit_private int	terminal_init(EditLine *); | ||||||
| protected void	term_bind_arrow(EditLine *); | libedit_private void	terminal_bind_arrow(EditLine *); | ||||||
| protected void	term_print_arrow(EditLine *, const Char *); | libedit_private void	terminal_print_arrow(EditLine *, const wchar_t *); | ||||||
| protected int	term_clear_arrow(EditLine *, const Char *); | libedit_private int	terminal_clear_arrow(EditLine *, const wchar_t *); | ||||||
| protected int	term_set_arrow(EditLine *, const Char *, key_value_t *, int); | libedit_private int	terminal_set_arrow(EditLine *, const wchar_t *, | ||||||
| protected void	term_end(EditLine *); |     keymacro_value_t *, int); | ||||||
| protected void	term_get(EditLine *, const char **); | libedit_private void	terminal_end(EditLine *); | ||||||
| protected int	term_set(EditLine *, const char *); | libedit_private void	terminal_get(EditLine *, const char **); | ||||||
| protected int	term_settc(EditLine *, int, const Char **); | libedit_private int	terminal_set(EditLine *, const char *); | ||||||
| protected int	term_gettc(EditLine *, int, char **); | libedit_private int	terminal_settc(EditLine *, int, const wchar_t **); | ||||||
| protected int	term_telltc(EditLine *, int, const Char **); | libedit_private int	terminal_gettc(EditLine *, int, char **); | ||||||
| protected int	term_echotc(EditLine *, int, const Char **); | libedit_private int	terminal_telltc(EditLine *, int, const wchar_t **); | ||||||
| protected void	term_writec(EditLine *, Int); | libedit_private int	terminal_echotc(EditLine *, int, const wchar_t **); | ||||||
| protected int	term__putc(EditLine *, Int); | libedit_private void	terminal_writec(EditLine *, wint_t); | ||||||
| protected void	term__flush(EditLine *); | libedit_private int	terminal__putc(EditLine *, wint_t); | ||||||
|  | libedit_private void	terminal__flush(EditLine *); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Easy access macros |  * Easy access macros | ||||||
|  */ |  */ | ||||||
| #define	EL_FLAGS	(el)->el_term.t_flags | #define	EL_FLAGS	(el)->el_terminal.t_flags | ||||||
| 
 | 
 | ||||||
| #define	EL_CAN_INSERT		(EL_FLAGS & TERM_CAN_INSERT) | #define	EL_CAN_INSERT		(EL_FLAGS & TERM_CAN_INSERT) | ||||||
| #define	EL_CAN_DELETE		(EL_FLAGS & TERM_CAN_DELETE) | #define	EL_CAN_DELETE		(EL_FLAGS & TERM_CAN_DELETE) | ||||||
| @@ -122,4 +122,4 @@ protected void	term__flush(EditLine *); | |||||||
| #define	EL_HAS_AUTO_MARGINS	(EL_FLAGS & TERM_HAS_AUTO_MARGINS) | #define	EL_HAS_AUTO_MARGINS	(EL_FLAGS & TERM_HAS_AUTO_MARGINS) | ||||||
| #define	EL_HAS_MAGIC_MARGINS	(EL_FLAGS & TERM_HAS_MAGIC_MARGINS) | #define	EL_HAS_MAGIC_MARGINS	(EL_FLAGS & TERM_HAS_MAGIC_MARGINS) | ||||||
| 
 | 
 | ||||||
| #endif /* _h_el_term */ | #endif /* _h_el_terminal */ | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: tokenizer.c,v 1.18 2010/01/03 18:27:10 christos Exp $	*/ | /*	$NetBSD: tokenizer.c,v 1.28 2016/04/11 18:56:31 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -32,15 +32,12 @@ | |||||||
|  * SUCH DAMAGE. |  * SUCH DAMAGE. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef NARROWCHAR |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if !defined(lint) && !defined(SCCSID) | #if !defined(lint) && !defined(SCCSID) | ||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)tokenizer.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)tokenizer.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: tokenizer.c,v 1.18 2010/01/03 18:27:10 christos Exp $"); | __RCSID("$NetBSD: tokenizer.c,v 1.28 2016/04/11 18:56:31 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| @@ -48,10 +45,10 @@ __RCSID("$NetBSD: tokenizer.c,v 1.18 2010/01/03 18:27:10 christos Exp $"); | |||||||
| /* | /* | ||||||
|  * tokenize.c: Bourne shell like tokenizer |  * tokenize.c: Bourne shell like tokenizer | ||||||
|  */ |  */ | ||||||
| #include <string.h> |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| #include "histedit.h" | #include "histedit.h" | ||||||
| #include "chartype.h" |  | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
| 	Q_none, Q_single, Q_double, Q_one, Q_doubleone | 	Q_none, Q_single, Q_double, Q_one, Q_doubleone | ||||||
| @@ -68,12 +65,26 @@ typedef enum { | |||||||
| #define	tok_malloc(a)		malloc(a) | #define	tok_malloc(a)		malloc(a) | ||||||
| #define	tok_free(a)		free(a) | #define	tok_free(a)		free(a) | ||||||
| #define	tok_realloc(a, b)	realloc(a, b) | #define	tok_realloc(a, b)	realloc(a, b) | ||||||
| #define	tok_strdup(a)		Strdup(a) |  | ||||||
|  |  | ||||||
|  | #ifdef NARROWCHAR | ||||||
|  | #define	Char			char | ||||||
|  | #define	FUN(prefix, rest)	prefix ## _ ## rest | ||||||
|  | #define	TYPE(type)		type | ||||||
|  | #define	STR(x)			x | ||||||
|  | #define	Strchr(s, c)		strchr(s, c) | ||||||
|  | #define	tok_strdup(s)		strdup(s) | ||||||
|  | #else | ||||||
|  | #define	Char			wchar_t | ||||||
|  | #define	FUN(prefix, rest)	prefix ## _w ## rest | ||||||
|  | #define	TYPE(type)		type ## W | ||||||
|  | #define	STR(x)			L ## x | ||||||
|  | #define	Strchr(s, c)		wcschr(s, c) | ||||||
|  | #define	tok_strdup(s)		wcsdup(s) | ||||||
|  | #endif | ||||||
|  |  | ||||||
| struct TYPE(tokenizer) { | struct TYPE(tokenizer) { | ||||||
| 	Char	*ifs;		/* In field separator			 */ | 	Char	*ifs;		/* In field separator			 */ | ||||||
| 	int	 argc, amax;	/* Current and maximum number of args	 */ | 	size_t	 argc, amax;	/* Current and maximum number of args	 */ | ||||||
| 	Char   **argv;		/* Argument list			 */ | 	Char   **argv;		/* Argument list			 */ | ||||||
| 	Char	*wptr, *wmax;	/* Space and limit on the word buffer	 */ | 	Char	*wptr, *wmax;	/* Space and limit on the word buffer	 */ | ||||||
| 	Char	*wstart;	/* Beginning of next word		 */ | 	Char	*wstart;	/* Beginning of next word		 */ | ||||||
| @@ -83,13 +94,13 @@ struct TYPE(tokenizer) { | |||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| private void FUN(tok,finish)(TYPE(Tokenizer) *); | static void FUN(tok,finish)(TYPE(Tokenizer) *); | ||||||
|  |  | ||||||
|  |  | ||||||
| /* FUN(tok,finish)(): | /* FUN(tok,finish)(): | ||||||
|  *	Finish a word in the tokenizer. |  *	Finish a word in the tokenizer. | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| FUN(tok,finish)(TYPE(Tokenizer) *tok) | FUN(tok,finish)(TYPE(Tokenizer) *tok) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -106,32 +117,32 @@ FUN(tok,finish)(TYPE(Tokenizer) *tok) | |||||||
| /* FUN(tok,init)(): | /* FUN(tok,init)(): | ||||||
|  *	Initialize the tokenizer |  *	Initialize the tokenizer | ||||||
|  */ |  */ | ||||||
| public TYPE(Tokenizer) * | TYPE(Tokenizer) * | ||||||
| FUN(tok,init)(const Char *ifs) | FUN(tok,init)(const Char *ifs) | ||||||
| { | { | ||||||
| 	TYPE(Tokenizer) *tok = tok_malloc(sizeof(TYPE(Tokenizer))); | 	TYPE(Tokenizer) *tok = tok_malloc(sizeof(*tok)); | ||||||
|  |  | ||||||
| 	if (tok == NULL) | 	if (tok == NULL) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	tok->ifs = tok_strdup(ifs ? ifs : IFS); | 	tok->ifs = tok_strdup(ifs ? ifs : IFS); | ||||||
| 	if (tok->ifs == NULL) { | 	if (tok->ifs == NULL) { | ||||||
| 		tok_free((ptr_t)tok); | 		tok_free(tok); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 	tok->argc = 0; | 	tok->argc = 0; | ||||||
| 	tok->amax = AINCR; | 	tok->amax = AINCR; | ||||||
| 	tok->argv = tok_malloc(sizeof(*tok->argv) * tok->amax); | 	tok->argv = tok_malloc(sizeof(*tok->argv) * tok->amax); | ||||||
| 	if (tok->argv == NULL) { | 	if (tok->argv == NULL) { | ||||||
| 		tok_free((ptr_t)tok->ifs); | 		tok_free(tok->ifs); | ||||||
| 		tok_free((ptr_t)tok); | 		tok_free(tok); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 	tok->argv[0] = NULL; | 	tok->argv[0] = NULL; | ||||||
| 	tok->wspace = tok_malloc(WINCR * sizeof(*tok->wspace)); | 	tok->wspace = tok_malloc(WINCR * sizeof(*tok->wspace)); | ||||||
| 	if (tok->wspace == NULL) { | 	if (tok->wspace == NULL) { | ||||||
| 		tok_free((ptr_t)tok->argv); | 		tok_free(tok->argv); | ||||||
| 		tok_free((ptr_t)tok->ifs); | 		tok_free(tok->ifs); | ||||||
| 		tok_free((ptr_t)tok); | 		tok_free(tok); | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 	tok->wmax = tok->wspace + WINCR; | 	tok->wmax = tok->wspace + WINCR; | ||||||
| @@ -140,14 +151,14 @@ FUN(tok,init)(const Char *ifs) | |||||||
| 	tok->flags = 0; | 	tok->flags = 0; | ||||||
| 	tok->quote = Q_none; | 	tok->quote = Q_none; | ||||||
|  |  | ||||||
| 	return (tok); | 	return tok; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* FUN(tok,reset)(): | /* FUN(tok,reset)(): | ||||||
|  *	Reset the tokenizer |  *	Reset the tokenizer | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| FUN(tok,reset)(TYPE(Tokenizer) *tok) | FUN(tok,reset)(TYPE(Tokenizer) *tok) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -162,14 +173,14 @@ FUN(tok,reset)(TYPE(Tokenizer) *tok) | |||||||
| /* FUN(tok,end)(): | /* FUN(tok,end)(): | ||||||
|  *	Clean up |  *	Clean up | ||||||
|  */ |  */ | ||||||
| public void | void | ||||||
| FUN(tok,end)(TYPE(Tokenizer) *tok) | FUN(tok,end)(TYPE(Tokenizer) *tok) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	tok_free((ptr_t) tok->ifs); | 	tok_free(tok->ifs); | ||||||
| 	tok_free((ptr_t) tok->wspace); | 	tok_free(tok->wspace); | ||||||
| 	tok_free((ptr_t) tok->argv); | 	tok_free(tok->argv); | ||||||
| 	tok_free((ptr_t) tok); | 	tok_free(tok); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -191,7 +202,7 @@ FUN(tok,end)(TYPE(Tokenizer) *tok) | |||||||
|  *		cursorc	if !NULL, argv element containing cursor |  *		cursorc	if !NULL, argv element containing cursor | ||||||
|  *		cursorv	if !NULL, offset in argv[cursorc] of cursor |  *		cursorv	if !NULL, offset in argv[cursorc] of cursor | ||||||
|  */ |  */ | ||||||
| public int | int | ||||||
| FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | ||||||
|     int *argc, const Char ***argv, int *cursorc, int *cursoro) |     int *argc, const Char ***argv, int *cursorc, int *cursoro) | ||||||
| { | { | ||||||
| @@ -204,7 +215,7 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 		if (ptr >= line->lastchar) | 		if (ptr >= line->lastchar) | ||||||
| 			ptr = STR(""); | 			ptr = STR(""); | ||||||
| 		if (ptr == line->cursor) { | 		if (ptr == line->cursor) { | ||||||
| 			cc = tok->argc; | 			cc = (int)tok->argc; | ||||||
| 			co = (int)(tok->wptr - tok->wstart); | 			co = (int)(tok->wptr - tok->wstart); | ||||||
| 		} | 		} | ||||||
| 		switch (*ptr) { | 		switch (*ptr) { | ||||||
| @@ -236,7 +247,7 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			default: | 			default: | ||||||
| 				return (-1); | 				return -1; | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| @@ -267,7 +278,7 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			default: | 			default: | ||||||
| 				return (-1); | 				return -1; | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| @@ -298,7 +309,7 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			default: | 			default: | ||||||
| 				return (-1); | 				return -1; | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| @@ -324,7 +335,7 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			default: | 			default: | ||||||
| 				return (0); | 				return 0; | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| @@ -334,15 +345,15 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 				/* Finish word and return */ | 				/* Finish word and return */ | ||||||
| 				if (tok->flags & TOK_EAT) { | 				if (tok->flags & TOK_EAT) { | ||||||
| 					tok->flags &= ~TOK_EAT; | 					tok->flags &= ~TOK_EAT; | ||||||
| 					return (3); | 					return 3; | ||||||
| 				} | 				} | ||||||
| 				goto tok_line_outok; | 				goto tok_line_outok; | ||||||
|  |  | ||||||
| 			case Q_single: | 			case Q_single: | ||||||
| 				return (1); | 				return 1; | ||||||
|  |  | ||||||
| 			case Q_double: | 			case Q_double: | ||||||
| 				return (2); | 				return 2; | ||||||
|  |  | ||||||
| 			case Q_doubleone: | 			case Q_doubleone: | ||||||
| 				tok->quote = Q_double; | 				tok->quote = Q_double; | ||||||
| @@ -355,7 +366,7 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			default: | 			default: | ||||||
| 				return (-1); | 				return -1; | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| @@ -387,21 +398,21 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			default: | 			default: | ||||||
| 				return (-1); | 				return -1; | ||||||
|  |  | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (tok->wptr >= tok->wmax - 4) { | 		if (tok->wptr >= tok->wmax - 4) { | ||||||
| 			size_t size = tok->wmax - tok->wspace + WINCR; | 			size_t size = (size_t)(tok->wmax - tok->wspace + WINCR); | ||||||
| 			Char *s = tok_realloc(tok->wspace, | 			Char *s = tok_realloc(tok->wspace, | ||||||
| 			    size * sizeof(*s)); | 			    size * sizeof(*s)); | ||||||
| 			if (s == NULL) | 			if (s == NULL) | ||||||
| 				return (-1); | 				return -1; | ||||||
|  |  | ||||||
| 			if (s != tok->wspace) { | 			if (s != tok->wspace) { | ||||||
| 				int i; | 				size_t i; | ||||||
| 				for (i = 0; i < tok->argc; i++) { | 				for (i = 0; i < tok->argc; i++) { | ||||||
| 				    tok->argv[i] = | 				    tok->argv[i] = | ||||||
| 					(tok->argv[i] - tok->wspace) + s; | 					(tok->argv[i] - tok->wspace) + s; | ||||||
| @@ -416,14 +427,16 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 			Char **p; | 			Char **p; | ||||||
| 			tok->amax += AINCR; | 			tok->amax += AINCR; | ||||||
| 			p = tok_realloc(tok->argv, tok->amax * sizeof(*p)); | 			p = tok_realloc(tok->argv, tok->amax * sizeof(*p)); | ||||||
| 			if (p == NULL) | 			if (p == NULL) { | ||||||
| 				return (-1); | 				tok->amax -= AINCR; | ||||||
|  | 				return -1; | ||||||
|  | 			} | ||||||
| 			tok->argv = p; | 			tok->argv = p; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  tok_line_outok: |  tok_line_outok: | ||||||
| 	if (cc == -1 && co == -1) { | 	if (cc == -1 && co == -1) { | ||||||
| 		cc = tok->argc; | 		cc = (int)tok->argc; | ||||||
| 		co = (int)(tok->wptr - tok->wstart); | 		co = (int)(tok->wptr - tok->wstart); | ||||||
| 	} | 	} | ||||||
| 	if (cursorc != NULL) | 	if (cursorc != NULL) | ||||||
| @@ -432,15 +445,15 @@ FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, | |||||||
| 		*cursoro = co; | 		*cursoro = co; | ||||||
| 	FUN(tok,finish)(tok); | 	FUN(tok,finish)(tok); | ||||||
| 	*argv = (const Char **)tok->argv; | 	*argv = (const Char **)tok->argv; | ||||||
| 	*argc = tok->argc; | 	*argc = (int)tok->argc; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* FUN(tok,str)(): | /* FUN(tok,str)(): | ||||||
|  *	Simpler version of tok_line, taking a NUL terminated line |  *	Simpler version of tok_line, taking a NUL terminated line | ||||||
|  *	and splitting into words, ignoring cursor state. |  *	and splitting into words, ignoring cursor state. | ||||||
|  */ |  */ | ||||||
| public int | int | ||||||
| FUN(tok,str)(TYPE(Tokenizer) *tok, const Char *line, int *argc, | FUN(tok,str)(TYPE(Tokenizer) *tok, const Char *line, int *argc, | ||||||
|     const Char ***argv) |     const Char ***argv) | ||||||
| { | { | ||||||
| @@ -449,5 +462,5 @@ FUN(tok,str)(TYPE(Tokenizer) *tok, const Char *line, int *argc, | |||||||
| 	memset(&li, 0, sizeof(li)); | 	memset(&li, 0, sizeof(li)); | ||||||
| 	li.buffer = line; | 	li.buffer = line; | ||||||
| 	li.cursor = li.lastchar = Strchr(line, '\0'); | 	li.cursor = li.lastchar = Strchr(line, '\0'); | ||||||
| 	return (FUN(tok,line)(tok, &li, argc, argv, NULL, NULL)); | 	return FUN(tok,line)(tok, &li, argc, argv, NULL, NULL); | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								lib/libedit/src/tokenizern.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lib/libedit/src/tokenizern.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | #include "config.h" | ||||||
|  | #define NARROWCHAR | ||||||
|  | #include "tokenizer.c" | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: tty.c,v 1.35 2011/01/28 03:41:52 christos Exp $	*/ | /*	$NetBSD: tty.c,v 1.65 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -37,7 +37,7 @@ | |||||||
| #if 0 | #if 0 | ||||||
| static char sccsid[] = "@(#)tty.c	8.1 (Berkeley) 6/4/93"; | static char sccsid[] = "@(#)tty.c	8.1 (Berkeley) 6/4/93"; | ||||||
| #else | #else | ||||||
| __RCSID("$NetBSD: tty.c,v 1.35 2011/01/28 03:41:52 christos Exp $"); | __RCSID("$NetBSD: tty.c,v 1.65 2016/05/09 21:46:56 christos Exp $"); | ||||||
| #endif | #endif | ||||||
| #endif /* not lint && not SCCSID */ | #endif /* not lint && not SCCSID */ | ||||||
|  |  | ||||||
| @@ -46,10 +46,14 @@ __RCSID("$NetBSD: tty.c,v 1.35 2011/01/28 03:41:52 christos Exp $"); | |||||||
|  */ |  */ | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
| #include <unistd.h>	/* for isatty */ | #include <stdlib.h>	/* for abort */ | ||||||
|  | #include <string.h> | ||||||
| #include <strings.h>	/* for ffs */ | #include <strings.h>	/* for ffs */ | ||||||
|  | #include <unistd.h>	/* for isatty */ | ||||||
|  |  | ||||||
| #include "el.h" | #include "el.h" | ||||||
| #include "tty.h" | #include "fcns.h" | ||||||
|  | #include "parse.h" | ||||||
|  |  | ||||||
| typedef struct ttymodes_t { | typedef struct ttymodes_t { | ||||||
| 	const char *m_name; | 	const char *m_name; | ||||||
| @@ -58,12 +62,12 @@ typedef struct ttymodes_t { | |||||||
| }          ttymodes_t; | }          ttymodes_t; | ||||||
|  |  | ||||||
| typedef struct ttymap_t { | typedef struct ttymap_t { | ||||||
| 	Int nch, och;		/* Internal and termio rep of chars */ | 	wint_t nch, och;	/* Internal and termio rep of chars */ | ||||||
| 	el_action_t bind[3];	/* emacs, vi, and vi-cmd */ | 	el_action_t bind[3];	/* emacs, vi, and vi-cmd */ | ||||||
| } ttymap_t; | } ttymap_t; | ||||||
|  |  | ||||||
|  |  | ||||||
| private const ttyperm_t ttyperm = { | static const ttyperm_t ttyperm = { | ||||||
| 	{ | 	{ | ||||||
| 		{"iflag:", ICRNL, (INLCR | IGNCR)}, | 		{"iflag:", ICRNL, (INLCR | IGNCR)}, | ||||||
| 		{"oflag:", (OPOST | ONLCR), ONLRET}, | 		{"oflag:", (OPOST | ONLCR), ONLRET}, | ||||||
| @@ -91,7 +95,7 @@ private const ttyperm_t ttyperm = { | |||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| private const ttychar_t ttychar = { | static const ttychar_t ttychar = { | ||||||
| 	{ | 	{ | ||||||
| 		CINTR, CQUIT, CERASE, CKILL, | 		CINTR, CQUIT, CERASE, CKILL, | ||||||
| 		CEOF, CEOL, CEOL2, CSWTCH, | 		CEOF, CEOL, CEOL2, CSWTCH, | ||||||
| @@ -121,7 +125,7 @@ private const ttychar_t ttychar = { | |||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| private const ttymap_t tty_map[] = { | static const ttymap_t tty_map[] = { | ||||||
| #ifdef VERASE | #ifdef VERASE | ||||||
| 	{C_ERASE, VERASE, | 	{C_ERASE, VERASE, | ||||||
| 	{EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, | 	{EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, | ||||||
| @@ -154,11 +158,11 @@ private const ttymap_t tty_map[] = { | |||||||
| 	{C_LNEXT, VLNEXT, | 	{C_LNEXT, VLNEXT, | ||||||
| 	{ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}}, | 	{ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}}, | ||||||
| #endif /* VLNEXT */ | #endif /* VLNEXT */ | ||||||
| 	{-1, -1, | 	{(wint_t)-1, (wint_t)-1, | ||||||
| 	{ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}} | 	{ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| private const ttymodes_t ttymodes[] = { | static const ttymodes_t ttymodes[] = { | ||||||
| #ifdef	IGNBRK | #ifdef	IGNBRK | ||||||
| 	{"ignbrk", IGNBRK, MD_INP}, | 	{"ignbrk", IGNBRK, MD_INP}, | ||||||
| #endif /* IGNBRK */ | #endif /* IGNBRK */ | ||||||
| @@ -452,20 +456,21 @@ private const ttymodes_t ttymodes[] = { | |||||||
| #define	tty__geteightbit(td)	(((td)->c_cflag & CSIZE) == CS8) | #define	tty__geteightbit(td)	(((td)->c_cflag & CSIZE) == CS8) | ||||||
| #define	tty__cooked_mode(td)	((td)->c_lflag & ICANON) | #define	tty__cooked_mode(td)	((td)->c_lflag & ICANON) | ||||||
|  |  | ||||||
| private int	tty_getty(EditLine *, struct termios *); | static int	tty_getty(EditLine *, struct termios *); | ||||||
| private int	tty_setty(EditLine *, int, const struct termios *); | static int	tty_setty(EditLine *, int, const struct termios *); | ||||||
| private int	tty__getcharindex(int); | static int	tty__getcharindex(int); | ||||||
| private void	tty__getchar(struct termios *, unsigned char *); | static void	tty__getchar(struct termios *, unsigned char *); | ||||||
| private void	tty__setchar(struct termios *, unsigned char *); | static void	tty__setchar(struct termios *, unsigned char *); | ||||||
| private speed_t	tty__getspeed(struct termios *); | static speed_t	tty__getspeed(struct termios *); | ||||||
| private int	tty_setup(EditLine *); | static int	tty_setup(EditLine *); | ||||||
|  | static void	tty_setup_flags(EditLine *, struct termios *, int); | ||||||
|  |  | ||||||
| #define	t_qu	t_ts | #define	t_qu	t_ts | ||||||
|  |  | ||||||
| /* tty_getty(): | /* tty_getty(): | ||||||
|  *	Wrapper for tcgetattr to handle EINTR |  *	Wrapper for tcgetattr to handle EINTR | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| tty_getty(EditLine *el, struct termios *t) | tty_getty(EditLine *el, struct termios *t) | ||||||
| { | { | ||||||
| 	int rv; | 	int rv; | ||||||
| @@ -477,7 +482,7 @@ tty_getty(EditLine *el, struct termios *t) | |||||||
| /* tty_setty(): | /* tty_setty(): | ||||||
|  *	Wrapper for tcsetattr to handle EINTR |  *	Wrapper for tcsetattr to handle EINTR | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| tty_setty(EditLine *el, int action, const struct termios *t) | tty_setty(EditLine *el, int action, const struct termios *t) | ||||||
| { | { | ||||||
| 	int rv; | 	int rv; | ||||||
| @@ -489,45 +494,38 @@ tty_setty(EditLine *el, int action, const struct termios *t) | |||||||
| /* tty_setup(): | /* tty_setup(): | ||||||
|  *	Get the tty parameters and initialize the editing state |  *	Get the tty parameters and initialize the editing state | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| tty_setup(EditLine *el) | tty_setup(EditLine *el) | ||||||
| { | { | ||||||
| 	int rst = 1; | 	int rst = 1; | ||||||
|  |  | ||||||
| 	if (el->el_flags & EDIT_DISABLED) | 	if (el->el_flags & EDIT_DISABLED) | ||||||
| 		return (0); | 		return 0; | ||||||
|  |  | ||||||
|  | 	if (el->el_tty.t_initialized) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
| 	if (!isatty(el->el_outfd)) { | 	if (!isatty(el->el_outfd)) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, "%s: isatty: %s\n", __func__, | ||||||
| 		    "tty_setup: isatty: %s\n", strerror(errno)); | 		    strerror(errno)); | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	if (tty_getty(el, &el->el_tty.t_ed) == -1) { | 	if (tty_getty(el, &el->el_tty.t_or) == -1) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__, | ||||||
| 		    "tty_setup: tty_getty: %s\n", strerror(errno)); | 		    strerror(errno)); | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed; | 	el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed = el->el_tty.t_or; | ||||||
|  |  | ||||||
| 	el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex); | 	el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex); | ||||||
| 	el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex); | 	el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex); | ||||||
| 	el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex); | 	el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex); | ||||||
|  |  | ||||||
| 	el->el_tty.t_ex.c_iflag &= ~el->el_tty.t_t[EX_IO][MD_INP].t_clrmask; | 	tty_setup_flags(el, &el->el_tty.t_ex, EX_IO); | ||||||
| 	el->el_tty.t_ex.c_iflag |= el->el_tty.t_t[EX_IO][MD_INP].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_ex.c_oflag &= ~el->el_tty.t_t[EX_IO][MD_OUT].t_clrmask; |  | ||||||
| 	el->el_tty.t_ex.c_oflag |= el->el_tty.t_t[EX_IO][MD_OUT].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_ex.c_cflag &= ~el->el_tty.t_t[EX_IO][MD_CTL].t_clrmask; |  | ||||||
| 	el->el_tty.t_ex.c_cflag |= el->el_tty.t_t[EX_IO][MD_CTL].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_ex.c_lflag &= ~el->el_tty.t_t[EX_IO][MD_LIN].t_clrmask; |  | ||||||
| 	el->el_tty.t_ex.c_lflag |= el->el_tty.t_t[EX_IO][MD_LIN].t_setmask; |  | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
|          * Reset the tty chars to reasonable defaults |          * Reset the tty chars to reasonable defaults | ||||||
| @@ -555,76 +553,73 @@ tty_setup(EditLine *el) | |||||||
| 		tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); | 		tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); | ||||||
| 		if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { | 		if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 			(void) fprintf(el->el_errfile, | 			(void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", | ||||||
| 			    "tty_setup: tty_setty: %s\n", | 			    __func__, strerror(errno)); | ||||||
| 			    strerror(errno)); |  | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| #ifdef notdef |  | ||||||
| 	else |  | ||||||
| 		tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_ed.c_iflag &= ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask; | 	tty_setup_flags(el, &el->el_tty.t_ed, ED_IO); | ||||||
| 	el->el_tty.t_ed.c_iflag |= el->el_tty.t_t[ED_IO][MD_INP].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_ed.c_oflag &= ~el->el_tty.t_t[ED_IO][MD_OUT].t_clrmask; |  | ||||||
| 	el->el_tty.t_ed.c_oflag |= el->el_tty.t_t[ED_IO][MD_OUT].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_ed.c_cflag &= ~el->el_tty.t_t[ED_IO][MD_CTL].t_clrmask; |  | ||||||
| 	el->el_tty.t_ed.c_cflag |= el->el_tty.t_t[ED_IO][MD_CTL].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_ed.c_lflag &= ~el->el_tty.t_t[ED_IO][MD_LIN].t_clrmask; |  | ||||||
| 	el->el_tty.t_ed.c_lflag |= el->el_tty.t_t[ED_IO][MD_LIN].t_setmask; |  | ||||||
|  |  | ||||||
| 	tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); | 	tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); | ||||||
| 	tty_bind_char(el, 1); | 	tty_bind_char(el, 1); | ||||||
| 	return (0); | 	el->el_tty.t_initialized = 1; | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| protected int | libedit_private int | ||||||
| tty_init(EditLine *el) | tty_init(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	el->el_tty.t_mode = EX_IO; | 	el->el_tty.t_mode = EX_IO; | ||||||
| 	el->el_tty.t_vdisable = _POSIX_VDISABLE; | 	el->el_tty.t_vdisable = _POSIX_VDISABLE; | ||||||
|  | 	el->el_tty.t_initialized = 0; | ||||||
| 	(void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t)); | 	(void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t)); | ||||||
| 	(void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t)); | 	(void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t)); | ||||||
| 	return (tty_setup(el)); | 	return tty_setup(el); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* tty_end(): | /* tty_end(): | ||||||
|  *	Restore the tty to its original settings |  *	Restore the tty to its original settings | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| tty_end(EditLine *el __attribute__((__unused__))) | tty_end(EditLine *el) | ||||||
| { | { | ||||||
|  | 	if (el->el_flags & EDIT_DISABLED) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
| 	/* XXX: Maybe reset to an initial state? */ | 	if (!el->el_tty.t_initialized) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if (tty_setty(el, TCSAFLUSH, &el->el_tty.t_or) == -1) { | ||||||
|  | #ifdef DEBUG_TTY | ||||||
|  | 		(void) fprintf(el->el_errfile, | ||||||
|  | 		    "%s: tty_setty: %s\n", __func__, strerror(errno)); | ||||||
|  | #endif /* DEBUG_TTY */ | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* tty__getspeed(): | /* tty__getspeed(): | ||||||
|  *	Get the tty speed |  *	Get the tty speed | ||||||
|  */ |  */ | ||||||
| private speed_t | static speed_t | ||||||
| tty__getspeed(struct termios *td) | tty__getspeed(struct termios *td) | ||||||
| { | { | ||||||
| 	speed_t spd; | 	speed_t spd; | ||||||
|  |  | ||||||
| 	if ((spd = cfgetispeed(td)) == 0) | 	if ((spd = cfgetispeed(td)) == 0) | ||||||
| 		spd = cfgetospeed(td); | 		spd = cfgetospeed(td); | ||||||
| 	return (spd); | 	return spd; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* tty__getspeed(): | /* tty__getspeed(): | ||||||
|  *	Return the index of the asked char in the c_cc array |  *	Return the index of the asked char in the c_cc array | ||||||
|  */ |  */ | ||||||
| private int | static int | ||||||
| tty__getcharindex(int i) | tty__getcharindex(int i) | ||||||
| { | { | ||||||
| 	switch (i) { | 	switch (i) { | ||||||
| @@ -732,7 +727,7 @@ tty__getcharindex(int i) | |||||||
| /* tty__getchar(): | /* tty__getchar(): | ||||||
|  *	Get the tty characters |  *	Get the tty characters | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| tty__getchar(struct termios *td, unsigned char *s) | tty__getchar(struct termios *td, unsigned char *s) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -814,7 +809,7 @@ tty__getchar(struct termios *td, unsigned char *s) | |||||||
| /* tty__setchar(): | /* tty__setchar(): | ||||||
|  *	Set the tty characters |  *	Set the tty characters | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| tty__setchar(struct termios *td, unsigned char *s) | tty__setchar(struct termios *td, unsigned char *s) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -896,13 +891,13 @@ tty__setchar(struct termios *td, unsigned char *s) | |||||||
| /* tty_bind_char(): | /* tty_bind_char(): | ||||||
|  *	Rebind the editline functions |  *	Rebind the editline functions | ||||||
|  */ |  */ | ||||||
| protected void | libedit_private void | ||||||
| tty_bind_char(EditLine *el, int force) | tty_bind_char(EditLine *el, int force) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	unsigned char *t_n = el->el_tty.t_c[ED_IO]; | 	unsigned char *t_n = el->el_tty.t_c[ED_IO]; | ||||||
| 	unsigned char *t_o = el->el_tty.t_ed.c_cc; | 	unsigned char *t_o = el->el_tty.t_ed.c_cc; | ||||||
| 	Char new[2], old[2]; | 	wchar_t new[2], old[2]; | ||||||
| 	const ttymap_t *tp; | 	const ttymap_t *tp; | ||||||
| 	el_action_t *map, *alt; | 	el_action_t *map, *alt; | ||||||
| 	const el_action_t *dmap, *dalt; | 	const el_action_t *dmap, *dalt; | ||||||
| @@ -918,46 +913,100 @@ tty_bind_char(EditLine *el, int force) | |||||||
| 		dalt = NULL; | 		dalt = NULL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for (tp = tty_map; tp->nch != -1; tp++) { | 	for (tp = tty_map; tp->nch != (wint_t)-1; tp++) { | ||||||
| 		new[0] = t_n[tp->nch]; | 		new[0] = (wchar_t)t_n[tp->nch]; | ||||||
| 		old[0] = t_o[tp->och]; | 		old[0] = (wchar_t)t_o[tp->och]; | ||||||
| 		if (new[0] == old[0] && !force) | 		if (new[0] == old[0] && !force) | ||||||
| 			continue; | 			continue; | ||||||
| 		/* Put the old default binding back, and set the new binding */ | 		/* Put the old default binding back, and set the new binding */ | ||||||
| 		key_clear(el, map, old); | 		keymacro_clear(el, map, old); | ||||||
| 		map[UC(old[0])] = dmap[UC(old[0])]; | 		map[(unsigned char)old[0]] = dmap[(unsigned char)old[0]]; | ||||||
| 		key_clear(el, map, new); | 		keymacro_clear(el, map, new); | ||||||
| 		/* MAP_VI == 1, MAP_EMACS == 0... */ | 		/* MAP_VI == 1, MAP_EMACS == 0... */ | ||||||
| 		map[UC(new[0])] = tp->bind[el->el_map.type]; | 		map[(unsigned char)new[0]] = tp->bind[el->el_map.type]; | ||||||
| 		if (dalt) { | 		if (dalt) { | ||||||
| 			key_clear(el, alt, old); | 			keymacro_clear(el, alt, old); | ||||||
| 			alt[UC(old[0])] = dalt[UC(old[0])]; | 			alt[(unsigned char)old[0]] = | ||||||
| 			key_clear(el, alt, new); | 			    dalt[(unsigned char)old[0]]; | ||||||
| 			alt[UC(new[0])] = tp->bind[el->el_map.type + 1]; | 			keymacro_clear(el, alt, new); | ||||||
|  | 			alt[(unsigned char)new[0]] = | ||||||
|  | 			    tp->bind[el->el_map.type + 1]; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static tcflag_t * | ||||||
|  | tty__get_flag(struct termios *t, int kind) { | ||||||
|  | 	switch (kind) { | ||||||
|  | 	case MD_INP: | ||||||
|  | 		return &t->c_iflag; | ||||||
|  | 	case MD_OUT: | ||||||
|  | 		return &t->c_oflag; | ||||||
|  | 	case MD_CTL: | ||||||
|  | 		return &t->c_cflag; | ||||||
|  | 	case MD_LIN: | ||||||
|  | 		return &t->c_lflag; | ||||||
|  | 	default: | ||||||
|  | 		abort(); | ||||||
|  | 		/*NOTREACHED*/ | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static tcflag_t | ||||||
|  | tty_update_flag(EditLine *el, tcflag_t f, int mode, int kind) | ||||||
|  | { | ||||||
|  | 	f &= ~el->el_tty.t_t[mode][kind].t_clrmask; | ||||||
|  | 	f |= el->el_tty.t_t[mode][kind].t_setmask; | ||||||
|  | 	return f; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | tty_update_flags(EditLine *el, int kind) | ||||||
|  | { | ||||||
|  | 	tcflag_t *tt, *ed, *ex; | ||||||
|  | 	tt = tty__get_flag(&el->el_tty.t_ts, kind); | ||||||
|  | 	ed = tty__get_flag(&el->el_tty.t_ed, kind); | ||||||
|  | 	ex = tty__get_flag(&el->el_tty.t_ex, kind); | ||||||
|  |  | ||||||
|  | 	if (*tt != *ex && (kind != MD_CTL || *tt != *ed)) { | ||||||
|  | 		*ed = tty_update_flag(el, *tt, ED_IO, kind); | ||||||
|  | 		*ex = tty_update_flag(el, *tt, EX_IO, kind); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | tty_update_char(EditLine *el, int mode, int c) { | ||||||
|  | 	if (!((el->el_tty.t_t[mode][MD_CHAR].t_setmask & C_SH(c))) | ||||||
|  | 	    && (el->el_tty.t_c[TS_IO][c] != el->el_tty.t_c[EX_IO][c])) | ||||||
|  | 		el->el_tty.t_c[mode][c] = el->el_tty.t_c[TS_IO][c]; | ||||||
|  | 	if (el->el_tty.t_t[mode][MD_CHAR].t_clrmask & C_SH(c)) | ||||||
|  | 		el->el_tty.t_c[mode][c] = el->el_tty.t_vdisable; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* tty_rawmode(): | /* tty_rawmode(): | ||||||
|  *	Set terminal into 1 character at a time mode. |  *	Set terminal into 1 character at a time mode. | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| tty_rawmode(EditLine *el) | tty_rawmode(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO) | 	if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO) | ||||||
| 		return (0); | 		return 0; | ||||||
|  |  | ||||||
| 	if (el->el_flags & EDIT_DISABLED) | 	if (el->el_flags & EDIT_DISABLED) | ||||||
| 		return (0); | 		return 0; | ||||||
|  |  | ||||||
| 	if (tty_getty(el, &el->el_tty.t_ts) == -1) { | 	if (tty_getty(el, &el->el_tty.t_ts) == -1) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 		(void) fprintf(el->el_errfile, "tty_rawmode: tty_getty: %s\n", | 		(void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__, | ||||||
| 		    strerror(errno)); | 		    strerror(errno)); | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	/* | 	/* | ||||||
|          * We always keep up with the eight bit setting and the speed of the |          * We always keep up with the eight bit setting and the speed of the | ||||||
| @@ -974,77 +1023,16 @@ tty_rawmode(EditLine *el) | |||||||
| 		(void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed); | 		(void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed); | ||||||
| 	} | 	} | ||||||
| 	if (tty__cooked_mode(&el->el_tty.t_ts)) { | 	if (tty__cooked_mode(&el->el_tty.t_ts)) { | ||||||
| 		if (el->el_tty.t_ts.c_cflag != el->el_tty.t_ex.c_cflag) { | 		int i; | ||||||
| 			el->el_tty.t_ex.c_cflag = |  | ||||||
| 			    el->el_tty.t_ts.c_cflag; |  | ||||||
| 			el->el_tty.t_ex.c_cflag &= |  | ||||||
| 			    ~el->el_tty.t_t[EX_IO][MD_CTL].t_clrmask; |  | ||||||
| 			el->el_tty.t_ex.c_cflag |= |  | ||||||
| 			    el->el_tty.t_t[EX_IO][MD_CTL].t_setmask; |  | ||||||
|  |  | ||||||
| 			el->el_tty.t_ed.c_cflag = | 		for (i = MD_INP; i <= MD_LIN; i++) | ||||||
| 			    el->el_tty.t_ts.c_cflag; | 			tty_update_flags(el, i); | ||||||
| 			el->el_tty.t_ed.c_cflag &= |  | ||||||
| 			    ~el->el_tty.t_t[ED_IO][MD_CTL].t_clrmask; |  | ||||||
| 			el->el_tty.t_ed.c_cflag |= |  | ||||||
| 			    el->el_tty.t_t[ED_IO][MD_CTL].t_setmask; |  | ||||||
| 		} |  | ||||||
| 		if ((el->el_tty.t_ts.c_lflag != el->el_tty.t_ex.c_lflag) && |  | ||||||
| 		    (el->el_tty.t_ts.c_lflag != el->el_tty.t_ed.c_lflag)) { |  | ||||||
| 			el->el_tty.t_ex.c_lflag = |  | ||||||
| 			    el->el_tty.t_ts.c_lflag; |  | ||||||
| 			el->el_tty.t_ex.c_lflag &= |  | ||||||
| 			    ~el->el_tty.t_t[EX_IO][MD_LIN].t_clrmask; |  | ||||||
| 			el->el_tty.t_ex.c_lflag |= |  | ||||||
| 			    el->el_tty.t_t[EX_IO][MD_LIN].t_setmask; |  | ||||||
|  |  | ||||||
| 			el->el_tty.t_ed.c_lflag = |  | ||||||
| 			    el->el_tty.t_ts.c_lflag; |  | ||||||
| 			el->el_tty.t_ed.c_lflag &= |  | ||||||
| 			    ~el->el_tty.t_t[ED_IO][MD_LIN].t_clrmask; |  | ||||||
| 			el->el_tty.t_ed.c_lflag |= |  | ||||||
| 			    el->el_tty.t_t[ED_IO][MD_LIN].t_setmask; |  | ||||||
| 		} |  | ||||||
| 		if ((el->el_tty.t_ts.c_iflag != el->el_tty.t_ex.c_iflag) && |  | ||||||
| 		    (el->el_tty.t_ts.c_iflag != el->el_tty.t_ed.c_iflag)) { |  | ||||||
| 			el->el_tty.t_ex.c_iflag = |  | ||||||
| 			    el->el_tty.t_ts.c_iflag; |  | ||||||
| 			el->el_tty.t_ex.c_iflag &= |  | ||||||
| 			    ~el->el_tty.t_t[EX_IO][MD_INP].t_clrmask; |  | ||||||
| 			el->el_tty.t_ex.c_iflag |= |  | ||||||
| 			    el->el_tty.t_t[EX_IO][MD_INP].t_setmask; |  | ||||||
|  |  | ||||||
| 			el->el_tty.t_ed.c_iflag = |  | ||||||
| 			    el->el_tty.t_ts.c_iflag; |  | ||||||
| 			el->el_tty.t_ed.c_iflag &= |  | ||||||
| 			    ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask; |  | ||||||
| 			el->el_tty.t_ed.c_iflag |= |  | ||||||
| 			    el->el_tty.t_t[ED_IO][MD_INP].t_setmask; |  | ||||||
| 		} |  | ||||||
| 		if ((el->el_tty.t_ts.c_oflag != el->el_tty.t_ex.c_oflag) && |  | ||||||
| 		    (el->el_tty.t_ts.c_oflag != el->el_tty.t_ed.c_oflag)) { |  | ||||||
| 			el->el_tty.t_ex.c_oflag = |  | ||||||
| 			    el->el_tty.t_ts.c_oflag; |  | ||||||
| 			el->el_tty.t_ex.c_oflag &= |  | ||||||
| 			    ~el->el_tty.t_t[EX_IO][MD_OUT].t_clrmask; |  | ||||||
| 			el->el_tty.t_ex.c_oflag |= |  | ||||||
| 			    el->el_tty.t_t[EX_IO][MD_OUT].t_setmask; |  | ||||||
|  |  | ||||||
| 			el->el_tty.t_ed.c_oflag = |  | ||||||
| 			    el->el_tty.t_ts.c_oflag; |  | ||||||
| 			el->el_tty.t_ed.c_oflag &= |  | ||||||
| 			    ~el->el_tty.t_t[ED_IO][MD_OUT].t_clrmask; |  | ||||||
| 			el->el_tty.t_ed.c_oflag |= |  | ||||||
| 			    el->el_tty.t_t[ED_IO][MD_OUT].t_setmask; |  | ||||||
| 		} |  | ||||||
| 		if (tty__gettabs(&el->el_tty.t_ex) == 0) | 		if (tty__gettabs(&el->el_tty.t_ex) == 0) | ||||||
| 			el->el_tty.t_tabs = 0; | 			el->el_tty.t_tabs = 0; | ||||||
| 		else | 		else | ||||||
| 			el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0; | 			el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0; | ||||||
|  |  | ||||||
| 		{ |  | ||||||
| 			int i; |  | ||||||
|  |  | ||||||
| 		tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); | 		tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); | ||||||
| 		/* | 		/* | ||||||
| 		 * Check if the user made any changes. | 		 * Check if the user made any changes. | ||||||
| @@ -1058,141 +1046,122 @@ tty_rawmode(EditLine *el) | |||||||
|  |  | ||||||
| 		if (i != C_NCC) { | 		if (i != C_NCC) { | ||||||
| 			/* | 			/* | ||||||
| 				 * Propagate changes only to the unprotected | 			 * Propagate changes only to the unlibedit_private | ||||||
| 			 * chars that have been modified just now. | 			 * chars that have been modified just now. | ||||||
| 			 */ | 			 */ | ||||||
| 				for (i = 0; i < C_NCC; i++) { | 			for (i = 0; i < C_NCC; i++) | ||||||
| 					if (!((el->el_tty.t_t[ED_IO][MD_CHAR].t_setmask & C_SH(i))) | 				tty_update_char(el, ED_IO, i); | ||||||
| 					    && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i])) |  | ||||||
| 						el->el_tty.t_c[ED_IO][i] = el->el_tty.t_c[TS_IO][i]; |  | ||||||
| 					if (el->el_tty.t_t[ED_IO][MD_CHAR].t_clrmask & C_SH(i)) |  | ||||||
| 						el->el_tty.t_c[ED_IO][i] = el->el_tty.t_vdisable; |  | ||||||
| 				} |  | ||||||
| 			tty_bind_char(el, 0); | 			tty_bind_char(el, 0); | ||||||
| 			tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); | 			tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); | ||||||
|  |  | ||||||
| 				for (i = 0; i < C_NCC; i++) { | 			for (i = 0; i < C_NCC; i++) | ||||||
| 					if (!((el->el_tty.t_t[EX_IO][MD_CHAR].t_setmask & C_SH(i))) | 				tty_update_char(el, EX_IO, i); | ||||||
| 					    && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i])) |  | ||||||
| 						el->el_tty.t_c[EX_IO][i] = el->el_tty.t_c[TS_IO][i]; |  | ||||||
| 					if (el->el_tty.t_t[EX_IO][MD_CHAR].t_clrmask & C_SH(i)) |  | ||||||
| 						el->el_tty.t_c[EX_IO][i] = el->el_tty.t_vdisable; |  | ||||||
| 				} |  | ||||||
| 			tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); | 			tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { | 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 		(void) fprintf(el->el_errfile, "tty_rawmode: tty_setty: %s\n", | 		(void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, | ||||||
| 		    strerror(errno)); | 		    strerror(errno)); | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	el->el_tty.t_mode = ED_IO; | 	el->el_tty.t_mode = ED_IO; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* tty_cookedmode(): | /* tty_cookedmode(): | ||||||
|  *	Set the tty back to normal mode |  *	Set the tty back to normal mode | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| tty_cookedmode(EditLine *el) | tty_cookedmode(EditLine *el) | ||||||
| {				/* set tty in normal setup */ | {				/* set tty in normal setup */ | ||||||
|  |  | ||||||
| 	if (el->el_tty.t_mode == EX_IO) | 	if (el->el_tty.t_mode == EX_IO) | ||||||
| 		return (0); | 		return 0; | ||||||
|  |  | ||||||
| 	if (el->el_flags & EDIT_DISABLED) | 	if (el->el_flags & EDIT_DISABLED) | ||||||
| 		return (0); | 		return 0; | ||||||
|  |  | ||||||
| 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { | 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 		(void) fprintf(el->el_errfile, | 		(void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, | ||||||
| 		    "tty_cookedmode: tty_setty: %s\n", |  | ||||||
| 		    strerror(errno)); | 		    strerror(errno)); | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	el->el_tty.t_mode = EX_IO; | 	el->el_tty.t_mode = EX_IO; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* tty_quotemode(): | /* tty_quotemode(): | ||||||
|  *	Turn on quote mode |  *	Turn on quote mode | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| tty_quotemode(EditLine *el) | tty_quotemode(EditLine *el) | ||||||
| { | { | ||||||
| 	if (el->el_tty.t_mode == QU_IO) | 	if (el->el_tty.t_mode == QU_IO) | ||||||
| 		return (0); | 		return 0; | ||||||
|  |  | ||||||
| 	el->el_tty.t_qu = el->el_tty.t_ed; | 	el->el_tty.t_qu = el->el_tty.t_ed; | ||||||
|  |  | ||||||
| 	el->el_tty.t_qu.c_iflag &= ~el->el_tty.t_t[QU_IO][MD_INP].t_clrmask; | 	tty_setup_flags(el, &el->el_tty.t_qu, QU_IO); | ||||||
| 	el->el_tty.t_qu.c_iflag |= el->el_tty.t_t[QU_IO][MD_INP].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_qu.c_oflag &= ~el->el_tty.t_t[QU_IO][MD_OUT].t_clrmask; |  | ||||||
| 	el->el_tty.t_qu.c_oflag |= el->el_tty.t_t[QU_IO][MD_OUT].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_qu.c_cflag &= ~el->el_tty.t_t[QU_IO][MD_CTL].t_clrmask; |  | ||||||
| 	el->el_tty.t_qu.c_cflag |= el->el_tty.t_t[QU_IO][MD_CTL].t_setmask; |  | ||||||
|  |  | ||||||
| 	el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][MD_LIN].t_clrmask; |  | ||||||
| 	el->el_tty.t_qu.c_lflag |= el->el_tty.t_t[QU_IO][MD_LIN].t_setmask; |  | ||||||
|  |  | ||||||
| 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) { | 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 		(void) fprintf(el->el_errfile, "QuoteModeOn: tty_setty: %s\n", | 		(void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, | ||||||
| 		    strerror(errno)); | 		    strerror(errno)); | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	el->el_tty.t_mode = QU_IO; | 	el->el_tty.t_mode = QU_IO; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* tty_noquotemode(): | /* tty_noquotemode(): | ||||||
|  *	Turn off quote mode |  *	Turn off quote mode | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| tty_noquotemode(EditLine *el) | tty_noquotemode(EditLine *el) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	if (el->el_tty.t_mode != QU_IO) | 	if (el->el_tty.t_mode != QU_IO) | ||||||
| 		return (0); | 		return 0; | ||||||
| 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { | 	if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 		(void) fprintf(el->el_errfile, "QuoteModeOff: tty_setty: %s\n", | 		(void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, | ||||||
| 		    strerror(errno)); | 		    strerror(errno)); | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	} | 	} | ||||||
| 	el->el_tty.t_mode = ED_IO; | 	el->el_tty.t_mode = ED_IO; | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* tty_stty(): | /* tty_stty(): | ||||||
|  *	Stty builtin |  *	Stty builtin | ||||||
|  */ |  */ | ||||||
| protected int | libedit_private int | ||||||
| /*ARGSUSED*/ | /*ARGSUSED*/ | ||||||
| tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv) | tty_stty(EditLine *el, int argc __attribute__((__unused__)), | ||||||
|  |     const wchar_t **argv) | ||||||
| { | { | ||||||
| 	const ttymodes_t *m; | 	const ttymodes_t *m; | ||||||
| 	char x; | 	char x; | ||||||
| 	int aflag = 0; | 	int aflag = 0; | ||||||
| 	const Char *s, *d; | 	const wchar_t *s, *d; | ||||||
|         char name[EL_BUFSIZ]; |         char name[EL_BUFSIZ]; | ||||||
| 	struct termios *tios = &el->el_tty.t_ex; | 	struct termios *tios = &el->el_tty.t_ex; | ||||||
| 	int z = EX_IO; | 	int z = EX_IO; | ||||||
|  |  | ||||||
| 	if (argv == NULL) | 	if (argv == NULL) | ||||||
| 		return (-1); | 		return -1; | ||||||
| 	strncpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name)); | 	strncpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name)); | ||||||
|         name[sizeof(name) - 1] = '\0'; |         name[sizeof(name) - 1] = '\0'; | ||||||
|  |  | ||||||
| @@ -1219,9 +1188,9 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv) | |||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			(void) fprintf(el->el_errfile, | 			(void) fprintf(el->el_errfile, | ||||||
| 			    "%s: Unknown switch `%c'.\n", | 			    "%s: Unknown switch `%lc'.\n", | ||||||
| 			    name, argv[0][1]); | 			    name, (wint_t)argv[0][1]); | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	if (!argv || !*argv) { | 	if (!argv || !*argv) { | ||||||
| @@ -1239,8 +1208,9 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv) | |||||||
| 			if (i != -1) { | 			if (i != -1) { | ||||||
| 			    x = (el->el_tty.t_t[z][i].t_setmask & m->m_value) | 			    x = (el->el_tty.t_t[z][i].t_setmask & m->m_value) | ||||||
| 				?  '+' : '\0'; | 				?  '+' : '\0'; | ||||||
| 			    x = (el->el_tty.t_t[z][i].t_clrmask & m->m_value) |  | ||||||
| 				? '-' : x; | 			    if (el->el_tty.t_t[z][i].t_clrmask & m->m_value) | ||||||
|  | 				x = '-'; | ||||||
| 			} else { | 			} else { | ||||||
| 			    x = '\0'; | 			    x = '\0'; | ||||||
| 			} | 			} | ||||||
| @@ -1249,7 +1219,8 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv) | |||||||
|  |  | ||||||
| 				cu = strlen(m->m_name) + (x != '\0') + 1; | 				cu = strlen(m->m_name) + (x != '\0') + 1; | ||||||
|  |  | ||||||
| 				if (len + cu >= (size_t)el->el_term.t_size.h) { | 				if (len + cu >= | ||||||
|  | 				    (size_t)el->el_terminal.t_size.h) { | ||||||
| 					(void) fprintf(el->el_outfile, "\n%*s", | 					(void) fprintf(el->el_outfile, "\n%*s", | ||||||
| 					    (int)st, ""); | 					    (int)st, ""); | ||||||
| 					len = st + cu; | 					len = st + cu; | ||||||
| @@ -1265,31 +1236,33 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv) | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		(void) fprintf(el->el_outfile, "\n"); | 		(void) fprintf(el->el_outfile, "\n"); | ||||||
| 		return (0); | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	while (argv && (s = *argv++)) { | 	while (argv && (s = *argv++)) { | ||||||
| 		const Char *p; | 		const wchar_t *p; | ||||||
| 		switch (*s) { | 		switch (*s) { | ||||||
| 		case '+': | 		case '+': | ||||||
| 		case '-': | 		case '-': | ||||||
| 			x = *s++; | 			x = (char)*s++; | ||||||
| 			break; | 			break; | ||||||
| 		default: | 		default: | ||||||
| 			x = '\0'; | 			x = '\0'; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		d = s; | 		d = s; | ||||||
| 		p = Strchr(s, '='); | 		p = wcschr(s, L'='); | ||||||
| 		for (m = ttymodes; m->m_name; m++) | 		for (m = ttymodes; m->m_name; m++) | ||||||
| 			if ((p ? strncmp(m->m_name, ct_encode_string(d, &el->el_scratch), (size_t)(p - d)) : | 			if ((p ? strncmp(m->m_name, ct_encode_string(d, | ||||||
| 			    strcmp(m->m_name, ct_encode_string(d, &el->el_scratch))) == 0 && | 			    &el->el_scratch), (size_t)(p - d)) : | ||||||
|  | 			    strcmp(m->m_name, ct_encode_string(d, | ||||||
|  | 			    &el->el_scratch))) == 0 && | ||||||
| 			    (p == NULL || m->m_type == MD_CHAR)) | 			    (p == NULL || m->m_type == MD_CHAR)) | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 		if (!m->m_name) { | 		if (!m->m_name) { | ||||||
| 			(void) fprintf(el->el_errfile, | 			(void) fprintf(el->el_errfile, | ||||||
| 			    "%s: Invalid argument `" FSTR "'.\n", name, d); | 			    "%s: Invalid argument `%ls'.\n", name, d); | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		} | 		} | ||||||
| 		if (p) { | 		if (p) { | ||||||
| 			int c = ffs((int)m->m_value); | 			int c = ffs((int)m->m_value); | ||||||
| @@ -1299,7 +1272,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv) | |||||||
| 			c--; | 			c--; | ||||||
| 			c = tty__getcharindex(c); | 			c = tty__getcharindex(c); | ||||||
| 			assert(c != -1); | 			assert(c != -1); | ||||||
| 			tios->c_cc[c] = v; | 			tios->c_cc[c] = (cc_t)v; | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		switch (x) { | 		switch (x) { | ||||||
| @@ -1318,17 +1291,18 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	tty_setup_flags(el, tios, z); | ||||||
| 	if (el->el_tty.t_mode == z) { | 	if (el->el_tty.t_mode == z) { | ||||||
| 		if (tty_setty(el, TCSADRAIN, tios) == -1) { | 		if (tty_setty(el, TCSADRAIN, tios) == -1) { | ||||||
| #ifdef DEBUG_TTY | #ifdef DEBUG_TTY | ||||||
| 			(void) fprintf(el->el_errfile, | 			(void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", | ||||||
| 			    "tty_stty: tty_setty: %s\n", strerror(errno)); | 			    __func__, strerror(errno)); | ||||||
| #endif /* DEBUG_TTY */ | #endif /* DEBUG_TTY */ | ||||||
| 			return (-1); | 			return -1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return (0); | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1336,7 +1310,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv) | |||||||
| /* tty_printchar(): | /* tty_printchar(): | ||||||
|  *	DEbugging routine to print the tty characters |  *	DEbugging routine to print the tty characters | ||||||
|  */ |  */ | ||||||
| private void | static void | ||||||
| tty_printchar(EditLine *el, unsigned char *s) | tty_printchar(EditLine *el, unsigned char *s) | ||||||
| { | { | ||||||
| 	ttyperm_t *m; | 	ttyperm_t *m; | ||||||
| @@ -1355,3 +1329,14 @@ tty_printchar(EditLine *el, unsigned char *s) | |||||||
| 	(void) fprintf(el->el_errfile, "\n"); | 	(void) fprintf(el->el_errfile, "\n"); | ||||||
| } | } | ||||||
| #endif /* notyet */ | #endif /* notyet */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | tty_setup_flags(EditLine *el, struct termios *tios, int mode) | ||||||
|  | { | ||||||
|  | 	int kind; | ||||||
|  | 	for (kind = MD_INP; kind <= MD_LIN; kind++) { | ||||||
|  | 		tcflag_t *f = tty__get_flag(tios, kind); | ||||||
|  | 		*f = tty_update_flag(el, *f, mode, kind); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /*	$NetBSD: tty.h,v 1.12 2009/12/30 22:37:40 christos Exp $	*/ | /*	$NetBSD: tty.h,v 1.21 2016/05/09 21:46:56 christos Exp $	*/ | ||||||
|  |  | ||||||
| /*- | /*- | ||||||
|  * Copyright (c) 1992, 1993 |  * Copyright (c) 1992, 1993 | ||||||
| @@ -40,8 +40,6 @@ | |||||||
| #ifndef _h_el_tty | #ifndef _h_el_tty | ||||||
| #define	_h_el_tty | #define	_h_el_tty | ||||||
|  |  | ||||||
| #include "sys.h" |  | ||||||
| #include "histedit.h" |  | ||||||
| #include <termios.h> | #include <termios.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
|  |  | ||||||
| @@ -431,7 +429,7 @@ | |||||||
| #define	C_MIN		23 | #define	C_MIN		23 | ||||||
| #define	C_TIME		24 | #define	C_TIME		24 | ||||||
| #define	C_NCC		25 | #define	C_NCC		25 | ||||||
| #define	C_SH(A)		(1 << (A)) | #define	C_SH(A)		((unsigned int)(1 << (A))) | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Terminal dependend data structures |  * Terminal dependend data structures | ||||||
| @@ -442,6 +440,7 @@ | |||||||
| #define	QU_IO	2	/* used only for quoted chars	*/ | #define	QU_IO	2	/* used only for quoted chars	*/ | ||||||
| #define	NN_IO	3	/* The number of entries	*/ | #define	NN_IO	3	/* The number of entries	*/ | ||||||
|  |  | ||||||
|  | /* Don't re-order */ | ||||||
| #define	MD_INP	0 | #define	MD_INP	0 | ||||||
| #define	MD_OUT	1 | #define	MD_OUT	1 | ||||||
| #define	MD_CTL	2 | #define	MD_CTL	2 | ||||||
| @@ -457,24 +456,25 @@ typedef struct { | |||||||
|  |  | ||||||
| typedef unsigned char ttychar_t[NN_IO][C_NCC]; | typedef unsigned char ttychar_t[NN_IO][C_NCC]; | ||||||
|  |  | ||||||
| protected int	tty_init(EditLine *); | libedit_private int	tty_init(EditLine *); | ||||||
| protected void	tty_end(EditLine *); | libedit_private void	tty_end(EditLine *); | ||||||
| protected int	tty_stty(EditLine *, int, const Char **); | libedit_private int	tty_stty(EditLine *, int, const wchar_t **); | ||||||
| protected int	tty_rawmode(EditLine *); | libedit_private int	tty_rawmode(EditLine *); | ||||||
| protected int	tty_cookedmode(EditLine *); | libedit_private int	tty_cookedmode(EditLine *); | ||||||
| protected int	tty_quotemode(EditLine *); | libedit_private int	tty_quotemode(EditLine *); | ||||||
| protected int	tty_noquotemode(EditLine *); | libedit_private int	tty_noquotemode(EditLine *); | ||||||
| protected void	tty_bind_char(EditLine *, int); | libedit_private void	tty_bind_char(EditLine *, int); | ||||||
|  |  | ||||||
| typedef struct { | typedef struct { | ||||||
|     ttyperm_t t_t; |     ttyperm_t t_t; | ||||||
|     ttychar_t t_c; |     ttychar_t t_c; | ||||||
|     struct termios t_ex, t_ed, t_ts; |     struct termios t_or, t_ex, t_ed, t_ts; | ||||||
|     int t_tabs; |     int t_tabs; | ||||||
|     int t_eight; |     int t_eight; | ||||||
|     speed_t t_speed; |     speed_t t_speed; | ||||||
|     int t_mode; |     unsigned char t_mode; | ||||||
|     unsigned char t_vdisable; |     unsigned char t_vdisable; | ||||||
|  |     unsigned char t_initialized; | ||||||
| } el_tty_t; | } el_tty_t; | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user
	 Viktor Dukhovni
					Viktor Dukhovni