Readline 5.1 import for HEAD.
[deliverable/binutils-gdb.git] / readline / util.c
CommitLineData
d60d9f65
SS
1/* util.c -- readline utility functions */
2
5bdf8622 3/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
d60d9f65
SS
4
5 This file is part of the GNU Readline Library, a library for
6 reading lines of text with interactive input and history editing.
7
8 The GNU Readline Library is free software; you can redistribute it
9 and/or modify it under the terms of the GNU General Public License
1b17e766 10 as published by the Free Software Foundation; either version 2, or
d60d9f65
SS
11 (at your option) any later version.
12
13 The GNU Readline Library is distributed in the hope that it will be
14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
15 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 The GNU General Public License is often shipped with GNU software, and
19 is generally kept in a file called COPYING or LICENSE. If you do not
20 have a copy of the license, write to the Free Software Foundation,
1b17e766 21 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
d60d9f65
SS
22#define READLINE_LIBRARY
23
24#if defined (HAVE_CONFIG_H)
25# include <config.h>
26#endif
27
28#include <sys/types.h>
29#include <fcntl.h>
30#include "posixjmp.h"
31
32#if defined (HAVE_UNISTD_H)
33# include <unistd.h> /* for _POSIX_VERSION */
34#endif /* HAVE_UNISTD_H */
35
36#if defined (HAVE_STDLIB_H)
37# include <stdlib.h>
38#else
39# include "ansi_stdlib.h"
40#endif /* HAVE_STDLIB_H */
41
42#include <stdio.h>
43#include <ctype.h>
44
45/* System-specific feature definitions and include files. */
46#include "rldefs.h"
5bdf8622 47#include "rlmbutil.h"
d60d9f65
SS
48
49#if defined (TIOCSTAT_IN_SYS_IOCTL)
50# include <sys/ioctl.h>
51#endif /* TIOCSTAT_IN_SYS_IOCTL */
52
53/* Some standard library routines. */
54#include "readline.h"
55
1b17e766
EZ
56#include "rlprivate.h"
57#include "xmalloc.h"
d60d9f65 58
d60d9f65
SS
59/* **************************************************************** */
60/* */
61/* Utility Functions */
62/* */
63/* **************************************************************** */
64
65/* Return 0 if C is not a member of the class of characters that belong
66 in words, or 1 if it is. */
67
68int _rl_allow_pathname_alphabetic_chars = 0;
9255ee31 69static const char *pathname_alphabetic_chars = "/-_=~.#$";
d60d9f65
SS
70
71int
9255ee31 72rl_alphabetic (c)
d60d9f65
SS
73 int c;
74{
75 if (ALPHABETIC (c))
76 return (1);
77
78 return (_rl_allow_pathname_alphabetic_chars &&
79 strchr (pathname_alphabetic_chars, c) != NULL);
80}
81
5bdf8622
DJ
82#if defined (HANDLE_MULTIBYTE)
83int
84_rl_walphabetic (wc)
85 wchar_t wc;
86{
87 int c;
88
89 if (iswalnum (wc))
90 return (1);
91
92 c = wc & 0177;
93 return (_rl_allow_pathname_alphabetic_chars &&
94 strchr (pathname_alphabetic_chars, c) != NULL);
95}
96#endif
97
d60d9f65
SS
98/* How to abort things. */
99int
100_rl_abort_internal ()
101{
9255ee31 102 rl_ding ();
d60d9f65 103 rl_clear_message ();
5bdf8622 104 _rl_reset_argument ();
9255ee31 105 rl_clear_pending_input ();
d60d9f65 106
9255ee31
EZ
107 RL_UNSETSTATE (RL_STATE_MACRODEF);
108 while (rl_executing_macro)
d60d9f65
SS
109 _rl_pop_executing_macro ();
110
9255ee31 111 rl_last_func = (rl_command_func_t *)NULL;
d60d9f65
SS
112 longjmp (readline_top_level, 1);
113 return (0);
114}
115
116int
117rl_abort (count, key)
118 int count, key;
119{
120 return (_rl_abort_internal ());
121}
122
123int
124rl_tty_status (count, key)
125 int count, key;
126{
127#if defined (TIOCSTAT)
128 ioctl (1, TIOCSTAT, (char *)0);
c862e87b 129 rl_refresh_line (count, key);
d60d9f65 130#else
9255ee31 131 rl_ding ();
d60d9f65
SS
132#endif
133 return 0;
134}
135
136/* Return a copy of the string between FROM and TO.
137 FROM is inclusive, TO is not. */
138char *
139rl_copy_text (from, to)
140 int from, to;
141{
142 register int length;
143 char *copy;
144
145 /* Fix it if the caller is confused. */
146 if (from > to)
147 SWAP (from, to);
148
149 length = to - from;
9255ee31 150 copy = (char *)xmalloc (1 + length);
d60d9f65
SS
151 strncpy (copy, rl_line_buffer + from, length);
152 copy[length] = '\0';
153 return (copy);
154}
155
156/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
157 LEN characters. */
158void
159rl_extend_line_buffer (len)
160 int len;
161{
162 while (len >= rl_line_buffer_len)
163 {
164 rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
9255ee31 165 rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len);
d60d9f65
SS
166 }
167
168 _rl_set_the_line ();
169}
170
171
172/* A function for simple tilde expansion. */
173int
174rl_tilde_expand (ignore, key)
175 int ignore, key;
176{
177 register int start, end;
178 char *homedir, *temp;
179 int len;
180
181 end = rl_point;
182 start = end - 1;
183
184 if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
185 {
186 homedir = tilde_expand ("~");
187 _rl_replace_text (homedir, start, end);
188 return (0);
189 }
190 else if (rl_line_buffer[start] != '~')
191 {
192 for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
193 ;
194 start++;
195 }
196
197 end = start;
198 do
199 end++;
200 while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
201
202 if (whitespace (rl_line_buffer[end]) || end >= rl_end)
203 end--;
204
205 /* If the first character of the current word is a tilde, perform
206 tilde expansion and insert the result. If not a tilde, do
207 nothing. */
208 if (rl_line_buffer[start] == '~')
209 {
210 len = end - start + 1;
9255ee31 211 temp = (char *)xmalloc (len + 1);
d60d9f65
SS
212 strncpy (temp, rl_line_buffer + start, len);
213 temp[len] = '\0';
214 homedir = tilde_expand (temp);
215 free (temp);
216
217 _rl_replace_text (homedir, start, end);
218 }
219
220 return (0);
221}
222
223/* **************************************************************** */
224/* */
225/* String Utility Functions */
226/* */
227/* **************************************************************** */
228
229/* Determine if s2 occurs in s1. If so, return a pointer to the
230 match in s1. The compare is case insensitive. */
231char *
232_rl_strindex (s1, s2)
9255ee31 233 register const char *s1, *s2;
d60d9f65
SS
234{
235 register int i, l, len;
236
237 for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
238 if (_rl_strnicmp (s1 + i, s2, l) == 0)
9255ee31 239 return ((char *) (s1 + i));
d60d9f65
SS
240 return ((char *)NULL);
241}
242
9255ee31
EZ
243#ifndef HAVE_STRPBRK
244/* Find the first occurrence in STRING1 of any character from STRING2.
245 Return a pointer to the character in STRING1. */
246char *
247_rl_strpbrk (string1, string2)
248 const char *string1, *string2;
249{
250 register const char *scan;
251#if defined (HANDLE_MULTIBYTE)
252 mbstate_t ps;
253 register int i, v;
254
255 memset (&ps, 0, sizeof (mbstate_t));
256#endif
257
258 for (; *string1; string1++)
259 {
260 for (scan = string2; *scan; scan++)
261 {
262 if (*string1 == *scan)
263 return ((char *)string1);
264 }
265#if defined (HANDLE_MULTIBYTE)
266 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
267 {
268 v = _rl_get_char_len (string1, &ps);
269 if (v > 1)
5bdf8622 270 string1 += v - 1; /* -1 to account for auto-increment in loop */
9255ee31
EZ
271 }
272#endif
273 }
274 return ((char *)NULL);
275}
276#endif
277
d60d9f65
SS
278#if !defined (HAVE_STRCASECMP)
279/* Compare at most COUNT characters from string1 to string2. Case
280 doesn't matter. */
281int
282_rl_strnicmp (string1, string2, count)
283 char *string1, *string2;
284 int count;
285{
286 register char ch1, ch2;
287
288 while (count)
289 {
290 ch1 = *string1++;
291 ch2 = *string2++;
292 if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
293 count--;
294 else
295 break;
296 }
297 return (count);
298}
299
300/* strcmp (), but caseless. */
301int
302_rl_stricmp (string1, string2)
303 char *string1, *string2;
304{
305 register char ch1, ch2;
306
307 while (*string1 && *string2)
308 {
309 ch1 = *string1++;
310 ch2 = *string2++;
311 if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
312 return (1);
313 }
314 return (*string1 - *string2);
315}
316#endif /* !HAVE_STRCASECMP */
317
318/* Stupid comparison routine for qsort () ing strings. */
319int
320_rl_qsort_string_compare (s1, s2)
321 char **s1, **s2;
322{
323#if defined (HAVE_STRCOLL)
324 return (strcoll (*s1, *s2));
325#else
326 int result;
327
328 result = **s1 - **s2;
329 if (result == 0)
330 result = strcmp (*s1, *s2);
331
332 return result;
333#endif
334}
335
9255ee31
EZ
336/* Function equivalents for the macros defined in chardefs.h. */
337#define FUNCTION_FOR_MACRO(f) int (f) (c) int c; { return f (c); }
d60d9f65 338
9255ee31
EZ
339FUNCTION_FOR_MACRO (_rl_digit_p)
340FUNCTION_FOR_MACRO (_rl_digit_value)
341FUNCTION_FOR_MACRO (_rl_lowercase_p)
342FUNCTION_FOR_MACRO (_rl_pure_alphabetic)
343FUNCTION_FOR_MACRO (_rl_to_lower)
344FUNCTION_FOR_MACRO (_rl_to_upper)
345FUNCTION_FOR_MACRO (_rl_uppercase_p)
d60d9f65
SS
346
347/* Backwards compatibility, now that savestring has been removed from
348 all `public' readline header files. */
349#undef _rl_savestring
350char *
351_rl_savestring (s)
9255ee31 352 const char *s;
d60d9f65 353{
9255ee31 354 return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s)));
d60d9f65 355}
This page took 0.300056 seconds and 4 git commands to generate.