112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*	$NetBSD: readline.c,v 1.108 2013/05/28 00:10:34 christos Exp $	*/
212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*-
412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Copyright (c) 1997 The NetBSD Foundation, Inc.
512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * All rights reserved.
612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * This code is derived from software contributed to The NetBSD Foundation
812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * by Jaromir Dolecek.
912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
1012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Redistribution and use in source and binary forms, with or without
1112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * modification, are permitted provided that the following conditions
1212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * are met:
1312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 1. Redistributions of source code must retain the above copyright
1412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    notice, this list of conditions and the following disclaimer.
1512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 2. Redistributions in binary form must reproduce the above copyright
1612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    notice, this list of conditions and the following disclaimer in the
1712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    documentation and/or other materials provided with the distribution.
1812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
1912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * POSSIBILITY OF SUCH DAMAGE.
3012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
3112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
3212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "config.h"
3312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if !defined(lint) && !defined(SCCSID)
3412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala__RCSID("$NetBSD: readline.c,v 1.108 2013/05/28 00:10:34 christos Exp $");
3512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif /* not lint && not SCCSID */
3612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
3712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <sys/types.h>
3812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <sys/stat.h>
3912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdio.h>
4012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <dirent.h>
4112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <string.h>
4212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <pwd.h>
4312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <ctype.h>
4412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdlib.h>
4512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <unistd.h>
4612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <limits.h>
4712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <errno.h>
4812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <fcntl.h>
4912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <setjmp.h>
5012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <vis.h>
5112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "editline/readline.h"
5312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "el.h"
5412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "fcns.h"		/* for EL_NUM_FCNS */
5512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "histedit.h"
5612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "filecomplete.h"
5712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if !defined(SIZE_T_MAX)
5912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala# define SIZE_T_MAX (size_t)(-1)
6012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
6112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid rl_prep_terminal(int);
6312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid rl_deprep_terminal(void);
6412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* for rl_complete() */
6612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define TAB		'\r'
6712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* see comment at the #ifdef for sense of this */
6912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* #define GDB_411_HACK */
7012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
7112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* readline compatibility stuff - look at readline sources/documentation */
7212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* to see what these variables mean */
7312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaconst char *rl_library_version = "EditLine wrapper";
7412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_readline_version = RL_READLINE_VERSION;
7512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char empty[] = { '\0' };
7612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char expand_chars[] = { ' ', '\t', '\n', '=', '(', '\0' };
7712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
7812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    '>', '<', '=', ';', '|', '&', '{', '(', '\0' };
7912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *rl_readline_name = empty;
8012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFILE *rl_instream = NULL;
8112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFILE *rl_outstream = NULL;
8212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_point = 0;
8312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_end = 0;
8412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *rl_line_buffer = NULL;
8512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaVCPFunction *rl_linefunc = NULL;
8612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_done = 0;
8712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaVFunction *rl_event_hook = NULL;
8812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaKEYMAP_ENTRY_ARRAY emacs_standard_keymap,
8912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    emacs_meta_keymap,
9012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    emacs_ctlx_keymap;
9112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
9212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * The following is not implemented; we always catch signals in the
9312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * libedit fashion: set handlers on entry to el_gets() and clear them
9412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * on the way out. This simplistic approach works for most cases; if
9512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * it does not work for your application, please let us know.
9612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
9712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_catch_signals = 1;
9812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_catch_sigwinch = 1;
9912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint history_base = 1;		/* probably never subject to change */
10112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint history_length = 0;
10212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint max_input_history = 0;
10312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar history_expansion_char = '!';
10412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar history_subst_char = '^';
10512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *history_no_expand_chars = expand_chars;
10612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFunction *history_inhibit_expansion_function = NULL;
10712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *history_arg_extract(int start, int end, const char *str);
10812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_inhibit_completion = 0;
11012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_attempted_completion_over = 0;
11112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *rl_basic_word_break_characters = break_chars;
11212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *rl_completer_word_break_characters = NULL;
11312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *rl_completer_quote_characters = NULL;
11412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFunction *rl_completion_entry_function = NULL;
11512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *(*rl_completion_word_break_hook)(void) = NULL;
11612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaCPPFunction *rl_attempted_completion_function = NULL;
11712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFunction *rl_pre_input_hook = NULL;
11812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFunction *rl_startup1_hook = NULL;
11912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint (*rl_getc_function)(FILE *) = NULL;
12012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *rl_terminal_name = NULL;
12112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_already_prompted = 0;
12212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_filename_completion_desired = 0;
12312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_ignore_completion_duplicates = 0;
12412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint readline_echoing_p = 1;
12512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint _rl_print_completions_horizontally = 0;
12612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaVFunction *rl_redisplay_function = NULL;
12712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFunction *rl_startup_hook = NULL;
12812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaVFunction *rl_completion_display_matches_hook = NULL;
12912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaVFunction *rl_prep_term_function = (VFunction *)rl_prep_terminal;
13012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaVFunction *rl_deprep_term_function = (VFunction *)rl_deprep_terminal;
13112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaKEYMAP_ENTRY_ARRAY emacs_meta_keymap;
13212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
13412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * The current prompt string.
13512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
13612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *rl_prompt = NULL;
13712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
13812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * This is set to character indicating type of completion being done by
13912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * rl_complete_internal(); this is available for application completion
14012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * functions.
14112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
14212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_completion_type = 0;
14312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
14412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
14512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * If more than this number of items results from query for possible
14612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * completions, we ask user if they are sure to really display the list.
14712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
14812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_completion_query_items = 100;
14912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
15112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * List of characters which are word break characters, but should be left
15212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * in the parsed text when it is passed to the completion function.
15312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Shell uses this to help determine what kind of completing to do.
15412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
15512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *rl_special_prefixes = NULL;
15612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
15812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * This is the character appended to the completed words if at the end of
15912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * the line. Default is ' ' (a space).
16012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
16112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint rl_completion_append_character = ' ';
16212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* stuff below is used internally by libedit for readline emulation */
16412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic History *h = NULL;
16612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic EditLine *e = NULL;
16712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic Function *map[256];
16812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic jmp_buf topbuf;
16912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* internal functions */
17112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic unsigned char	 _el_rl_complete(EditLine *, int);
17212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic unsigned char	 _el_rl_tstp(EditLine *, int);
17312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char		*_get_prompt(EditLine *);
17412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic int		 _getc_function(EditLine *, char *);
17512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic HIST_ENTRY	*_move_history(int);
17612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic int		 _history_expand_command(const char *, size_t, size_t,
17712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    char **);
17812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char		*_rl_compat_sub(const char *, const char *,
17912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    const char *, int);
18012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic int		 _rl_event_read_char(EditLine *, char *);
18112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic void		 _rl_update_pos(void);
18212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
18412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
18512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char *
18612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_get_prompt(EditLine *el __attribute__((__unused__)))
18712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
18812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_already_prompted = 1;
18912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return rl_prompt;
19012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
19112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
19212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
19312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
19412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * generic function for moving around history
19512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
19612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic HIST_ENTRY *
19712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_move_history(int op)
19812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
19912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
20012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static HIST_ENTRY rl_he;
20112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, op) != 0)
20312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
20412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_he.line = ev.str;
20612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_he.data = NULL;
20712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return &rl_he;
20912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
21012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
21312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * read one key from user defined input function
21412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
21512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic int
21612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
21712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_getc_function(EditLine *el __attribute__((__unused__)), char *c)
21812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
21912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int i;
22012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
22112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	i = (*rl_getc_function)(NULL);
22212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (i == -1)
22312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 0;
22412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*c = (char)i;
22512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 1;
22612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
22712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
22812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic void
22912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_resize_fun(EditLine *el, void *a)
23012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
23112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const LineInfo *li;
23212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char **ap = a;
23312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
23412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	li = el_line(el);
23512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* a cheesy way to get rid of const cast. */
23612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*ap = memchr(li->buffer, *li->buffer, (size_t)1);
23712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
23812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
23912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic const char *
24012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_default_history_file(void)
24112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
24212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	struct passwd *p;
24312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static char path[PATH_MAX];
24412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (*path)
24612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return path;
24712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((p = getpwuid(getuid())) == NULL)
24812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
24912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)snprintf(path, sizeof(path), "%s/.history", p->pw_dir);
25012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return path;
25112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
25212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
25312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
25412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * READLINE compatibility stuff
25512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
25612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
25712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
25812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Set the prompt
25912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
26012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
26112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_set_prompt(const char *prompt)
26212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
26312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *p;
26412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
26512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!prompt)
26612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		prompt = "";
26712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_prompt != NULL && strcmp(rl_prompt, prompt) == 0)
26812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 0;
26912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_prompt)
27012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_free(rl_prompt);
27112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_prompt = strdup(prompt);
27212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_prompt == NULL)
27312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
27412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while ((p = strchr(rl_prompt, RL_PROMPT_END_IGNORE)) != NULL)
27612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*p = RL_PROMPT_START_IGNORE;
27712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
27912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
28012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
28112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
28212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * initialize rl compat stuff
28312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
28412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
28512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_initialize(void)
28612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
28712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
28812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int editmode = 1;
28912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	struct termios t;
29012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (e != NULL)
29212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_end(e);
29312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h != NULL)
29412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history_end(h);
29512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!rl_instream)
29712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_instream = stdin;
29812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!rl_outstream)
29912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_outstream = stdout;
30012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
30212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * See if we don't really want to run the editor
30312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 */
30412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (tcgetattr(fileno(rl_instream), &t) != -1 && (t.c_lflag & ECHO) == 0)
30512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		editmode = 0;
30612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	e = el_init(rl_readline_name, rl_instream, rl_outstream, stderr);
30812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!editmode)
31012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_set(e, EL_EDITMODE, 0);
31112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h = history_init();
31312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!e || !h)
31412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
31512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history(h, &ev, H_SETSIZE, INT_MAX);	/* unlimited */
31712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_length = 0;
31812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	max_input_history = INT_MAX;
31912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_HIST, history, h);
32012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* Setup resize function */
32212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_RESIZE, _resize_fun, &rl_line_buffer);
32312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* setup getc function if valid */
32512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_getc_function)
32612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_set(e, EL_GETCFN, _getc_function);
32712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* for proper prompt printing in readline() */
32912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_set_prompt("") == -1) {
33012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history_end(h);
33112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_end(e);
33212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
33312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
33412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE);
33512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_SIGNAL, rl_catch_signals);
33612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
33712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* set default mode to "emacs"-style and read setting afterwards */
33812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* so this can be overriden */
33912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_EDITOR, "emacs");
34012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_terminal_name != NULL)
34112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_set(e, EL_TERMINAL, rl_terminal_name);
34212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
34312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_get(e, EL_TERMINAL, &rl_terminal_name);
34412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
34512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
34612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * Word completion - this has to go AFTER rebinding keys
34712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * to emacs-style.
34812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 */
34912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_ADDFN, "rl_complete",
35012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    "ReadLine compatible completion function",
35112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    _el_rl_complete);
35212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_BIND, "^I", "rl_complete", NULL);
35312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
35512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * Send TSTP when ^Z is pressed.
35612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 */
35712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_ADDFN, "rl_tstp",
35812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    "ReadLine compatible suspend function",
35912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    _el_rl_tstp);
36012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_BIND, "^Z", "rl_tstp", NULL);
36112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
36212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* read settings from configuration file */
36312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_source(e, NULL);
36412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
36512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
36612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * Unfortunately, some applications really do use rl_point
36712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * and rl_line_buffer directly.
36812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 */
36912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	_resize_fun(e, &rl_line_buffer);
37012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	_rl_update_pos();
37112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_startup_hook)
37312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(*rl_startup_hook)(NULL, 0);
37412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
37612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
37712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
38012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * read one line from input stream and return it, chomping
38112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * trailing newline (if there is any)
38212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
38312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *
38412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialareadline(const char *p)
38512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
38612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
38712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const char * volatile prompt = p;
38812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int count;
38912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const char *ret;
39012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *buf;
39112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static int used_event_hook;
39212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (e == NULL || h == NULL)
39412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
39512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_done = 0;
39712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
39812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)setjmp(topbuf);
39912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* update prompt accordingly to what has been passed */
40112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_set_prompt(prompt) == -1)
40212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
40312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_pre_input_hook)
40512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(*rl_pre_input_hook)(NULL, 0);
40612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_event_hook && !(e->el_flags&NO_TTY)) {
40812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_set(e, EL_GETCFN, _rl_event_read_char);
40912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		used_event_hook = 1;
41012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
41112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!rl_event_hook && used_event_hook) {
41312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_set(e, EL_GETCFN, EL_BUILTIN_GETCFN);
41412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		used_event_hook = 0;
41512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
41612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_already_prompted = 0;
41812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* get one line from input stream */
42012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ret = el_gets(e, &count);
42112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
42212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ret && count > 0) {
42312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		int lastidx;
42412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
42512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		buf = strdup(ret);
42612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (buf == NULL)
42712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return NULL;
42812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		lastidx = count - 1;
42912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (buf[lastidx] == '\n')
43012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			buf[lastidx] = '\0';
43112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else
43212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		buf = NULL;
43312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history(h, &ev, H_GETSIZE);
43512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_length = ev.num;
43612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return buf;
43812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
43912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
44012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
44112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * history functions
44212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
44312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
44412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
44512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * is normally called before application starts to use
44612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * history expansion functions
44712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
44812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
44912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialausing_history(void)
45012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
45112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
45212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
45312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
45412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
45612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
45712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * substitute ``what'' with ``with'', returning resulting string; if
45812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * globally == 1, substitutes all occurrences of what, otherwise only the
45912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * first one
46012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
46112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char *
46212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_rl_compat_sub(const char *str, const char *what, const char *with,
46312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    int globally)
46412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
46512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const	char	*s;
46612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char	*r, *result;
46712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t	len, with_len, what_len;
46812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	len = strlen(str);
47012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	with_len = strlen(with);
47112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	what_len = strlen(what);
47212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
47312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* calculate length we need for result */
47412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	s = str;
47512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (*s) {
47612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*s == *what && !strncmp(s, what, what_len)) {
47712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			len += with_len - what_len;
47812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (!globally)
47912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
48012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			s += what_len;
48112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else
48212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			s++;
48312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
48412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	r = result = el_malloc((len + 1) * sizeof(*r));
48512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (result == NULL)
48612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
48712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	s = str;
48812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (*s) {
48912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*s == *what && !strncmp(s, what, what_len)) {
49012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			(void)strncpy(r, with, with_len);
49112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			r += with_len;
49212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			s += what_len;
49312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (!globally) {
49412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				(void)strcpy(r, s);
49512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				return result;
49612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
49712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else
49812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			*r++ = *s++;
49912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
50012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*r = '\0';
50112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return result;
50212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
50312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
50412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic	char	*last_search_pat;	/* last !?pat[?] search pattern */
50512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic	char	*last_search_match;	/* last !?pat[?] that matched */
50612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
50712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaconst char *
50812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaget_history_event(const char *cmd, int *cindex, int qchar)
50912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
51012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int idx, sign, sub, num, begin, ret;
51112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len;
51212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char	*pat;
51312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const char *rptr;
51412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
51512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
51612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	idx = *cindex;
51712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (cmd[idx++] != history_expansion_char)
51812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
51912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
52012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* find out which event to take */
52112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (cmd[idx] == history_expansion_char || cmd[idx] == '\0') {
52212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (history(h, &ev, H_FIRST) != 0)
52312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return NULL;
52412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*cindex = cmd[idx]? (idx + 1):idx;
52512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return ev.str;
52612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
52712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	sign = 0;
52812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (cmd[idx] == '-') {
52912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		sign = 1;
53012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		idx++;
53112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
53212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
53312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ('0' <= cmd[idx] && cmd[idx] <= '9') {
53412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		HIST_ENTRY *rl_he;
53512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
53612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		num = 0;
53712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (cmd[idx] && '0' <= cmd[idx] && cmd[idx] <= '9') {
53812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			num = num * 10 + cmd[idx] - '0';
53912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			idx++;
54012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
54112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (sign)
54212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			num = history_length - num + 1;
54312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
54412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (!(rl_he = history_get(num)))
54512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return NULL;
54612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
54712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*cindex = idx;
54812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return rl_he->line;
54912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
55012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	sub = 0;
55112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (cmd[idx] == '?') {
55212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		sub = 1;
55312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		idx++;
55412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
55512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	begin = idx;
55612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (cmd[idx]) {
55712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (cmd[idx] == '\n')
55812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
55912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (sub && cmd[idx] == '?')
56012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
56112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (!sub && (cmd[idx] == ':' || cmd[idx] == ' '
56212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				    || cmd[idx] == '\t' || cmd[idx] == qchar))
56312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
56412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		idx++;
56512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
56612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	len = (size_t)idx - (size_t)begin;
56712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (sub && cmd[idx] == '?')
56812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		idx++;
56912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (sub && len == 0 && last_search_pat && *last_search_pat)
57012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		pat = last_search_pat;
57112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else if (len == 0)
57212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
57312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else {
57412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((pat = el_malloc((len + 1) * sizeof(*pat))) == NULL)
57512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return NULL;
57612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)strncpy(pat, cmd + begin, len);
57712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		pat[len] = '\0';
57812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
57912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
58012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_CURR) != 0) {
58112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (pat != last_search_pat)
58212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el_free(pat);
58312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
58412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
58512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	num = ev.num;
58612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
58712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (sub) {
58812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (pat != last_search_pat) {
58912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (last_search_pat)
59012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				el_free(last_search_pat);
59112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			last_search_pat = pat;
59212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
59312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = history_search(pat, -1);
59412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else
59512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = history_search_prefix(pat, -1);
59612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
59712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ret == -1) {
59812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* restore to end of list on failed search */
59912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history(h, &ev, H_FIRST);
60012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)fprintf(rl_outstream, "%s: Event not found\n", pat);
60112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (pat != last_search_pat)
60212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el_free(pat);
60312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
60412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
60512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
60612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (sub && len) {
60712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (last_search_match && last_search_match != pat)
60812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el_free(last_search_match);
60912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		last_search_match = pat;
61012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
61112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
61212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (pat != last_search_pat)
61312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_free(pat);
61412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
61512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_CURR) != 0)
61612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
61712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*cindex = idx;
61812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rptr = ev.str;
61912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
62012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* roll back to original position */
62112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev, H_SET, num);
62212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
62312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return rptr;
62412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
62512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
62612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
62712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * the real function doing history expansion - takes as argument command
62812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * to do and data upon which the command should be executed
62912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * does expansion the way I've understood readline documentation
63012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
63112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returns 0 if data was not modified, 1 if it was and 2 if the string
63212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * should be only printed and not executed; in case of error,
63312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returns -1 and *result points to NULL
63412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * it's callers responsibility to free() string returned in *result
63512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
63612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic int
63712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_history_expand_command(const char *command, size_t offs, size_t cmdlen,
63812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    char **result)
63912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
64012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *tmp, *search = NULL, *aptr;
64112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const char *ptr, *cmd;
64212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static char *from = NULL, *to = NULL;
64312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int start, end, idx, has_mods = 0;
64412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int p_on = 0, g_on = 0;
64512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
64612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*result = NULL;
64712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	aptr = NULL;
64812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ptr = NULL;
64912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
65012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* First get event specifier */
65112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	idx = 0;
65212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
65312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (strchr(":^*$", command[offs + 1])) {
65412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		char str[4];
65512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/*
65612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		* "!:" is shorthand for "!!:".
65712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		* "!^", "!*" and "!$" are shorthand for
65812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		* "!!:^", "!!:*" and "!!:$" respectively.
65912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*/
66012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		str[0] = str[1] = '!';
66112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		str[2] = '0';
66212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ptr = get_history_event(str, &idx, 0);
66312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		idx = (command[offs + 1] == ':')? 1:0;
66412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		has_mods = 1;
66512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {
66612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (command[offs + 1] == '#') {
66712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			/* use command so far */
66812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if ((aptr = el_malloc((offs + 1) * sizeof(*aptr)))
66912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    == NULL)
67012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				return -1;
67112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			(void)strncpy(aptr, command, offs);
67212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			aptr[offs] = '\0';
67312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			idx = 1;
67412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else {
67512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			int	qchar;
67612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
67712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			qchar = (offs > 0 && command[offs - 1] == '"')? '"':0;
67812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ptr = get_history_event(command + offs, &idx, qchar);
67912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
68012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		has_mods = command[offs + (size_t)idx] == ':';
68112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
68212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
68312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ptr == NULL && aptr == NULL)
68412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
68512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
68612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!has_mods) {
68712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*result = strdup(aptr ? aptr : ptr);
68812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (aptr)
68912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el_free(aptr);
69012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*result == NULL)
69112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return -1;
69212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 1;
69312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
69412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
69512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cmd = command + offs + idx + 1;
69612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
69712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* Now parse any word designators */
69812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
69912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (*cmd == '%')	/* last word matched by ?pat? */
70012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		tmp = strdup(last_search_match? last_search_match:"");
70112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else if (strchr("^*$-0123456789", *cmd)) {
70212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		start = end = -1;
70312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*cmd == '^')
70412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			start = end = 1, cmd++;
70512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else if (*cmd == '$')
70612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			start = -1, cmd++;
70712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else if (*cmd == '*')
70812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			start = 1, cmd++;
70912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	       else if (*cmd == '-' || isdigit((unsigned char) *cmd)) {
71012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			start = 0;
71112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			while (*cmd && '0' <= *cmd && *cmd <= '9')
71212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				start = start * 10 + *cmd++ - '0';
71312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
71412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (*cmd == '-') {
71512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (isdigit((unsigned char) cmd[1])) {
71612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					cmd++;
71712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					end = 0;
71812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					while (*cmd && '0' <= *cmd && *cmd <= '9')
71912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						end = end * 10 + *cmd++ - '0';
72012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				} else if (cmd[1] == '$') {
72112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					cmd += 2;
72212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					end = -1;
72312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				} else {
72412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					cmd++;
72512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					end = -2;
72612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				}
72712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			} else if (*cmd == '*')
72812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				end = -1, cmd++;
72912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			else
73012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				end = start;
73112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
73212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		tmp = history_arg_extract(start, end, aptr? aptr:ptr);
73312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (tmp == NULL) {
73412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			(void)fprintf(rl_outstream, "%s: Bad word specifier",
73512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    command + offs + idx);
73612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (aptr)
73712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				el_free(aptr);
73812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return -1;
73912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
74012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else
74112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		tmp = strdup(aptr? aptr:ptr);
74212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
74312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (aptr)
74412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_free(aptr);
74512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
74612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (*cmd == '\0' || ((size_t)(cmd - (command + offs)) >= cmdlen)) {
74712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*result = tmp;
74812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 1;
74912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
75012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
75112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (; *cmd; cmd++) {
75212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*cmd == ':')
75312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			continue;
75412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else if (*cmd == 'h') {		/* remove trailing path */
75512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if ((aptr = strrchr(tmp, '/')) != NULL)
75612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				*aptr = '\0';
75712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else if (*cmd == 't') {	/* remove leading path */
75812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if ((aptr = strrchr(tmp, '/')) != NULL) {
75912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				aptr = strdup(aptr + 1);
76012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				el_free(tmp);
76112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				tmp = aptr;
76212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
76312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else if (*cmd == 'r') {	/* remove trailing suffix */
76412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if ((aptr = strrchr(tmp, '.')) != NULL)
76512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				*aptr = '\0';
76612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else if (*cmd == 'e') {	/* remove all but suffix */
76712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if ((aptr = strrchr(tmp, '.')) != NULL) {
76812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				aptr = strdup(aptr);
76912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				el_free(tmp);
77012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				tmp = aptr;
77112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
77212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else if (*cmd == 'p')		/* print only */
77312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			p_on = 1;
77412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else if (*cmd == 'g')
77512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			g_on = 2;
77612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else if (*cmd == 's' || *cmd == '&') {
77712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			char *what, *with, delim;
77812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			size_t len, from_len;
77912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			size_t size;
78012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
78112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (*cmd == '&' && (from == NULL || to == NULL))
78212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				continue;
78312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			else if (*cmd == 's') {
78412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				delim = *(++cmd), cmd++;
78512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				size = 16;
78612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				what = el_realloc(from, size * sizeof(*what));
78712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (what == NULL) {
78812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					el_free(from);
78912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					el_free(tmp);
79012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					return 0;
79112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				}
79212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				len = 0;
79312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				for (; *cmd && *cmd != delim; cmd++) {
79412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					if (*cmd == '\\' && cmd[1] == delim)
79512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						cmd++;
79612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					if (len >= size) {
79712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						char *nwhat;
79812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						nwhat = el_realloc(what,
79912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						    (size <<= 1) *
80012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						    sizeof(*nwhat));
80112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						if (nwhat == NULL) {
80212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala							el_free(what);
80312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala							el_free(tmp);
80412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala							return 0;
80512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						}
80612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						what = nwhat;
80712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					}
80812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					what[len++] = *cmd;
80912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				}
81012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				what[len] = '\0';
81112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				from = what;
81212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (*what == '\0') {
81312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					el_free(what);
81412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					if (search) {
81512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						from = strdup(search);
81612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						if (from == NULL) {
81712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala							el_free(tmp);
81812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala							return 0;
81912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						}
82012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					} else {
82112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						from = NULL;
82212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						el_free(tmp);
82312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						return -1;
82412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					}
82512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				}
82612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				cmd++;	/* shift after delim */
82712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (!*cmd)
82812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					continue;
82912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
83012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				size = 16;
83112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				with = el_realloc(to, size * sizeof(*with));
83212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (with == NULL) {
83312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					el_free(to);
83412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					el_free(tmp);
83512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					return -1;
83612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				}
83712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				len = 0;
83812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				from_len = strlen(from);
83912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				for (; *cmd && *cmd != delim; cmd++) {
84012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					if (len + from_len + 1 >= size) {
84112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						char *nwith;
84212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						size += from_len + 1;
84312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						nwith = el_realloc(with,
84412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						    size * sizeof(*nwith));
84512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						if (nwith == NULL) {
84612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala							el_free(with);
84712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala							el_free(tmp);
84812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala							return -1;
84912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						}
85012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						with = nwith;
85112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					}
85212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					if (*cmd == '&') {
85312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						/* safe */
85412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						(void)strcpy(&with[len], from);
85512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						len += from_len;
85612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						continue;
85712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					}
85812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					if (*cmd == '\\'
85912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					    && (*(cmd + 1) == delim
86012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						|| *(cmd + 1) == '&'))
86112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						cmd++;
86212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					with[len++] = *cmd;
86312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				}
86412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				with[len] = '\0';
86512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				to = with;
86612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
86712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
86812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			aptr = _rl_compat_sub(tmp, from, to, g_on);
86912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (aptr) {
87012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				el_free(tmp);
87112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				tmp = aptr;
87212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
87312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			g_on = 0;
87412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
87512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
87612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*result = tmp;
87712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return p_on? 2:1;
87812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
87912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
88012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
88112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
88212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * csh-style history expansion
88312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
88412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
88512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_expand(char *str, char **output)
88612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
88712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int ret = 0;
88812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t idx, i, size;
88912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *tmp, *result;
89012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
89112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
89212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
89312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
89412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history_expansion_char == 0) {
89512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*output = strdup(str);
89612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 0;
89712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
89812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
89912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*output = NULL;
90012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (str[0] == history_subst_char) {
90112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* ^foo^foo2^ is equivalent to !!:s^foo^foo2^ */
90212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*output = el_malloc((strlen(str) + 4 + 1) * sizeof(**output));
90312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*output == NULL)
90412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return 0;
90512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(*output)[0] = (*output)[1] = history_expansion_char;
90612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(*output)[2] = ':';
90712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(*output)[3] = 's';
90812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)strcpy((*output) + 4, str);
90912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		str = *output;
91012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {
91112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*output = strdup(str);
91212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (*output == NULL)
91312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return 0;
91412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
91512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
91612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define ADD_STRING(what, len, fr)					\
91712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	{								\
91812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (idx + len + 1 > size) {				\
91912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			char *nresult = el_realloc(result,		\
92012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    (size += len + 1) * sizeof(*nresult));	\
92112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (nresult == NULL) {				\
92212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				el_free(*output);			\
92312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (/*CONSTCOND*/fr)			\
92412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					el_free(tmp);			\
92512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				return 0;				\
92612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}						\
92712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			result = nresult;				\
92812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}							\
92912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)strncpy(&result[idx], what, len);			\
93012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		idx += len;						\
93112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		result[idx] = '\0';					\
93212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
93312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
93412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	result = NULL;
93512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size = idx = 0;
93612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	tmp = NULL;
93712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = 0; str[i];) {
93812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		int qchar, loop_again;
93912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		size_t len, start, j;
94012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
94112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		qchar = 0;
94212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		loop_again = 1;
94312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		start = j = i;
94412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaloop:
94512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		for (; str[j]; j++) {
94612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (str[j] == '\\' &&
94712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    str[j + 1] == history_expansion_char) {
94812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				(void)strcpy(&str[j], &str[j + 1]);
94912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				continue;
95012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
95112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (!loop_again) {
95212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (isspace((unsigned char) str[j])
95312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				    || str[j] == qchar)
95412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					break;
95512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
95612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (str[j] == history_expansion_char
95712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    && !strchr(history_no_expand_chars, str[j + 1])
95812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    && (!history_inhibit_expansion_function ||
95912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    (*history_inhibit_expansion_function)(str,
96012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    (int)j) == 0))
96112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
96212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
96312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
96412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (str[j] && loop_again) {
96512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			i = j;
96612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			qchar = (j > 0 && str[j - 1] == '"' )? '"':0;
96712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			j++;
96812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (str[j] == history_expansion_char)
96912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				j++;
97012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			loop_again = 0;
97112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			goto loop;
97212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
97312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		len = i - start;
97412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ADD_STRING(&str[start], len, 0);
97512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
97612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (str[i] == '\0' || str[i] != history_expansion_char) {
97712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			len = j - i;
97812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ADD_STRING(&str[i], len, 0);
97912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (start == 0)
98012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				ret = 0;
98112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			else
98212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				ret = 1;
98312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
98412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
98512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = _history_expand_command (str, i, (j - i), &tmp);
98612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (ret > 0 && tmp) {
98712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			len = strlen(tmp);
98812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ADD_STRING(tmp, len, 1);
98912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
99012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (tmp) {
99112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el_free(tmp);
99212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			tmp = NULL;
99312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
99412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		i = j;
99512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
99612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
99712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* ret is 2 for "print only" option */
99812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ret == 2) {
99912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		add_history(result);
100012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef GDB_411_HACK
100112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* gdb 4.11 has been shipped with readline, where */
100212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* history_expand() returned -1 when the line	  */
100312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* should not be executed; in readline 2.1+	  */
100412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* it should return 2 in such a case		  */
100512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = -1;
100612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
100712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
100812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_free(*output);
100912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*output = result;
101012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
101112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return ret;
101212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
101312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
101412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
101512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala* Return a string consisting of arguments of "str" from "start" to "end".
101612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala*/
101712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *
101812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_arg_extract(int start, int end, const char *str)
101912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
102012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t  i, len, max;
102112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char	**arr, *result = NULL;
102212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
102312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	arr = history_tokenize(str);
102412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!arr)
102512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
102612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (arr && *arr == NULL)
102712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out;
102812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
102912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (max = 0; arr[max]; max++)
103012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		continue;
103112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	max--;
103212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
103312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (start == '$')
103412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		start = (int)max;
103512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (end == '$')
103612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		end = (int)max;
103712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (end < 0)
103812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		end = (int)max + end + 1;
103912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (start < 0)
104012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		start = end;
104112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
104212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (start < 0 || end < 0 || (size_t)start > max ||
104312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (size_t)end > max || start > end)
104412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out;
104512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
104612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = (size_t)start, len = 0; i <= (size_t)end; i++)
104712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		len += strlen(arr[i]) + 1;
104812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	len++;
104912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	result = el_malloc(len * sizeof(*result));
105012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (result == NULL)
105112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out;
105212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
105312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = (size_t)start, len = 0; i <= (size_t)end; i++) {
105412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)strcpy(result + len, arr[i]);
105512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		len += strlen(arr[i]);
105612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (i < (size_t)end)
105712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			result[len++] = ' ';
105812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
105912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	result[len] = '\0';
106012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
106112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaout:
106212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = 0; arr[i]; i++)
106312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_free(arr[i]);
106412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_free(arr);
106512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
106612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return result;
106712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
106812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
106912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
107012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Parse the string into individual tokens,
107112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * similar to how shell would do it.
107212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
107312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar **
107412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_tokenize(const char *str)
107512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
107612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int size = 1, idx = 0, i, start;
107712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len;
107812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char **result = NULL, *temp, delim = '\0';
107912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
108012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = 0; str[i];) {
108112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (isspace((unsigned char) str[i]))
108212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			i++;
108312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		start = i;
108412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		for (; str[i];) {
108512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (str[i] == '\\') {
108612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (str[i+1] != '\0')
108712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					i++;
108812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			} else if (str[i] == delim)
108912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				delim = '\0';
109012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			else if (!delim &&
109112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				    (isspace((unsigned char) str[i]) ||
109212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				strchr("()<>;&|$", str[i])))
109312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
109412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			else if (!delim && strchr("'`\"", str[i]))
109512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				delim = str[i];
109612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (str[i])
109712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				i++;
109812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
109912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
110012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (idx + 2 >= size) {
110112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			char **nresult;
110212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			size <<= 1;
110312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			nresult = el_realloc(result, (size_t)size * sizeof(*nresult));
110412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (nresult == NULL) {
110512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				el_free(result);
110612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				return NULL;
110712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
110812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			result = nresult;
110912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
111012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		len = (size_t)i - (size_t)start;
111112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		temp = el_malloc((size_t)(len + 1) * sizeof(*temp));
111212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (temp == NULL) {
111312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			for (i = 0; i < idx; i++)
111412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				el_free(result[i]);
111512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			el_free(result);
111612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return NULL;
111712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
111812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)strncpy(temp, &str[start], len);
111912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		temp[len] = '\0';
112012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		result[idx++] = temp;
112112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		result[idx] = NULL;
112212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (str[i])
112312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			i++;
112412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
112512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return result;
112612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
112712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
112812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
112912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
113012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * limit size of history record to ``max'' events
113112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
113212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
113312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastifle_history(int max)
113412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
113512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
113612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
113712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
113812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
113912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
114012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_SETSIZE, max) == 0)
114112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		max_input_history = max;
114212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
114312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
114412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
114512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
114612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * "unlimit" size of history - set the limit to maximum allowed int value
114712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
114812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
114912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaunstifle_history(void)
115012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
115112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
115212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int omax;
115312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
115412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history(h, &ev, H_SETSIZE, INT_MAX);
115512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	omax = max_input_history;
115612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	max_input_history = INT_MAX;
115712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return omax;		/* some value _must_ be returned */
115812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
115912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
116012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
116112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
116212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_is_stifled(void)
116312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
116412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
116512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* cannot return true answer */
116612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return max_input_history != INT_MAX;
116712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
116812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
116912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic const char _history_tmp_template[] = "/tmp/.historyXXXXXX";
117012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
117112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
117212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_truncate_file (const char *filename, int nlines)
117312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
117412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int ret = 0;
117512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	FILE *fp, *tp;
117612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char template[sizeof(_history_tmp_template)];
117712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char buf[4096];
117812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int fd;
117912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *cp;
118012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	off_t off;
118112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int count = 0;
118212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ssize_t left = 0;
118312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
118412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (filename == NULL && (filename = _default_history_file()) == NULL)
118512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return errno;
118612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((fp = fopen(filename, "r+")) == NULL)
118712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return errno;
118812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	strcpy(template, _history_tmp_template);
118912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((fd = mkstemp(template)) == -1) {
119012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = errno;
119112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out1;
119212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
119312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
119412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((tp = fdopen(fd, "r+")) == NULL) {
119512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		close(fd);
119612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = errno;
119712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out2;
119812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
119912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
120012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for(;;) {
120112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (fread(buf, sizeof(buf), (size_t)1, fp) != 1) {
120212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (ferror(fp)) {
120312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				ret = errno;
120412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
120512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
120612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (fseeko(fp, (off_t)sizeof(buf) * count, SEEK_SET) ==
120712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    (off_t)-1) {
120812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				ret = errno;
120912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
121012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
121112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), fp);
121212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (ferror(fp)) {
121312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				ret = errno;
121412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
121512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
121612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (left == 0) {
121712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				count--;
121812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				left = sizeof(buf);
121912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			} else if (fwrite(buf, (size_t)left, (size_t)1, tp)
122012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			    != 1) {
122112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				ret = errno;
122212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
122312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
122412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			fflush(tp);
122512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
122612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
122712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (fwrite(buf, sizeof(buf), (size_t)1, tp) != 1) {
122812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ret = errno;
122912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
123012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
123112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		count++;
123212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
123312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ret)
123412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out3;
123512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	cp = buf + left - 1;
123612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if(*cp != '\n')
123712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cp++;
123812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for(;;) {
123912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		while (--cp >= buf) {
124012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (*cp == '\n') {
124112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				if (--nlines == 0) {
124212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					if (++cp >= buf + sizeof(buf)) {
124312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						count++;
124412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala						cp = buf;
124512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					}
124612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala					break;
124712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				}
124812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
124912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
125012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (nlines <= 0 || count == 0)
125112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
125212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		count--;
125312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (fseeko(tp, (off_t)sizeof(buf) * count, SEEK_SET) < 0) {
125412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ret = errno;
125512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
125612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
125712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (fread(buf, sizeof(buf), (size_t)1, tp) != 1) {
125812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (ferror(tp)) {
125912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				ret = errno;
126012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
126112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
126212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ret = EAGAIN;
126312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
126412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
126512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		cp = buf + sizeof(buf);
126612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
126712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
126812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ret || nlines > 0)
126912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out3;
127012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
127112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (fseeko(fp, (off_t)0, SEEK_SET) == (off_t)-1) {
127212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = errno;
127312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out3;
127412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
127512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
127612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (fseeko(tp, (off_t)sizeof(buf) * count + (cp - buf), SEEK_SET) ==
127712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (off_t)-1) {
127812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		ret = errno;
127912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out3;
128012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
128112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
128212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for(;;) {
128312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), tp)) == 0) {
128412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (ferror(fp))
128512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				ret = errno;
128612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
128712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
128812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (fwrite(buf, (size_t)left, (size_t)1, fp) != 1) {
128912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ret = errno;
129012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
129112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
129212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
129312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	fflush(fp);
129412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if((off = ftello(fp)) > 0)
129512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)ftruncate(fileno(fp), off);
129612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaout3:
129712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	fclose(tp);
129812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaout2:
129912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	unlink(template);
130012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaout1:
130112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	fclose(fp);
130212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
130312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return ret;
130412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
130512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
130612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
130712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
130812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * read history from a file given
130912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
131012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
131112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaread_history(const char *filename)
131212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
131312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
131412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
131512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
131612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
131712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (filename == NULL && (filename = _default_history_file()) == NULL)
131812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return errno;
131912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return history(h, &ev, H_LOAD, filename) == -1 ?
132012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (errno ? errno : EINVAL) : 0;
132112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
132212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
132312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
132412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
132512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * write history to a file given
132612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
132712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
132812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialawrite_history(const char *filename)
132912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
133012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
133112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
133212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
133312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
133412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (filename == NULL && (filename = _default_history_file()) == NULL)
133512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return errno;
133612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return history(h, &ev, H_SAVE, filename) == -1 ?
133712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (errno ? errno : EINVAL) : 0;
133812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
133912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
134012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
134112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
134212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returns history ``num''th event
134312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
134412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returned pointer points to static variable
134512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
134612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaHIST_ENTRY *
134712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_get(int num)
134812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
134912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static HIST_ENTRY she;
135012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
135112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int curr_num;
135212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
135312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
135412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
135512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
135612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* save current position */
135712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_CURR) != 0)
135812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
135912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	curr_num = ev.num;
136012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
136112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* start from the oldest */
136212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_LAST) != 0)
136312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;	/* error */
136412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
136512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* look forwards for event matching specified offset */
136612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_NEXT_EVDATA, num, &she.data))
136712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
136812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
136912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	she.line = ev.str;
137012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
137112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* restore pointer to where it was */
137212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev, H_SET, curr_num);
137312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
137412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return &she;
137512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
137612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
137712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
137812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
137912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * add the line to history table
138012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
138112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
138212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaadd_history(const char *line)
138312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
138412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
138512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
138612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (line == NULL)
138712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 0;
138812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
138912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
139012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
139112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
139212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev, H_ENTER, line);
139312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_GETSIZE) == 0)
139412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history_length = ev.num;
139512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
139612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return !(history_length > 0); /* return 0 if all is okay */
139712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
139812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
139912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
140012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
140112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * remove the specified entry from the history list and return it.
140212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
140312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaHIST_ENTRY *
140412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaremove_history(int num)
140512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
140612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HIST_ENTRY *he;
140712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
140812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
140912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
141012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
141112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
141212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((he = el_malloc(sizeof(*he))) == NULL)
141312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
141412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
141512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_DELDATA, num, &he->data) != 0) {
141612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_free(he);
141712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
141812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
141912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
142012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he->line = ev.str;
142112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_GETSIZE) == 0)
142212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history_length = ev.num;
142312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
142412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return he;
142512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
142612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
142712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
142812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
142912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * replace the line and data of the num-th entry
143012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
143112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaHIST_ENTRY *
143212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialareplace_history_entry(int num, const char *line, histdata_t data)
143312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
143412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HIST_ENTRY *he;
143512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
143612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int curr_num;
143712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
143812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
143912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
144012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
144112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* save current position */
144212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_CURR) != 0)
144312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
144412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	curr_num = ev.num;
144512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
144612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* start from the oldest */
144712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_LAST) != 0)
144812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;	/* error */
144912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
145012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((he = el_malloc(sizeof(*he))) == NULL)
145112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
145212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
145312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* look forwards for event matching specified offset */
145412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_NEXT_EVDATA, num, &he->data))
145512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out;
145612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
145712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he->line = strdup(ev.str);
145812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (he->line == NULL)
145912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out;
146012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
146112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_REPLACE, line, data))
146212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out;
146312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
146412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* restore pointer to where it was */
146512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_SET, curr_num))
146612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out;
146712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
146812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return he;
146912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaout:
147012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_free(he);
147112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return NULL;
147212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
147312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
147412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
147512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * clear the history list - delete all entries
147612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
147712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
147812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaclear_history(void)
147912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
148012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
148112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
148212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev, H_CLEAR);
148312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_length = 0;
148412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
148512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
148612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
148712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
148812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returns offset of the current history event
148912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
149012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
149112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialawhere_history(void)
149212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
149312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
149412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int curr_num, off;
149512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
149612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_CURR) != 0)
149712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 0;
149812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	curr_num = ev.num;
149912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
150012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev, H_FIRST);
150112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	off = 1;
150212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (ev.num != curr_num && history(h, &ev, H_NEXT) == 0)
150312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		off++;
150412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
150512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return off;
150612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
150712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
150812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
150912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
151012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returns current history event or NULL if there is no such event
151112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
151212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaHIST_ENTRY *
151312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialacurrent_history(void)
151412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
151512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
151612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return _move_history(H_CURR);
151712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
151812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
151912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
152012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
152112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returns total number of bytes history events' data are using
152212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
152312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
152412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_total_bytes(void)
152512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
152612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
152712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int curr_num;
152812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t size;
152912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
153012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_CURR) != 0)
153112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
153212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	curr_num = ev.num;
153312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
153412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev, H_FIRST);
153512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size = 0;
153612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	do
153712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		size += strlen(ev.str) * sizeof(*ev.str);
153812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (history(h, &ev, H_NEXT) == 0);
153912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
154012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* get to the same position as before */
154112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history(h, &ev, H_PREV_EVENT, curr_num);
154212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
154312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return (int)size;
154412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
154512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
154612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
154712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
154812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * sets the position in the history list to ``pos''
154912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
155012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
155112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_set_pos(int pos)
155212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
155312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
155412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int curr_num;
155512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
155612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (pos >= history_length || pos < 0)
155712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
155812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
155912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev, H_CURR);
156012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	curr_num = ev.num;
156112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
156212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
156312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * use H_DELDATA to set to nth history (without delete) by passing
156412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * (void **)-1
156512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 */
156612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_DELDATA, pos, (void **)-1)) {
156712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)history(h, &ev, H_SET, curr_num);
156812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
156912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
157012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
157112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
157212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
157312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
157412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
157512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returns previous event in history and shifts pointer accordingly
157612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
157712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaHIST_ENTRY *
157812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprevious_history(void)
157912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
158012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
158112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return _move_history(H_PREV);
158212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
158312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
158412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
158512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
158612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * returns next event in history and shifts pointer accordingly
158712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
158812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaHIST_ENTRY *
158912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialanext_history(void)
159012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
159112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
159212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return _move_history(H_NEXT);
159312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
159412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
159512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
159612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
159712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * searches for first history event containing the str
159812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
159912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
160012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_search(const char *str, int direction)
160112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
160212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
160312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const char *strp;
160412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int curr_num;
160512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
160612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_CURR) != 0)
160712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
160812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	curr_num = ev.num;
160912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
161012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (;;) {
161112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((strp = strstr(ev.str, str)) != NULL)
161212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return (int)(strp - ev.str);
161312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (history(h, &ev, direction < 0 ? H_NEXT:H_PREV) != 0)
161412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
161512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
161612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev, H_SET, curr_num);
161712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return -1;
161812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
161912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
162012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
162112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
162212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * searches for first history event beginning with str
162312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
162412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
162512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_search_prefix(const char *str, int direction)
162612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
162712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
162812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
162912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return (history(h, &ev, direction < 0 ?
163012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    H_PREV_STR : H_NEXT_STR, str));
163112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
163212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
163312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
163412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
163512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * search for event in history containing str, starting at offset
163612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * abs(pos); continue backward, if pos<0, forward otherwise
163712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
163812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
163912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
164012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_search_pos(const char *str,
164112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   int direction __attribute__((__unused__)), int pos)
164212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
164312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEvent ev;
164412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int curr_num, off;
164512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
164612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	off = (pos > 0) ? pos : -pos;
164712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	pos = (pos > 0) ? 1 : -1;
164812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
164912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history(h, &ev, H_CURR) != 0)
165012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
165112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	curr_num = ev.num;
165212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
165312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history_set_pos(off) != 0 || history(h, &ev, H_CURR) != 0)
165412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
165512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
165612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (;;) {
165712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (strstr(ev.str, str))
165812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return off;
165912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (history(h, &ev, (pos < 0) ? H_PREV : H_NEXT) != 0)
166012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
166112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
166212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
166312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* set "current" pointer back to previous state */
166412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)history(h, &ev,
166512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    pos < 0 ? H_NEXT_EVENT : H_PREV_EVENT, curr_num);
166612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
166712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return -1;
166812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
166912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
167012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
167112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/********************************/
167212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* completion functions */
167312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
167412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *
167512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialatilde_expand(char *name)
167612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
167712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return fn_tilde_expand(name);
167812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
167912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
168012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *
168112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialafilename_completion_function(const char *name, int state)
168212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
168312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return fn_filename_completion_function(name, state);
168412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
168512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
168612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
168712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * a completion generator for usernames; returns _first_ username
168812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * which starts with supplied text
168912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * text contains a partial username preceded by random character
169012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * (usually '~'); state resets search from start (??? should we do that anyway)
169112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * it's callers responsibility to free returned value
169212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
169312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *
169412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialausername_completion_function(const char *text, int state)
169512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
169612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	struct passwd *pass = NULL;
169712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
169812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (text[0] == '\0')
169912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
170012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
170112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (*text == '~')
170212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		text++;
170312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
170412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (state == 0)
170512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		setpwent();
170612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
170712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (
170812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (pass = getpwent()) != NULL
170912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    && text[0] == pass->pw_name[0]
171012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    && strcmp(text, pass->pw_name) == 0)
171112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		continue;
171212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
171312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (pass == NULL) {
171412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		endpwent();
171512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
171612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
171712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return strdup(pass->pw_name);
171812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
171912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
172012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
172112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
172212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * el-compatible wrapper to send TSTP on ^Z
172312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
172412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
172512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic unsigned char
172612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_el_rl_tstp(EditLine *el __attribute__((__unused__)), int ch __attribute__((__unused__)))
172712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
172812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)kill(0, SIGTSTP);
172912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
173012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
173112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
173212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
173312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Display list of strings in columnar format on readline's output stream.
173412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 'matches' is list of strings, 'len' is number of strings in 'matches',
173512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 'max' is maximum length of string in 'matches'.
173612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
173712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
173812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_display_match_list(char **matches, int len, int max)
173912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
174012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
174112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	fn_display_match_list(e, matches, (size_t)len, (size_t)max);
174212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
174312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
174412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic const char *
174512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
174612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_rl_completion_append_character_function(const char *dummy
174712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    __attribute__((__unused__)))
174812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
174912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static char buf[2];
175012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	buf[0] = (char)rl_completion_append_character;
175112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	buf[1] = '\0';
175212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return buf;
175312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
175412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
175512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
175612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
175712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * complete word at current point
175812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
175912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
176012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
176112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_complete(int ignore __attribute__((__unused__)), int invoking_key)
176212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
176312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef WIDECHAR
176412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static ct_buffer_t wbreak_conv, sprefix_conv;
176512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
176612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *breakchars;
176712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
176812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
176912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
177012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
177112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_inhibit_completion) {
177212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		char arr[2];
177312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		arr[0] = (char)invoking_key;
177412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		arr[1] = '\0';
177512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_insertstr(e, arr);
177612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_REFRESH;
177712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
177812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
177912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_completion_word_break_hook != NULL)
178012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		breakchars = (*rl_completion_word_break_hook)();
178112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else
178212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		breakchars = rl_basic_word_break_characters;
178312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
178412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* Just look at how many global variables modify this operation! */
178512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return fn_complete(e,
178612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (CPFunction *)rl_completion_entry_function,
178712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    rl_attempted_completion_function,
178812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    ct_decode_string(rl_basic_word_break_characters, &wbreak_conv),
178912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    ct_decode_string(breakchars, &sprefix_conv),
179012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    _rl_completion_append_character_function,
179112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (size_t)rl_completion_query_items,
179212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    &rl_completion_type, &rl_attempted_completion_over,
179312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    &rl_point, &rl_end);
179412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
179512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
179612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
179712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
179812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
179912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
180012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic unsigned char
180112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_el_rl_complete(EditLine *el __attribute__((__unused__)), int ch)
180212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
180312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return (unsigned char)rl_complete(0, ch);
180412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
180512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
180612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
180712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * misc other functions
180812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
180912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
181012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
181112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * bind key c to readline-type function func
181212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
181312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
181412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_bind_key(int c, rl_command_func_t *func)
181512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
181612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int retval = -1;
181712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
181812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
181912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
182012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
182112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (func == rl_insert) {
182212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* XXX notice there is no range checking of ``c'' */
182312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		e->el_map.key[c] = ED_INSERT;
182412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = 0;
182512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
182612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return retval;
182712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
182812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
182912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
183012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
183112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * read one key from input - handles chars pushed back
183212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * to input stream also
183312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
183412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
183512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_read_key(void)
183612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
183712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char fooarr[2 * sizeof(int)];
183812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
183912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (e == NULL || h == NULL)
184012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
184112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
184212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return el_getc(e, fooarr);
184312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
184412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
184512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
184612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
184712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * reset the terminal
184812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
184912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
185012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
185112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_reset_terminal(const char *p __attribute__((__unused__)))
185212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
185312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
185412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
185512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
185612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_reset(e);
185712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
185812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
185912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
186012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
186112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * insert character ``c'' back into input stream, ``count'' times
186212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
186312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
186412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_insert(int count, int c)
186512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
186612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char arr[2];
186712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
186812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
186912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
187012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
187112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* XXX - int -> char conversion can lose on multichars */
187212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	arr[0] = (char)c;
187312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	arr[1] = '\0';
187412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
187512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (; count > 0; count--)
187612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_push(e, arr);
187712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
187812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
187912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
188012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
188112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
188212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_insert_text(const char *text)
188312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
188412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!text || *text == 0)
188512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 0;
188612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
188712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL || e == NULL)
188812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
188912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
189012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (el_insertstr(e, text) < 0)
189112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 0;
189212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return (int)strlen(text);
189312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
189412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
189512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
189612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
189712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_newline(int count __attribute__((__unused__)),
189812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    int c __attribute__((__unused__)))
189912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
190012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
190112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * Readline-4.0 appears to ignore the args.
190212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 */
190312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return rl_insert(1, '\n');
190412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
190512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
190612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
190712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic unsigned char
190812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_bind_wrapper(EditLine *el __attribute__((__unused__)), unsigned char c)
190912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
191012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (map[c] == NULL)
191112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    return CC_ERROR;
191212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
191312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	_rl_update_pos();
191412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
191512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(*map[c])(NULL, c);
191612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
191712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* If rl_done was set by the above call, deal with it here */
191812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rl_done)
191912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return CC_EOF;
192012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
192112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return CC_NORM;
192212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
192312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
192412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
192512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_add_defun(const char *name, Function *fun, int c)
192612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
192712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char dest[8];
192812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((size_t)c >= sizeof(map) / sizeof(map[0]) || c < 0)
192912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
193012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	map[(unsigned char)c] = fun;
193112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_ADDFN, name, name, rl_bind_wrapper);
193212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	vis(dest, c, VIS_WHITE|VIS_NOSLASH, 0);
193312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_BIND, dest, name, NULL);
193412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
193512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
193612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
193712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
193812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_callback_read_char(void)
193912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
194012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int count = 0, done = 0;
194112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const char *buf = el_gets(e, &count);
194212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *wbuf;
194312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
194412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (buf == NULL || count-- <= 0)
194512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return;
194612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (count == 0 && buf[0] == e->el_tty.t_c[TS_IO][C_EOF])
194712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		done = 1;
194812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (buf[count] == '\n' || buf[count] == '\r')
194912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		done = 2;
195012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
195112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (done && rl_linefunc != NULL) {
195212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_set(e, EL_UNBUFFERED, 0);
195312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (done == 2) {
195412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		    if ((wbuf = strdup(buf)) != NULL)
195512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			wbuf[count] = '\0';
195612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		} else
195712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			wbuf = NULL;
195812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(*(void (*)(const char *))rl_linefunc)(wbuf);
195912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		//el_set(e, EL_UNBUFFERED, 1);
196012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
196112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
196212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
196312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
196412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_callback_handler_install(const char *prompt, VCPFunction *linefunc)
196512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
196612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (e == NULL) {
196712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		rl_initialize();
196812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
196912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)rl_set_prompt(prompt);
197012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_linefunc = linefunc;
197112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_UNBUFFERED, 1);
197212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
197312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
197412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
197512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_callback_handler_remove(void)
197612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
197712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_UNBUFFERED, 0);
197812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_linefunc = NULL;
197912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
198012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
198112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
198212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_redisplay(void)
198312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
198412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char a[2];
198512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	a[0] = (char)e->el_tty.t_c[TS_IO][C_REPRINT];
198612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	a[1] = '\0';
198712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_push(e, a);
198812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
198912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
199012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
199112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_get_previous_history(int count, int key)
199212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
199312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char a[2];
199412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	a[0] = (char)key;
199512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	a[1] = '\0';
199612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (count--)
199712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_push(e, a);
199812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
199912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
200012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
200112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
200212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
200312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_prep_terminal(int meta_flag __attribute__((__unused__)))
200412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
200512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_PREP_TERM, 1);
200612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
200712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
200812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
200912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_deprep_terminal(void)
201012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
201112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_PREP_TERM, 0);
201212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
201312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
201412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
201512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_read_init_file(const char *s)
201612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
201712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return el_source(e, s);
201812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
201912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
202012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
202112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_parse_and_bind(const char *line)
202212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
202312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const char **argv;
202412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int argc;
202512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Tokenizer *tok;
202612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
202712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	tok = tok_init(NULL);
202812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	tok_str(tok, line, &argc, &argv);
202912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	argc = el_parse(e, argc, argv);
203012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	tok_end(tok);
203112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return argc ? 1 : 0;
203212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
203312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
203412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
203512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_variable_bind(const char *var, const char *value)
203612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
203712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
203812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * The proper return value is undocument, but this is what the
203912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 * readline source seems to do.
204012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	 */
204112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return el_set(e, EL_BIND, "", var, value, NULL) == -1 ? 1 : 0;
204212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
204312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
204412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
204512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_stuff_char(int c)
204612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
204712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char buf[2];
204812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
204912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	buf[0] = (char)c;
205012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	buf[1] = '\0';
205112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_insertstr(e, buf);
205212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
205312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
205412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic int
205512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_rl_event_read_char(EditLine *el, char *cp)
205612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
205712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int	n;
205812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ssize_t num_read = 0;
205912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
206012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*cp = '\0';
206112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (rl_event_hook) {
206212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
206312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(*rl_event_hook)();
206412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
206512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if defined(FIONREAD)
206612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (ioctl(el->el_infd, FIONREAD, &n) < 0)
206712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return -1;
206812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (n)
206912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			num_read = read(el->el_infd, cp, (size_t)1);
207012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else
207112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			num_read = 0;
207212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#elif defined(F_SETFL) && defined(O_NDELAY)
207312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((n = fcntl(el->el_infd, F_GETFL, 0)) < 0)
207412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return -1;
207512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (fcntl(el->el_infd, F_SETFL, n|O_NDELAY) < 0)
207612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return -1;
207712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		num_read = read(el->el_infd, cp, 1);
207812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (fcntl(el->el_infd, F_SETFL, n))
207912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return -1;
208012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else
208112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		/* not non-blocking, but what you gonna do? */
208212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		num_read = read(el->el_infd, cp, 1);
208312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
208412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
208512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
208612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (num_read < 0 && errno == EAGAIN)
208712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			continue;
208812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (num_read == 0)
208912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			continue;
209012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
209112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
209212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (!rl_event_hook)
209312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_set(el, EL_GETCFN, EL_BUILTIN_GETCFN);
209412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return (int)num_read;
209512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
209612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
209712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic void
209812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_rl_update_pos(void)
209912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
210012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const LineInfo *li = el_line(e);
210112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
210212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_point = (int)(li->cursor - li->buffer);
210312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	rl_end = (int)(li->lastchar - li->buffer);
210412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
210512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
210612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
210712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_get_screen_size(int *rows, int *cols)
210812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
210912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (rows)
211012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_get(e, EL_GETTC, "li", rows, (void *)0);
211112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (cols)
211212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		el_get(e, EL_GETTC, "co", cols, (void *)0);
211312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
211412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
211512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
211612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_set_screen_size(int rows, int cols)
211712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
211812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char buf[64];
211912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)snprintf(buf, sizeof(buf), "%d", rows);
212012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_SETTC, "li", buf, NULL);
212112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void)snprintf(buf, sizeof(buf), "%d", cols);
212212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_SETTC, "co", buf, NULL);
212312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
212412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
212512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar **
212612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_completion_matches(const char *str, rl_compentry_func_t *fun)
212712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
212812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len, max, i, j, min;
212912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char **list, *match, *a, *b;
213012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
213112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	len = 1;
213212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	max = 10;
213312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((list = el_malloc(max * sizeof(*list))) == NULL)
213412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
213512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
213612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while ((match = (*fun)(str, (int)(len - 1))) != NULL) {
213712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		list[len++] = match;
213812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (len == max) {
213912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			char **nl;
214012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			max += 10;
214112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if ((nl = el_realloc(list, max * sizeof(*nl))) == NULL)
214212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				goto out;
214312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			list = nl;
214412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
214512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
214612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (len == 1)
214712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto out;
214812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	list[len] = NULL;
214912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (len == 2) {
215012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((list[0] = strdup(list[1])) == NULL)
215112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			goto out;
215212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return list;
215312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
215412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	qsort(&list[1], len - 1, sizeof(*list),
215512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    (int (*)(const void *, const void *)) strcmp);
215612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	min = SIZE_T_MAX;
215712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = 1, a = list[i]; i < len - 1; i++, a = b) {
215812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		b = list[i + 1];
215912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		for (j = 0; a[j] && a[j] == b[j]; j++)
216012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			continue;
216112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (min > j)
216212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			min = j;
216312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
216412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (min == 0 && *str) {
216512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((list[0] = strdup(str)) == NULL)
216612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			goto out;
216712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	} else {
216812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((list[0] = el_malloc((min + 1) * sizeof(*list[0]))) == NULL)
216912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			goto out;
217012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void)memcpy(list[0], list[1], min);
217112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		list[0][min] = '\0';
217212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
217312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return list;
217412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
217512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaout:
217612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_free(list);
217712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return NULL;
217812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
217912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
218012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialachar *
218112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_filename_completion_function (const char *text, int state)
218212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
218312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return fn_filename_completion_function(text, state);
218412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
218512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
218612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
218712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_forced_update_display(void)
218812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
218912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_set(e, EL_REFRESH);
219012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
219112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
219212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
219312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_rl_abort_internal(void)
219412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
219512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	el_beep(e);
219612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	longjmp(topbuf, 1);
219712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*NOTREACHED*/
219812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
219912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
220012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
220112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala_rl_qsort_string_compare(char **s1, char **s2)
220212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
220312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return strcoll(*s1, *s2);
220412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
220512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
220612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaHISTORY_STATE *
220712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_get_history_state(void)
220812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
220912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HISTORY_STATE *hs;
221012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
221112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((hs = el_malloc(sizeof(*hs))) == NULL)
221212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
221312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	hs->length = history_length;
221412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return hs;
221512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
221612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
221712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
221812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
221912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_kill_text(int from __attribute__((__unused__)),
222012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    int to __attribute__((__unused__)))
222112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
222212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
222312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
222412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
222512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaKeymap
222612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_make_bare_keymap(void)
222712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
222812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return NULL;
222912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
223012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
223112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaKeymap
223212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_get_keymap(void)
223312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
223412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return NULL;
223512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
223612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
223712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
223812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
223912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_set_keymap(Keymap k __attribute__((__unused__)))
224012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
224112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
224212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
224312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
224412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
224512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_generic_bind(int type __attribute__((__unused__)),
224612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    const char * keyseq __attribute__((__unused__)),
224712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    const char * data __attribute__((__unused__)),
224812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    Keymap k __attribute__((__unused__)))
224912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
225012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
225112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
225212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
225312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
225412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*ARGSUSED*/
225512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_bind_key_in_map(int key __attribute__((__unused__)),
225612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    rl_command_func_t *fun __attribute__((__unused__)),
225712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    Keymap k __attribute__((__unused__)))
225812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
225912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
226012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
226112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
226212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* unsupported, but needed by python */
226312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
226412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_cleanup_after_signal(void)
226512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
226612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
226712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
226812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
226912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_on_new_line(void)
227012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
227112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
227212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
227312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
227412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialavoid
227512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialarl_free_line_state(void)
227612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
227712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
2278