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