]> git.ipfire.org Git - thirdparty/bash.git/blame - lib/readline/util.c
Imported from ../bash-2.01.tar.gz.
[thirdparty/bash.git] / lib / readline / util.c
CommitLineData
ccc6cda3
JA
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
ccc6cda3
JA
28#include <sys/types.h>
29#include <fcntl.h>
d166f048 30#include "posixjmp.h"
ccc6cda3
JA
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
d166f048
JA
42#include <stdio.h>
43#include <ctype.h>
44
ccc6cda3
JA
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;
d166f048 59extern procenv_t readline_top_level;
ccc6cda3
JA
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. */
67extern void _rl_pop_executing_macro ();
68extern void _rl_set_the_line ();
69extern void _rl_init_argument ();
70
71extern char *xmalloc (), *xrealloc ();
72
73/* **************************************************************** */
74/* */
75/* Utility Functions */
76/* */
77/* **************************************************************** */
78
79/* Return 0 if C is not a member of the class of characters that belong
80 in words, or 1 if it is. */
81
82int _rl_allow_pathname_alphabetic_chars = 0;
83static char *pathname_alphabetic_chars = "/-_=~.#$";
84
85int
86alphabetic (c)
87 int c;
88{
89 if (ALPHABETIC (c))
90 return (1);
91
92 return (_rl_allow_pathname_alphabetic_chars &&
93 strchr (pathname_alphabetic_chars, c) != NULL);
94}
95
96/* How to abort things. */
97int
98_rl_abort_internal ()
99{
100 ding ();
101 rl_clear_message ();
102 _rl_init_argument ();
103 rl_pending_input = 0;
104
105 _rl_defining_kbd_macro = 0;
106 while (_rl_executing_macro)
107 _rl_pop_executing_macro ();
108
109 rl_last_func = (Function *)NULL;
110 longjmp (readline_top_level, 1);
111 return (0);
112}
113
114int
115rl_abort (count, key)
116 int count, key;
117{
118 return (_rl_abort_internal ());
119}
120
121int
122rl_tty_status (count, key)
123 int count, key;
124{
125#if defined (TIOCSTAT)
126 ioctl (1, TIOCSTAT, (char *)0);
127 rl_refresh_line ();
128#else
129 ding ();
130#endif
131 return 0;
132}
133
134/* Return a copy of the string between FROM and TO.
135 FROM is inclusive, TO is not. */
136char *
137rl_copy_text (from, to)
138 int from, to;
139{
140 register int length;
141 char *copy;
142
143 /* Fix it if the caller is confused. */
144 if (from > to)
145 SWAP (from, to);
146
147 length = to - from;
148 copy = xmalloc (1 + length);
149 strncpy (copy, rl_line_buffer + from, length);
150 copy[length] = '\0';
151 return (copy);
152}
153
154/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
155 LEN characters. */
156void
157rl_extend_line_buffer (len)
158 int len;
159{
160 while (len >= rl_line_buffer_len)
161 {
162 rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
163 rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len);
164 }
165
166 _rl_set_the_line ();
167}
168
169/* **************************************************************** */
170/* */
171/* String Utility Functions */
172/* */
173/* **************************************************************** */
174
175/* Determine if s2 occurs in s1. If so, return a pointer to the
176 match in s1. The compare is case insensitive. */
177char *
178_rl_strindex (s1, s2)
179 register char *s1, *s2;
180{
181 register int i, l, len;
182
183 for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
184 if (_rl_strnicmp (s1 + i, s2, l) == 0)
185 return (s1 + i);
186 return ((char *)NULL);
187}
188
189#if !defined (HAVE_STRCASECMP)
190/* Compare at most COUNT characters from string1 to string2. Case
191 doesn't matter. */
192int
193_rl_strnicmp (string1, string2, count)
194 char *string1, *string2;
195 int count;
196{
197 register char ch1, ch2;
198
199 while (count)
200 {
201 ch1 = *string1++;
202 ch2 = *string2++;
203 if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
204 count--;
205 else
206 break;
207 }
208 return (count);
209}
210
211/* strcmp (), but caseless. */
212int
213_rl_stricmp (string1, string2)
214 char *string1, *string2;
215{
216 register char ch1, ch2;
217
218 while (*string1 && *string2)
219 {
220 ch1 = *string1++;
221 ch2 = *string2++;
222 if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
223 return (1);
224 }
225 return (*string1 - *string2);
226}
227#endif /* !HAVE_STRCASECMP */
228
229/* Stupid comparison routine for qsort () ing strings. */
230int
231_rl_qsort_string_compare (s1, s2)
232 char **s1, **s2;
233{
234#if defined (HAVE_STRCOLL)
235 return (strcoll (*s1, *s2));
236#else
237 int result;
238
239 result = **s1 - **s2;
240 if (result == 0)
241 result = strcmp (*s1, *s2);
242
243 return result;
244#endif
245}
246
ccc6cda3
JA
247/* Function equivalents for the macros defined in chartypes.h. */
248#undef _rl_uppercase_p
249int
250_rl_uppercase_p (c)
251 int c;
252{
253 return (isupper (c));
254}
255
256#undef _rl_lowercase_p
257int
258_rl_lowercase_p (c)
259 int c;
260{
261 return (islower (c));
262}
263
264#undef _rl_pure_alphabetic
265int
266_rl_pure_alphabetic (c)
267 int c;
268{
269 return (isupper (c) || islower (c));
270}
271
272#undef _rl_digit_p
273int
274_rl_digit_p (c)
275 int c;
276{
277 return (isdigit (c));
278}
279
280#undef _rl_to_lower
281int
282_rl_to_lower (c)
283 int c;
284{
285 return (isupper (c) ? tolower (c) : c);
286}
287
288#undef _rl_to_upper
289int
290_rl_to_upper (c)
291 int c;
292{
293 return (islower (c) ? toupper (c) : c);
294}
295
296#undef _rl_digit_value
297int
298_rl_digit_value (c)
299 int c;
300{
301 return (isdigit (c) ? c - '0' : c);
302}