~ubuntu-branches/ubuntu/wily/ecasound2.2/wily

« back to all changes in this revision

Viewing changes to readline-4.0/readline.c

  • Committer: Bazaar Package Importer
  • Author(s): Junichi Uekawa
  • Date: 2008-09-26 09:58:52 UTC
  • mfrom: (1.1.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20080926095852-k3v9ewhmxpaltusw
Tags: 2.5.2-3
yodl 2.13.1 removed --unique-output option. Remove --unique-output
accordingly.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* readline.c -- a general facility for reading lines of input
 
2
   with emacs style editing and completion. */
 
3
 
 
4
/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
 
5
 
 
6
   This file is part of the GNU Readline Library, a library for
 
7
   reading lines of text with interactive input and history editing.
 
8
 
 
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 1, or
 
12
   (at your option) any later version.
 
13
 
 
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.
 
18
 
 
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
   675 Mass Ave, Cambridge, MA 02139, USA. */
 
23
#define READLINE_LIBRARY
 
24
 
 
25
#if defined (HAVE_CONFIG_H)
 
26
#  include <config.h>
 
27
#endif
 
28
 
 
29
#include <sys/types.h>
 
30
#include "posixstat.h"
 
31
#include <fcntl.h>
 
32
#if defined (HAVE_SYS_FILE_H)
 
33
#  include <sys/file.h>
 
34
#endif /* HAVE_SYS_FILE_H */
 
35
 
 
36
#if defined (HAVE_UNISTD_H)
 
37
#  include <unistd.h>
 
38
#endif /* HAVE_UNISTD_H */
 
39
 
 
40
#if defined (HAVE_STDLIB_H)
 
41
#  include <stdlib.h>
 
42
#else
 
43
#  include "ansi_stdlib.h"
 
44
#endif /* HAVE_STDLIB_H */
 
45
 
 
46
#if defined (HAVE_LOCALE_H)
 
47
#  include <locale.h>
 
48
#endif
 
49
 
 
50
#include <signal.h>
 
51
#include <stdio.h>
 
52
#include "posixjmp.h"
 
53
 
 
54
/* System-specific feature definitions and include files. */
 
55
#include "rldefs.h"
 
56
 
 
57
#if defined (__EMX__)
 
58
#  define INCL_DOSPROCESS
 
59
#  include <os2.h>
 
60
#endif /* __EMX__ */
 
61
 
 
62
/* Some standard library routines. */
 
63
#include "readline.h"
 
64
#include "history.h"
 
65
 
 
66
#ifndef RL_LIBRARY_VERSION
 
67
#  define RL_LIBRARY_VERSION "4.0"
 
68
#endif
 
69
 
 
70
/* Evaluates its arguments multiple times. */
 
71
#define SWAP(s, e)  do { int t; t = s; s = e; e = t; } while (0)
 
72
 
 
73
/* NOTE: Functions and variables prefixed with `_rl_' are
 
74
   pseudo-global: they are global so they can be shared
 
75
   between files in the readline library, but are not intended
 
76
   to be visible to readline callers. */
 
77
 
 
78
/* Variables and functions imported from terminal.c */
 
79
extern int _rl_init_terminal_io ();
 
80
extern void _rl_enable_meta_key ();
 
81
#ifdef _MINIX
 
82
extern void _rl_output_character_function ();
 
83
#else
 
84
extern int _rl_output_character_function ();
 
85
#endif
 
86
 
 
87
extern int _rl_enable_meta;
 
88
extern int _rl_term_autowrap;
 
89
extern int screenwidth, screenheight, screenchars;
 
90
 
 
91
/* Variables and functions imported from rltty.c. */
 
92
extern void rl_prep_terminal (), rl_deprep_terminal ();
 
93
extern void rltty_set_default_bindings ();
 
94
 
 
95
/* Functions imported from util.c. */
 
96
extern void _rl_abort_internal ();
 
97
extern void rl_extend_line_buffer ();
 
98
extern int alphabetic ();
 
99
 
 
100
/* Functions imported from bind.c. */
 
101
extern void _rl_bind_if_unbound ();
 
102
 
 
103
/* Functions imported from input.c. */
 
104
extern int _rl_any_typein ();
 
105
extern void _rl_insert_typein ();
 
106
extern int rl_read_key ();
 
107
 
 
108
/* Functions imported from nls.c */
 
109
extern int _rl_init_eightbit ();
 
110
 
 
111
/* Functions imported from shell.c */
 
112
extern char *get_env_value ();
 
113
 
 
114
/* External redisplay functions and variables from display.c */
 
115
extern void _rl_move_vert ();
 
116
extern void _rl_update_final ();
 
117
extern void _rl_clear_to_eol ();
 
118
extern void _rl_clear_screen ();
 
119
extern void _rl_erase_entire_line ();
 
120
 
 
121
extern void _rl_erase_at_end_of_line ();
 
122
extern void _rl_move_cursor_relative ();
 
123
 
 
124
extern int _rl_vis_botlin;
 
125
extern int _rl_last_c_pos;
 
126
extern int _rl_horizontal_scroll_mode;
 
127
extern int rl_display_fixed;
 
128
extern int _rl_suppress_redisplay;
 
129
extern char *rl_display_prompt;
 
130
 
 
131
/* Variables imported from complete.c. */
 
132
extern char *rl_completer_word_break_characters;
 
133
extern char *rl_basic_word_break_characters;
 
134
extern int rl_completion_query_items;
 
135
extern int rl_complete_with_tilde_expansion;
 
136
 
 
137
/* Variables and functions from macro.c. */
 
138
extern void _rl_add_macro_char ();
 
139
extern void _rl_with_macro_input ();
 
140
extern int _rl_next_macro_key ();
 
141
extern int _rl_defining_kbd_macro;
 
142
 
 
143
#if defined (VI_MODE)
 
144
/* Functions imported from vi_mode.c. */
 
145
extern void _rl_vi_set_last ();
 
146
extern void _rl_vi_reset_last ();
 
147
extern void _rl_vi_done_inserting ();
 
148
extern int _rl_vi_textmod_command ();
 
149
extern void _rl_vi_initialize_line ();
 
150
#endif /* VI_MODE */
 
151
 
 
152
extern UNDO_LIST *rl_undo_list;
 
153
extern int _rl_doing_an_undo;
 
154
 
 
155
/* Forward declarations used in this file. */
 
156
void _rl_free_history_entry ();
 
157
 
 
158
int _rl_dispatch ();
 
159
int _rl_init_argument ();
 
160
 
 
161
static char *readline_internal ();
 
162
static void readline_initialize_everything ();
 
163
static void start_using_history ();
 
164
static void bind_arrow_keys ();
 
165
 
 
166
#if !defined (__GO32__)
 
167
static void readline_default_bindings ();
 
168
#endif /* !__GO32__ */
 
169
 
 
170
#if defined (__GO32__)
 
171
#  include <go32.h>
 
172
#  include <pc.h>
 
173
#  undef HANDLE_SIGNALS
 
174
#endif /* __GO32__ */
 
175
 
 
176
extern char *xmalloc (), *xrealloc ();
 
177
 
 
178
/* **************************************************************** */
 
179
/*                                                                  */
 
180
/*                      Line editing input utility                  */
 
181
/*                                                                  */
 
182
/* **************************************************************** */
 
183
 
 
184
char *rl_library_version = RL_LIBRARY_VERSION;
 
185
 
 
186
/* A pointer to the keymap that is currently in use.
 
187
   By default, it is the standard emacs keymap. */
 
188
Keymap _rl_keymap = emacs_standard_keymap;
 
189
 
 
190
/* The current style of editing. */
 
191
int rl_editing_mode = emacs_mode;
 
192
 
 
193
/* Non-zero if we called this function from _rl_dispatch().  It's present
 
194
   so functions can find out whether they were called from a key binding
 
195
   or directly from an application. */
 
196
int rl_dispatching;
 
197
 
 
198
/* Non-zero if the previous command was a kill command. */
 
199
int _rl_last_command_was_kill = 0;
 
200
 
 
201
/* The current value of the numeric argument specified by the user. */
 
202
int rl_numeric_arg = 1;
 
203
 
 
204
/* Non-zero if an argument was typed. */
 
205
int rl_explicit_arg = 0;
 
206
 
 
207
/* Temporary value used while generating the argument. */
 
208
int rl_arg_sign = 1;
 
209
 
 
210
/* Non-zero means we have been called at least once before. */
 
211
static int rl_initialized;
 
212
 
 
213
/* If non-zero, this program is running in an EMACS buffer. */
 
214
static int running_in_emacs;
 
215
 
 
216
/* The current offset in the current input line. */
 
217
int rl_point;
 
218
 
 
219
/* Mark in the current input line. */
 
220
int rl_mark;
 
221
 
 
222
/* Length of the current input line. */
 
223
int rl_end;
 
224
 
 
225
/* Make this non-zero to return the current input_line. */
 
226
int rl_done;
 
227
 
 
228
/* The last function executed by readline. */
 
229
Function *rl_last_func = (Function *)NULL;
 
230
 
 
231
/* Top level environment for readline_internal (). */
 
232
procenv_t readline_top_level;
 
233
 
 
234
/* The streams we interact with. */
 
235
FILE *_rl_in_stream, *_rl_out_stream;
 
236
 
 
237
/* The names of the streams that we do input and output to. */
 
238
FILE *rl_instream = (FILE *)NULL;
 
239
FILE *rl_outstream = (FILE *)NULL;
 
240
 
 
241
/* Non-zero means echo characters as they are read. */
 
242
int readline_echoing_p = 1;
 
243
 
 
244
/* Current prompt. */
 
245
char *rl_prompt;
 
246
int rl_visible_prompt_length = 0;
 
247
 
 
248
/* The number of characters read in order to type this complete command. */
 
249
int rl_key_sequence_length = 0;
 
250
 
 
251
/* If non-zero, then this is the address of a function to call just
 
252
   before readline_internal_setup () prints the first prompt. */
 
253
Function *rl_startup_hook = (Function *)NULL;
 
254
 
 
255
/* If non-zero, this is the address of a function to call just before
 
256
   readline_internal_setup () returns and readline_internal starts
 
257
   reading input characters. */
 
258
Function *rl_pre_input_hook = (Function *)NULL;
 
259
 
 
260
/* What we use internally.  You should always refer to RL_LINE_BUFFER. */
 
261
static char *the_line;
 
262
 
 
263
/* The character that can generate an EOF.  Really read from
 
264
   the terminal driver... just defaulted here. */
 
265
int _rl_eof_char = CTRL ('D');
 
266
 
 
267
/* Non-zero makes this the next keystroke to read. */
 
268
int rl_pending_input = 0;
 
269
 
 
270
/* Pointer to a useful terminal name. */
 
271
char *rl_terminal_name = (char *)NULL;
 
272
 
 
273
/* Non-zero means to always use horizontal scrolling in line display. */
 
274
int _rl_horizontal_scroll_mode = 0;
 
275
 
 
276
/* Non-zero means to display an asterisk at the starts of history lines
 
277
   which have been modified. */
 
278
int _rl_mark_modified_lines = 0;  
 
279
 
 
280
/* The style of `bell' notification preferred.  This can be set to NO_BELL,
 
281
   AUDIBLE_BELL, or VISIBLE_BELL. */
 
282
int _rl_bell_preference = AUDIBLE_BELL;
 
283
     
 
284
/* String inserted into the line by rl_insert_comment (). */
 
285
char *_rl_comment_begin;
 
286
 
 
287
/* Keymap holding the function currently being executed. */
 
288
Keymap rl_executing_keymap;
 
289
 
 
290
/* Non-zero means to erase entire line, including prompt, on empty input lines. */
 
291
int rl_erase_empty_line = 0;
 
292
 
 
293
/* Line buffer and maintenence. */
 
294
char *rl_line_buffer = (char *)NULL;
 
295
int rl_line_buffer_len = 0;
 
296
 
 
297
/* Forward declarations used by the display and termcap code. */
 
298
 
 
299
/* **************************************************************** */
 
300
/*                                                                  */
 
301
/*                      `Forward' declarations                      */
 
302
/*                                                                  */
 
303
/* **************************************************************** */
 
304
 
 
305
/* Non-zero means do not parse any lines other than comments and
 
306
   parser directives. */
 
307
unsigned char _rl_parsing_conditionalized_out = 0;
 
308
 
 
309
/* Non-zero means to convert characters with the meta bit set to
 
310
   escape-prefixed characters so we can indirect through
 
311
   emacs_meta_keymap or vi_escape_keymap. */
 
312
int _rl_convert_meta_chars_to_ascii = 1;
 
313
 
 
314
/* Non-zero means to output characters with the meta bit set directly
 
315
   rather than as a meta-prefixed escape sequence. */
 
316
int _rl_output_meta_chars = 0;
 
317
 
 
318
/* **************************************************************** */
 
319
/*                                                                  */
 
320
/*                      Top Level Functions                         */
 
321
/*                                                                  */
 
322
/* **************************************************************** */
 
323
 
 
324
/* Non-zero means treat 0200 bit in terminal input as Meta bit. */
 
325
int _rl_meta_flag = 0;  /* Forward declaration */
 
326
 
 
327
/* Read a line of input.  Prompt with PROMPT.  An empty PROMPT means
 
328
   none.  A return value of NULL means that EOF was encountered. */
 
329
char *
 
330
readline (prompt)
 
331
     char *prompt;
 
332
{
 
333
  char *value;
 
334
 
 
335
  rl_prompt = prompt;
 
336
 
 
337
  /* If we are at EOF return a NULL string. */
 
338
  if (rl_pending_input == EOF)
 
339
    {
 
340
      rl_pending_input = 0;
 
341
      return ((char *)NULL);
 
342
    }
 
343
 
 
344
  rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
 
345
 
 
346
  rl_initialize ();
 
347
  (*rl_prep_term_function) (_rl_meta_flag);
 
348
 
 
349
#if defined (HANDLE_SIGNALS)
 
350
  rl_set_signals ();
 
351
#endif
 
352
 
 
353
  value = readline_internal ();
 
354
  (*rl_deprep_term_function) ();
 
355
 
 
356
#if defined (HANDLE_SIGNALS)
 
357
  rl_clear_signals ();
 
358
#endif
 
359
 
 
360
  return (value);
 
361
}
 
362
 
 
363
#if defined (READLINE_CALLBACKS)
 
364
#  define STATIC_CALLBACK
 
365
#else
 
366
#  define STATIC_CALLBACK static
 
367
#endif
 
368
 
 
369
STATIC_CALLBACK void
 
370
readline_internal_setup ()
 
371
{
 
372
  _rl_in_stream = rl_instream;
 
373
  _rl_out_stream = rl_outstream;
 
374
 
 
375
  if (rl_startup_hook)
 
376
    (*rl_startup_hook) ();
 
377
 
 
378
  if (readline_echoing_p == 0)
 
379
    {
 
380
      if (rl_prompt)
 
381
        {
 
382
          fprintf (_rl_out_stream, "%s", rl_prompt);
 
383
          fflush (_rl_out_stream);
 
384
        }
 
385
    }
 
386
  else
 
387
    {
 
388
      rl_on_new_line ();
 
389
      (*rl_redisplay_function) ();
 
390
#if defined (VI_MODE)
 
391
      if (rl_editing_mode == vi_mode)
 
392
        rl_vi_insertion_mode (1, 0);
 
393
#endif /* VI_MODE */
 
394
    }
 
395
 
 
396
  if (rl_pre_input_hook)
 
397
    (*rl_pre_input_hook) ();
 
398
}
 
399
 
 
400
STATIC_CALLBACK char *
 
401
readline_internal_teardown (eof)
 
402
     int eof;
 
403
{
 
404
  char *temp;
 
405
  HIST_ENTRY *entry;
 
406
 
 
407
  /* Restore the original of this history line, iff the line that we
 
408
     are editing was originally in the history, AND the line has changed. */
 
409
  entry = current_history ();
 
410
 
 
411
  if (entry && rl_undo_list)
 
412
    {
 
413
      temp = savestring (the_line);
 
414
      rl_revert_line (1, 0);
 
415
      entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL);
 
416
      _rl_free_history_entry (entry);
 
417
 
 
418
      strcpy (the_line, temp);
 
419
      free (temp);
 
420
    }
 
421
 
 
422
  /* At any rate, it is highly likely that this line has an undo list.  Get
 
423
     rid of it now. */
 
424
  if (rl_undo_list)
 
425
    free_undo_list ();
 
426
 
 
427
  return (eof ? (char *)NULL : savestring (the_line));
 
428
}
 
429
 
 
430
STATIC_CALLBACK int
 
431
#if defined (READLINE_CALLBACKS)
 
432
readline_internal_char ()
 
433
#else
 
434
readline_internal_charloop ()
 
435
#endif
 
436
{
 
437
  static int lastc, eof_found;
 
438
  int c, code, lk;
 
439
 
 
440
  lastc = -1;
 
441
  eof_found = 0;
 
442
 
 
443
#if !defined (READLINE_CALLBACKS)
 
444
  while (rl_done == 0)
 
445
    {
 
446
#endif
 
447
      lk = _rl_last_command_was_kill;
 
448
 
 
449
      code = setjmp (readline_top_level);
 
450
 
 
451
      if (code)
 
452
        (*rl_redisplay_function) ();
 
453
 
 
454
      if (rl_pending_input == 0)
 
455
        {
 
456
          /* Then initialize the argument and number of keys read. */
 
457
          _rl_init_argument ();
 
458
          rl_key_sequence_length = 0;
 
459
        }
 
460
 
 
461
      c = rl_read_key ();
 
462
 
 
463
      /* EOF typed to a non-blank line is a <NL>. */
 
464
      if (c == EOF && rl_end)
 
465
        c = NEWLINE;
 
466
 
 
467
      /* The character _rl_eof_char typed to blank line, and not as the
 
468
         previous character is interpreted as EOF. */
 
469
      if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end)
 
470
        {
 
471
#if defined (READLINE_CALLBACKS)
 
472
          return (rl_done = 1);
 
473
#else
 
474
          eof_found = 1;
 
475
          break;
 
476
#endif
 
477
        }
 
478
 
 
479
      lastc = c;
 
480
      _rl_dispatch (c, _rl_keymap);
 
481
 
 
482
      /* If there was no change in _rl_last_command_was_kill, then no kill
 
483
         has taken place.  Note that if input is pending we are reading
 
484
         a prefix command, so nothing has changed yet. */
 
485
      if (rl_pending_input == 0 && lk == _rl_last_command_was_kill)
 
486
        _rl_last_command_was_kill = 0;
 
487
 
 
488
#if defined (VI_MODE)
 
489
      /* In vi mode, when you exit insert mode, the cursor moves back
 
490
         over the previous character.  We explicitly check for that here. */
 
491
      if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
 
492
        rl_vi_check ();
 
493
#endif /* VI_MODE */
 
494
 
 
495
      if (rl_done == 0)
 
496
        (*rl_redisplay_function) ();
 
497
 
 
498
      /* If the application writer has told us to erase the entire line if
 
499
          the only character typed was something bound to rl_newline, do so. */
 
500
      if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline &&
 
501
          rl_point == 0 && rl_end == 0)
 
502
        _rl_erase_entire_line ();
 
503
 
 
504
#if defined (READLINE_CALLBACKS)
 
505
      return 0;
 
506
#else
 
507
    }
 
508
 
 
509
  return (eof_found);
 
510
#endif
 
511
}
 
512
 
 
513
#if defined (READLINE_CALLBACKS)
 
514
static int
 
515
readline_internal_charloop ()
 
516
{
 
517
  int eof = 1;
 
518
 
 
519
  while (rl_done == 0)
 
520
    eof = readline_internal_char ();
 
521
  return (eof);
 
522
}
 
523
#endif /* READLINE_CALLBACKS */
 
524
 
 
525
/* Read a line of input from the global rl_instream, doing output on
 
526
   the global rl_outstream.
 
527
   If rl_prompt is non-null, then that is our prompt. */
 
528
static char *
 
529
readline_internal ()
 
530
{
 
531
  int eof;
 
532
 
 
533
  readline_internal_setup ();
 
534
  eof = readline_internal_charloop ();
 
535
  return (readline_internal_teardown (eof));
 
536
}
 
537
 
 
538
void
 
539
_rl_init_line_state ()
 
540
{
 
541
  rl_point = rl_end = 0;
 
542
  the_line = rl_line_buffer;
 
543
  the_line[0] = 0;
 
544
}
 
545
 
 
546
void
 
547
_rl_set_the_line ()
 
548
{
 
549
  the_line = rl_line_buffer;
 
550
}
 
551
 
 
552
/* Do the command associated with KEY in MAP.
 
553
   If the associated command is really a keymap, then read
 
554
   another key, and dispatch into that map. */
 
555
int
 
556
_rl_dispatch (key, map)
 
557
     register int key;
 
558
     Keymap map;
 
559
{
 
560
  int r, newkey;
 
561
  char *macro;
 
562
  Function *func;
 
563
 
 
564
  if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
 
565
    {
 
566
      if (map[ESC].type == ISKMAP)
 
567
        {
 
568
          if (_rl_defining_kbd_macro)
 
569
            _rl_add_macro_char (ESC);
 
570
          map = FUNCTION_TO_KEYMAP (map, ESC);
 
571
          key = UNMETA (key);
 
572
          rl_key_sequence_length += 2;
 
573
          return (_rl_dispatch (key, map));
 
574
        }
 
575
      else
 
576
        ding ();
 
577
      return 0;
 
578
    }
 
579
 
 
580
  if (_rl_defining_kbd_macro)
 
581
    _rl_add_macro_char (key);
 
582
 
 
583
  r = 0;
 
584
  switch (map[key].type)
 
585
    {
 
586
    case ISFUNC:
 
587
      func = map[key].function;
 
588
      if (func != (Function *)NULL)
 
589
        {
 
590
          /* Special case rl_do_lowercase_version (). */
 
591
          if (func == rl_do_lowercase_version)
 
592
            return (_rl_dispatch (_rl_to_lower (key), map));
 
593
 
 
594
          rl_executing_keymap = map;
 
595
 
 
596
#if 0
 
597
          _rl_suppress_redisplay = (map[key].function == rl_insert) && _rl_input_available ();
 
598
#endif
 
599
 
 
600
          rl_dispatching = 1;
 
601
          r = (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
 
602
          rl_dispatching = 0;
 
603
 
 
604
          /* If we have input pending, then the last command was a prefix
 
605
             command.  Don't change the state of rl_last_func.  Otherwise,
 
606
             remember the last command executed in this variable. */
 
607
          if (!rl_pending_input && map[key].function != rl_digit_argument)
 
608
            rl_last_func = map[key].function;
 
609
        }
 
610
      else
 
611
        {
 
612
          _rl_abort_internal ();
 
613
          return -1;
 
614
        }
 
615
      break;
 
616
 
 
617
    case ISKMAP:
 
618
      if (map[key].function != (Function *)NULL)
 
619
        {
 
620
          rl_key_sequence_length++;
 
621
          newkey = rl_read_key ();
 
622
          r = _rl_dispatch (newkey, FUNCTION_TO_KEYMAP (map, key));
 
623
        }
 
624
      else
 
625
        {
 
626
          _rl_abort_internal ();
 
627
          return -1;
 
628
        }
 
629
      break;
 
630
 
 
631
    case ISMACR:
 
632
      if (map[key].function != (Function *)NULL)
 
633
        {
 
634
          macro = savestring ((char *)map[key].function);
 
635
          _rl_with_macro_input (macro);
 
636
          return 0;
 
637
        }
 
638
      break;
 
639
    }
 
640
#if defined (VI_MODE)
 
641
  if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
 
642
      _rl_vi_textmod_command (key))
 
643
    _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
 
644
#endif
 
645
  return (r);
 
646
}
 
647
 
 
648
/* **************************************************************** */
 
649
/*                                                                  */
 
650
/*                      Initializations                             */
 
651
/*                                                                  */
 
652
/* **************************************************************** */
 
653
 
 
654
/* Initialize readline (and terminal if not already). */
 
655
int
 
656
rl_initialize ()
 
657
{
 
658
  /* If we have never been called before, initialize the
 
659
     terminal and data structures. */
 
660
  if (!rl_initialized)
 
661
    {
 
662
      readline_initialize_everything ();
 
663
      rl_initialized++;
 
664
    }
 
665
 
 
666
  /* Initalize the current line information. */
 
667
  _rl_init_line_state ();
 
668
 
 
669
  /* We aren't done yet.  We haven't even gotten started yet! */
 
670
  rl_done = 0;
 
671
 
 
672
  /* Tell the history routines what is going on. */
 
673
  start_using_history ();
 
674
 
 
675
  /* Make the display buffer match the state of the line. */
 
676
  rl_reset_line_state ();
 
677
 
 
678
  /* No such function typed yet. */
 
679
  rl_last_func = (Function *)NULL;
 
680
 
 
681
  /* Parsing of key-bindings begins in an enabled state. */
 
682
  _rl_parsing_conditionalized_out = 0;
 
683
 
 
684
#if defined (VI_MODE)
 
685
  if (rl_editing_mode == vi_mode)
 
686
    _rl_vi_initialize_line ();
 
687
#endif
 
688
 
 
689
  return 0;
 
690
}
 
691
 
 
692
#if defined (__EMX__)
 
693
static void
 
694
_emx_build_environ ()
 
695
{
 
696
  TIB *tibp;
 
697
  PIB *pibp;
 
698
  char *t, **tp;
 
699
  int c;
 
700
 
 
701
  DosGetInfoBlocks (&tibp, &pibp);
 
702
  t = pibp->pib_pchenv;
 
703
  for (c = 1; *t; c++)
 
704
    t += strlen (t) + 1;
 
705
  tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *));
 
706
  t = pibp->pib_pchenv;
 
707
  while (*t)
 
708
    {
 
709
      *tp++ = t;
 
710
      t += strlen (t) + 1;
 
711
    }
 
712
  *tp = 0;
 
713
}
 
714
#endif /* __EMX__ */
 
715
 
 
716
/* Initialize the entire state of the world. */
 
717
static void
 
718
readline_initialize_everything ()
 
719
{
 
720
#if defined (__EMX__)
 
721
  if (environ == 0)
 
722
    _emx_build_environ ();
 
723
#endif
 
724
 
 
725
  /* Find out if we are running in Emacs. */
 
726
  running_in_emacs = get_env_value ("EMACS") != (char *)0;
 
727
 
 
728
  /* Set up input and output if they are not already set up. */
 
729
  if (!rl_instream)
 
730
    rl_instream = stdin;
 
731
 
 
732
  if (!rl_outstream)
 
733
    rl_outstream = stdout;
 
734
 
 
735
  /* Bind _rl_in_stream and _rl_out_stream immediately.  These values
 
736
     may change, but they may also be used before readline_internal ()
 
737
     is called. */
 
738
  _rl_in_stream = rl_instream;
 
739
  _rl_out_stream = rl_outstream;
 
740
 
 
741
  /* Allocate data structures. */
 
742
  if (rl_line_buffer == 0)
 
743
    rl_line_buffer = xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
 
744
 
 
745
  /* Initialize the terminal interface. */
 
746
  _rl_init_terminal_io ((char *)NULL);
 
747
 
 
748
#if !defined (__GO32__)
 
749
  /* Bind tty characters to readline functions. */
 
750
  readline_default_bindings ();
 
751
#endif /* !__GO32__ */
 
752
 
 
753
  /* Initialize the function names. */
 
754
  rl_initialize_funmap ();
 
755
 
 
756
  /* Decide whether we should automatically go into eight-bit mode. */
 
757
  _rl_init_eightbit ();
 
758
      
 
759
  /* Read in the init file. */
 
760
  rl_read_init_file ((char *)NULL);
 
761
 
 
762
  /* XXX */
 
763
  if (_rl_horizontal_scroll_mode && _rl_term_autowrap)
 
764
    {
 
765
      screenwidth--;
 
766
      screenchars -= screenheight;
 
767
    }
 
768
 
 
769
  /* Override the effect of any `set keymap' assignments in the
 
770
     inputrc file. */
 
771
  rl_set_keymap_from_edit_mode ();
 
772
 
 
773
  /* Try to bind a common arrow key prefix, if not already bound. */
 
774
  bind_arrow_keys ();
 
775
 
 
776
  /* Enable the meta key, if this terminal has one. */
 
777
  if (_rl_enable_meta)
 
778
    _rl_enable_meta_key ();
 
779
 
 
780
  /* If the completion parser's default word break characters haven't
 
781
     been set yet, then do so now. */
 
782
  if (rl_completer_word_break_characters == (char *)NULL)
 
783
    rl_completer_word_break_characters = rl_basic_word_break_characters;
 
784
}
 
785
 
 
786
/* If this system allows us to look at the values of the regular
 
787
   input editing characters, then bind them to their readline
 
788
   equivalents, iff the characters are not bound to keymaps. */
 
789
static void
 
790
readline_default_bindings ()
 
791
{
 
792
  rltty_set_default_bindings (_rl_keymap);
 
793
}
 
794
 
 
795
static void
 
796
bind_arrow_keys_internal ()
 
797
{
 
798
  Function *f;
 
799
 
 
800
  f = rl_function_of_keyseq ("\033[A", _rl_keymap, (int *)NULL);
 
801
  if (!f || f == rl_do_lowercase_version)
 
802
    {
 
803
      _rl_bind_if_unbound ("\033[A", rl_get_previous_history);
 
804
      _rl_bind_if_unbound ("\033[B", rl_get_next_history);
 
805
      _rl_bind_if_unbound ("\033[C", rl_forward);
 
806
      _rl_bind_if_unbound ("\033[D", rl_backward);
 
807
    }
 
808
 
 
809
  f = rl_function_of_keyseq ("\033OA", _rl_keymap, (int *)NULL);
 
810
  if (!f || f == rl_do_lowercase_version)
 
811
    {
 
812
      _rl_bind_if_unbound ("\033OA", rl_get_previous_history);
 
813
      _rl_bind_if_unbound ("\033OB", rl_get_next_history);
 
814
      _rl_bind_if_unbound ("\033OC", rl_forward);
 
815
      _rl_bind_if_unbound ("\033OD", rl_backward);
 
816
    }
 
817
}
 
818
 
 
819
/* Try and bind the common arrow key prefix after giving termcap and
 
820
   the inputrc file a chance to bind them and create `real' keymaps
 
821
   for the arrow key prefix. */
 
822
static void
 
823
bind_arrow_keys ()
 
824
{
 
825
  Keymap xkeymap;
 
826
 
 
827
  xkeymap = _rl_keymap;
 
828
 
 
829
  _rl_keymap = emacs_standard_keymap;
 
830
  bind_arrow_keys_internal ();
 
831
 
 
832
#if defined (VI_MODE)
 
833
  _rl_keymap = vi_movement_keymap;
 
834
  bind_arrow_keys_internal ();
 
835
#endif
 
836
 
 
837
  _rl_keymap = xkeymap;
 
838
}
 
839
 
 
840
 
 
841
/* **************************************************************** */
 
842
/*                                                                  */
 
843
/*                      Numeric Arguments                           */
 
844
/*                                                                  */
 
845
/* **************************************************************** */
 
846
 
 
847
/* Handle C-u style numeric args, as well as M--, and M-digits. */
 
848
static int
 
849
rl_digit_loop ()
 
850
{
 
851
  int key, c, sawminus, sawdigits;
 
852
 
 
853
  rl_save_prompt ();
 
854
 
 
855
  sawminus = sawdigits = 0;
 
856
  while (1)
 
857
    {
 
858
      if (rl_numeric_arg > 1000000)
 
859
        {
 
860
          sawdigits = rl_explicit_arg = rl_numeric_arg = 0;
 
861
          ding ();
 
862
          rl_restore_prompt ();
 
863
          rl_clear_message ();
 
864
          return 1;
 
865
        }
 
866
      rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
 
867
      key = c = rl_read_key ();
 
868
 
 
869
      /* If we see a key bound to `universal-argument' after seeing digits,
 
870
         it ends the argument but is otherwise ignored. */
 
871
      if (_rl_keymap[c].type == ISFUNC &&
 
872
          _rl_keymap[c].function == rl_universal_argument)
 
873
        {
 
874
          if (sawdigits == 0)
 
875
            {
 
876
              rl_numeric_arg *= 4;
 
877
              continue;
 
878
            }
 
879
          else
 
880
            {
 
881
              key = rl_read_key ();
 
882
              rl_restore_prompt ();
 
883
              rl_clear_message ();
 
884
              return (_rl_dispatch (key, _rl_keymap));
 
885
            }
 
886
        }
 
887
 
 
888
      c = UNMETA (c);
 
889
 
 
890
      if (_rl_digit_p (c))
 
891
        {
 
892
          rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + c - '0' : c - '0';
 
893
          sawdigits = rl_explicit_arg = 1;
 
894
        }
 
895
      else if (c == '-' && rl_explicit_arg == 0)
 
896
        {
 
897
          rl_numeric_arg = sawminus = 1;
 
898
          rl_arg_sign = -1;
 
899
        }
 
900
      else
 
901
        {
 
902
          /* Make M-- command equivalent to M--1 command. */
 
903
          if (sawminus && rl_numeric_arg == 1 && rl_explicit_arg == 0)
 
904
            rl_explicit_arg = 1;
 
905
          rl_restore_prompt ();
 
906
          rl_clear_message ();
 
907
          return (_rl_dispatch (key, _rl_keymap));
 
908
        }
 
909
    }
 
910
 
 
911
  return 0;
 
912
}
 
913
 
 
914
/* Add the current digit to the argument in progress. */
 
915
int
 
916
rl_digit_argument (ignore, key)
 
917
     int ignore, key;
 
918
{
 
919
  rl_pending_input = key;
 
920
  return (rl_digit_loop ());
 
921
}
 
922
 
 
923
/* What to do when you abort reading an argument. */
 
924
int
 
925
rl_discard_argument ()
 
926
{
 
927
  ding ();
 
928
  rl_clear_message ();
 
929
  _rl_init_argument ();
 
930
  return 0;
 
931
}
 
932
 
 
933
/* Create a default argument. */
 
934
int
 
935
_rl_init_argument ()
 
936
{
 
937
  rl_numeric_arg = rl_arg_sign = 1;
 
938
  rl_explicit_arg = 0;
 
939
  return 0;
 
940
}
 
941
 
 
942
/* C-u, universal argument.  Multiply the current argument by 4.
 
943
   Read a key.  If the key has nothing to do with arguments, then
 
944
   dispatch on it.  If the key is the abort character then abort. */
 
945
int
 
946
rl_universal_argument (count, key)
 
947
     int count, key;
 
948
{
 
949
  rl_numeric_arg *= 4;
 
950
  return (rl_digit_loop ());
 
951
}
 
952
 
 
953
/* **************************************************************** */
 
954
/*                                                                  */
 
955
/*                      Insert and Delete                           */
 
956
/*                                                                  */
 
957
/* **************************************************************** */
 
958
 
 
959
/* Insert a string of text into the line at point.  This is the only
 
960
   way that you should do insertion.  rl_insert () calls this
 
961
   function. */
 
962
int
 
963
rl_insert_text (string)
 
964
     char *string;
 
965
{
 
966
  register int i, l = strlen (string);
 
967
 
 
968
  if (rl_end + l >= rl_line_buffer_len)
 
969
    rl_extend_line_buffer (rl_end + l);
 
970
 
 
971
  for (i = rl_end; i >= rl_point; i--)
 
972
    the_line[i + l] = the_line[i];
 
973
  strncpy (the_line + rl_point, string, l);
 
974
 
 
975
  /* Remember how to undo this if we aren't undoing something. */
 
976
  if (!_rl_doing_an_undo)
 
977
    {
 
978
      /* If possible and desirable, concatenate the undos. */
 
979
      if ((l == 1) &&
 
980
          rl_undo_list &&
 
981
          (rl_undo_list->what == UNDO_INSERT) &&
 
982
          (rl_undo_list->end == rl_point) &&
 
983
          (rl_undo_list->end - rl_undo_list->start < 20))
 
984
        rl_undo_list->end++;
 
985
      else
 
986
        rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL);
 
987
    }
 
988
  rl_point += l;
 
989
  rl_end += l;
 
990
  the_line[rl_end] = '\0';
 
991
  return l;
 
992
}
 
993
 
 
994
/* Delete the string between FROM and TO.  FROM is
 
995
   inclusive, TO is not. */
 
996
int
 
997
rl_delete_text (from, to)
 
998
     int from, to;
 
999
{
 
1000
  register char *text;
 
1001
  register int diff, i;
 
1002
 
 
1003
  /* Fix it if the caller is confused. */
 
1004
  if (from > to)
 
1005
    SWAP (from, to);
 
1006
 
 
1007
  /* fix boundaries */
 
1008
  if (to > rl_end)
 
1009
    {
 
1010
      to = rl_end;
 
1011
      if (from > to)
 
1012
        from = to;
 
1013
    }
 
1014
 
 
1015
  text = rl_copy_text (from, to);
 
1016
 
 
1017
  /* Some versions of strncpy() can't handle overlapping arguments. */
 
1018
  diff = to - from;
 
1019
  for (i = from; i < rl_end - diff; i++)
 
1020
    the_line[i] = the_line[i + diff];
 
1021
 
 
1022
  /* Remember how to undo this delete. */
 
1023
  if (_rl_doing_an_undo == 0)
 
1024
    rl_add_undo (UNDO_DELETE, from, to, text);
 
1025
  else
 
1026
    free (text);
 
1027
 
 
1028
  rl_end -= diff;
 
1029
  the_line[rl_end] = '\0';
 
1030
  return (diff);
 
1031
}
 
1032
 
 
1033
/* Fix up point so that it is within the line boundaries after killing
 
1034
   text.  If FIX_MARK_TOO is non-zero, the mark is forced within line
 
1035
   boundaries also. */
 
1036
 
 
1037
#define _RL_FIX_POINT(x) \
 
1038
        do { \
 
1039
        if (x > rl_end) \
 
1040
          x = rl_end; \
 
1041
        else if (x < 0) \
 
1042
          x = 0; \
 
1043
        } while (0)
 
1044
 
 
1045
void
 
1046
_rl_fix_point (fix_mark_too)
 
1047
     int fix_mark_too;
 
1048
{
 
1049
  _RL_FIX_POINT (rl_point);
 
1050
  if (fix_mark_too)
 
1051
    _RL_FIX_POINT (rl_mark);
 
1052
}
 
1053
#undef _RL_FIX_POINT
 
1054
 
 
1055
void
 
1056
_rl_replace_text (text, start, end)
 
1057
     char *text;
 
1058
     int start, end;
 
1059
{
 
1060
  rl_begin_undo_group ();
 
1061
  rl_delete_text (start, end + 1);
 
1062
  rl_point = start;
 
1063
  rl_insert_text (text);
 
1064
  rl_end_undo_group ();
 
1065
}
 
1066
 
 
1067
/* **************************************************************** */
 
1068
/*                                                                  */
 
1069
/*                      Readline character functions                */
 
1070
/*                                                                  */
 
1071
/* **************************************************************** */
 
1072
 
 
1073
/* This is not a gap editor, just a stupid line input routine.  No hair
 
1074
   is involved in writing any of the functions, and none should be. */
 
1075
 
 
1076
/* Note that:
 
1077
 
 
1078
   rl_end is the place in the string that we would place '\0';
 
1079
   i.e., it is always safe to place '\0' there.
 
1080
 
 
1081
   rl_point is the place in the string where the cursor is.  Sometimes
 
1082
   this is the same as rl_end.
 
1083
 
 
1084
   Any command that is called interactively receives two arguments.
 
1085
   The first is a count: the numeric arg pased to this command.
 
1086
   The second is the key which invoked this command.
 
1087
*/
 
1088
 
 
1089
/* **************************************************************** */
 
1090
/*                                                                  */
 
1091
/*                      Movement Commands                           */
 
1092
/*                                                                  */
 
1093
/* **************************************************************** */
 
1094
 
 
1095
/* Note that if you `optimize' the display for these functions, you cannot
 
1096
   use said functions in other functions which do not do optimizing display.
 
1097
   I.e., you will have to update the data base for rl_redisplay, and you
 
1098
   might as well let rl_redisplay do that job. */
 
1099
 
 
1100
/* Move forward COUNT characters. */
 
1101
int
 
1102
rl_forward (count, key)
 
1103
     int count, key;
 
1104
{
 
1105
  if (count < 0)
 
1106
    rl_backward (-count, key);
 
1107
  else if (count > 0)
 
1108
    {
 
1109
      int end = rl_point + count;
 
1110
#if defined (VI_MODE)
 
1111
      int lend = rl_end - (rl_editing_mode == vi_mode);
 
1112
#else
 
1113
      int lend = rl_end;
 
1114
#endif
 
1115
 
 
1116
      if (end > lend)
 
1117
        {
 
1118
          rl_point = lend;
 
1119
          ding ();
 
1120
        }
 
1121
      else
 
1122
        rl_point = end;
 
1123
    }
 
1124
  return 0;
 
1125
}
 
1126
 
 
1127
/* Move backward COUNT characters. */
 
1128
int
 
1129
rl_backward (count, key)
 
1130
     int count, key;
 
1131
{
 
1132
  if (count < 0)
 
1133
    rl_forward (-count, key);
 
1134
  else if (count > 0)
 
1135
    {
 
1136
      if (rl_point < count)
 
1137
        {
 
1138
          rl_point = 0;
 
1139
          ding ();
 
1140
        }
 
1141
      else
 
1142
        rl_point -= count;
 
1143
    }
 
1144
  return 0;
 
1145
}
 
1146
 
 
1147
/* Move to the beginning of the line. */
 
1148
int
 
1149
rl_beg_of_line (count, key)
 
1150
     int count, key;
 
1151
{
 
1152
  rl_point = 0;
 
1153
  return 0;
 
1154
}
 
1155
 
 
1156
/* Move to the end of the line. */
 
1157
int
 
1158
rl_end_of_line (count, key)
 
1159
     int count, key;
 
1160
{
 
1161
  rl_point = rl_end;
 
1162
  return 0;
 
1163
}
 
1164
 
 
1165
/* Move forward a word.  We do what Emacs does. */
 
1166
int
 
1167
rl_forward_word (count, key)
 
1168
     int count, key;
 
1169
{
 
1170
  int c;
 
1171
 
 
1172
  if (count < 0)
 
1173
    {
 
1174
      rl_backward_word (-count, key);
 
1175
      return 0;
 
1176
    }
 
1177
 
 
1178
  while (count)
 
1179
    {
 
1180
      if (rl_point == rl_end)
 
1181
        return 0;
 
1182
 
 
1183
      /* If we are not in a word, move forward until we are in one.
 
1184
         Then, move forward until we hit a non-alphabetic character. */
 
1185
      c = the_line[rl_point];
 
1186
      if (alphabetic (c) == 0)
 
1187
        {
 
1188
          while (++rl_point < rl_end)
 
1189
            {
 
1190
              c = the_line[rl_point];
 
1191
              if (alphabetic (c))
 
1192
                break;
 
1193
            }
 
1194
        }
 
1195
      if (rl_point == rl_end)
 
1196
        return 0;
 
1197
      while (++rl_point < rl_end)
 
1198
        {
 
1199
          c = the_line[rl_point];
 
1200
          if (alphabetic (c) == 0)
 
1201
            break;
 
1202
        }
 
1203
      --count;
 
1204
    }
 
1205
  return 0;
 
1206
}
 
1207
 
 
1208
/* Move backward a word.  We do what Emacs does. */
 
1209
int
 
1210
rl_backward_word (count, key)
 
1211
     int count, key;
 
1212
{
 
1213
  int c;
 
1214
 
 
1215
  if (count < 0)
 
1216
    {
 
1217
      rl_forward_word (-count, key);
 
1218
      return 0;
 
1219
    }
 
1220
 
 
1221
  while (count)
 
1222
    {
 
1223
      if (!rl_point)
 
1224
        return 0;
 
1225
 
 
1226
      /* Like rl_forward_word (), except that we look at the characters
 
1227
         just before point. */
 
1228
 
 
1229
      c = the_line[rl_point - 1];
 
1230
      if (alphabetic (c) == 0)
 
1231
        {
 
1232
          while (--rl_point)
 
1233
            {
 
1234
              c = the_line[rl_point - 1];
 
1235
              if (alphabetic (c))
 
1236
                break;
 
1237
            }
 
1238
        }
 
1239
 
 
1240
      while (rl_point)
 
1241
        {
 
1242
          c = the_line[rl_point - 1];
 
1243
          if (alphabetic (c) == 0)
 
1244
            break;
 
1245
          else
 
1246
            --rl_point;
 
1247
        }
 
1248
      --count;
 
1249
    }
 
1250
  return 0;
 
1251
}
 
1252
 
 
1253
/* Clear the current line.  Numeric argument to C-l does this. */
 
1254
int
 
1255
rl_refresh_line (ignore1, ignore2)
 
1256
     int ignore1, ignore2;
 
1257
{
 
1258
  int curr_line, nleft;
 
1259
 
 
1260
  /* Find out whether or not there might be invisible characters in the
 
1261
     editing buffer. */
 
1262
  if (rl_display_prompt == rl_prompt)
 
1263
    nleft = _rl_last_c_pos - screenwidth - rl_visible_prompt_length;
 
1264
  else
 
1265
    nleft = _rl_last_c_pos - screenwidth;
 
1266
 
 
1267
  if (nleft > 0)
 
1268
    curr_line = 1 + nleft / screenwidth;
 
1269
  else
 
1270
    curr_line = 0;
 
1271
 
 
1272
  _rl_move_vert (curr_line);
 
1273
  _rl_move_cursor_relative (0, the_line);   /* XXX is this right */
 
1274
 
 
1275
#if defined (__GO32__)
 
1276
  {
 
1277
    int row, col, width, row_start;
 
1278
 
 
1279
    ScreenGetCursor (&row, &col);
 
1280
    width = ScreenCols ();
 
1281
    row_start = ScreenPrimary + (row * width);
 
1282
    memset (row_start + col, 0, (width - col) * 2);
 
1283
  }
 
1284
#else /* !__GO32__ */
 
1285
  _rl_clear_to_eol (0);         /* arg of 0 means to not use spaces */
 
1286
#endif /* !__GO32__ */
 
1287
 
 
1288
  rl_forced_update_display ();
 
1289
  rl_display_fixed = 1;
 
1290
 
 
1291
  return 0;
 
1292
}
 
1293
 
 
1294
/* C-l typed to a line without quoting clears the screen, and then reprints
 
1295
   the prompt and the current input line.  Given a numeric arg, redraw only
 
1296
   the current line. */
 
1297
int
 
1298
rl_clear_screen (count, key)
 
1299
     int count, key;
 
1300
{
 
1301
  if (rl_explicit_arg)
 
1302
    {
 
1303
      rl_refresh_line (count, key);
 
1304
      return 0;
 
1305
    }
 
1306
 
 
1307
  _rl_clear_screen ();          /* calls termcap function to clear screen */
 
1308
  rl_forced_update_display ();
 
1309
  rl_display_fixed = 1;
 
1310
 
 
1311
  return 0;
 
1312
}
 
1313
 
 
1314
int
 
1315
rl_arrow_keys (count, c)
 
1316
     int count, c;
 
1317
{
 
1318
  int ch;
 
1319
 
 
1320
  ch = rl_read_key ();
 
1321
 
 
1322
  switch (_rl_to_upper (ch))
 
1323
    {
 
1324
    case 'A':
 
1325
      rl_get_previous_history (count, ch);
 
1326
      break;
 
1327
 
 
1328
    case 'B':
 
1329
      rl_get_next_history (count, ch);
 
1330
      break;
 
1331
 
 
1332
    case 'C':
 
1333
      rl_forward (count, ch);
 
1334
      break;
 
1335
 
 
1336
    case 'D':
 
1337
      rl_backward (count, ch);
 
1338
      break;
 
1339
 
 
1340
    default:
 
1341
      ding ();
 
1342
    }
 
1343
  return 0;
 
1344
}
 
1345
 
 
1346
 
 
1347
/* **************************************************************** */
 
1348
/*                                                                  */
 
1349
/*                      Text commands                               */
 
1350
/*                                                                  */
 
1351
/* **************************************************************** */
 
1352
 
 
1353
/* Insert the character C at the current location, moving point forward. */
 
1354
int
 
1355
rl_insert (count, c)
 
1356
     int count, c;
 
1357
{
 
1358
  register int i;
 
1359
  char *string;
 
1360
 
 
1361
  if (count <= 0)
 
1362
    return 0;
 
1363
 
 
1364
  /* If we can optimize, then do it.  But don't let people crash
 
1365
     readline because of extra large arguments. */
 
1366
  if (count > 1 && count <= 1024)
 
1367
    {
 
1368
      string = xmalloc (1 + count);
 
1369
 
 
1370
      for (i = 0; i < count; i++)
 
1371
        string[i] = c;
 
1372
 
 
1373
      string[i] = '\0';
 
1374
      rl_insert_text (string);
 
1375
      free (string);
 
1376
 
 
1377
      return 0;
 
1378
    }
 
1379
 
 
1380
  if (count > 1024)
 
1381
    {
 
1382
      int decreaser;
 
1383
      char str[1024+1];
 
1384
 
 
1385
      for (i = 0; i < 1024; i++)
 
1386
        str[i] = c;
 
1387
 
 
1388
      while (count)
 
1389
        {
 
1390
          decreaser = (count > 1024 ? 1024 : count);
 
1391
          str[decreaser] = '\0';
 
1392
          rl_insert_text (str);
 
1393
          count -= decreaser;
 
1394
        }
 
1395
 
 
1396
      return 0;
 
1397
    }
 
1398
 
 
1399
  /* We are inserting a single character.
 
1400
     If there is pending input, then make a string of all of the
 
1401
     pending characters that are bound to rl_insert, and insert
 
1402
     them all. */
 
1403
  if (_rl_any_typein ())
 
1404
    _rl_insert_typein (c);
 
1405
  else
 
1406
    {
 
1407
      /* Inserting a single character. */
 
1408
      char str[2];
 
1409
 
 
1410
      str[1] = '\0';
 
1411
      str[0] = c;
 
1412
      rl_insert_text (str);
 
1413
    }
 
1414
  return 0;
 
1415
}
 
1416
 
 
1417
/* Insert the next typed character verbatim. */
 
1418
int
 
1419
rl_quoted_insert (count, key)
 
1420
     int count, key;
 
1421
{
 
1422
  int c;
 
1423
 
 
1424
  c = rl_read_key ();
 
1425
  return (rl_insert (count, c));  
 
1426
}
 
1427
 
 
1428
/* Insert a tab character. */
 
1429
int
 
1430
rl_tab_insert (count, key)
 
1431
     int count, key;
 
1432
{
 
1433
  return (rl_insert (count, '\t'));
 
1434
}
 
1435
 
 
1436
/* What to do when a NEWLINE is pressed.  We accept the whole line.
 
1437
   KEY is the key that invoked this command.  I guess it could have
 
1438
   meaning in the future. */
 
1439
int
 
1440
rl_newline (count, key)
 
1441
     int count, key;
 
1442
{
 
1443
  rl_done = 1;
 
1444
 
 
1445
#if defined (VI_MODE)
 
1446
  if (rl_editing_mode == vi_mode)
 
1447
    {
 
1448
      _rl_vi_done_inserting ();
 
1449
      _rl_vi_reset_last ();
 
1450
    }
 
1451
#endif /* VI_MODE */
 
1452
 
 
1453
  /* If we've been asked to erase empty lines, suppress the final update,
 
1454
     since _rl_update_final calls crlf(). */
 
1455
  if (rl_erase_empty_line && rl_point == 0 && rl_end == 0)
 
1456
    return 0;
 
1457
 
 
1458
  if (readline_echoing_p)
 
1459
    _rl_update_final ();
 
1460
  return 0;
 
1461
}
 
1462
 
 
1463
/* What to do for some uppercase characters, like meta characters,
 
1464
   and some characters appearing in emacs_ctlx_keymap.  This function
 
1465
   is just a stub, you bind keys to it and the code in _rl_dispatch ()
 
1466
   is special cased. */
 
1467
int
 
1468
rl_do_lowercase_version (ignore1, ignore2)
 
1469
     int ignore1, ignore2;
 
1470
{
 
1471
  return 0;
 
1472
}
 
1473
 
 
1474
/* Rubout the character behind point. */
 
1475
int
 
1476
rl_rubout (count, key)
 
1477
     int count, key;
 
1478
{
 
1479
  if (count < 0)
 
1480
    {
 
1481
      rl_delete (-count, key);
 
1482
      return 0;
 
1483
    }
 
1484
 
 
1485
  if (!rl_point)
 
1486
    {
 
1487
      ding ();
 
1488
      return -1;
 
1489
    }
 
1490
 
 
1491
  if (count > 1 || rl_explicit_arg)
 
1492
    {
 
1493
      int orig_point = rl_point;
 
1494
      rl_backward (count, key);
 
1495
      rl_kill_text (orig_point, rl_point);
 
1496
    }
 
1497
  else
 
1498
    {
 
1499
      int c = the_line[--rl_point];
 
1500
      rl_delete_text (rl_point, rl_point + 1);
 
1501
 
 
1502
      if (rl_point == rl_end && isprint (c) && _rl_last_c_pos)
 
1503
        {
 
1504
          int l;
 
1505
          l = rl_character_len (c, rl_point);
 
1506
          _rl_erase_at_end_of_line (l);
 
1507
        }
 
1508
    }
 
1509
  return 0;
 
1510
}
 
1511
 
 
1512
/* Delete the character under the cursor.  Given a numeric argument,
 
1513
   kill that many characters instead. */
 
1514
int
 
1515
rl_delete (count, key)
 
1516
     int count, key;
 
1517
{
 
1518
  if (count < 0)
 
1519
    return (rl_rubout (-count, key));
 
1520
 
 
1521
  if (rl_point == rl_end)
 
1522
    {
 
1523
      ding ();
 
1524
      return -1;
 
1525
    }
 
1526
 
 
1527
  if (count > 1 || rl_explicit_arg)
 
1528
    {
 
1529
      int orig_point = rl_point;
 
1530
      rl_forward (count, key);
 
1531
      rl_kill_text (orig_point, rl_point);
 
1532
      rl_point = orig_point;
 
1533
      return 0;
 
1534
    }
 
1535
  else
 
1536
    return (rl_delete_text (rl_point, rl_point + 1));
 
1537
}
 
1538
 
 
1539
/* Delete the character under the cursor, unless the insertion
 
1540
   point is at the end of the line, in which case the character
 
1541
   behind the cursor is deleted.  COUNT is obeyed and may be used
 
1542
   to delete forward or backward that many characters. */      
 
1543
int
 
1544
rl_rubout_or_delete (count, key)
 
1545
     int count, key;
 
1546
{
 
1547
  if (rl_end != 0 && rl_point == rl_end)
 
1548
    return (rl_rubout (count, key));
 
1549
  else
 
1550
    return (rl_delete (count, key));
 
1551
}  
 
1552
 
 
1553
/* Delete all spaces and tabs around point. */
 
1554
int
 
1555
rl_delete_horizontal_space (count, ignore)
 
1556
     int count, ignore;
 
1557
{
 
1558
  int start = rl_point;
 
1559
 
 
1560
  while (rl_point && whitespace (the_line[rl_point - 1]))
 
1561
    rl_point--;
 
1562
 
 
1563
  start = rl_point;
 
1564
 
 
1565
  while (rl_point < rl_end && whitespace (the_line[rl_point]))
 
1566
    rl_point++;
 
1567
 
 
1568
  if (start != rl_point)
 
1569
    {
 
1570
      rl_delete_text (start, rl_point);
 
1571
      rl_point = start;
 
1572
    }
 
1573
  return 0;
 
1574
}
 
1575
 
 
1576
/* Like the tcsh editing function delete-char-or-list.  The eof character
 
1577
   is caught before this is invoked, so this really does the same thing as
 
1578
   delete-char-or-list-or-eof, as long as it's bound to the eof character. */
 
1579
int
 
1580
rl_delete_or_show_completions (count, key)
 
1581
     int count, key;
 
1582
{
 
1583
  if (rl_end != 0 && rl_point == rl_end)
 
1584
    return (rl_possible_completions (count, key));
 
1585
  else
 
1586
    return (rl_delete (count, key));
 
1587
}
 
1588
 
 
1589
#ifndef RL_COMMENT_BEGIN_DEFAULT
 
1590
#define RL_COMMENT_BEGIN_DEFAULT "#"
 
1591
#endif
 
1592
 
 
1593
/* Turn the current line into a comment in shell history.
 
1594
   A K*rn shell style function. */
 
1595
int
 
1596
rl_insert_comment (count, key)
 
1597
     int count, key;
 
1598
{
 
1599
  rl_beg_of_line (1, key);
 
1600
  rl_insert_text (_rl_comment_begin ? _rl_comment_begin
 
1601
                                    : RL_COMMENT_BEGIN_DEFAULT);
 
1602
  (*rl_redisplay_function) ();
 
1603
  rl_newline (1, '\n');
 
1604
  return (0);
 
1605
}
 
1606
 
 
1607
/* **************************************************************** */
 
1608
/*                                                                  */
 
1609
/*                      Changing Case                               */
 
1610
/*                                                                  */
 
1611
/* **************************************************************** */
 
1612
 
 
1613
/* The three kinds of things that we know how to do. */
 
1614
#define UpCase 1
 
1615
#define DownCase 2
 
1616
#define CapCase 3
 
1617
 
 
1618
static int rl_change_case ();
 
1619
 
 
1620
/* Uppercase the word at point. */
 
1621
int
 
1622
rl_upcase_word (count, key)
 
1623
     int count, key;
 
1624
{
 
1625
  return (rl_change_case (count, UpCase));
 
1626
}
 
1627
 
 
1628
/* Lowercase the word at point. */
 
1629
int
 
1630
rl_downcase_word (count, key)
 
1631
     int count, key;
 
1632
{
 
1633
  return (rl_change_case (count, DownCase));
 
1634
}
 
1635
 
 
1636
/* Upcase the first letter, downcase the rest. */
 
1637
int
 
1638
rl_capitalize_word (count, key)
 
1639
     int count, key;
 
1640
{
 
1641
 return (rl_change_case (count, CapCase));
 
1642
}
 
1643
 
 
1644
/* The meaty function.
 
1645
   Change the case of COUNT words, performing OP on them.
 
1646
   OP is one of UpCase, DownCase, or CapCase.
 
1647
   If a negative argument is given, leave point where it started,
 
1648
   otherwise, leave it where it moves to. */
 
1649
static int
 
1650
rl_change_case (count, op)
 
1651
     int count, op;
 
1652
{
 
1653
  register int start, end;
 
1654
  int inword, c;
 
1655
 
 
1656
  start = rl_point;
 
1657
  rl_forward_word (count, 0);
 
1658
  end = rl_point;
 
1659
 
 
1660
  if (count < 0)
 
1661
    SWAP (start, end);
 
1662
 
 
1663
  /* We are going to modify some text, so let's prepare to undo it. */
 
1664
  rl_modifying (start, end);
 
1665
 
 
1666
  for (inword = 0; start < end; start++)
 
1667
    {
 
1668
      c = the_line[start];
 
1669
      switch (op)
 
1670
        {
 
1671
        case UpCase:
 
1672
          the_line[start] = _rl_to_upper (c);
 
1673
          break;
 
1674
 
 
1675
        case DownCase:
 
1676
          the_line[start] = _rl_to_lower (c);
 
1677
          break;
 
1678
 
 
1679
        case CapCase:
 
1680
          the_line[start] = (inword == 0) ? _rl_to_upper (c) : _rl_to_lower (c);
 
1681
          inword = alphabetic (the_line[start]);
 
1682
          break;
 
1683
 
 
1684
        default:
 
1685
          ding ();
 
1686
          return -1;
 
1687
        }
 
1688
    }
 
1689
  rl_point = end;
 
1690
  return 0;
 
1691
}
 
1692
 
 
1693
/* **************************************************************** */
 
1694
/*                                                                  */
 
1695
/*                      Transposition                               */
 
1696
/*                                                                  */
 
1697
/* **************************************************************** */
 
1698
 
 
1699
/* Transpose the words at point. */
 
1700
int
 
1701
rl_transpose_words (count, key)
 
1702
     int count, key;
 
1703
{
 
1704
  char *word1, *word2;
 
1705
  int w1_beg, w1_end, w2_beg, w2_end;
 
1706
  int orig_point = rl_point;
 
1707
 
 
1708
  if (!count)
 
1709
    return 0;
 
1710
 
 
1711
  /* Find the two words. */
 
1712
  rl_forward_word (count, key);
 
1713
  w2_end = rl_point;
 
1714
  rl_backward_word (1, key);
 
1715
  w2_beg = rl_point;
 
1716
  rl_backward_word (count, key);
 
1717
  w1_beg = rl_point;
 
1718
  rl_forward_word (1, key);
 
1719
  w1_end = rl_point;
 
1720
 
 
1721
  /* Do some check to make sure that there really are two words. */
 
1722
  if ((w1_beg == w2_beg) || (w2_beg < w1_end))
 
1723
    {
 
1724
      ding ();
 
1725
      rl_point = orig_point;
 
1726
      return -1;
 
1727
    }
 
1728
 
 
1729
  /* Get the text of the words. */
 
1730
  word1 = rl_copy_text (w1_beg, w1_end);
 
1731
  word2 = rl_copy_text (w2_beg, w2_end);
 
1732
 
 
1733
  /* We are about to do many insertions and deletions.  Remember them
 
1734
     as one operation. */
 
1735
  rl_begin_undo_group ();
 
1736
 
 
1737
  /* Do the stuff at word2 first, so that we don't have to worry
 
1738
     about word1 moving. */
 
1739
  rl_point = w2_beg;
 
1740
  rl_delete_text (w2_beg, w2_end);
 
1741
  rl_insert_text (word1);
 
1742
 
 
1743
  rl_point = w1_beg;
 
1744
  rl_delete_text (w1_beg, w1_end);
 
1745
  rl_insert_text (word2);
 
1746
 
 
1747
  /* This is exactly correct since the text before this point has not
 
1748
     changed in length. */
 
1749
  rl_point = w2_end;
 
1750
 
 
1751
  /* I think that does it. */
 
1752
  rl_end_undo_group ();
 
1753
  free (word1);
 
1754
  free (word2);
 
1755
 
 
1756
  return 0;
 
1757
}
 
1758
 
 
1759
/* Transpose the characters at point.  If point is at the end of the line,
 
1760
   then transpose the characters before point. */
 
1761
int
 
1762
rl_transpose_chars (count, key)
 
1763
     int count, key;
 
1764
{
 
1765
  char dummy[2];
 
1766
 
 
1767
  if (!count)
 
1768
    return 0;
 
1769
 
 
1770
  if (!rl_point || rl_end < 2)
 
1771
    {
 
1772
      ding ();
 
1773
      return -1;
 
1774
    }
 
1775
 
 
1776
  rl_begin_undo_group ();
 
1777
 
 
1778
  if (rl_point == rl_end)
 
1779
    {
 
1780
      --rl_point;
 
1781
      count = 1;
 
1782
    }
 
1783
  rl_point--;
 
1784
 
 
1785
  dummy[0] = the_line[rl_point];
 
1786
  dummy[1] = '\0';
 
1787
 
 
1788
  rl_delete_text (rl_point, rl_point + 1);
 
1789
 
 
1790
  rl_point += count;
 
1791
  _rl_fix_point (0);
 
1792
  rl_insert_text (dummy);
 
1793
 
 
1794
  rl_end_undo_group ();
 
1795
  return 0;
 
1796
}
 
1797
 
 
1798
/* **************************************************************** */
 
1799
/*                                                                  */
 
1800
/*                      Character Searching                         */
 
1801
/*                                                                  */
 
1802
/* **************************************************************** */
 
1803
 
 
1804
int
 
1805
_rl_char_search_internal (count, dir, schar)
 
1806
     int count, dir, schar;
 
1807
{
 
1808
  int pos, inc;
 
1809
 
 
1810
  pos = rl_point;
 
1811
  inc = (dir < 0) ? -1 : 1;
 
1812
  while (count)
 
1813
    {
 
1814
      if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end))
 
1815
        {
 
1816
          ding ();
 
1817
          return -1;
 
1818
        }
 
1819
 
 
1820
      pos += inc;
 
1821
      do
 
1822
        {
 
1823
          if (rl_line_buffer[pos] == schar)
 
1824
            {
 
1825
              count--;
 
1826
              if (dir < 0)
 
1827
                rl_point = (dir == BTO) ? pos + 1 : pos;
 
1828
              else
 
1829
                rl_point = (dir == FTO) ? pos - 1 : pos;
 
1830
              break;
 
1831
            }
 
1832
        }
 
1833
      while ((dir < 0) ? pos-- : ++pos < rl_end);
 
1834
    }
 
1835
  return (0);
 
1836
}
 
1837
 
 
1838
/* Search COUNT times for a character read from the current input stream.
 
1839
   FDIR is the direction to search if COUNT is non-negative; otherwise
 
1840
   the search goes in BDIR. */
 
1841
static int
 
1842
_rl_char_search (count, fdir, bdir)
 
1843
     int count, fdir, bdir;
 
1844
{
 
1845
  int c;
 
1846
 
 
1847
  c = rl_read_key ();
 
1848
  if (count < 0)
 
1849
    return (_rl_char_search_internal (-count, bdir, c));
 
1850
  else
 
1851
    return (_rl_char_search_internal (count, fdir, c));
 
1852
}
 
1853
 
 
1854
int
 
1855
rl_char_search (count, key)
 
1856
     int count, key;
 
1857
{
 
1858
  return (_rl_char_search (count, FFIND, BFIND));
 
1859
}
 
1860
 
 
1861
int
 
1862
rl_backward_char_search (count, key)
 
1863
     int count, key;
 
1864
{
 
1865
  return (_rl_char_search (count, BFIND, FFIND));
 
1866
}
 
1867
 
 
1868
/* **************************************************************** */
 
1869
/*                                                                  */
 
1870
/*                      History Utilities                           */
 
1871
/*                                                                  */
 
1872
/* **************************************************************** */
 
1873
 
 
1874
/* We already have a history library, and that is what we use to control
 
1875
   the history features of readline.  This is our local interface to
 
1876
   the history mechanism. */
 
1877
 
 
1878
/* While we are editing the history, this is the saved
 
1879
   version of the original line. */
 
1880
HIST_ENTRY *saved_line_for_history = (HIST_ENTRY *)NULL;
 
1881
 
 
1882
/* Set the history pointer back to the last entry in the history. */
 
1883
static void
 
1884
start_using_history ()
 
1885
{
 
1886
  using_history ();
 
1887
  if (saved_line_for_history)
 
1888
    _rl_free_history_entry (saved_line_for_history);
 
1889
 
 
1890
  saved_line_for_history = (HIST_ENTRY *)NULL;
 
1891
}
 
1892
 
 
1893
/* Free the contents (and containing structure) of a HIST_ENTRY. */
 
1894
void
 
1895
_rl_free_history_entry (entry)
 
1896
     HIST_ENTRY *entry;
 
1897
{
 
1898
  if (entry == 0)
 
1899
    return;
 
1900
  if (entry->line)
 
1901
    free (entry->line);
 
1902
  free (entry);
 
1903
}
 
1904
 
 
1905
/* Perhaps put back the current line if it has changed. */
 
1906
int
 
1907
maybe_replace_line ()
 
1908
{
 
1909
  HIST_ENTRY *temp;
 
1910
 
 
1911
  temp = current_history ();
 
1912
  /* If the current line has changed, save the changes. */
 
1913
  if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list))
 
1914
    {
 
1915
      temp = replace_history_entry (where_history (), the_line, (histdata_t)rl_undo_list);
 
1916
      free (temp->line);
 
1917
      free (temp);
 
1918
    }
 
1919
  return 0;
 
1920
}
 
1921
 
 
1922
/* Put back the saved_line_for_history if there is one. */
 
1923
int
 
1924
maybe_unsave_line ()
 
1925
{
 
1926
  int line_len;
 
1927
 
 
1928
  if (saved_line_for_history)
 
1929
    {
 
1930
      line_len = strlen (saved_line_for_history->line);
 
1931
 
 
1932
      if (line_len >= rl_line_buffer_len)
 
1933
        rl_extend_line_buffer (line_len);
 
1934
 
 
1935
      strcpy (the_line, saved_line_for_history->line);
 
1936
      rl_undo_list = (UNDO_LIST *)saved_line_for_history->data;
 
1937
      _rl_free_history_entry (saved_line_for_history);
 
1938
      saved_line_for_history = (HIST_ENTRY *)NULL;
 
1939
      rl_end = rl_point = strlen (the_line);
 
1940
    }
 
1941
  else
 
1942
    ding ();
 
1943
  return 0;
 
1944
}
 
1945
 
 
1946
/* Save the current line in saved_line_for_history. */
 
1947
int
 
1948
maybe_save_line ()
 
1949
{
 
1950
  if (saved_line_for_history == 0)
 
1951
    {
 
1952
      saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
 
1953
      saved_line_for_history->line = savestring (the_line);
 
1954
      saved_line_for_history->data = (char *)rl_undo_list;
 
1955
    }
 
1956
  return 0;
 
1957
}
 
1958
 
 
1959
/* **************************************************************** */
 
1960
/*                                                                  */
 
1961
/*                      History Commands                            */
 
1962
/*                                                                  */
 
1963
/* **************************************************************** */
 
1964
 
 
1965
/* Meta-< goes to the start of the history. */
 
1966
int
 
1967
rl_beginning_of_history (count, key)
 
1968
     int count, key;
 
1969
{
 
1970
  return (rl_get_previous_history (1 + where_history (), key));
 
1971
}
 
1972
 
 
1973
/* Meta-> goes to the end of the history.  (The current line). */
 
1974
int
 
1975
rl_end_of_history (count, key)
 
1976
     int count, key;
 
1977
{
 
1978
  maybe_replace_line ();
 
1979
  using_history ();
 
1980
  maybe_unsave_line ();
 
1981
  return 0;
 
1982
}
 
1983
 
 
1984
/* Move down to the next history line. */
 
1985
int
 
1986
rl_get_next_history (count, key)
 
1987
     int count, key;
 
1988
{
 
1989
  HIST_ENTRY *temp;
 
1990
  int line_len;
 
1991
 
 
1992
  if (count < 0)
 
1993
    return (rl_get_previous_history (-count, key));
 
1994
 
 
1995
  if (count == 0)
 
1996
    return 0;
 
1997
 
 
1998
  maybe_replace_line ();
 
1999
 
 
2000
  temp = (HIST_ENTRY *)NULL;
 
2001
  while (count)
 
2002
    {
 
2003
      temp = next_history ();
 
2004
      if (!temp)
 
2005
        break;
 
2006
      --count;
 
2007
    }
 
2008
 
 
2009
  if (temp == 0)
 
2010
    maybe_unsave_line ();
 
2011
  else
 
2012
    {
 
2013
      line_len = strlen (temp->line);
 
2014
 
 
2015
      if (line_len >= rl_line_buffer_len)
 
2016
        rl_extend_line_buffer (line_len);
 
2017
 
 
2018
      strcpy (the_line, temp->line);
 
2019
      rl_undo_list = (UNDO_LIST *)temp->data;
 
2020
      rl_end = rl_point = strlen (the_line);
 
2021
#if defined (VI_MODE)
 
2022
      if (rl_editing_mode == vi_mode)
 
2023
        rl_point = 0;
 
2024
#endif /* VI_MODE */
 
2025
    }
 
2026
  return 0;
 
2027
}
 
2028
 
 
2029
/* Get the previous item out of our interactive history, making it the current
 
2030
   line.  If there is no previous history, just ding. */
 
2031
int
 
2032
rl_get_previous_history (count, key)
 
2033
     int count, key;
 
2034
{
 
2035
  HIST_ENTRY *old_temp, *temp;
 
2036
  int line_len;
 
2037
 
 
2038
  if (count < 0)
 
2039
    return (rl_get_next_history (-count, key));
 
2040
 
 
2041
  if (count == 0)
 
2042
    return 0;
 
2043
 
 
2044
  /* If we don't have a line saved, then save this one. */
 
2045
  maybe_save_line ();
 
2046
 
 
2047
  /* If the current line has changed, save the changes. */
 
2048
  maybe_replace_line ();
 
2049
 
 
2050
  temp = old_temp = (HIST_ENTRY *)NULL;
 
2051
  while (count)
 
2052
    {
 
2053
      temp = previous_history ();
 
2054
      if (temp == 0)
 
2055
        break;
 
2056
 
 
2057
      old_temp = temp;
 
2058
      --count;
 
2059
    }
 
2060
 
 
2061
  /* If there was a large argument, and we moved back to the start of the
 
2062
     history, that is not an error.  So use the last value found. */
 
2063
  if (!temp && old_temp)
 
2064
    temp = old_temp;
 
2065
 
 
2066
  if (temp == 0)
 
2067
    ding ();
 
2068
  else
 
2069
    {
 
2070
      line_len = strlen (temp->line);
 
2071
 
 
2072
      if (line_len >= rl_line_buffer_len)
 
2073
        rl_extend_line_buffer (line_len);
 
2074
 
 
2075
      strcpy (the_line, temp->line);
 
2076
      rl_undo_list = (UNDO_LIST *)temp->data;
 
2077
      rl_end = rl_point = line_len;
 
2078
 
 
2079
#if defined (VI_MODE)
 
2080
      if (rl_editing_mode == vi_mode)
 
2081
        rl_point = 0;
 
2082
#endif /* VI_MODE */
 
2083
    }
 
2084
  return 0;
 
2085
}
 
2086
 
 
2087
/* **************************************************************** */
 
2088
/*                                                                  */
 
2089
/*                 The Mark and the Region.                         */
 
2090
/*                                                                  */
 
2091
/* **************************************************************** */
 
2092
 
 
2093
/* Set the mark at POSITION. */
 
2094
int
 
2095
_rl_set_mark_at_pos (position)
 
2096
     int position;
 
2097
{
 
2098
  if (position > rl_end)
 
2099
    return -1;
 
2100
 
 
2101
  rl_mark = position;
 
2102
  return 0;
 
2103
}
 
2104
 
 
2105
/* A bindable command to set the mark. */
 
2106
int
 
2107
rl_set_mark (count, key)
 
2108
     int count, key;
 
2109
{
 
2110
  return (_rl_set_mark_at_pos (rl_explicit_arg ? count : rl_point));
 
2111
}
 
2112
 
 
2113
/* Exchange the position of mark and point. */
 
2114
int
 
2115
rl_exchange_point_and_mark (count, key)
 
2116
     int count, key;
 
2117
{
 
2118
  if (rl_mark > rl_end)
 
2119
    rl_mark = -1;
 
2120
 
 
2121
  if (rl_mark == -1)
 
2122
    {
 
2123
      ding ();
 
2124
      return -1;
 
2125
    }
 
2126
  else
 
2127
    SWAP (rl_point, rl_mark);
 
2128
 
 
2129
  return 0;
 
2130
}
 
2131
 
 
2132
/* **************************************************************** */
 
2133
/*                                                                  */
 
2134
/*                          Editing Modes                           */
 
2135
/*                                                                  */
 
2136
/* **************************************************************** */
 
2137
/* How to toggle back and forth between editing modes. */
 
2138
int
 
2139
rl_vi_editing_mode (count, key)
 
2140
     int count, key;
 
2141
{
 
2142
#if defined (VI_MODE)
 
2143
  rl_editing_mode = vi_mode;
 
2144
  rl_vi_insertion_mode (1, key);
 
2145
#endif /* VI_MODE */
 
2146
  return 0;
 
2147
}
 
2148
 
 
2149
int
 
2150
rl_emacs_editing_mode (count, key)
 
2151
     int count, key;
 
2152
{
 
2153
  rl_editing_mode = emacs_mode;
 
2154
  _rl_keymap = emacs_standard_keymap;
 
2155
  return 0;
 
2156
}