TheGNUGeneralPublicLicenseisoftenshippedwithGNUsoftware,and isgenerallykeptinafilecalledCOPYINGorLICENSE.Ifyoudonot haveacopyofthelicense,writetotheFreeSoftwareFoundation,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA. */ #define READLINE_LIBRARY
#ifdefined (HAVE_CONFIG_H) # include "config_readline.h" #endif
#ifdefined (HAVE_UNISTD_H) # include <unistd.h> #endif/* HAVE_UNISTD_H */
#ifdefined (HAVE_STDLIB_H) # include <stdlib.h> #else # include "ansi_stdlib.h" #endif/* HAVE_STDLIB_H */
#ifdefined (HAVE_LOCALE_H) # include <locale.h> #endif
#include <stdio.h>
/* System-specific feature definitions and include files. */ #include"rldefs.h" #include"rlmbutil.h"
/* Some standard library routines. */ #include"readline.h" #include"history.h"
/* Forward declarations used in this file */ void _rl_free_history_entry PARAMS((HIST_ENTRY *));
/* If non-zero, rl_get_previous_history and rl_get_next_history attempt
to preserve the value of rl_point from line to line. */ int _rl_history_preserve_point = 0;
_rl_arg_cxt _rl_argcxt;
/* Saved target point for when _rl_history_preserve_point is set. Special
value of -1 means that point is at the end of the line. */ int _rl_history_saved_point = -1;
/* Process C as part of the current numeric argument. Return -1 if the argumentshouldbeaborted,0ifweshouldnotreadanymorechars,and
1 if we should continue to read chars. */ int
_rl_arg_dispatch (cxt, c)
_rl_arg_cxt cxt; int c;
{ int key, r;
key = c;
/* If we see a key bound to `universal-argument' after seeing digits,
it ends the argument but is otherwise ignored. */ if (_rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument)
{ if ((cxt & NUM_SAWDIGITS) == 0)
{
rl_numeric_arg *= 4; return1;
} elseif (RL_ISSTATE (RL_STATE_CALLBACK))
{
_rl_argcxt |= NUM_READONE; return0; /* XXX */
} else
{
RL_SETSTATE(RL_STATE_MOREINPUT);
key = rl_read_key ();
RL_UNSETSTATE(RL_STATE_MOREINPUT);
rl_restore_prompt ();
rl_clear_message ();
RL_UNSETSTATE(RL_STATE_NUMERICARG); return (_rl_dispatch (key, _rl_keymap));
}
}
r = _rl_dispatch (key, _rl_keymap); if (RL_ISSTATE (RL_STATE_CALLBACK))
{ /* At worst, this will cause an extra redisplay. Otherwise,
we have to wait until the next character comes in. */ if (rl_done == 0)
(*rl_redisplay_function) ();
r = 0;
} return r;
}
return1;
}
/* Handle C-u style numeric args, as well as M--, and M-digits. */ staticint
rl_digit_loop ()
{ int c, r;
while (1)
{ if (_rl_arg_overflow ()) return1;
c = _rl_arg_getchar ();
if (c < 0)
{
_rl_abort_internal (); return -1;
}
r = _rl_arg_dispatch (_rl_argcxt, c); if (r <= 0 || (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)) break;
}
/* Start a numeric argument with initial value KEY */ int
rl_digit_argument (ignore, key) int ignore __attribute__((unused)), key;
{
_rl_arg_init (); if (RL_ISSTATE (RL_STATE_CALLBACK))
{
_rl_arg_dispatch (_rl_argcxt, key);
rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg); return0;
} else
{
rl_execute_next (key); return (rl_digit_loop ());
}
}
/* C-u, universal argument. Multiply the current argument by 4. Readakey.Ifthekeyhasnothingtodowitharguments,then
dispatch on it. If the key is the abort character then abort. */ int
rl_universal_argument (count, key) int count __attribute__((unused)), key __attribute__((unused));
{
_rl_arg_init ();
rl_numeric_arg *= 4;
/* We already have a history library, and that is what we use to control thehistoryfeaturesofreadline.Thisisourlocalinterfaceto
the history mechanism. */
/* While we are editing the history, this is the saved
version of the original line. */
HIST_ENTRY *_rl_saved_line_for_history = (HIST_ENTRY *)NULL;
/* Set the history pointer back to the last entry in the history. */ void
_rl_start_using_history ()
{
using_history (); if (_rl_saved_line_for_history)
_rl_free_history_entry (_rl_saved_line_for_history);
/* Free the contents (and containing structure) of a HIST_ENTRY. */ void
_rl_free_history_entry (entry)
HIST_ENTRY *entry;
{ if (entry == 0) return;
FREE (entry->line);
FREE (entry->timestamp);
free (entry);
}
/* Perhaps put back the current line if it has changed. */ int
rl_maybe_replace_line ()
{
HIST_ENTRY *temp;
temp = current_history (); /* If the current line has changed, save the changes. */ if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list))
{
temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list);
free (temp->line);
FREE (temp->timestamp);
free (temp);
} return0;
}
/* Restore the _rl_saved_line_for_history if there is one. */ int
rl_maybe_unsave_line ()
{ if (_rl_saved_line_for_history)
{ /* Can't call with `1' because rl_undo_list might point to an undo
list from a history entry, as in rl_replace_from_history() below. */
rl_replace_line (_rl_saved_line_for_history->line, 0);
rl_undo_list = (UNDO_LIST *)_rl_saved_line_for_history->data;
_rl_free_history_entry (_rl_saved_line_for_history);
_rl_saved_line_for_history = (HIST_ENTRY *)NULL;
rl_point = rl_end; /* rl_replace_line sets rl_end */
} else
rl_ding (); return0;
}
/* Save the current line in _rl_saved_line_for_history. */ int
rl_maybe_save_line ()
{ if (_rl_saved_line_for_history == 0)
{
_rl_saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
_rl_saved_line_for_history->line = savestring (rl_line_buffer);
_rl_saved_line_for_history->timestamp = (char *)NULL;
_rl_saved_line_for_history->data = (char *)rl_undo_list;
}
return0;
}
int
_rl_free_saved_history_line ()
{ if (_rl_saved_line_for_history)
{
_rl_free_history_entry (_rl_saved_line_for_history);
_rl_saved_line_for_history = (HIST_ENTRY *)NULL;
} return0;
}
void
rl_replace_from_history (entry, flags)
HIST_ENTRY *entry; int flags __attribute__((unused)); /* currently unused */
{ /* Can't call with `1' because rl_undo_list might point to an undo list
from a history entry, just like we're setting up here. */
rl_replace_line (entry->line, 0);
rl_undo_list = (UNDO_LIST *)entry->data;
rl_point = rl_end;
rl_mark = 0;
/* Meta-< goes to the start of the history. */ int
rl_beginning_of_history (count, key) int count __attribute__((unused)), key;
{ return (rl_get_previous_history (1 + where_history (), key));
}
/* Meta-> goes to the end of the history. (The current line). */ int
rl_end_of_history (count, key) int count __attribute__((unused)), key __attribute__((unused));
{
rl_maybe_replace_line ();
using_history ();
rl_maybe_unsave_line (); return0;
}
/* Move down to the next history line. */ int
rl_get_next_history (count, key) int count, key;
{
HIST_ENTRY *temp;
if (count < 0) return (rl_get_previous_history (-count, key));
if (count == 0) return0;
rl_maybe_replace_line ();
/* either not saved by rl_newline or at end of line, so set appropriately. */ if (_rl_history_saved_point == -1 && (rl_point || rl_end))
_rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
temp = (HIST_ENTRY *)NULL; while (count)
{
temp = next_history (); if (!temp) break;
--count;
}
/* Get the previous item out of our interactive history, making it the current
line. If there is no previous history, just ding. */ int
rl_get_previous_history (count, key) int count, key;
{
HIST_ENTRY *old_temp, *temp;
if (count < 0) return (rl_get_next_history (-count, key));
if (count == 0) return0;
/* either not saved by rl_newline or at end of line, so set appropriately. */ if (_rl_history_saved_point == -1 && (rl_point || rl_end))
_rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
/* If we don't have a line saved, then save this one. */
rl_maybe_save_line ();
/* If the current line has changed, save the changes. */
rl_maybe_replace_line ();
temp = old_temp = (HIST_ENTRY *)NULL; while (count)
{
temp = previous_history (); if (temp == 0) break;
old_temp = temp;
--count;
}
/* If there was a large argument, and we moved back to the start of the
history, that is not an error. So use the last value found. */ if (!temp && old_temp)
temp = old_temp;
/* **************************************************************** */ /* */ /* Editing Modes */ /* */ /* **************************************************************** */ /* How to toggle back and forth between editing modes. */ int
rl_vi_editing_mode (count, key) int count __attribute__((unused)), key;
{ #ifdefined (VI_MODE)
_rl_set_insert_mode (RL_IM_INSERT, 1); /* vi mode ignores insert mode */
rl_editing_mode = vi_mode;
rl_vi_insertion_mode (1, key); #endif/* VI_MODE */
return0;
}
int
rl_emacs_editing_mode (count, key) int count __attribute__((unused)), key __attribute__((unused));
{
rl_editing_mode = emacs_mode;
_rl_set_insert_mode (RL_IM_INSERT, 1); /* emacs mode default is insert mode */
_rl_keymap = emacs_standard_keymap; return0;
}
/* Function for the rest of the library to use to set insert/overwrite mode. */ void
_rl_set_insert_mode (im, force) int im, force __attribute__((unused));
{ #ifdef CURSOR_MODE
_rl_set_cursor (im, force); #endif
rl_insert_mode = im;
}
/* Toggle overwrite mode. A positive explicit argument selects overwrite
mode. A negative or zero explicit argument selects insert mode. */ int
rl_overwrite_mode (count, key) int count, key __attribute__((unused));
{ if (rl_explicit_arg == 0)
_rl_set_insert_mode (rl_insert_mode ^ 1, 0); elseif (count > 0)
_rl_set_insert_mode (RL_IM_OVERWRITE, 0); else
_rl_set_insert_mode (RL_IM_INSERT, 0);
return0;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-10-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.