1 /* readline.c -- a general facility for reading lines of input
2 with emacs style editing and completion. */
4 /* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
9 The GNU Readline Library is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2, or
12 (at your option) any later version.
14 The GNU Readline Library is distributed in the hope that it will be
15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
16 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 The GNU General Public License is often shipped with GNU software, and
20 is generally kept in a file called COPYING or LICENSE. If you do not
21 have a copy of the license, write to the Free Software Foundation,
22 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
23 #define READLINE_LIBRARY
25 #if defined (HAVE_CONFIG_H)
29 #include <sys/types.h>
31 #if defined (HAVE_UNISTD_H)
32 # include <unistd.h> /* for _POSIX_VERSION */
33 #endif /* HAVE_UNISTD_H */
35 #if defined (HAVE_STDLIB_H)
38 # include "ansi_stdlib.h"
39 #endif /* HAVE_STDLIB_H */
43 /* System-specific feature definitions and include files. */
46 /* Some standard library routines. */
50 #include "rlprivate.h"
52 #define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
54 /* Non-zero tells rl_delete_text and rl_insert_text to not add to
56 int _rl_doing_an_undo = 0;
58 /* How many unclosed undo groups we currently have. */
59 int _rl_undo_group_level = 0;
61 /* The current undo list for THE_LINE. */
62 UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL;
64 /* **************************************************************** */
66 /* Undo, and Undoing */
68 /* **************************************************************** */
70 /* Remember how to undo something. Concatenate some undos if that
73 rl_add_undo (what, start, end, text)
78 UNDO_LIST *temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST));
83 temp->next = rl_undo_list;
87 /* Free the existing undo list. */
93 UNDO_LIST *release = rl_undo_list;
94 rl_undo_list = rl_undo_list->next;
96 if (release->what == UNDO_DELETE)
101 rl_undo_list = (UNDO_LIST *)NULL;
104 /* Undo the next thing in the list. Return 0 if there
105 is nothing to undo, or non-zero if there was. */
110 int waiting_for_begin, start, end;
112 #define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i)))
114 start = end = waiting_for_begin = 0;
120 _rl_doing_an_undo = 1;
121 RL_SETSTATE(RL_STATE_UNDOING);
123 /* To better support vi-mode, a start or end value of -1 means
124 rl_point, and a value of -2 means rl_end. */
125 if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT)
127 start = TRANS (rl_undo_list->start);
128 end = TRANS (rl_undo_list->end);
131 switch (rl_undo_list->what)
133 /* Undoing deletes means inserting some text. */
136 rl_insert_text (rl_undo_list->text);
137 free (rl_undo_list->text);
140 /* Undoing inserts means deleting some text. */
142 rl_delete_text (start, end);
146 /* Undoing an END means undoing everything 'til we get to a BEGIN. */
151 /* Undoing a BEGIN means that we are done with this group. */
153 if (waiting_for_begin)
160 _rl_doing_an_undo = 0;
161 RL_UNSETSTATE(RL_STATE_UNDOING);
163 release = rl_undo_list;
164 rl_undo_list = rl_undo_list->next;
167 while (waiting_for_begin);
174 _rl_fix_last_undo_of_type (type, start, end)
175 int type, start, end;
179 for (rl = rl_undo_list; rl; rl = rl->next)
181 if (rl->what == type)
191 /* Begin a group. Subsequent undos are undone as an atomic operation. */
193 rl_begin_undo_group ()
195 rl_add_undo (UNDO_BEGIN, 0, 0, 0);
196 _rl_undo_group_level++;
200 /* End an undo group started with rl_begin_undo_group (). */
204 rl_add_undo (UNDO_END, 0, 0, 0);
205 _rl_undo_group_level--;
209 /* Save an undo entry for the text from START to END. */
211 rl_modifying (start, end)
221 char *temp = rl_copy_text (start, end);
222 rl_begin_undo_group ();
223 rl_add_undo (UNDO_DELETE, start, end, temp);
224 rl_add_undo (UNDO_INSERT, start, end, (char *)NULL);
225 rl_end_undo_group ();
230 /* Revert the current line to its previous state. */
232 rl_revert_line (count, key)
245 /* Do some undoing of things that were done. */
247 rl_undo_command (count, key)
251 return 0; /* Nothing to do. */