Commit 758f5d0a authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/home/bk/mysql-5.0

into neptunus.(none):/home/msvensson/mysql/mysql-5.0


ndb/src/ndbapi/ndberror.c:
  Auto merged
sql/ha_innodb.cc:
  Auto merged
parents 2ea08720 c18bed57
...@@ -53,11 +53,14 @@ max_leave_isam_configs="--with-innodb --with-berkeley-db --with-ndbcluster --wit ...@@ -53,11 +53,14 @@ max_leave_isam_configs="--with-innodb --with-berkeley-db --with-ndbcluster --wit
max_no_es_configs="$max_leave_isam_configs --without-isam" max_no_es_configs="$max_leave_isam_configs --without-isam"
max_configs="$max_no_es_configs --with-embedded-server" max_configs="$max_no_es_configs --with-embedded-server"
alpha_cflags="-mcpu=ev6 -Wa,-mev6" # Not used yet path=`dirname $0`
amd64_cflags="" # If dropping '--with-big-tables', add here "-DBIG_TABLES" . "$path/check-cpu"
pentium_cflags="-mcpu=pentiumpro"
pentium64_cflags="-mcpu=nocona -m64" alpha_cflags="$check_cpu_cflags -Wa,-m$cpu_flag"
ppc_cflags="-mpowerpc -mcpu=powerpc" amd64_cflags="$check_cpu_cflags"
pentium_cflags="$check_cpu_cflags"
pentium64_cflags="$check_cpu_cflags -m64"
ppc_cflags="$check_cpu_cflags"
sparc_cflags="" sparc_cflags=""
# be as fast as we can be without losing our ability to backtrace # be as fast as we can be without losing our ability to backtrace
......
#!/bin/sh
#
# Check cpu of current machine and find the
# best compiler optimization flags for gcc
#
#
if test -r /proc/cpuinfo ; then
cpuinfo="cat /proc/cpuinfo"
cpu_family=`$cpuinfo | grep 'family' | cut -d ':' -f 2 | cut -d ' ' -f 2 | head -1`
if test -z "$cpu_family" ; then
cpu_family=`$cpuinfo | grep 'cpu' | cut -d ':' -f 2 | cut -d ' ' -f 2 | head -1`
fi
cpu_vendor=`$cpuinfo | grep 'vendor_id' | cut -d ':' -f 2 | cut -d ' ' -f 2 | head -1`
model_name=`$cpuinfo | grep 'model name' | cut -d ':' -f 2 | head -1`
if test -z "$model_name" ; then
model_name=`$cpuinfo | grep 'cpu model' | cut -d ':' -f 2 | head -1`
fi
if test -z "$model_name" ; then
model_name=`uname -m`
fi
else
exit 0
fi
case "$cpu_family--$model_name" in
Alpha*EV6*)
cpu_flag="ev6";
;;
*Xeon*)
cpu_flag="nocona";
;;
*Pentium*4*CPU*)
cpu_flag="pentium4";
;;
*Athlon*64*)
cpu_flag="athlon64";
;;
*Athlon*)
cpu_flag="athlon";
;;
*Itanium*)
# Don't need to set any flags for itanium(at the moment)
cpu_flag="";
;;
*ppc)
cpu_flag="powerpc";
;;
*)
cpu_flag="";
;;
esac
if test -z "$cpu_flag"; then
echo "BUILD/check-cpu: Oops, could not findout what kind of cpu this machine is using."
check_cpu_flags=""
return
fi
echo "cpu_flag: $cpu_flag"
if test -z "$CC" ; then
cc="gcc";
else
cc=$CC
fi
cc_ver=`$cc --version | sed 1q`
cc_verno=`echo $cc_ver | sed -e 's/[^0-9. ]//g; s/^ *//g; s/ .*//g'`
case "$cc_ver--$cc_verno" in
*GCC*--3.4*|*GCC*--3.5*|*GCC*--4.*)
check_cpu_cflags="-mtune=$cpu_flag -march=$cpu_flag"
;;
*GCC*)
check_cpu_cflags="-mcpu=$cpu_flag -march=$cpu_flag"
;;
*)
check_cpu_cflags=""
;;
esac
echo $check_cpu_cflags
...@@ -703,8 +703,16 @@ static void usage(int version) ...@@ -703,8 +703,16 @@ static void usage(int version)
#ifdef __NETWARE__ #ifdef __NETWARE__
#define printf consoleprintf #define printf consoleprintf
#endif #endif
printf("%s Ver %s Distrib %s, for %s (%s)\n",
my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE); #if defined(USE_LIBEDIT_INTERFACE)
const char* readline= "";
#else
const char* readline= "readline";
#endif
printf("%s Ver %s Distrib %s, for %s (%s) using %s %s\n",
my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE,
readline, rl_library_version);
if (version) if (version)
return; return;
printf("\ printf("\
...@@ -1323,7 +1331,7 @@ static void initialize_readline (char *name) ...@@ -1323,7 +1331,7 @@ static void initialize_readline (char *name)
setlocale(LC_ALL,""); /* so as libedit use isprint */ setlocale(LC_ALL,""); /* so as libedit use isprint */
#endif #endif
rl_attempted_completion_function= (CPPFunction*)&new_mysql_completion; rl_attempted_completion_function= (CPPFunction*)&new_mysql_completion;
rl_completion_entry_function= (CPFunction*)&no_completion; rl_completion_entry_function= (Function*)&no_completion;
#else #else
rl_attempted_completion_function= (CPPFunction*)&new_mysql_completion; rl_attempted_completion_function= (CPPFunction*)&new_mysql_completion;
rl_completion_entry_function= (Function*)&no_completion; rl_completion_entry_function= (Function*)&no_completion;
......
/* $NetBSD: chared.c,v 1.18 2002/11/20 16:50:08 christos Exp $ */ /* $NetBSD: chared.c,v 1.22 2004/08/13 12:10:38 mycroft Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)chared.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: chared.c,v 1.18 2002/11/20 16:50:08 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* chared.c: Character editor utilities * chared.c: Character editor utilities
...@@ -62,13 +51,13 @@ cv_undo(EditLine *el) ...@@ -62,13 +51,13 @@ cv_undo(EditLine *el)
{ {
c_undo_t *vu = &el->el_chared.c_undo; c_undo_t *vu = &el->el_chared.c_undo;
c_redo_t *r = &el->el_chared.c_redo; c_redo_t *r = &el->el_chared.c_redo;
int size; uint size;
/* Save entire line for undo */ /* Save entire line for undo */
size = el->el_line.lastchar - el->el_line.buffer; size = el->el_line.lastchar - el->el_line.buffer;
vu->len = size; vu->len = size;
vu->cursor = el->el_line.cursor - el->el_line.buffer; vu->cursor = el->el_line.cursor - el->el_line.buffer;
memcpy(vu->buf, el->el_line.buffer, (size_t)size); memcpy(vu->buf, el->el_line.buffer, size);
/* save command info for redo */ /* save command info for redo */
r->count = el->el_state.doingarg ? el->el_state.argument : 0; r->count = el->el_state.doingarg ? el->el_state.argument : 0;
...@@ -139,6 +128,21 @@ c_delafter(EditLine *el, int num) ...@@ -139,6 +128,21 @@ c_delafter(EditLine *el, int num)
} }
/* c_delafter1():
* Delete the character after the cursor, do not yank
*/
protected void
c_delafter1(EditLine *el)
{
char *cp;
for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
*cp = cp[1];
el->el_line.lastchar--;
}
/* c_delbefore(): /* c_delbefore():
* Delete num characters before the cursor * Delete num characters before the cursor
*/ */
...@@ -167,6 +171,21 @@ c_delbefore(EditLine *el, int num) ...@@ -167,6 +171,21 @@ c_delbefore(EditLine *el, int num)
} }
/* c_delbefore1():
* Delete the character before the cursor, do not yank
*/
protected void
c_delbefore1(EditLine *el)
{
char *cp;
for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++)
*cp = cp[1];
el->el_line.lastchar--;
}
/* 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
*/ */
...@@ -460,8 +479,8 @@ ch_init(EditLine *el) ...@@ -460,8 +479,8 @@ 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;
el->el_chared.c_macro.nline = NULL;
el->el_chared.c_macro.level = -1; el->el_chared.c_macro.level = -1;
el->el_chared.c_macro.offset = 0;
el->el_chared.c_macro.macro = (char **) el_malloc(EL_MAXMACRO * el->el_chared.c_macro.macro = (char **) el_malloc(EL_MAXMACRO *
sizeof(char *)); sizeof(char *));
if (el->el_chared.c_macro.macro == NULL) if (el->el_chared.c_macro.macro == NULL)
...@@ -582,7 +601,7 @@ ch_enlargebufs(el, addlen) ...@@ -582,7 +601,7 @@ ch_enlargebufs(el, addlen)
return 0; return 0;
/* Safe to set enlarged buffer size */ /* Safe to set enlarged buffer size */
el->el_line.limit = &newbuffer[newsz - EL_LEAVE]; el->el_line.limit = &el->el_line.buffer[newsz - EL_LEAVE];
return 1; return 1;
} }
......
/* $NetBSD: chared.h,v 1.11 2002/11/20 16:50:08 christos Exp $ */ /* $NetBSD: chared.h,v 1.14 2004/08/13 12:10:39 mycroft Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -66,8 +62,8 @@ ...@@ -66,8 +62,8 @@
typedef struct c_macro_t { typedef struct c_macro_t {
int level; int level;
int offset;
char **macro; char **macro;
char *nline;
} c_macro_t; } c_macro_t;
/* /*
...@@ -158,7 +154,9 @@ protected char *c__next_word(char *, char *, int, int (*)(int)); ...@@ -158,7 +154,9 @@ protected char *c__next_word(char *, char *, int, int (*)(int));
protected char *c__prev_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_insert(EditLine *, int);
protected void c_delbefore(EditLine *, int); protected void c_delbefore(EditLine *, int);
protected void c_delbefore1(EditLine *);
protected void c_delafter(EditLine *, int); protected void c_delafter(EditLine *, int);
protected void c_delafter1(EditLine *);
protected int c_gets(EditLine *, char *, const char *); protected int c_gets(EditLine *, char *, const char *);
protected int c_hpos(EditLine *); protected int c_hpos(EditLine *);
......
This diff is collapsed.
/* $NetBSD: el.c,v 1.30 2002/11/12 00:00:23 thorpej Exp $ */ /* $NetBSD: el.c,v 1.39 2004/07/08 00:51:36 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
#else
__RCSID("$NetBSD: el.c,v 1.30 2002/11/12 00:00:23 thorpej Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* el.c: EditLine interface functions * el.c: EditLine interface functions
...@@ -72,7 +61,10 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) ...@@ -72,7 +61,10 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
el->el_infd = fileno(fin); el->el_infd = fileno(fin);
el->el_outfile = fout; el->el_outfile = fout;
el->el_errfile = ferr; el->el_errfile = ferr;
el->el_prog = strdup(prog); if ((el->el_prog = el_strdup(prog)) == NULL) {
el_free(el);
return NULL;
}
/* /*
* Initialize all the modules. Order is important!!! * Initialize all the modules. Order is important!!!
...@@ -80,11 +72,11 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) ...@@ -80,11 +72,11 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
el->el_flags = 0; el->el_flags = 0;
if (term_init(el) == -1) { if (term_init(el) == -1) {
free(el->el_prog); el_free(el->el_prog);
el_free(el); el_free(el);
return NULL; return NULL;
} }
(void) el_key_init(el); (void) key_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;
...@@ -112,7 +104,7 @@ el_end(EditLine *el) ...@@ -112,7 +104,7 @@ el_end(EditLine *el)
el_reset(el); el_reset(el);
term_end(el); term_end(el);
el_key_end(el); key_end(el);
map_end(el); map_end(el);
tty_end(el); tty_end(el);
ch_end(el); ch_end(el);
...@@ -257,6 +249,27 @@ el_set(EditLine *el, int op, ...) ...@@ -257,6 +249,27 @@ el_set(EditLine *el, int op, ...)
el->el_data = va_arg(va, void *); el->el_data = va_arg(va, void *);
break; break;
case EL_UNBUFFERED:
rv = va_arg(va, int);
if (rv && !(el->el_flags & UNBUFFERED)) {
el->el_flags |= UNBUFFERED;
read_prepare(el);
} else if (!rv && (el->el_flags & UNBUFFERED)) {
el->el_flags &= ~UNBUFFERED;
read_finish(el);
}
rv = 0;
break;
case EL_PREP_TERM:
rv = va_arg(va, int);
if (rv)
(void) tty_rawmode(el);
else
(void) tty_cookedmode(el);
rv = 0;
break;
default: default:
rv = -1; rv = -1;
break; break;
...@@ -297,21 +310,22 @@ el_get(EditLine *el, int op, void *ret) ...@@ -297,21 +310,22 @@ el_get(EditLine *el, int op, void *ret)
rv = 0; rv = 0;
break; break;
#if 0 /* XXX */
case EL_TERMINAL: case EL_TERMINAL:
rv = term_get(el, (const char *) &ret); term_get(el, (const char **)ret);
rv = 0;
break; break;
#if 0 /* XXX */
case EL_BIND: case EL_BIND:
case EL_TELLTC: case EL_TELLTC:
case EL_SETTC: case EL_SETTC:
case EL_ECHOTC: case EL_ECHOTC:
case EL_SETTY: case EL_SETTY:
{ {
char *argv[20]; const char *argv[20];
int i; int i;
for (i = 1; i < 20; i++) for (i = 1; i < sizeof(argv) / sizeof(argv[0]); i++)
if ((argv[i] = va_arg(va, char *)) == NULL) if ((argv[i] = va_arg(va, char *)) == NULL)
break; break;
...@@ -378,6 +392,11 @@ el_get(EditLine *el, int op, void *ret) ...@@ -378,6 +392,11 @@ el_get(EditLine *el, int op, void *ret)
rv = 0; rv = 0;
break; break;
case EL_UNBUFFERED:
*((int *) ret) = (!(el->el_flags & UNBUFFERED));
rv = 0;
break;
default: default:
rv = -1; rv = -1;
} }
...@@ -409,12 +428,17 @@ el_source(EditLine *el, const char *fname) ...@@ -409,12 +428,17 @@ el_source(EditLine *el, const char *fname)
fp = NULL; fp = NULL;
if (fname == NULL) { if (fname == NULL) {
#ifdef HAVE_ISSETUGID
static const char elpath[] = "/.editrc"; static const char elpath[] = "/.editrc";
#ifdef MAXPATHLEN
char path[MAXPATHLEN]; char path[MAXPATHLEN];
#else
char path[4096];
#endif
#ifdef HAVE_ISSETUGID
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)) if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path))
...@@ -422,14 +446,6 @@ el_source(EditLine *el, const char *fname) ...@@ -422,14 +446,6 @@ el_source(EditLine *el, const char *fname)
if (strlcat(path, elpath, sizeof(path)) >= sizeof(path)) if (strlcat(path, elpath, sizeof(path)) >= sizeof(path))
return (-1); return (-1);
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");
...@@ -496,10 +512,13 @@ el_editmode(EditLine *el, int argc, const char **argv) ...@@ -496,10 +512,13 @@ el_editmode(EditLine *el, int argc, const char **argv)
return (-1); return (-1);
how = argv[1]; how = argv[1];
if (strcmp(how, "on") == 0) if (strcmp(how, "on") == 0) {
el->el_flags &= ~EDIT_DISABLED; el->el_flags &= ~EDIT_DISABLED;
else if (strcmp(how, "off") == 0) tty_rawmode(el);
} else if (strcmp(how, "off") == 0) {
tty_cookedmode(el);
el->el_flags |= EDIT_DISABLED; el->el_flags |= EDIT_DISABLED;
}
else { else {
(void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how); (void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how);
return (-1); return (-1);
......
/* $NetBSD: el.h,v 1.13 2002/11/15 14:32:33 christos Exp $ */ /* $NetBSD: el.h,v 1.16 2003/10/18 23:48:42 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -55,9 +51,10 @@ ...@@ -55,9 +51,10 @@
#define EL_BUFSIZ 1024 /* Maximum line size */ #define EL_BUFSIZ 1024 /* Maximum line size */
#define HANDLE_SIGNALS 1<<0 #define HANDLE_SIGNALS 0x01
#define NO_TTY 1<<1 #define NO_TTY 0x02
#define EDIT_DISABLED 1<<2 #define EDIT_DISABLED 0x04
#define UNBUFFERED 0x08
typedef int bool_t; /* True or not */ typedef int bool_t; /* True or not */
...@@ -91,6 +88,7 @@ typedef struct el_state_t { ...@@ -91,6 +88,7 @@ typedef struct el_state_t {
/* /*
* Until we come up with something better... * Until we come up with something better...
*/ */
#define el_strdup(a) strdup(a)
#define el_malloc(a) malloc(a) #define el_malloc(a) malloc(a)
#define el_realloc(a,b) realloc(a, b) #define el_realloc(a,b) realloc(a, b)
#define el_free(a) free(a) #define el_free(a) free(a)
...@@ -98,7 +96,7 @@ typedef struct el_state_t { ...@@ -98,7 +96,7 @@ typedef struct el_state_t {
#include "tty.h" #include "tty.h"
#include "prompt.h" #include "prompt.h"
#include "key.h" #include "key.h"
#include "libedit_term.h" #include "el_term.h"
#include "refresh.h" #include "refresh.h"
#include "chared.h" #include "chared.h"
#include "common.h" #include "common.h"
......
/* $NetBSD: term.h,v 1.15 2003/09/14 21:48:55 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
*
* 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.
* 3. Neither the name of the University 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 REGENTS 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 REGENTS 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.
*
* @(#)term.h 8.1 (Berkeley) 6/4/93
*/
/*
* el.term.h: Termcap header
*/
#ifndef _h_el_term
#define _h_el_term
#include "histedit.h"
typedef struct { /* Symbolic function key bindings */
const char *name; /* name of the key */
int key; /* Index in termcap table */
key_value_t fun; /* Function bound to it */
int type; /* Type of function */
} fkey_t;
typedef struct {
const char *t_name; /* the terminal name */
coord_t t_size; /* # lines and cols */
int t_flags;
#define TERM_CAN_INSERT 0x001 /* Has insert cap */
#define TERM_CAN_DELETE 0x002 /* Has delete cap */
#define TERM_CAN_CEOL 0x004 /* Has CEOL cap */
#define TERM_CAN_TAB 0x008 /* Can use tabs */
#define TERM_CAN_ME 0x010 /* Can turn all attrs. */
#define TERM_CAN_UP 0x020 /* Can move up */
#define TERM_HAS_META 0x040 /* Has a meta key */
#define TERM_HAS_AUTO_MARGINS 0x080 /* Has auto margins */
#define TERM_HAS_MAGIC_MARGINS 0x100 /* Has magic margins */
char *t_buf; /* Termcap buffer */
int t_loc; /* location used */
char **t_str; /* termcap strings */
int *t_val; /* termcap values */
char *t_cap; /* Termcap buffer */
fkey_t *t_fkey; /* Array of keys */
} el_term_t;
/*
* fKey indexes
*/
#define A_K_DN 0
#define A_K_UP 1
#define A_K_LT 2
#define A_K_RT 3
#define A_K_HO 4
#define A_K_EN 5
#define A_K_NKEYS 6
#ifdef _SUNOS
extern int tgetent(char *, const char *);
extern int tgetflag(char *);
extern int tgetnum(char *);
extern int tputs(const char *, int, int (*)(int));
extern char* tgoto(const char*, int, int);
extern char* tgetstr(char*, char**);
#endif
protected void term_move_to_line(EditLine *, int);
protected void term_move_to_char(EditLine *, int);
protected void term_clear_EOL(EditLine *, int);
protected void term_overwrite(EditLine *, const char *, int);
protected void term_insertwrite(EditLine *, char *, int);
protected void term_deletechars(EditLine *, int);
protected void term_clear_screen(EditLine *);
protected void term_beep(EditLine *);
protected int term_change_size(EditLine *, int, int);
protected int term_get_size(EditLine *, int *, int *);
protected int term_init(EditLine *);
protected void term_bind_arrow(EditLine *);
protected void term_print_arrow(EditLine *, const char *);
protected int term_clear_arrow(EditLine *, const char *);
protected int term_set_arrow(EditLine *, const char *, key_value_t *, int);
protected void term_end(EditLine *);
protected void term_get(EditLine *, const char **);
protected int term_set(EditLine *, const char *);
protected int term_settc(EditLine *, int, const char **);
protected int term_telltc(EditLine *, int, const char **);
protected int term_echotc(EditLine *, int, const char **);
protected int term__putc(int);
protected void term__flush(void);
/*
* Easy access macros
*/
#define EL_FLAGS (el)->el_term.t_flags
#define EL_CAN_INSERT (EL_FLAGS & TERM_CAN_INSERT)
#define EL_CAN_DELETE (EL_FLAGS & TERM_CAN_DELETE)
#define EL_CAN_CEOL (EL_FLAGS & TERM_CAN_CEOL)
#define EL_CAN_TAB (EL_FLAGS & TERM_CAN_TAB)
#define EL_CAN_ME (EL_FLAGS & TERM_CAN_ME)
#define EL_HAS_META (EL_FLAGS & TERM_HAS_META)
#define EL_HAS_AUTO_MARGINS (EL_FLAGS & TERM_HAS_AUTO_MARGINS)
#define EL_HAS_MAGIC_MARGINS (EL_FLAGS & TERM_HAS_MAGIC_MARGINS)
#endif /* _h_el_term */
/* $NetBSD: emacs.c,v 1.12 2002/11/15 14:32:33 christos Exp $ */ /* $NetBSD: emacs.c,v 1.19 2004/10/28 21:14:52 dsl Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: emacs.c,v 1.12 2002/11/15 14:32:33 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* emacs.c: Emacs functions * emacs.c: Emacs functions
...@@ -56,7 +45,7 @@ __RCSID("$NetBSD: emacs.c,v 1.12 2002/11/15 14:32:33 christos Exp $"); ...@@ -56,7 +45,7 @@ __RCSID("$NetBSD: emacs.c,v 1.12 2002/11/15 14:32:33 christos Exp $");
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_delete_or_list(EditLine *el, int c __attribute__((unused))) em_delete_or_list(EditLine *el, int c __attribute__((__unused__)))
{ {
if (el->el_line.cursor == el->el_line.lastchar) { if (el->el_line.cursor == el->el_line.lastchar) {
...@@ -75,7 +64,10 @@ em_delete_or_list(EditLine *el, int c __attribute__((unused))) ...@@ -75,7 +64,10 @@ em_delete_or_list(EditLine *el, int c __attribute__((unused)))
return (CC_ERROR); return (CC_ERROR);
} }
} else { } else {
c_delafter(el, el->el_state.argument); /* delete after dot */ if (el->el_state.doingarg)
c_delafter(el, el->el_state.argument);
else
c_delafter1(el);
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 */
...@@ -90,7 +82,7 @@ em_delete_or_list(EditLine *el, int c __attribute__((unused))) ...@@ -90,7 +82,7 @@ em_delete_or_list(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_delete_next_word(EditLine *el, int c __attribute__((unused))) em_delete_next_word(EditLine *el, int c __attribute__((__unused__)))
{ {
char *cp, *p, *kp; char *cp, *p, *kp;
...@@ -119,14 +111,12 @@ em_delete_next_word(EditLine *el, int c __attribute__((unused))) ...@@ -119,14 +111,12 @@ em_delete_next_word(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_yank(EditLine *el, int c __attribute__((unused))) em_yank(EditLine *el, int c __attribute__((__unused__)))
{ {
char *kp, *cp; char *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)
if (!ch_enlargebufs(el, 1)) return (CC_NORM);
return (CC_ERROR);
}
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) >=
...@@ -156,7 +146,7 @@ em_yank(EditLine *el, int c __attribute__((unused))) ...@@ -156,7 +146,7 @@ em_yank(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_kill_line(EditLine *el, int c __attribute__((unused))) em_kill_line(EditLine *el, int c __attribute__((__unused__)))
{ {
char *kp, *cp; char *kp, *cp;
...@@ -178,7 +168,7 @@ em_kill_line(EditLine *el, int c __attribute__((unused))) ...@@ -178,7 +168,7 @@ em_kill_line(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_kill_region(EditLine *el, int c __attribute__((unused))) em_kill_region(EditLine *el, int c __attribute__((__unused__)))
{ {
char *kp, *cp; char *kp, *cp;
...@@ -211,7 +201,7 @@ em_kill_region(EditLine *el, int c __attribute__((unused))) ...@@ -211,7 +201,7 @@ em_kill_region(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_copy_region(EditLine *el, int c __attribute__((unused))) em_copy_region(EditLine *el, int c __attribute__((__unused__)))
{ {
char *kp, *cp; char *kp, *cp;
...@@ -235,12 +225,12 @@ em_copy_region(EditLine *el, int c __attribute__((unused))) ...@@ -235,12 +225,12 @@ em_copy_region(EditLine *el, int c __attribute__((unused)))
} }
/* em_gosmacs_traspose(): /* em_gosmacs_transpose():
* 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 protected el_action_t
em_gosmacs_traspose(EditLine *el, int c) em_gosmacs_transpose(EditLine *el, int c)
{ {
if (el->el_line.cursor > &el->el_line.buffer[1]) { if (el->el_line.cursor > &el->el_line.buffer[1]) {
...@@ -260,7 +250,7 @@ em_gosmacs_traspose(EditLine *el, int c) ...@@ -260,7 +250,7 @@ em_gosmacs_traspose(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_next_word(EditLine *el, int c __attribute__((unused))) em_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)
return (CC_ERROR); return (CC_ERROR);
...@@ -285,7 +275,7 @@ em_next_word(EditLine *el, int c __attribute__((unused))) ...@@ -285,7 +275,7 @@ em_next_word(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_upper_case(EditLine *el, int c __attribute__((unused))) em_upper_case(EditLine *el, int c __attribute__((__unused__)))
{ {
char *cp, *ep; char *cp, *ep;
...@@ -293,8 +283,8 @@ em_upper_case(EditLine *el, int c __attribute__((unused))) ...@@ -293,8 +283,8 @@ em_upper_case(EditLine *el, int c __attribute__((unused)))
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((unsigned char) *cp)) if (islower((unsigned char)*cp))
*cp = toupper(*cp); *cp = toupper((unsigned char)*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)
...@@ -309,7 +299,7 @@ em_upper_case(EditLine *el, int c __attribute__((unused))) ...@@ -309,7 +299,7 @@ em_upper_case(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_capitol_case(EditLine *el, int c __attribute__((unused))) em_capitol_case(EditLine *el, int c __attribute__((__unused__)))
{ {
char *cp, *ep; char *cp, *ep;
...@@ -317,16 +307,16 @@ em_capitol_case(EditLine *el, int c __attribute__((unused))) ...@@ -317,16 +307,16 @@ em_capitol_case(EditLine *el, int c __attribute__((unused)))
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((unsigned char) *cp)) { if (isalpha((unsigned char)*cp)) {
if (islower((unsigned char) *cp)) if (islower((unsigned char)*cp))
*cp = toupper(*cp); *cp = toupper((unsigned char)*cp);
cp++; cp++;
break; break;
} }
} }
for (; cp < ep; cp++) for (; cp < ep; cp++)
if (isupper((unsigned char) *cp)) if (isupper((unsigned char)*cp))
*cp = tolower(*cp); *cp = tolower((unsigned char)*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)
...@@ -341,7 +331,7 @@ em_capitol_case(EditLine *el, int c __attribute__((unused))) ...@@ -341,7 +331,7 @@ em_capitol_case(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_lower_case(EditLine *el, int c __attribute__((unused))) em_lower_case(EditLine *el, int c __attribute__((__unused__)))
{ {
char *cp, *ep; char *cp, *ep;
...@@ -349,8 +339,8 @@ em_lower_case(EditLine *el, int c __attribute__((unused))) ...@@ -349,8 +339,8 @@ em_lower_case(EditLine *el, int c __attribute__((unused)))
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((unsigned char) *cp)) if (isupper((unsigned char)*cp))
*cp = tolower(*cp); *cp = tolower((unsigned char)*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)
...@@ -365,7 +355,7 @@ em_lower_case(EditLine *el, int c __attribute__((unused))) ...@@ -365,7 +355,7 @@ em_lower_case(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_set_mark(EditLine *el, int c __attribute__((unused))) em_set_mark(EditLine *el, int c __attribute__((__unused__)))
{ {
el->el_chared.c_kill.mark = el->el_line.cursor; el->el_chared.c_kill.mark = el->el_line.cursor;
...@@ -379,7 +369,7 @@ em_set_mark(EditLine *el, int c __attribute__((unused))) ...@@ -379,7 +369,7 @@ em_set_mark(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_exchange_mark(EditLine *el, int c __attribute__((unused))) em_exchange_mark(EditLine *el, int c __attribute__((__unused__)))
{ {
char *cp; char *cp;
...@@ -396,7 +386,7 @@ em_exchange_mark(EditLine *el, int c __attribute__((unused))) ...@@ -396,7 +386,7 @@ em_exchange_mark(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_universal_argument(EditLine *el, int c __attribute__((unused))) em_universal_argument(EditLine *el, int 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)
...@@ -413,7 +403,7 @@ em_universal_argument(EditLine *el, int c __attribute__((unused))) ...@@ -413,7 +403,7 @@ em_universal_argument(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_meta_next(EditLine *el, int c __attribute__((unused))) em_meta_next(EditLine *el, int c __attribute__((__unused__)))
{ {
el->el_state.metanext = 1; el->el_state.metanext = 1;
...@@ -426,7 +416,7 @@ em_meta_next(EditLine *el, int c __attribute__((unused))) ...@@ -426,7 +416,7 @@ em_meta_next(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_toggle_overwrite(EditLine *el, int c __attribute__((unused))) em_toggle_overwrite(EditLine *el, int c __attribute__((__unused__)))
{ {
el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ?
...@@ -440,7 +430,7 @@ em_toggle_overwrite(EditLine *el, int c __attribute__((unused))) ...@@ -440,7 +430,7 @@ em_toggle_overwrite(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_copy_prev_word(EditLine *el, int c __attribute__((unused))) em_copy_prev_word(EditLine *el, int c __attribute__((__unused__)))
{ {
char *cp, *oldc, *dp; char *cp, *oldc, *dp;
...@@ -467,7 +457,7 @@ em_copy_prev_word(EditLine *el, int c __attribute__((unused))) ...@@ -467,7 +457,7 @@ em_copy_prev_word(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_inc_search_next(EditLine *el, int c __attribute__((unused))) em_inc_search_next(EditLine *el, int c __attribute__((__unused__)))
{ {
el->el_search.patlen = 0; el->el_search.patlen = 0;
...@@ -480,9 +470,32 @@ em_inc_search_next(EditLine *el, int c __attribute__((unused))) ...@@ -480,9 +470,32 @@ em_inc_search_next(EditLine *el, int c __attribute__((unused)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_inc_search_prev(EditLine *el, int c __attribute__((unused))) em_inc_search_prev(EditLine *el, int 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));
} }
/* em_delete_prev_char():
* Delete the character to the left of the cursor
* [^?]
*/
protected el_action_t
/*ARGSUSED*/
em_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
{
if (el->el_line.cursor <= el->el_line.buffer)
return (CC_ERROR);
if (el->el_state.doingarg)
c_delbefore(el, el->el_state.argument);
else
c_delbefore1(el);
el->el_line.cursor -= el->el_state.argument;
if (el->el_line.cursor < el->el_line.buffer)
el->el_line.cursor = el->el_line.buffer;
return (CC_REFRESH);
}
/* $NetBSD: fgetln.c,v 1.2 2003/12/10 01:30:27 lukem 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.
* 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
* ``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.
*/
#include <config.h>
#include <stdio.h> #include <stdio.h>
#include "compat.h" #include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#ifndef HAVE_FGETLN
#ifdef HAVE_GETLINE char *
fgetln(FILE *fp, size_t *len)
extern int getline (char **lineptr, size_t *n, FILE *stream);
#else
/* The interface here is that of GNU libc's getline */
static int
getline (char **lineptr, size_t *n, FILE *stream)
{ {
#define EXPAND_CHUNK 16 static char *buf = NULL;
static size_t bufsiz = 0;
int n_read = 0; char *ptr;
char *line = *lineptr;
if (lineptr == NULL) return -1;
if (n == NULL) return -1;
if (stream == NULL) return -1;
if (*lineptr == NULL || *n == 0) return -1;
#ifdef HAVE_FLOCKFILE
flockfile (stream);
#endif
while (1) if (buf == NULL) {
{ bufsiz = BUFSIZ;
int c; if ((buf = malloc(bufsiz)) == NULL)
return NULL;
#ifdef HAVE_FLOCKFILE
c = getc_unlocked (stream);
#else
c = getc (stream);
#endif
if (c == EOF)
{
if (n_read > 0)
line[n_read] = '\0';
break;
} }
if (n_read + 2 >= *n) if (fgets(buf, bufsiz, fp) == NULL)
{ return NULL;
size_t new_size; *len = 0;
if (*n == 0) while ((ptr = strchr(&buf[*len], '\n')) == NULL) {
new_size = 16; size_t nbufsiz = bufsiz + BUFSIZ;
else char *nbuf = realloc(buf, nbufsiz);
new_size = *n * 2;
if (*n >= new_size) /* Overflowed size_t */ if (nbuf == NULL) {
line = NULL; int oerrno = errno;
else free(buf);
line = (char *) (*lineptr ? (char*) realloc(*lineptr, new_size) : errno = oerrno;
(char*) malloc(new_size)); buf = NULL;
return NULL;
} else
buf = nbuf;
if (line) *len = bufsiz;
{ if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL)
*lineptr = line; return buf;
*n = new_size;
}
else
{
if (*n > 0)
{
(*lineptr)[*n - 1] = '\0';
n_read = *n - 2;
}
break;
}
}
line[n_read] = c;
n_read++;
if (c == '\n') bufsiz = nbufsiz;
{
line[n_read] = '\0';
break;
}
} }
#ifdef HAVE_FLOCKFILE *len = (ptr - buf) + 1;
funlockfile (stream); return buf;
#endif
return n_read - 1;
} }
#endif /* ! HAVE_GETLINE */
char *fgetln(FILE *stream, size_t *len)
{
char *ptr = NULL;
int sz;
size_t length= 0;
sz = getline(&ptr, &length, stream);
if(len) {
*len = sz;
}
return sz >= 0 ? ptr : NULL;
}
#endif
/* $NetBSD: hist.c,v 1.12 2003/01/21 18:40:23 christos Exp $ */ /* $NetBSD: hist.c,v 1.15 2003/11/01 23:36:39 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)hist.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: hist.c,v 1.12 2003/01/21 18:40:23 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* hist.c: History access functions * hist.c: History access functions
...@@ -157,7 +146,6 @@ hist_get(EditLine *el) ...@@ -157,7 +146,6 @@ hist_get(EditLine *el)
* process a history command * process a history command
*/ */
protected int protected int
/*ARGSUSED*/
hist_command(EditLine *el, int argc, const char **argv) hist_command(EditLine *el, int argc, const char **argv)
{ {
const char *str; const char *str;
...@@ -167,7 +155,7 @@ hist_command(EditLine *el, int argc, const char **argv) ...@@ -167,7 +155,7 @@ hist_command(EditLine *el, int argc, const char **argv)
if (el->el_history.ref == NULL) if (el->el_history.ref == NULL)
return (-1); return (-1);
if (argc == 0 || strcmp(argv[0], "list") == 1) { if (argc == 1 || strcmp(argv[1], "list") == 0) {
/* 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))
...@@ -176,15 +164,15 @@ hist_command(EditLine *el, int argc, const char **argv) ...@@ -176,15 +164,15 @@ hist_command(EditLine *el, int argc, const char **argv)
return (0); return (0);
} }
if (argc != 2) if (argc != 3)
return (-1); return (-1);
num = (int)strtol(argv[1], NULL, 0); num = (int)strtol(argv[2], NULL, 0);
if (strcmp(argv[0], "size") == 0) if (strcmp(argv[1], "size") == 0)
return history(el->el_history.ref, &ev, H_SETSIZE, num); return history(el->el_history.ref, &ev, H_SETSIZE, num);
if (strcmp(argv[0], "unique") == 0) if (strcmp(argv[1], "unique") == 0)
return history(el->el_history.ref, &ev, H_SETUNIQUE, num); return history(el->el_history.ref, &ev, H_SETUNIQUE, num);
return -1; return -1;
......
/* $NetBSD: hist.h,v 1.9 2003/01/21 18:40:23 christos Exp $ */ /* $NetBSD: hist.h,v 1.10 2003/08/07 16:44:31 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
......
/* $NetBSD: histedit.h,v 1.21 2003/01/21 18:40:24 christos Exp $ */ /* $NetBSD: histedit.h,v 1.25 2003/12/05 13:37:48 lukem Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -45,7 +41,7 @@ ...@@ -45,7 +41,7 @@
#define _HISTEDIT_H_ #define _HISTEDIT_H_
#define LIBEDIT_MAJOR 2 #define LIBEDIT_MAJOR 2
#define LIBEDIT_MINOR 6 #define LIBEDIT_MINOR 9
#include <sys/types.h> #include <sys/types.h>
#include <stdio.h> #include <stdio.h>
...@@ -53,6 +49,7 @@ ...@@ -53,6 +49,7 @@
/* /*
* ==== Editing ==== * ==== Editing ====
*/ */
typedef struct editline EditLine; typedef struct editline EditLine;
/* /*
...@@ -64,7 +61,6 @@ typedef struct lineinfo { ...@@ -64,7 +61,6 @@ typedef struct lineinfo {
const char *lastchar; const char *lastchar;
} LineInfo; } LineInfo;
/* /*
* EditLine editor function return codes. * EditLine editor function return codes.
* For user-defined function interface * For user-defined function interface
...@@ -84,9 +80,8 @@ typedef struct lineinfo { ...@@ -84,9 +80,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 *);
void el_reset(EditLine *);
void el_end(EditLine *); void el_end(EditLine *);
void el_reset(EditLine *);
/* /*
* Get a line, a character or push a string back in the input queue * Get a line, a character or push a string back in the input queue
...@@ -131,6 +126,8 @@ int el_get(EditLine *, int, void *); ...@@ -131,6 +126,8 @@ int el_get(EditLine *, int, void *);
#define EL_RPROMPT 12 /* , el_pfunc_t); */ #define EL_RPROMPT 12 /* , el_pfunc_t); */
#define EL_GETCFN 13 /* , el_rfunc_t); */ #define EL_GETCFN 13 /* , el_rfunc_t); */
#define EL_CLIENTDATA 14 /* , void *); */ #define EL_CLIENTDATA 14 /* , void *); */
#define EL_UNBUFFERED 15 /* , int); */
#define EL_PREP_TERM 16 /* , int); */
#define EL_BUILTIN_GETCFN (NULL) #define EL_BUILTIN_GETCFN (NULL)
...@@ -146,7 +143,6 @@ int el_source(EditLine *, const char *); ...@@ -146,7 +143,6 @@ int el_source(EditLine *, const char *);
*/ */
void el_resize(EditLine *); void el_resize(EditLine *);
/* /*
* User-defined function interface. * User-defined function interface.
*/ */
...@@ -154,6 +150,7 @@ const LineInfo *el_line(EditLine *); ...@@ -154,6 +150,7 @@ const LineInfo *el_line(EditLine *);
int el_insertstr(EditLine *, const char *); int el_insertstr(EditLine *, const char *);
void el_deletestr(EditLine *, int); void el_deletestr(EditLine *, int);
/* /*
* ==== History ==== * ==== History ====
*/ */
...@@ -196,4 +193,22 @@ int history(History *, HistEvent *, int, ...); ...@@ -196,4 +193,22 @@ int history(History *, HistEvent *, int, ...);
#define H_SETUNIQUE 20 /* , int); */ #define H_SETUNIQUE 20 /* , int); */
#define H_GETUNIQUE 21 /* , void); */ #define H_GETUNIQUE 21 /* , void); */
/*
* ==== Tokenization ====
*/
typedef struct tokenizer Tokenizer;
/*
* String tokenization functions, using simplified sh(1) quoting rules
*/
Tokenizer *tok_init(const char *);
void tok_end(Tokenizer *);
void tok_reset(Tokenizer *);
int tok_line(Tokenizer *, const LineInfo *,
int *, const char ***, int *, int *);
int tok_str(Tokenizer *, const char *,
int *, const char ***);
#endif /* _HISTEDIT_H_ */ #endif /* _HISTEDIT_H_ */
/* $NetBSD: history.c,v 1.22 2003/01/21 18:40:24 christos Exp $ */ /* $NetBSD: history.c,v 1.28 2004/11/27 18:31:45 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)history.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: history.c,v 1.22 2003/01/21 18:40:24 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* hist.c: History access functions * hist.c: History access functions
...@@ -51,11 +40,7 @@ __RCSID("$NetBSD: history.c,v 1.22 2003/01/21 18:40:24 christos Exp $"); ...@@ -51,11 +40,7 @@ __RCSID("$NetBSD: history.c,v 1.22 2003/01/21 18:40:24 christos Exp $");
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#ifdef HAVE_VIS_H
#include <vis.h> #include <vis.h>
#else
#include "np/vis.h"
#endif
#include <sys/stat.h> #include <sys/stat.h>
static const char hist_cookie[] = "_HiStOrY_V2_\n"; static const char hist_cookie[] = "_HiStOrY_V2_\n";
...@@ -91,6 +76,7 @@ struct history { ...@@ -91,6 +76,7 @@ struct history {
#define HENTER(h, ev, str) (*(h)->h_enter)((h)->h_ref, ev, str) #define HENTER(h, ev, str) (*(h)->h_enter)((h)->h_ref, ev, str)
#define HADD(h, ev, str) (*(h)->h_add)((h)->h_ref, ev, str) #define HADD(h, ev, str) (*(h)->h_add)((h)->h_ref, ev, str)
#define h_strdup(a) strdup(a)
#define h_malloc(a) malloc(a) #define h_malloc(a) malloc(a)
#define h_realloc(a, b) realloc((a), (b)) #define h_realloc(a, b) realloc((a), (b))
#define h_free(a) free(a) #define h_free(a) free(a)
...@@ -249,20 +235,19 @@ history_def_next(ptr_t p, HistEvent *ev) ...@@ -249,20 +235,19 @@ history_def_next(ptr_t p, HistEvent *ev)
{ {
history_t *h = (history_t *) p; history_t *h = (history_t *) p;
if (h->cursor != &h->list) if (h->cursor == &h->list) {
h->cursor = h->cursor->next;
else {
he_seterrev(ev, _HE_EMPTY_LIST); he_seterrev(ev, _HE_EMPTY_LIST);
return (-1); return (-1);
} }
if (h->cursor != &h->list) if (h->cursor->next == &h->list) {
*ev = h->cursor->ev;
else {
he_seterrev(ev, _HE_END_REACHED); he_seterrev(ev, _HE_END_REACHED);
return (-1); return (-1);
} }
h->cursor = h->cursor->next;
*ev = h->cursor->ev;
return (0); return (0);
} }
...@@ -275,21 +260,20 @@ history_def_prev(ptr_t p, HistEvent *ev) ...@@ -275,21 +260,20 @@ history_def_prev(ptr_t p, HistEvent *ev)
{ {
history_t *h = (history_t *) p; history_t *h = (history_t *) p;
if (h->cursor != &h->list) if (h->cursor == &h->list) {
h->cursor = h->cursor->prev;
else {
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 != &h->list) if (h->cursor->prev == &h->list) {
*ev = h->cursor->ev;
else {
he_seterrev(ev, _HE_START_REACHED); he_seterrev(ev, _HE_START_REACHED);
return (-1); return (-1);
} }
h->cursor = h->cursor->prev;
*ev = h->cursor->ev;
return (0); return (0);
} }
...@@ -374,7 +358,8 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str) ...@@ -374,7 +358,8 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str)
*/ */
/* ARGSUSED */ /* ARGSUSED */
private void private void
history_def_delete(history_t *h, HistEvent *ev __attribute__((unused)), hentry_t *hp) history_def_delete(history_t *h,
HistEvent *ev __attribute__((__unused__)), hentry_t *hp)
{ {
HistEventPrivate *evp = (void *)&hp->ev; HistEventPrivate *evp = (void *)&hp->ev;
if (hp == &h->list) if (hp == &h->list)
...@@ -397,7 +382,7 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str) ...@@ -397,7 +382,7 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str)
h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t)); h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t));
if (h->cursor == NULL) if (h->cursor == NULL)
goto oomem; goto oomem;
if ((h->cursor->ev.str = strdup(str)) == NULL) { if ((h->cursor->ev.str = h_strdup(str)) == NULL) {
h_free((ptr_t)h->cursor); h_free((ptr_t)h->cursor);
goto oomem; goto oomem;
} }
...@@ -447,7 +432,7 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str) ...@@ -447,7 +432,7 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
*/ */
/* ARGSUSED */ /* ARGSUSED */
private int private int
history_def_init(ptr_t *p, HistEvent *ev __attribute__((unused)), int n) history_def_init(ptr_t *p, HistEvent *ev __attribute__((__unused__)), int n)
{ {
history_t *h = (history_t *) h_malloc(sizeof(history_t)); history_t *h = (history_t *) h_malloc(sizeof(history_t));
if (h == NULL) if (h == NULL)
...@@ -661,6 +646,12 @@ history_load(History *h, const char *fname) ...@@ -661,6 +646,12 @@ history_load(History *h, const char *fname)
if ((fp = fopen(fname, "r")) == NULL) if ((fp = fopen(fname, "r")) == NULL)
return (i); return (i);
if ((line = fgetln(fp, &sz)) == NULL)
goto done;
if (strncmp(line, hist_cookie, sz) != 0)
goto done;
ptr = h_malloc(max_size = 1024); ptr = h_malloc(max_size = 1024);
if (ptr == NULL) if (ptr == NULL)
goto done; goto done;
...@@ -674,7 +665,7 @@ history_load(History *h, const char *fname) ...@@ -674,7 +665,7 @@ history_load(History *h, const char *fname)
if (max_size < sz) { if (max_size < sz) {
char *nptr; char *nptr;
max_size = (sz + 1023) & ~1023; max_size = (sz + 1024) & ~1023;
nptr = h_realloc(ptr, max_size); nptr = h_realloc(ptr, max_size);
if (nptr == NULL) { if (nptr == NULL) {
i = -1; i = -1;
...@@ -714,16 +705,18 @@ history_save(History *h, const char *fname) ...@@ -714,16 +705,18 @@ history_save(History *h, const char *fname)
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)
goto done;
ptr = h_malloc(max_size = 1024); ptr = h_malloc(max_size = 1024);
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 + 1; len = strlen(ev.str) * 4;
if (len >= max_size) { if (len >= max_size) {
char *nptr; char *nptr;
max_size = (len + 1023) & ~1023; max_size = (len + 1024) & ~1023;
nptr = h_realloc(ptr, max_size); nptr = h_realloc(ptr, max_size);
if (nptr == NULL) { if (nptr == NULL) {
i = -1; i = -1;
...@@ -732,7 +725,7 @@ history_save(History *h, const char *fname) ...@@ -732,7 +725,7 @@ history_save(History *h, const char *fname)
ptr = nptr; ptr = nptr;
} }
(void) strvis(ptr, ev.str, VIS_WHITE); (void) strvis(ptr, ev.str, VIS_WHITE);
(void) fprintf(fp, "%s\n", ev.str); (void) fprintf(fp, "%s\n", ptr);
} }
oomem: oomem:
h_free((ptr_t)ptr); h_free((ptr_t)ptr);
......
/* $NetBSD: key.c,v 1.13 2002/03/18 16:00:55 christos Exp $ */ /* $NetBSD: key.c,v 1.15 2003/10/18 23:48:42 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)key.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: key.c,v 1.13 2002/03/18 16:00:55 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* key.c: This module contains the procedures for maintaining * key.c: This module contains the procedures for maintaining
...@@ -103,14 +92,14 @@ private int key__decode_char(char *, int, int); ...@@ -103,14 +92,14 @@ private int key__decode_char(char *, int, int);
* Initialize the key maps * Initialize the key maps
*/ */
protected int protected int
el_key_init(EditLine *el) key_init(EditLine *el)
{ {
el->el_key.buf = (char *) el_malloc(KEY_BUFSIZ); el->el_key.buf = (char *) el_malloc(KEY_BUFSIZ);
if (el->el_key.buf == NULL) if (el->el_key.buf == NULL)
return (-1); return (-1);
el->el_key.map = NULL; el->el_key.map = NULL;
el_key_reset(el); key_reset(el);
return (0); return (0);
} }
...@@ -119,7 +108,7 @@ el_key_init(EditLine *el) ...@@ -119,7 +108,7 @@ el_key_init(EditLine *el)
* Free the key maps * Free the key maps
*/ */
protected void protected void
el_key_end(EditLine *el) key_end(EditLine *el)
{ {
el_free((ptr_t) el->el_key.buf); el_free((ptr_t) el->el_key.buf);
...@@ -133,7 +122,7 @@ el_key_end(EditLine *el) ...@@ -133,7 +122,7 @@ el_key_end(EditLine *el)
* Associate cmd with a key value * Associate cmd with a key value
*/ */
protected key_value_t * protected key_value_t *
el_key_map_cmd(EditLine *el, int cmd) key_map_cmd(EditLine *el, int cmd)
{ {
el->el_key.val.cmd = (el_action_t) cmd; el->el_key.val.cmd = (el_action_t) cmd;
...@@ -145,7 +134,7 @@ el_key_map_cmd(EditLine *el, int cmd) ...@@ -145,7 +134,7 @@ el_key_map_cmd(EditLine *el, int cmd)
* Associate str with a key value * Associate str with a key value
*/ */
protected key_value_t * protected key_value_t *
el_key_map_str(EditLine *el, char *str) key_map_str(EditLine *el, char *str)
{ {
el->el_key.val.str = str; el->el_key.val.str = str;
...@@ -159,7 +148,7 @@ el_key_map_str(EditLine *el, char *str) ...@@ -159,7 +148,7 @@ el_key_map_str(EditLine *el, char *str)
* [Always bind the ansi arrow keys?] * [Always bind the ansi arrow keys?]
*/ */
protected void protected void
el_key_reset(EditLine *el) key_reset(EditLine *el)
{ {
node__put(el, el->el_key.map); node__put(el, el->el_key.map);
...@@ -177,7 +166,7 @@ el_key_reset(EditLine *el) ...@@ -177,7 +166,7 @@ el_key_reset(EditLine *el)
* The last character read is returned in *ch. * The last character read is returned in *ch.
*/ */
protected int protected int
el_key_get(EditLine *el, char *ch, key_value_t *val) key_get(EditLine *el, char *ch, key_value_t *val)
{ {
return (node_trav(el, el->el_key.map, ch, val)); return (node_trav(el, el->el_key.map, ch, val));
...@@ -191,7 +180,7 @@ el_key_get(EditLine *el, char *ch, key_value_t *val) ...@@ -191,7 +180,7 @@ el_key_get(EditLine *el, char *ch, key_value_t *val)
* out str or a unix command. * out str or a unix command.
*/ */
protected void protected void
el_key_add(EditLine *el, const char *key, key_value_t *val, int ntype) key_add(EditLine *el, const char *key, key_value_t *val, int ntype)
{ {
if (key[0] == '\0') { if (key[0] == '\0') {
...@@ -219,7 +208,7 @@ el_key_add(EditLine *el, const char *key, key_value_t *val, int ntype) ...@@ -219,7 +208,7 @@ el_key_add(EditLine *el, const char *key, key_value_t *val, int ntype)
* *
*/ */
protected void protected void
el_key_clear(EditLine *el, el_action_t *map, const char *in) key_clear(EditLine *el, el_action_t *map, const char *in)
{ {
if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) && if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) &&
...@@ -227,7 +216,7 @@ el_key_clear(EditLine *el, el_action_t *map, const char *in) ...@@ -227,7 +216,7 @@ el_key_clear(EditLine *el, el_action_t *map, const char *in)
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) el_key_delete(el, in); (void) key_delete(el, in);
} }
...@@ -236,7 +225,7 @@ el_key_clear(EditLine *el, el_action_t *map, const char *in) ...@@ -236,7 +225,7 @@ el_key_clear(EditLine *el, el_action_t *map, const char *in)
* they exists. * they exists.
*/ */
protected int protected int
el_key_delete(EditLine *el, const char *key) key_delete(EditLine *el, const char *key)
{ {
if (key[0] == '\0') { if (key[0] == '\0') {
...@@ -257,7 +246,7 @@ el_key_delete(EditLine *el, const char *key) ...@@ -257,7 +246,7 @@ el_key_delete(EditLine *el, const char *key)
* Print entire el->el_key.map if null * Print entire el->el_key.map if null
*/ */
protected void protected void
el_key_print(EditLine *el, const char *key) key_print(EditLine *el, const char *key)
{ {
/* do nothing if el->el_key.map is empty and null key specified */ /* do nothing if el->el_key.map is empty and null key specified */
...@@ -356,7 +345,8 @@ node__try(EditLine *el, key_node_t *ptr, const char *str, key_value_t *val, int ...@@ -356,7 +345,8 @@ node__try(EditLine *el, key_node_t *ptr, const char *str, key_value_t *val, int
break; break;
case XK_STR: case XK_STR:
case XK_EXE: case XK_EXE:
ptr->val.str = strdup(val->str); if ((ptr->val.str = el_strdup(val->str)) == NULL)
return -1;
break; break;
default: default:
EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
...@@ -504,7 +494,7 @@ node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt) ...@@ -504,7 +494,7 @@ node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt)
if (str[1] == 0) { if (str[1] == 0) {
el->el_key.buf[ncnt + 1] = '"'; el->el_key.buf[ncnt + 1] = '"';
el->el_key.buf[ncnt + 2] = '\0'; el->el_key.buf[ncnt + 2] = '\0';
el_key_kprint(el, el->el_key.buf, key_kprint(el, el->el_key.buf,
&ptr->val, ptr->type); &ptr->val, ptr->type);
return (0); return (0);
} else } else
...@@ -552,7 +542,7 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt) ...@@ -552,7 +542,7 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt)
/* print this key and function */ /* print this key and function */
el->el_key.buf[ncnt + 1] = '"'; el->el_key.buf[ncnt + 1] = '"';
el->el_key.buf[ncnt + 2] = '\0'; el->el_key.buf[ncnt + 2] = '\0';
el_key_kprint(el, el->el_key.buf, &ptr->val, ptr->type); key_kprint(el, el->el_key.buf, &ptr->val, ptr->type);
} else } else
(void) node_enum(el, ptr->next, ncnt + 1); (void) node_enum(el, ptr->next, ncnt + 1);
...@@ -568,7 +558,7 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt) ...@@ -568,7 +558,7 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt)
* function specified by val * function specified by val
*/ */
protected void protected void
el_key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype) key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
{ {
el_bindings_t *fp; el_bindings_t *fp;
char unparsbuf[EL_BUFSIZ]; char unparsbuf[EL_BUFSIZ];
...@@ -579,7 +569,7 @@ el_key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype) ...@@ -579,7 +569,7 @@ el_key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
case XK_STR: case XK_STR:
case XK_EXE: case XK_EXE:
(void) fprintf(el->el_outfile, fmt, key, (void) fprintf(el->el_outfile, fmt, key,
el_key__decode_str(val->str, unparsbuf, key__decode_str(val->str, unparsbuf,
ntype == XK_STR ? "\"\"" : "[]")); ntype == XK_STR ? "\"\"" : "[]"));
break; break;
case XK_CMD: case XK_CMD:
...@@ -644,7 +634,7 @@ key__decode_char(char *buf, int cnt, int ch) ...@@ -644,7 +634,7 @@ key__decode_char(char *buf, int cnt, int ch)
* Make a printable version of the ey * Make a printable version of the ey
*/ */
protected char * protected char *
el_key__decode_str(const char *str, char *buf, const char *sep) key__decode_str(const char *str, char *buf, const char *sep)
{ {
char *b; char *b;
const char *p; const char *p;
......
/* $NetBSD: key.h,v 1.6 2002/03/18 16:00:55 christos Exp $ */ /* $NetBSD: key.h,v 1.8 2003/08/07 16:44:32 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -62,19 +58,22 @@ typedef struct el_key_t { ...@@ -62,19 +58,22 @@ typedef struct el_key_t {
#define XK_NOD 2 #define XK_NOD 2
#define XK_EXE 3 #define XK_EXE 3
protected int el_key_init(EditLine *); #undef key_end
protected void el_key_end(EditLine *); #undef key_clear
protected key_value_t *el_key_map_cmd(EditLine *, int); #undef key_print
protected key_value_t *el_key_map_str(EditLine *, char *);
protected void el_key_reset(EditLine *); protected int key_init(EditLine *);
protected int el_key_get(EditLine *, char *, key_value_t *); protected void key_end(EditLine *);
protected void el_key_add(EditLine *, protected key_value_t *key_map_cmd(EditLine *, int);
const char *, key_value_t *, int); protected key_value_t *key_map_str(EditLine *, char *);
protected void el_key_clear(EditLine *, el_action_t *, const char *); protected void key_reset(EditLine *);
protected int el_key_delete(EditLine *, const char *); protected int key_get(EditLine *, char *, key_value_t *);
protected void el_key_print(EditLine *, const char *); protected void key_add(EditLine *, const char *, key_value_t *, int);
protected void el_key_kprint(EditLine *, const char *, key_value_t *, protected void key_clear(EditLine *, el_action_t *, const char *);
protected int key_delete(EditLine *, const char *);
protected void key_print(EditLine *, const char *);
protected void key_kprint(EditLine *, const char *, key_value_t *,
int); int);
protected char *el_key__decode_str(const char *, char *, const char *); protected char *key__decode_str(const char *, char *, const char *);
#endif /* _h_el_key */ #endif /* _h_el_key */
...@@ -68,7 +68,7 @@ case $FLAG in ...@@ -68,7 +68,7 @@ case $FLAG in
/\(\):/ { /\(\):/ {
pr = substr($2, 1, 2); pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") { if (pr == "vi" || pr == "em" || pr == "ed") {
name = substr($2, 1, length($2) - 3); name = substr($2, 1, index($2,"(") - 1);
# #
# 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
...@@ -97,7 +97,7 @@ case $FLAG in ...@@ -97,7 +97,7 @@ case $FLAG in
/\(\):/ { /\(\):/ {
pr = substr($2, 1, 2); pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") { if (pr == "vi" || pr == "em" || pr == "ed") {
name = substr($2, 1, length($2) - 3); name = substr($2, 1, index($2,"(") - 1);
uname = ""; uname = "";
fname = ""; fname = "";
for (i = 1; i <= length(name); i++) { for (i = 1; i <= length(name); i++) {
...@@ -117,6 +117,7 @@ case $FLAG in ...@@ -117,6 +117,7 @@ case $FLAG in
printf(" \""); printf(" \"");
for (i = 2; i < NF; i++) for (i = 2; i < NF; i++)
printf("%s ", $i); printf("%s ", $i);
sub("\r", "", $i);
printf("%s\" },\n", $i); printf("%s\" },\n", $i);
ok = 0; ok = 0;
} }
...@@ -219,7 +220,7 @@ case $FLAG in ...@@ -219,7 +220,7 @@ case $FLAG in
/\(\):/ { /\(\):/ {
pr = substr($2, 1, 2); pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") { if (pr == "vi" || pr == "em" || pr == "ed") {
name = substr($2, 1, length($2) - 3); name = substr($2, 1, index($2, "(") - 1);
fname = ""; fname = "";
for (i = 1; i <= length(name); i++) { for (i = 1; i <= length(name); i++) {
s = substr(name, i, 1); s = substr(name, i, 1);
......
/* $NetBSD: map.c,v 1.18 2002/11/15 14:32:33 christos Exp $ */ /* $NetBSD: map.c,v 1.20 2004/08/13 12:10:39 mycroft Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: map.c,v 1.18 2002/11/15 14:32:33 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* map.c: Editor function definitions * map.c: Editor function definitions
...@@ -71,7 +60,7 @@ private const el_action_t el_map_emacs[] = { ...@@ -71,7 +60,7 @@ private const el_action_t el_map_emacs[] = {
/* 5 */ ED_MOVE_TO_END, /* ^E */ /* 5 */ ED_MOVE_TO_END, /* ^E */
/* 6 */ ED_NEXT_CHAR, /* ^F */ /* 6 */ ED_NEXT_CHAR, /* ^F */
/* 7 */ ED_UNASSIGNED, /* ^G */ /* 7 */ ED_UNASSIGNED, /* ^G */
/* 8 */ ED_DELETE_PREV_CHAR, /* ^H */ /* 8 */ EM_DELETE_PREV_CHAR, /* ^H */
/* 9 */ ED_UNASSIGNED, /* ^I */ /* 9 */ ED_UNASSIGNED, /* ^I */
/* 10 */ ED_NEWLINE, /* ^J */ /* 10 */ ED_NEWLINE, /* ^J */
/* 11 */ ED_KILL_LINE, /* ^K */ /* 11 */ ED_KILL_LINE, /* ^K */
...@@ -190,7 +179,7 @@ private const el_action_t el_map_emacs[] = { ...@@ -190,7 +179,7 @@ private const el_action_t el_map_emacs[] = {
/* 124 */ ED_INSERT, /* | */ /* 124 */ ED_INSERT, /* | */
/* 125 */ ED_INSERT, /* } */ /* 125 */ ED_INSERT, /* } */
/* 126 */ ED_INSERT, /* ~ */ /* 126 */ ED_INSERT, /* ~ */
/* 127 */ ED_DELETE_PREV_CHAR, /* ^? */ /* 127 */ EM_DELETE_PREV_CHAR, /* ^? */
/* 128 */ ED_UNASSIGNED, /* M-^@ */ /* 128 */ ED_UNASSIGNED, /* M-^@ */
/* 129 */ ED_UNASSIGNED, /* M-^A */ /* 129 */ ED_UNASSIGNED, /* M-^A */
/* 130 */ ED_UNASSIGNED, /* M-^B */ /* 130 */ ED_UNASSIGNED, /* M-^B */
...@@ -1011,8 +1000,7 @@ map_init_meta(EditLine *el) ...@@ -1011,8 +1000,7 @@ map_init_meta(EditLine *el)
break; break;
default: default:
buf[1] = i & 0177; buf[1] = i & 0177;
el_key_add(el, buf, key_add(el, buf, key_map_cmd(el, (int) map[i]), XK_CMD);
el_key_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;
...@@ -1034,7 +1022,7 @@ map_init_vi(EditLine *el) ...@@ -1034,7 +1022,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;
el_key_reset(el); key_reset(el);
for (i = 0; i < N_KEYS; i++) { for (i = 0; i < N_KEYS; i++) {
key[i] = vii[i]; key[i] = vii[i];
...@@ -1063,7 +1051,7 @@ map_init_emacs(EditLine *el) ...@@ -1063,7 +1051,7 @@ map_init_emacs(EditLine *el)
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;
el_key_reset(el); key_reset(el);
for (i = 0; i < N_KEYS; i++) { for (i = 0; i < N_KEYS; i++) {
key[i] = emacs[i]; key[i] = emacs[i];
...@@ -1076,7 +1064,7 @@ map_init_emacs(EditLine *el) ...@@ -1076,7 +1064,7 @@ 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;
el_key_add(el, buf, el_key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD); key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
tty_bind_char(el, 1); tty_bind_char(el, 1);
term_bind_arrow(el); term_bind_arrow(el);
...@@ -1133,7 +1121,7 @@ map_print_key(EditLine *el, el_action_t *map, const char *in) ...@@ -1133,7 +1121,7 @@ map_print_key(EditLine *el, el_action_t *map, const char *in)
el_bindings_t *bp; el_bindings_t *bp;
if (in[0] == '\0' || in[1] == '\0') { if (in[0] == '\0' || in[1] == '\0') {
(void) el_key__decode_str(in, outbuf, ""); (void) key__decode_str(in, outbuf, "");
for (bp = el->el_map.help; bp->name != NULL; bp++) for (bp = el->el_map.help; bp->name != NULL; 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,
...@@ -1141,7 +1129,7 @@ map_print_key(EditLine *el, el_action_t *map, const char *in) ...@@ -1141,7 +1129,7 @@ map_print_key(EditLine *el, el_action_t *map, const char *in)
return; return;
} }
} else } else
el_key_print(el, in); key_print(el, in);
} }
...@@ -1163,20 +1151,20 @@ map_print_some_keys(EditLine *el, el_action_t *map, int first, int last) ...@@ -1163,20 +1151,20 @@ map_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
if (first == last) if (first == last)
(void) fprintf(el->el_outfile, (void) fprintf(el->el_outfile,
"%-15s-> is undefined\n", "%-15s-> is undefined\n",
el_key__decode_str(firstbuf, unparsbuf, STRQQ)); key__decode_str(firstbuf, unparsbuf, STRQQ));
return; return;
} }
for (bp = el->el_map.help; bp->name != NULL; bp++) { for (bp = el->el_map.help; bp->name != NULL; bp++) {
if (bp->func == map[first]) { if (bp->func == map[first]) {
if (first == last) { if (first == last) {
(void) fprintf(el->el_outfile, "%-15s-> %s\n", (void) fprintf(el->el_outfile, "%-15s-> %s\n",
el_key__decode_str(firstbuf, unparsbuf, STRQQ), key__decode_str(firstbuf, unparsbuf, STRQQ),
bp->name); bp->name);
} else { } else {
(void) fprintf(el->el_outfile, (void) fprintf(el->el_outfile,
"%-4s to %-7s-> %s\n", "%-4s to %-7s-> %s\n",
el_key__decode_str(firstbuf, unparsbuf, STRQQ), key__decode_str(firstbuf, unparsbuf, STRQQ),
el_key__decode_str(lastbuf, extrabuf, STRQQ), key__decode_str(lastbuf, extrabuf, STRQQ),
bp->name); bp->name);
} }
return; return;
...@@ -1230,7 +1218,7 @@ map_print_all_keys(EditLine *el) ...@@ -1230,7 +1218,7 @@ 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");
el_key_print(el, ""); key_print(el, "");
(void) fprintf(el->el_outfile, "Arrow key bindings\n"); (void) fprintf(el->el_outfile, "Arrow key bindings\n");
term_print_arrow(el, ""); term_print_arrow(el, "");
} }
...@@ -1323,9 +1311,9 @@ map_bind(EditLine *el, int argc, const char **argv) ...@@ -1323,9 +1311,9 @@ map_bind(EditLine *el, int argc, const char **argv)
return (-1); return (-1);
} }
if (in[1]) if (in[1])
(void) el_key_delete(el, in); (void) key_delete(el, in);
else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN) else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
(void) el_key_delete(el, in); (void) key_delete(el, in);
else else
map[(unsigned char) *in] = ED_UNASSIGNED; map[(unsigned char) *in] = ED_UNASSIGNED;
return (0); return (0);
...@@ -1353,9 +1341,9 @@ map_bind(EditLine *el, int argc, const char **argv) ...@@ -1353,9 +1341,9 @@ map_bind(EditLine *el, int argc, const char **argv)
return (-1); return (-1);
} }
if (key) if (key)
term_set_arrow(el, in, el_key_map_str(el, out), ntype); term_set_arrow(el, in, key_map_str(el, out), ntype);
else else
el_key_add(el, in, el_key_map_str(el, out), ntype); key_add(el, in, key_map_str(el, out), ntype);
map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
break; break;
...@@ -1366,13 +1354,13 @@ map_bind(EditLine *el, int argc, const char **argv) ...@@ -1366,13 +1354,13 @@ map_bind(EditLine *el, int argc, const char **argv)
return (-1); return (-1);
} }
if (key) if (key)
term_set_arrow(el, in, el_key_map_str(el, out), ntype); term_set_arrow(el, in, key_map_str(el, out), ntype);
else { else {
if (in[1]) { if (in[1]) {
el_key_add(el, in, el_key_map_cmd(el, cmd), ntype); key_add(el, in, key_map_cmd(el, cmd), ntype);
map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
} else { } else {
el_key_clear(el, map, in); key_clear(el, map, in);
map[(unsigned char) *in] = cmd; map[(unsigned char) *in] = cmd;
} }
} }
......
/* $NetBSD: map.h,v 1.7 2002/03/18 16:00:56 christos Exp $ */ /* $NetBSD: map.h,v 1.8 2003/08/07 16:44:32 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
......
/* $NetBSD: parse.c,v 1.16 2003/01/21 18:40:24 christos Exp $ */ /* $NetBSD: parse.c,v 1.20 2003/12/05 13:37:48 lukem Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: parse.c,v 1.16 2003/01/21 18:40:24 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* parse.c: parse an editline extended command * parse.c: parse an editline extended command
...@@ -59,7 +48,6 @@ __RCSID("$NetBSD: parse.c,v 1.16 2003/01/21 18:40:24 christos Exp $"); ...@@ -59,7 +48,6 @@ __RCSID("$NetBSD: parse.c,v 1.16 2003/01/21 18:40:24 christos Exp $");
* setty * setty
*/ */
#include "el.h" #include "el.h"
#include "tokenizer.h"
#include <stdlib.h> #include <stdlib.h>
private const struct { private const struct {
...@@ -87,9 +75,8 @@ parse_line(EditLine *el, const char *line) ...@@ -87,9 +75,8 @@ parse_line(EditLine *el, const char *line)
int argc; int argc;
Tokenizer *tok; Tokenizer *tok;
if (!(tok = tok_init(NULL))) tok = tok_init(NULL);
return -1; tok_str(tok, line, &argc, &argv);
tok_line(tok, line, &argc, &argv);
argc = el_parse(el, argc, argv); argc = el_parse(el, argc, argv);
tok_end(tok); tok_end(tok);
return (argc); return (argc);
...@@ -207,7 +194,7 @@ parse__escape(const char **const ptr) ...@@ -207,7 +194,7 @@ parse__escape(const char **const ptr)
c = *p; c = *p;
break; break;
} }
} else if (*p == '^' && isalpha((unsigned char) p[1])) { } else if (*p == '^') {
p++; p++;
c = (*p == '?') ? '\177' : (*p & 0237); c = (*p == '?') ? '\177' : (*p & 0237);
} else } else
...@@ -215,6 +202,7 @@ parse__escape(const char **const ptr) ...@@ -215,6 +202,7 @@ parse__escape(const char **const ptr)
*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
*/ */
...@@ -237,6 +225,14 @@ parse__string(char *out, const char *in) ...@@ -237,6 +225,14 @@ parse__string(char *out, const char *in)
*out++ = n; *out++ = n;
break; break;
case 'M':
if (in[1] == '-' && in[2] != '\0') {
*out++ = '\033';
in += 2;
break;
}
/*FALLTHROUGH*/
default: default:
*out++ = *in++; *out++ = *in++;
break; break;
......
/* $NetBSD: parse.h,v 1.4 2000/09/04 22:06:31 lukem Exp $ */ /* $NetBSD: parse.h,v 1.5 2003/08/07 16:44:32 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
......
/* $NetBSD: prompt.c,v 1.9 2002/03/18 16:00:56 christos Exp $ */ /* $NetBSD: prompt.c,v 1.11 2003/08/07 16:44:32 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)prompt.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: prompt.c,v 1.9 2002/03/18 16:00:56 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* prompt.c: Prompt printing functions * prompt.c: Prompt printing functions
...@@ -59,7 +48,7 @@ private char *prompt_default_r(EditLine *); ...@@ -59,7 +48,7 @@ private char *prompt_default_r(EditLine *);
*/ */
private char * private char *
/*ARGSUSED*/ /*ARGSUSED*/
prompt_default(EditLine *el __attribute__((unused))) prompt_default(EditLine *el __attribute__((__unused__)))
{ {
static char a[3] = {'?', ' ', '\0'}; static char a[3] = {'?', ' ', '\0'};
...@@ -72,7 +61,7 @@ prompt_default(EditLine *el __attribute__((unused))) ...@@ -72,7 +61,7 @@ prompt_default(EditLine *el __attribute__((unused)))
*/ */
private char * private char *
/*ARGSUSED*/ /*ARGSUSED*/
prompt_default_r(EditLine *el __attribute__((unused))) prompt_default_r(EditLine *el __attribute__((__unused__)))
{ {
static char a[1] = {'\0'}; static char a[1] = {'\0'};
...@@ -127,7 +116,7 @@ prompt_init(EditLine *el) ...@@ -127,7 +116,7 @@ prompt_init(EditLine *el)
*/ */
protected void protected void
/*ARGSUSED*/ /*ARGSUSED*/
prompt_end(EditLine *el __attribute__((unused))) prompt_end(EditLine *el __attribute__((__unused__)))
{ {
} }
......
/* $NetBSD: prompt.h,v 1.5 2000/09/04 22:06:31 lukem Exp $ */ /* $NetBSD: prompt.h,v 1.6 2003/08/07 16:44:32 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
......
/* $NetBSD: read.c,v 1.24 2002/11/20 16:50:08 christos Exp $ */ /* $NetBSD: read.c,v 1.35 2005/03/09 23:55:02 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,20 +32,14 @@ ...@@ -36,20 +32,14 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: read.c,v 1.24 2002/11/20 16:50:08 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* read.c: Clean this junk up! This is horrible code. * read.c: Clean this junk up! This is horrible code.
* Terminal read functions * Terminal read functions
*/ */
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include "el.h" #include "el.h"
...@@ -97,6 +87,10 @@ el_read_getfn(EditLine *el) ...@@ -97,6 +87,10 @@ el_read_getfn(EditLine *el)
} }
#ifndef MIN
#define MIN(A,B) ((A) < (B) ? (A) : (B))
#endif
#ifdef DEBUG_EDIT #ifdef DEBUG_EDIT
private void private void
read_debug(EditLine *el) read_debug(EditLine *el)
...@@ -121,11 +115,7 @@ read_debug(EditLine *el) ...@@ -121,11 +115,7 @@ read_debug(EditLine *el)
*/ */
/* ARGSUSED */ /* ARGSUSED */
private int private int
read__fixio(int fd read__fixio(int fd __attribute__((__unused__)), int e)
#if !(defined(TRY_AGAIN) && (defined(FIONBIO) || (defined(F_SETFL) && defined(O_NDELAY))))
__attribute__((unused))
#endif /* !(defined(TRY_AGAIN) && (defined(FIONBIO) || (defined(F_SETFL) && defined(O_NDELAY)))) */
, int e)
{ {
switch (e) { switch (e) {
...@@ -190,18 +180,10 @@ read_preread(EditLine *el) ...@@ -190,18 +180,10 @@ read_preread(EditLine *el)
{ {
int chrs = 0; int chrs = 0;
if (el->el_chared.c_macro.nline) {
el_free((ptr_t) el->el_chared.c_macro.nline);
el->el_chared.c_macro.nline = NULL;
}
if (el->el_tty.t_mode == ED_IO) if (el->el_tty.t_mode == ED_IO)
return (0); return (0);
#ifdef FIONREAD #ifdef FIONREAD
#ifndef MIN // definition of MIN is lacking on hpux..
#define MIN(x,y) (((x)<(y))?(x):(y))
#endif
(void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs); (void) ioctl(el->el_infd, FIONREAD, (ioctl_t) & chrs);
if (chrs > 0) { if (chrs > 0) {
char buf[EL_BUFSIZ]; char buf[EL_BUFSIZ];
...@@ -210,8 +192,7 @@ read_preread(EditLine *el) ...@@ -210,8 +192,7 @@ read_preread(EditLine *el)
(size_t) MIN(chrs, EL_BUFSIZ - 1)); (size_t) MIN(chrs, EL_BUFSIZ - 1));
if (chrs > 0) { if (chrs > 0) {
buf[chrs] = '\0'; buf[chrs] = '\0';
el->el_chared.c_macro.nline = strdup(buf); el_push(el, buf);
el_push(el, el->el_chared.c_macro.nline);
} }
} }
#endif /* FIONREAD */ #endif /* FIONREAD */
...@@ -230,11 +211,12 @@ el_push(EditLine *el, char *str) ...@@ -230,11 +211,12 @@ el_push(EditLine *el, char *str)
if (str != NULL && ma->level + 1 < EL_MAXMACRO) { if (str != NULL && ma->level + 1 < EL_MAXMACRO) {
ma->level++; ma->level++;
ma->macro[ma->level] = str; if ((ma->macro[ma->level] = el_strdup(str)) != NULL)
} else { return;
ma->level--;
}
term_beep(el); term_beep(el);
term__flush(); term__flush();
}
} }
...@@ -266,7 +248,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch) ...@@ -266,7 +248,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
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; key_value_t val;
switch (el_key_get(el, ch, &val)) { switch (key_get(el, ch, &val)) {
case XK_CMD: case XK_CMD:
cmd = val.cmd; cmd = val.cmd;
break; break;
...@@ -331,14 +313,16 @@ el_getc(EditLine *el, char *cp) ...@@ -331,14 +313,16 @@ el_getc(EditLine *el, char *cp)
if (ma->level < 0) if (ma->level < 0)
break; break;
if (*ma->macro[ma->level] == 0) { if (ma->macro[ma->level][ma->offset] == '\0') {
ma->level--; el_free(ma->macro[ma->level--]);
ma->offset = 0;
continue; continue;
} }
*cp = *ma->macro[ma->level]++ & 0377; *cp = ma->macro[ma->level][ma->offset++] & 0377;
if (*ma->macro[ma->level] == 0) { /* Needed for QuoteMode if (ma->macro[ma->level][ma->offset] == '\0') {
* On */ /* Needed for QuoteMode On */
ma->level--; el_free(ma->macro[ma->level--]);
ma->offset = 0;
} }
return (1); return (1);
} }
...@@ -359,6 +343,35 @@ el_getc(EditLine *el, char *cp) ...@@ -359,6 +343,35 @@ el_getc(EditLine *el, char *cp)
return (num_read); return (num_read);
} }
protected void
read_prepare(EditLine *el)
{
if (el->el_flags & HANDLE_SIGNALS)
sig_set(el);
if (el->el_flags & NO_TTY)
return;
if ((el->el_flags & (UNBUFFERED|EDIT_DISABLED)) == UNBUFFERED)
tty_rawmode(el);
/* This is relatively cheap, and things go terribly wrong if
we have the wrong size. */
el_resize(el);
re_clear_display(el); /* reset the display stuff */
ch_reset(el);
re_refresh(el); /* print the prompt */
if (el->el_flags & UNBUFFERED)
term__flush();
}
protected void
read_finish(EditLine *el)
{
if ((el->el_flags & UNBUFFERED) == 0)
(void) tty_cookedmode(el);
if (el->el_flags & HANDLE_SIGNALS)
sig_clr(el);
}
public const char * public const char *
el_gets(EditLine *el, int *nread) el_gets(EditLine *el, int *nread)
...@@ -367,13 +380,11 @@ el_gets(EditLine *el, int *nread) ...@@ -367,13 +380,11 @@ el_gets(EditLine *el, int *nread)
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; char ch;
int crlf = 0;
#ifdef FIONREAD #ifdef FIONREAD
c_macro_t *ma = &el->el_chared.c_macro; c_macro_t *ma = &el->el_chared.c_macro;
#endif /* FIONREAD */ #endif /* FIONREAD */
if (el->el_flags & HANDLE_SIGNALS)
sig_set(el);
if (el->el_flags & NO_TTY) { if (el->el_flags & NO_TTY) {
char *cp = el->el_line.buffer; char *cp = el->el_line.buffer;
size_t idx; size_t idx;
...@@ -387,6 +398,8 @@ el_gets(EditLine *el, int *nread) ...@@ -387,6 +398,8 @@ el_gets(EditLine *el, int *nread)
cp = &el->el_line.buffer[idx]; cp = &el->el_line.buffer[idx];
} }
cp++; cp++;
if (el->el_flags & UNBUFFERED)
break;
if (cp[-1] == '\r' || cp[-1] == '\n') if (cp[-1] == '\r' || cp[-1] == '\n')
break; break;
} }
...@@ -398,12 +411,6 @@ el_gets(EditLine *el, int *nread) ...@@ -398,12 +411,6 @@ el_gets(EditLine *el, int *nread)
return (el->el_line.buffer); return (el->el_line.buffer);
} }
/* This is relatively cheap, and things go terribly wrong if
we have the wrong size. */
el_resize(el);
re_clear_display(el); /* reset the display stuff */
ch_reset(el);
#ifdef FIONREAD #ifdef FIONREAD
if (el->el_tty.t_mode == EX_IO && ma->level < 0) { if (el->el_tty.t_mode == EX_IO && ma->level < 0) {
...@@ -420,11 +427,16 @@ el_gets(EditLine *el, int *nread) ...@@ -420,11 +427,16 @@ el_gets(EditLine *el, int *nread)
} }
#endif /* FIONREAD */ #endif /* FIONREAD */
re_refresh(el); /* print the prompt */ if ((el->el_flags & UNBUFFERED) == 0)
read_prepare(el);
if (el->el_flags & EDIT_DISABLED) { if (el->el_flags & EDIT_DISABLED) {
char *cp = el->el_line.buffer; char *cp;
size_t idx; size_t idx;
if ((el->el_flags & UNBUFFERED) == 0)
cp = el->el_line.buffer;
else
cp = el->el_line.lastchar;
term__flush(); term__flush();
...@@ -439,7 +451,10 @@ el_gets(EditLine *el, int *nread) ...@@ -439,7 +451,10 @@ el_gets(EditLine *el, int *nread)
if (*cp == 4) /* ought to be stty eof */ if (*cp == 4) /* ought to be stty eof */
break; break;
cp++; cp++;
if (cp[-1] == '\r' || cp[-1] == '\n') crlf = cp[-1] == '\r' || cp[-1] == '\n';
if (el->el_flags & UNBUFFERED)
break;
if (crlf)
break; break;
} }
...@@ -463,8 +478,7 @@ el_gets(EditLine *el, int *nread) ...@@ -463,8 +478,7 @@ el_gets(EditLine *el, int *nread)
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
break; break;
} }
if ((unsigned int)cmdnum >= (unsigned int)(el->el_map.nfunc)) if ((uint)cmdnum >= el->el_map.nfunc) { /* BUG CHECK command */
{ /* BUG CHECK command */
#ifdef DEBUG_EDIT #ifdef DEBUG_EDIT
(void) fprintf(el->el_errfile, (void) fprintf(el->el_errfile,
"ERROR: illegal command from key 0%o\r\n", ch); "ERROR: illegal command from key 0%o\r\n", ch);
...@@ -494,7 +508,7 @@ el_gets(EditLine *el, int *nread) ...@@ -494,7 +508,7 @@ 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])) && isprint((unsigned char)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;
...@@ -536,7 +550,13 @@ el_gets(EditLine *el, int *nread) ...@@ -536,7 +550,13 @@ el_gets(EditLine *el, int *nread)
continue; /* keep going... */ continue; /* keep going... */
case CC_EOF: /* end of file typed */ case CC_EOF: /* end of file typed */
if ((el->el_flags & UNBUFFERED) == 0)
num = 0; num = 0;
else if (num == -1) {
*el->el_line.lastchar++ = CONTROL('d');
el->el_line.cursor = el->el_line.lastchar;
num = 1;
}
break; break;
case CC_NEWLINE: /* normal end of line */ case CC_NEWLINE: /* normal end of line */
...@@ -567,14 +587,19 @@ el_gets(EditLine *el, int *nread) ...@@ -567,14 +587,19 @@ el_gets(EditLine *el, int *nread)
el->el_state.argument = 1; el->el_state.argument = 1;
el->el_state.doingarg = 0; el->el_state.doingarg = 0;
el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.action = NOP;
if (el->el_flags & UNBUFFERED)
break;
} }
term__flush(); /* flush any buffered output */ term__flush(); /* flush any buffered output */
/* make sure the tty is set up correctly */ /* make sure the tty is set up correctly */
(void) tty_cookedmode(el); if ((el->el_flags & UNBUFFERED) == 0) {
if (el->el_flags & HANDLE_SIGNALS) read_finish(el);
sig_clr(el);
if (nread) if (nread)
*nread = num; *nread = num;
} else {
if (nread)
*nread = el->el_line.lastchar - el->el_line.buffer;
}
return (num ? el->el_line.buffer : NULL); return (num ? el->el_line.buffer : NULL);
} }
/* $NetBSD: read.h,v 1.1 2001/09/27 19:29:50 christos Exp $ */ /* $NetBSD: read.h,v 1.4 2004/02/27 14:52:18 christos Exp $ */
/*- /*-
* Copyright (c) 2001 The NetBSD Foundation, Inc. * Copyright (c) 2001 The NetBSD Foundation, Inc.
...@@ -49,6 +49,8 @@ typedef struct el_read_t { ...@@ -49,6 +49,8 @@ typedef struct el_read_t {
} el_read_t; } el_read_t;
protected int read_init(EditLine *); 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 int el_read_setfn(EditLine *, el_rfunc_t);
protected el_rfunc_t el_read_getfn(EditLine *); protected el_rfunc_t el_read_getfn(EditLine *);
......
This diff is collapsed.
/* $NetBSD: readline.h,v 1.1 2001/01/05 21:15:50 jdolecek Exp $ */ /* $NetBSD: readline.h,v 1.12 2004/09/08 18:15:37 christos Exp $ */
/*- /*-
* Copyright (c) 1997 The NetBSD Foundation, Inc. * Copyright (c) 1997 The NetBSD Foundation, Inc.
...@@ -48,11 +48,45 @@ typedef void VFunction(void); ...@@ -48,11 +48,45 @@ typedef void VFunction(void);
typedef char *CPFunction(const char *, int); typedef char *CPFunction(const char *, int);
typedef char **CPPFunction(const char *, int, int); typedef char **CPPFunction(const char *, int, int);
typedef void *histdata_t;
typedef struct _hist_entry { typedef struct _hist_entry {
const char *line; const char *line;
const char *data; histdata_t *data;
} HIST_ENTRY; } HIST_ENTRY;
typedef struct _keymap_entry {
char type;
#define ISFUNC 0
#define ISKMAP 1
#define ISMACR 2
Function *function;
} KEYMAP_ENTRY;
#define KEYMAP_SIZE 256
typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE];
typedef KEYMAP_ENTRY *Keymap;
#define control_character_threshold 0x20
#define control_character_bit 0x40
#ifndef CTRL
#include <sys/ioctl.h>
#ifdef __GLIBC__
#include <sys/ttydefaults.h>
#endif
#ifndef CTRL
#define CTRL(c) ((c) & 037)
#endif
#endif
#ifndef UNCTRL
#define UNCTRL(c) (((c) - 'a' + 'A')|control_character_bit)
#endif
#define RUBOUT 0x7f
#define ABORT_CHAR CTRL('G')
/* global variables used by readline enabled applications */ /* global variables used by readline enabled applications */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
...@@ -68,12 +102,31 @@ extern int max_input_history; ...@@ -68,12 +102,31 @@ 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 CPFunction *rl_completion_entry_function; extern Function *rl_completion_entry_function;
extern CPPFunction *rl_attempted_completion_function; extern CPPFunction *rl_attempted_completion_function;
extern int rl_completion_type; extern int rl_completion_type;
extern int rl_completion_query_items; extern int rl_completion_query_items;
extern char *rl_special_prefixes; extern char *rl_special_prefixes;
extern int rl_completion_append_character; extern int rl_completion_append_character;
extern int rl_inhibit_completion;
extern Function *rl_pre_input_hook;
extern Function *rl_startup_hook;
extern char *rl_terminal_name;
extern int rl_already_prompted;
extern char *rl_prompt;
/*
* The following is not implemented
*/
extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap,
emacs_meta_keymap,
emacs_ctlx_keymap;
extern int rl_filename_completion_desired;
extern int rl_ignore_completion_duplicates;
extern Function *rl_getc_function;
extern VFunction *rl_redisplay_function;
extern VFunction *rl_completion_display_matches_hook;
extern VFunction *rl_prep_term_function;
extern VFunction *rl_deprep_term_function;
/* supported functions */ /* supported functions */
char *readline(const char *); char *readline(const char *);
...@@ -99,6 +152,8 @@ int read_history(const char *); ...@@ -99,6 +152,8 @@ int read_history(const char *);
int write_history(const char *); int write_history(const char *);
int history_expand(char *, char **); int history_expand(char *, char **);
char **history_tokenize(const char *); char **history_tokenize(const char *);
const char *get_history_event(const char *, int *, int);
char *history_arg_extract(int, int, const char *);
char *tilde_expand(char *); char *tilde_expand(char *);
char *filename_completion_function(const char *, int); char *filename_completion_function(const char *, int);
...@@ -111,6 +166,26 @@ void rl_display_match_list(char **, int, int); ...@@ -111,6 +166,26 @@ void rl_display_match_list(char **, int, int);
int rl_insert(int, int); int rl_insert(int, int);
void rl_reset_terminal(const char *); void rl_reset_terminal(const char *);
int rl_bind_key(int, int (*)(int, int)); int rl_bind_key(int, int (*)(int, int));
int rl_newline(int, int);
void rl_callback_read_char(void);
void rl_callback_handler_install(const char *, VFunction *);
void rl_callback_handler_remove(void);
void rl_redisplay(void);
int rl_get_previous_history(int, int);
void rl_prep_terminal(int);
void rl_deprep_terminal(void);
int rl_read_init_file(const char *);
int rl_parse_and_bind(const char *);
void rl_stuff_char(int);
int rl_add_defun(const char *, Function *, int);
/*
* The following are not implemented
*/
Keymap rl_get_keymap(void);
Keymap rl_make_bare_keymap(void);
int rl_generic_bind(int, const char *, const char *, Keymap);
int rl_bind_key_in_map(int, Function *, Keymap);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
/* $NetBSD: refresh.c,v 1.24 2003/03/10 21:18:49 christos Exp $ */ /* $NetBSD: refresh.c,v 1.26 2003/08/07 16:44:33 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)refresh.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: refresh.c,v 1.24 2003/03/10 21:18:49 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* refresh.c: Lower level screen refreshing functions * refresh.c: Lower level screen refreshing functions
...@@ -57,8 +46,8 @@ __RCSID("$NetBSD: refresh.c,v 1.24 2003/03/10 21:18:49 christos Exp $"); ...@@ -57,8 +46,8 @@ __RCSID("$NetBSD: refresh.c,v 1.24 2003/03/10 21:18:49 christos Exp $");
private void re_addc(EditLine *, int); private void re_addc(EditLine *, int);
private void re_update_line(EditLine *, char *, char *, int); private void re_update_line(EditLine *, char *, char *, int);
private void re_insert (EditLine *el, char *, int, int, char *, int); private void re_insert (EditLine *, char *, int, int, char *, int);
private void re_delete(EditLine *el, char *, int, int, int); private void re_delete(EditLine *, char *, int, int, int);
private void re_fastputc(EditLine *, int); private void re_fastputc(EditLine *, int);
private void re__strncopy(char *, char *, size_t); private void re__strncopy(char *, char *, size_t);
private void re__copy_and_pad(char *, const char *, size_t); private void re__copy_and_pad(char *, const char *, size_t);
...@@ -338,7 +327,7 @@ re_goto_bottom(EditLine *el) ...@@ -338,7 +327,7 @@ re_goto_bottom(EditLine *el)
*/ */
private void private 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) char *d, int dat, int dlen, char *s, int num)
{ {
char *a, *b; char *a, *b;
...@@ -382,7 +371,7 @@ re_insert(EditLine *el __attribute__((unused)), ...@@ -382,7 +371,7 @@ re_insert(EditLine *el __attribute__((unused)),
*/ */
private void private void
/*ARGSUSED*/ /*ARGSUSED*/
re_delete(EditLine *el __attribute__((unused)), re_delete(EditLine *el __attribute__((__unused__)),
char *d, int dat, int dlen, int num) char *d, int dat, int dlen, int num)
{ {
char *a, *b; char *a, *b;
......
/* $NetBSD: refresh.h,v 1.4 2001/01/10 07:45:42 jdolecek Exp $ */ /* $NetBSD: refresh.h,v 1.5 2003/08/07 16:44:33 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
......
/* $NetBSD: search.c,v 1.14 2002/11/20 16:50:08 christos Exp $ */ /* $NetBSD: search.c,v 1.20 2004/11/04 01:16:03 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,21 +32,13 @@ ...@@ -36,21 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: search.c,v 1.14 2002/11/20 16:50:08 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* search.c: History and character search functions * search.c: History and character search functions
*/ */
#include <stdlib.h> #include <stdlib.h>
#if defined(REGEX) #if defined(REGEX)
#include <sys/types.h>
#include <regex.h> #include <regex.h>
#elif defined(REGEXP) #elif defined(REGEXP)
#include <regexp.h> #include <regexp.h>
...@@ -227,8 +215,11 @@ ce_inc_search(EditLine *el, int dir) ...@@ -227,8 +215,11 @@ ce_inc_search(EditLine *el, int dir)
if (el->el_search.patlen == 0) { /* first round */ if (el->el_search.patlen == 0) { /* first round */
pchar = ':'; pchar = ':';
#ifdef ANCHOR #ifdef ANCHOR
#define LEN 2
el->el_search.patbuf[el->el_search.patlen++] = '.'; el->el_search.patbuf[el->el_search.patlen++] = '.';
el->el_search.patbuf[el->el_search.patlen++] = '*'; el->el_search.patbuf[el->el_search.patlen++] = '*';
#else
#define LEN 0
#endif #endif
} }
done = redo = 0; done = redo = 0;
...@@ -237,7 +228,7 @@ ce_inc_search(EditLine *el, int dir) ...@@ -237,7 +228,7 @@ ce_inc_search(EditLine *el, int dir)
*cp; *el->el_line.lastchar++ = *cp++) *cp; *el->el_line.lastchar++ = *cp++)
continue; continue;
*el->el_line.lastchar++ = pchar; *el->el_line.lastchar++ = pchar;
for (cp = &el->el_search.patbuf[1]; for (cp = &el->el_search.patbuf[LEN];
cp < &el->el_search.patbuf[el->el_search.patlen]; cp < &el->el_search.patbuf[el->el_search.patlen];
*el->el_line.lastchar++ = *cp++) *el->el_line.lastchar++ = *cp++)
continue; continue;
...@@ -250,7 +241,7 @@ ce_inc_search(EditLine *el, int dir) ...@@ -250,7 +241,7 @@ ce_inc_search(EditLine *el, int dir)
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 - 3) if (el->el_search.patlen >= EL_BUFSIZ - LEN)
term_beep(el); term_beep(el);
else { else {
el->el_search.patbuf[el->el_search.patlen++] = el->el_search.patbuf[el->el_search.patlen++] =
...@@ -271,8 +262,9 @@ ce_inc_search(EditLine *el, int dir) ...@@ -271,8 +262,9 @@ ce_inc_search(EditLine *el, int dir)
redo++; redo++;
break; break;
case EM_DELETE_PREV_CHAR:
case ED_DELETE_PREV_CHAR: case ED_DELETE_PREV_CHAR:
if (el->el_search.patlen > 1) if (el->el_search.patlen > LEN)
done++; done++;
else else
term_beep(el); term_beep(el);
...@@ -287,17 +279,18 @@ ce_inc_search(EditLine *el, int dir) ...@@ -287,17 +279,18 @@ ce_inc_search(EditLine *el, int dir)
case 0027: /* ^W: Append word */ case 0027: /* ^W: Append word */
/* No can do if globbing characters in pattern */ /* No can do if globbing characters in pattern */
for (cp = &el->el_search.patbuf[1];; cp++) for (cp = &el->el_search.patbuf[LEN];; cp++)
if (cp >= &el->el_search.patbuf[el->el_search.patlen]) { if (cp >= &el->el_search.patbuf[
el->el_search.patlen]) {
el->el_line.cursor += el->el_line.cursor +=
el->el_search.patlen - 1; el->el_search.patlen - LEN - 1;
cp = c__next_word(el->el_line.cursor, cp = c__next_word(el->el_line.cursor,
el->el_line.lastchar, 1, el->el_line.lastchar, 1,
ce__isword); ce__isword);
while (el->el_line.cursor < cp && while (el->el_line.cursor < cp &&
*el->el_line.cursor != '\n') { *el->el_line.cursor != '\n') {
if (el->el_search.patlen > if (el->el_search.patlen >=
EL_BUFSIZ - 3) { EL_BUFSIZ - LEN) {
term_beep(el); term_beep(el);
break; break;
} }
...@@ -339,13 +332,13 @@ ce_inc_search(EditLine *el, int dir) ...@@ -339,13 +332,13 @@ 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 = ']';
cp > el->el_search.patbuf; 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 > 1 && ch != '[') { if (el->el_search.patlen > LEN && ch != '[') {
if (redo && newdir == dir) { if (redo && newdir == dir) {
if (pchar == '?') { /* wrap around */ if (pchar == '?') { /* wrap around */
el->el_history.eventno = el->el_history.eventno =
...@@ -375,9 +368,8 @@ ce_inc_search(EditLine *el, int dir) ...@@ -375,9 +368,8 @@ ce_inc_search(EditLine *el, int dir)
'\0'; '\0';
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.lastchar || el->el_line.cursor > el->el_line.lastchar ||
(ret = ce_search_line(el, (ret = ce_search_line(el, newdir))
&el->el_search.patbuf[1], == CC_ERROR) {
newdir)) == CC_ERROR) {
/* avoid c_setpat */ /* avoid c_setpat */
el->el_state.lastcmd = el->el_state.lastcmd =
(el_action_t) newdir; (el_action_t) newdir;
...@@ -390,11 +382,11 @@ ce_inc_search(EditLine *el, int dir) ...@@ -390,11 +382,11 @@ ce_inc_search(EditLine *el, int dir)
el->el_line.lastchar : el->el_line.lastchar :
el->el_line.buffer; el->el_line.buffer;
(void) ce_search_line(el, (void) ce_search_line(el,
&el->el_search.patbuf[1],
newdir); newdir);
} }
} }
el->el_search.patbuf[--el->el_search.patlen] = el->el_search.patlen -= LEN;
el->el_search.patbuf[el->el_search.patlen] =
'\0'; '\0';
if (ret == CC_ERROR) { if (ret == CC_ERROR) {
term_beep(el); term_beep(el);
...@@ -453,9 +445,6 @@ cv_search(EditLine *el, int dir) ...@@ -453,9 +445,6 @@ cv_search(EditLine *el, int dir)
#ifdef ANCHOR #ifdef ANCHOR
tmpbuf[0] = '.'; tmpbuf[0] = '.';
tmpbuf[1] = '*'; tmpbuf[1] = '*';
#define LEN 2
#else
#define LEN 0
#endif #endif
tmplen = LEN; tmplen = LEN;
...@@ -521,24 +510,39 @@ cv_search(EditLine *el, int dir) ...@@ -521,24 +510,39 @@ cv_search(EditLine *el, int dir)
* Look for a pattern inside a line * Look for a pattern inside a line
*/ */
protected el_action_t protected el_action_t
ce_search_line(EditLine *el, char *pattern, int dir) ce_search_line(EditLine *el, int dir)
{ {
char *cp; char *cp = el->el_line.cursor;
char *pattern = el->el_search.patbuf;
char oc, *ocp;
#ifdef ANCHOR
ocp = &pattern[1];
oc = *ocp;
*ocp = '^';
#else
ocp = pattern;
oc = *ocp;
#endif
if (dir == ED_SEARCH_PREV_HISTORY) { if (dir == ED_SEARCH_PREV_HISTORY) {
for (cp = el->el_line.cursor; cp >= el->el_line.buffer; cp--) for (; cp >= el->el_line.buffer; cp--) {
if (el_match(cp, pattern)) { if (el_match(cp, ocp)) {
*ocp = oc;
el->el_line.cursor = cp; el->el_line.cursor = cp;
return (CC_NORM); return (CC_NORM);
} }
}
*ocp = oc;
return (CC_ERROR); return (CC_ERROR);
} else { } else {
for (cp = el->el_line.cursor; *cp != '\0' && for (; *cp != '\0' && cp < el->el_line.limit; cp++) {
cp < el->el_line.limit; cp++) if (el_match(cp, ocp)) {
if (el_match(cp, pattern)) { *ocp = oc;
el->el_line.cursor = cp; el->el_line.cursor = cp;
return (CC_NORM); return (CC_NORM);
} }
}
*ocp = oc;
return (CC_ERROR); return (CC_ERROR);
} }
} }
......
/* $NetBSD: search.h,v 1.6 2002/11/15 14:32:34 christos Exp $ */ /* $NetBSD: search.h,v 1.8 2003/10/18 23:27:36 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -63,7 +59,7 @@ protected int c_hmatch(EditLine *, const char *); ...@@ -63,7 +59,7 @@ protected int c_hmatch(EditLine *, const char *);
protected void c_setpat(EditLine *); protected void c_setpat(EditLine *);
protected el_action_t ce_inc_search(EditLine *, int); protected el_action_t ce_inc_search(EditLine *, int);
protected el_action_t cv_search(EditLine *, int); protected el_action_t cv_search(EditLine *, int);
protected el_action_t ce_search_line(EditLine *, char *, int); protected el_action_t ce_search_line(EditLine *, int);
protected el_action_t cv_repeat_srch(EditLine *, int); protected el_action_t cv_repeat_srch(EditLine *, int);
protected el_action_t cv_csearch(EditLine *, int, int, int, int); protected el_action_t cv_csearch(EditLine *, int, int, int, int);
......
/* $NetBSD: sig.c,v 1.10 2003/03/10 00:58:05 christos Exp $ */ /* $NetBSD: sig.c,v 1.11 2003/08/07 16:44:33 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -36,14 +32,7 @@ ...@@ -36,14 +32,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include "config.h" #include <config.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)sig.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: sig.c,v 1.10 2003/03/10 00:58:05 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
/* /*
* sig.c: Signal handling stuff. * sig.c: Signal handling stuff.
......
/* $NetBSD: sig.h,v 1.4 2003/03/10 00:58:05 christos Exp $ */ /* $NetBSD: sig.h,v 1.5 2003/08/07 16:44:33 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
......
/* $NetBSD: strlcpy.c,v 1.14 2003/10/27 00:12:42 lukem 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>
#include <sys/types.h>
#include <assert.h>
#include <string.h> #include <string.h>
#ifndef HAVE_STRLCPY #ifdef _LIBC
size_t strlcpy(char *dst, const char *src, size_t size) # ifdef __weak_alias
{ __weak_alias(strlcpy, _strlcpy)
if(size) { # endif
strncpy(dst, src, size-1); #endif
dst[size-1] = '\0';
} else {
dst[0] = '\0';
}
return strlen(src);
}
size_t strlcat(char *dst, const char *src, size_t size) #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
#ifdef _LIBC
_strlcpy(dst, src, siz)
#else
strlcpy(dst, src, siz)
#endif
char *dst;
const char *src;
size_t siz;
{ {
int dl = strlen(dst); char *d = dst;
int sz = size-dl-1; const char *s = src;
size_t n = siz;
_DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL);
if(sz >= 0) { /* Copy as many bytes as will fit */
strncat(dst, src, sz); if (n != 0 && --n != 0) {
dst[sz] = '\0'; do {
if ((*d++ = *s++) == 0)
break;
} while (--n != 0);
} }
return dl+strlen(src); /* 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 #endif
/* $NetBSD: sys.h,v 1.6 2003/03/10 00:57:38 christos Exp $ */ /* $NetBSD: sys.h,v 1.9 2004/01/17 17:57:40 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -48,6 +44,28 @@ ...@@ -48,6 +44,28 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#endif #endif
#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
# define __attribute__(A)
#endif
#ifndef __P
# define __P(x) x
#endif
#ifndef _DIAGASSERT
# define _DIAGASSERT(x)
#endif
#ifndef __BEGIN_DECLS
# ifdef __cplusplus
# define __BEGIN_DECLS extern "C" {
# define __END_DECLS }
# else
# define __BEGIN_DECLS
# define __END_DECLS
# endif
#endif
#ifndef public #ifndef public
# define public /* Externally visible functions/variables */ # define public /* Externally visible functions/variables */
#endif #endif
...@@ -61,6 +79,10 @@ ...@@ -61,6 +79,10 @@
/* When we want to hide everything */ /* When we want to hide everything */
#endif #endif
#ifndef HAVE_U_INT32_T
typedef unsigned int u_int32_t;
#endif
#ifndef _PTR_T #ifndef _PTR_T
# define _PTR_T # define _PTR_T
typedef void *ptr_t; typedef void *ptr_t;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/* $NetBSD: tty.h,v 1.9 2002/03/18 16:01:01 christos Exp $ */ /* $NetBSD: tty.h,v 1.10 2003/08/07 16:44:34 agc Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
* 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 * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -104,6 +104,7 @@ class ha_archive: public handler ...@@ -104,6 +104,7 @@ class ha_archive: public handler
int end_bulk_insert(); int end_bulk_insert();
THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
enum thr_lock_type lock_type); enum thr_lock_type lock_type);
int rename_table(const char * from, const char * to);
}; };
handlerton *archive_db_init(void); handlerton *archive_db_init(void);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment