Revert accidental commit.
[deliverable/binutils-gdb.git] / readline / parens.c
CommitLineData
cc88a640 1/* parens.c -- implementation of matching parentheses feature. */
d60d9f65 2
cc88a640 3/* Copyright (C) 1987, 1989, 1992-2009 Free Software Foundation, Inc.
d60d9f65 4
cc88a640
JK
5 This file is part of the GNU Readline Library (Readline), a library
6 for reading lines of text with interactive input and history editing.
d60d9f65 7
cc88a640
JK
8 Readline is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
d60d9f65
SS
11 (at your option) any later version.
12
cc88a640
JK
13 Readline is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d60d9f65
SS
16 GNU General Public License for more details.
17
cc88a640
JK
18 You should have received a copy of the GNU General Public License
19 along with Readline. If not, see <http://www.gnu.org/licenses/>.
20*/
21
d60d9f65
SS
22#define READLINE_LIBRARY
23
5bdf8622
DJ
24#if defined (__TANDEM)
25# include <floss.h>
26#endif
27
d60d9f65
SS
28#include "rlconf.h"
29
d60d9f65
SS
30#if defined (HAVE_CONFIG_H)
31# include <config.h>
32#endif
33
34#include <stdio.h>
35#include <sys/types.h>
36
9255ee31
EZ
37#if defined (HAVE_UNISTD_H)
38# include <unistd.h>
39#endif
40
cc88a640 41#include "posixselect.h"
d60d9f65
SS
42
43#if defined (HAVE_STRING_H)
44# include <string.h>
45#else /* !HAVE_STRING_H */
46# include <strings.h>
47#endif /* !HAVE_STRING_H */
48
49#if !defined (strchr) && !defined (__STDC__)
50extern char *strchr (), *strrchr ();
51#endif /* !strchr && !__STDC__ */
52
53#include "readline.h"
1b17e766 54#include "rlprivate.h"
d60d9f65 55
9255ee31 56static int find_matching_open PARAMS((char *, int, int));
d60d9f65
SS
57
58/* Non-zero means try to blink the matching open parenthesis when the
59 close parenthesis is inserted. */
5836a818
PP
60#if defined (HAVE_SELECT)
61int rl_blink_matching_paren = 1;
62#else /* !HAVE_SELECT */
d60d9f65 63int rl_blink_matching_paren = 0;
5836a818 64#endif /* !HAVE_SELECT */
d60d9f65 65
9255ee31
EZ
66static int _paren_blink_usec = 500000;
67
1b17e766
EZ
68/* Change emacs_standard_keymap to have bindings for paren matching when
69 ON_OR_OFF is 1, change them back to self_insert when ON_OR_OFF == 0. */
70void
71_rl_enable_paren_matching (on_or_off)
72 int on_or_off;
73{
74 if (on_or_off)
5836a818 75 { /* ([{ */
1b17e766
EZ
76 rl_bind_key_in_map (')', rl_insert_close, emacs_standard_keymap);
77 rl_bind_key_in_map (']', rl_insert_close, emacs_standard_keymap);
78 rl_bind_key_in_map ('}', rl_insert_close, emacs_standard_keymap);
79 }
80 else
5836a818 81 { /* ([{ */
1b17e766
EZ
82 rl_bind_key_in_map (')', rl_insert, emacs_standard_keymap);
83 rl_bind_key_in_map (']', rl_insert, emacs_standard_keymap);
84 rl_bind_key_in_map ('}', rl_insert, emacs_standard_keymap);
85 }
86}
d60d9f65 87
9255ee31
EZ
88int
89rl_set_paren_blink_timeout (u)
90 int u;
91{
92 int o;
93
94 o = _paren_blink_usec;
95 if (u > 0)
96 _paren_blink_usec = u;
97 return (o);
98}
99
d60d9f65
SS
100int
101rl_insert_close (count, invoking_key)
102 int count, invoking_key;
103{
104 if (rl_explicit_arg || !rl_blink_matching_paren)
9255ee31 105 _rl_insert_char (count, invoking_key);
d60d9f65
SS
106 else
107 {
108#if defined (HAVE_SELECT)
109 int orig_point, match_point, ready;
110 struct timeval timer;
111 fd_set readfds;
112
9255ee31 113 _rl_insert_char (1, invoking_key);
d60d9f65
SS
114 (*rl_redisplay_function) ();
115 match_point =
116 find_matching_open (rl_line_buffer, rl_point - 2, invoking_key);
117
118 /* Emacs might message or ring the bell here, but I don't. */
119 if (match_point < 0)
5836a818 120 return -1;
d60d9f65
SS
121
122 FD_ZERO (&readfds);
123 FD_SET (fileno (rl_instream), &readfds);
cc88a640 124 USEC_TO_TIMEVAL (_paren_blink_usec, timer);
d60d9f65
SS
125
126 orig_point = rl_point;
127 rl_point = match_point;
128 (*rl_redisplay_function) ();
129 ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
130 rl_point = orig_point;
131#else /* !HAVE_SELECT */
9255ee31 132 _rl_insert_char (count, invoking_key);
d60d9f65
SS
133#endif /* !HAVE_SELECT */
134 }
135 return 0;
136}
137
138static int
139find_matching_open (string, from, closer)
140 char *string;
141 int from, closer;
142{
143 register int i;
144 int opener, level, delimiter;
145
146 switch (closer)
147 {
148 case ']': opener = '['; break;
149 case '}': opener = '{'; break;
150 case ')': opener = '('; break;
151 default:
152 return (-1);
153 }
154
155 level = 1; /* The closer passed in counts as 1. */
156 delimiter = 0; /* Delimited state unknown. */
157
158 for (i = from; i > -1; i--)
159 {
160 if (delimiter && (string[i] == delimiter))
161 delimiter = 0;
162 else if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, string[i]))
163 delimiter = string[i];
164 else if (!delimiter && (string[i] == closer))
165 level++;
166 else if (!delimiter && (string[i] == opener))
167 level--;
168
169 if (!level)
170 break;
171 }
172 return (i);
173}
This page took 0.683444 seconds and 4 git commands to generate.