1
/* util.c -- readline utility functions */
3
/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
5
This file is part of the GNU Readline Library, a library for
6
reading lines of text with interactive input and history editing.
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.
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.
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
24
#if defined (HAVE_CONFIG_H)
28
#include <sys/types.h>
32
#if defined (HAVE_UNISTD_H)
33
# include <unistd.h> /* for _POSIX_VERSION */
34
#endif /* HAVE_UNISTD_H */
36
#if defined (HAVE_STDLIB_H)
39
# include "ansi_stdlib.h"
40
#endif /* HAVE_STDLIB_H */
45
/* System-specific feature definitions and include files. */
48
#if defined (TIOCSTAT_IN_SYS_IOCTL)
49
# include <sys/ioctl.h>
50
#endif /* TIOCSTAT_IN_SYS_IOCTL */
52
/* Some standard library routines. */
55
#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
57
/* Pseudo-globals imported from readline.c */
58
extern int readline_echoing_p;
59
extern procenv_t readline_top_level;
60
extern int rl_line_buffer_len;
61
extern Function *rl_last_func;
63
extern int _rl_defining_kbd_macro;
64
extern char *_rl_executing_macro;
66
/* Pseudo-global functions imported from other library files. */
67
extern void _rl_replace_text ();
68
extern void _rl_pop_executing_macro ();
69
extern void _rl_set_the_line ();
70
extern void _rl_init_argument ();
72
extern char *xmalloc (), *xrealloc ();
74
/* **************************************************************** */
76
/* Utility Functions */
78
/* **************************************************************** */
80
/* Return 0 if C is not a member of the class of characters that belong
81
in words, or 1 if it is. */
83
int _rl_allow_pathname_alphabetic_chars = 0;
84
static char *pathname_alphabetic_chars = "/-_=~.#$";
93
return (_rl_allow_pathname_alphabetic_chars &&
94
strchr (pathname_alphabetic_chars, c) != NULL);
97
/* How to abort things. */
103
_rl_init_argument ();
104
rl_pending_input = 0;
106
_rl_defining_kbd_macro = 0;
107
while (_rl_executing_macro)
108
_rl_pop_executing_macro ();
110
rl_last_func = (Function *)NULL;
111
longjmp (readline_top_level, 1);
116
rl_abort (count, key)
119
return (_rl_abort_internal ());
123
rl_tty_status (count, key)
126
#if defined (TIOCSTAT)
127
ioctl (1, TIOCSTAT, (char *)0);
128
rl_refresh_line (count, key);
135
/* Return a copy of the string between FROM and TO.
136
FROM is inclusive, TO is not. */
138
rl_copy_text (from, to)
144
/* Fix it if the caller is confused. */
149
copy = xmalloc (1 + length);
150
strncpy (copy, rl_line_buffer + from, length);
155
/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
158
rl_extend_line_buffer (len)
161
while (len >= rl_line_buffer_len)
163
rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
164
rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len);
171
/* A function for simple tilde expansion. */
173
rl_tilde_expand (ignore, key)
176
register int start, end;
177
char *homedir, *temp;
183
if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
185
homedir = tilde_expand ("~");
186
_rl_replace_text (homedir, start, end);
189
else if (rl_line_buffer[start] != '~')
191
for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
199
while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
201
if (whitespace (rl_line_buffer[end]) || end >= rl_end)
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
207
if (rl_line_buffer[start] == '~')
209
len = end - start + 1;
210
temp = xmalloc (len + 1);
211
strncpy (temp, rl_line_buffer + start, len);
213
homedir = tilde_expand (temp);
216
_rl_replace_text (homedir, start, end);
222
/* **************************************************************** */
224
/* String Utility Functions */
226
/* **************************************************************** */
228
/* Determine if s2 occurs in s1. If so, return a pointer to the
229
match in s1. The compare is case insensitive. */
231
_rl_strindex (s1, s2)
232
register char *s1, *s2;
234
register int i, l, len;
236
for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
237
if (_rl_strnicmp (s1 + i, s2, l) == 0)
239
return ((char *)NULL);
242
#if !defined (HAVE_STRCASECMP)
243
/* Compare at most COUNT characters from string1 to string2. Case
246
_rl_strnicmp (string1, string2, count)
247
char *string1, *string2;
250
register char ch1, ch2;
256
if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
264
/* strcmp (), but caseless. */
266
_rl_stricmp (string1, string2)
267
char *string1, *string2;
269
register char ch1, ch2;
271
while (*string1 && *string2)
275
if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
278
return (*string1 - *string2);
280
#endif /* !HAVE_STRCASECMP */
282
/* Stupid comparison routine for qsort () ing strings. */
284
_rl_qsort_string_compare (s1, s2)
287
#if defined (HAVE_STRCOLL)
288
return (strcoll (*s1, *s2));
292
result = **s1 - **s2;
294
result = strcmp (*s1, *s2);
300
/* Function equivalents for the macros defined in chartypes.h. */
301
#undef _rl_uppercase_p
306
return (isupper (c));
309
#undef _rl_lowercase_p
314
return (islower (c));
317
#undef _rl_pure_alphabetic
319
_rl_pure_alphabetic (c)
322
return (isupper (c) || islower (c));
330
return (isdigit (c));
338
return (isupper (c) ? tolower (c) : c);
346
return (islower (c) ? toupper (c) : c);
349
#undef _rl_digit_value
354
return (isdigit (c) ? c - '0' : c);
357
/* Backwards compatibility, now that savestring has been removed from
358
all `public' readline header files. */
359
#undef _rl_savestring
364
return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));