]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - readline/util.c
import gdb-1999-08-02 snapshot
[thirdparty/binutils-gdb.git] / readline / util.c
CommitLineData
d60d9f65
SS
1/* util.c -- readline utility functions */
2
3/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
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
10 as published by the Free Software Foundation; either version 1, or
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,
21 675 Mass Ave, Cambridge, MA 02139, USA. */
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"
47
48#if defined (TIOCSTAT_IN_SYS_IOCTL)
49# include <sys/ioctl.h>
50#endif /* TIOCSTAT_IN_SYS_IOCTL */
51
52/* Some standard library routines. */
53#include "readline.h"
54
55#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
56
57/* Pseudo-globals imported from readline.c */
58extern int readline_echoing_p;
59extern procenv_t readline_top_level;
60extern int rl_line_buffer_len;
61extern Function *rl_last_func;
62
63extern int _rl_defining_kbd_macro;
64extern char *_rl_executing_macro;
65
66/* Pseudo-global functions imported from other library files. */
c862e87b 67extern void _rl_replace_text ();
d60d9f65
SS
68extern void _rl_pop_executing_macro ();
69extern void _rl_set_the_line ();
70extern void _rl_init_argument ();
71
72extern char *xmalloc (), *xrealloc ();
73
74/* **************************************************************** */
75/* */
76/* Utility Functions */
77/* */
78/* **************************************************************** */
79
80/* Return 0 if C is not a member of the class of characters that belong
81 in words, or 1 if it is. */
82
83int _rl_allow_pathname_alphabetic_chars = 0;
84static char *pathname_alphabetic_chars = "/-_=~.#$";
85
86int
87alphabetic (c)
88 int c;
89{
90 if (ALPHABETIC (c))
91 return (1);
92
93 return (_rl_allow_pathname_alphabetic_chars &&
94 strchr (pathname_alphabetic_chars, c) != NULL);
95}
96
97/* How to abort things. */
98int
99_rl_abort_internal ()
100{
101 ding ();
102 rl_clear_message ();
103 _rl_init_argument ();
104 rl_pending_input = 0;
105
106 _rl_defining_kbd_macro = 0;
107 while (_rl_executing_macro)
108 _rl_pop_executing_macro ();
109
110 rl_last_func = (Function *)NULL;
111 longjmp (readline_top_level, 1);
112 return (0);
113}
114
115int
116rl_abort (count, key)
117 int count, key;
118{
119 return (_rl_abort_internal ());
120}
121
122int
123rl_tty_status (count, key)
124 int count, key;
125{
126#if defined (TIOCSTAT)
127 ioctl (1, TIOCSTAT, (char *)0);
c862e87b 128 rl_refresh_line (count, key);
d60d9f65
SS
129#else
130 ding ();
131#endif
132 return 0;
133}
134
135/* Return a copy of the string between FROM and TO.
136 FROM is inclusive, TO is not. */
137char *
138rl_copy_text (from, to)
139 int from, to;
140{
141 register int length;
142 char *copy;
143
144 /* Fix it if the caller is confused. */
145 if (from > to)
146 SWAP (from, to);
147
148 length = to - from;
149 copy = xmalloc (1 + length);
150 strncpy (copy, rl_line_buffer + from, length);
151 copy[length] = '\0';
152 return (copy);
153}
154
155/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
156 LEN characters. */
157void
158rl_extend_line_buffer (len)
159 int len;
160{
161 while (len >= rl_line_buffer_len)
162 {
163 rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
164 rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len);
165 }
166
167 _rl_set_the_line ();
168}
169
170
171/* A function for simple tilde expansion. */
172int
173rl_tilde_expand (ignore, key)
174 int ignore, key;
175{
176 register int start, end;
177 char *homedir, *temp;
178 int len;
179
180 end = rl_point;
181 start = end - 1;
182
183 if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
184 {
185 homedir = tilde_expand ("~");
186 _rl_replace_text (homedir, start, end);
187 return (0);
188 }
189 else if (rl_line_buffer[start] != '~')
190 {
191 for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
192 ;
193 start++;
194 }
195
196 end = start;
197 do
198 end++;
199 while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
200
201 if (whitespace (rl_line_buffer[end]) || end >= rl_end)
202 end--;
203
204 /* If the first character of the current word is a tilde, perform
205 tilde expansion and insert the result. If not a tilde, do
206 nothing. */
207 if (rl_line_buffer[start] == '~')
208 {
209 len = end - start + 1;
210 temp = xmalloc (len + 1);
211 strncpy (temp, rl_line_buffer + start, len);
212 temp[len] = '\0';
213 homedir = tilde_expand (temp);
214 free (temp);
215
216 _rl_replace_text (homedir, start, end);
217 }
218
219 return (0);
220}
221
222/* **************************************************************** */
223/* */
224/* String Utility Functions */
225/* */
226/* **************************************************************** */
227
228/* Determine if s2 occurs in s1. If so, return a pointer to the
229 match in s1. The compare is case insensitive. */
230char *
231_rl_strindex (s1, s2)
232 register char *s1, *s2;
233{
234 register int i, l, len;
235
236 for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
237 if (_rl_strnicmp (s1 + i, s2, l) == 0)
238 return (s1 + i);
239 return ((char *)NULL);
240}
241
242#if !defined (HAVE_STRCASECMP)
243/* Compare at most COUNT characters from string1 to string2. Case
244 doesn't matter. */
245int
246_rl_strnicmp (string1, string2, count)
247 char *string1, *string2;
248 int count;
249{
250 register char ch1, ch2;
251
252 while (count)
253 {
254 ch1 = *string1++;
255 ch2 = *string2++;
256 if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
257 count--;
258 else
259 break;
260 }
261 return (count);
262}
263
264/* strcmp (), but caseless. */
265int
266_rl_stricmp (string1, string2)
267 char *string1, *string2;
268{
269 register char ch1, ch2;
270
271 while (*string1 && *string2)
272 {
273 ch1 = *string1++;
274 ch2 = *string2++;
275 if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
276 return (1);
277 }
278 return (*string1 - *string2);
279}
280#endif /* !HAVE_STRCASECMP */
281
282/* Stupid comparison routine for qsort () ing strings. */
283int
284_rl_qsort_string_compare (s1, s2)
285 char **s1, **s2;
286{
287#if defined (HAVE_STRCOLL)
288 return (strcoll (*s1, *s2));
289#else
290 int result;
291
292 result = **s1 - **s2;
293 if (result == 0)
294 result = strcmp (*s1, *s2);
295
296 return result;
297#endif
298}
299
300/* Function equivalents for the macros defined in chartypes.h. */
301#undef _rl_uppercase_p
302int
303_rl_uppercase_p (c)
304 int c;
305{
306 return (isupper (c));
307}
308
309#undef _rl_lowercase_p
310int
311_rl_lowercase_p (c)
312 int c;
313{
314 return (islower (c));
315}
316
317#undef _rl_pure_alphabetic
318int
319_rl_pure_alphabetic (c)
320 int c;
321{
322 return (isupper (c) || islower (c));
323}
324
325#undef _rl_digit_p
326int
327_rl_digit_p (c)
328 int c;
329{
330 return (isdigit (c));
331}
332
333#undef _rl_to_lower
334int
335_rl_to_lower (c)
336 int c;
337{
338 return (isupper (c) ? tolower (c) : c);
339}
340
341#undef _rl_to_upper
342int
343_rl_to_upper (c)
344 int c;
345{
346 return (islower (c) ? toupper (c) : c);
347}
348
349#undef _rl_digit_value
350int
351_rl_digit_value (c)
352 int c;
353{
354 return (isdigit (c) ? c - '0' : c);
355}
356
357/* Backwards compatibility, now that savestring has been removed from
358 all `public' readline header files. */
359#undef _rl_savestring
360char *
361_rl_savestring (s)
362 char *s;
363{
364 return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));
365}