2 /* util.c -- readline utility functions */
4 /* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
9 The GNU Readline Library is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2, or
12 (at your option) any later version.
14 The GNU Readline Library is distributed in the hope that it will be
15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
16 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 The GNU General Public License is often shipped with GNU software, and
20 is generally kept in a file called COPYING or LICENSE. If you do not
21 have a copy of the license, write to the Free Software Foundation,
22 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
23 #define READLINE_LIBRARY
25 #if defined (HAVE_CONFIG_H)
29 #include <sys/types.h>
33 #if defined (HAVE_UNISTD_H)
34 # include <unistd.h> /* for _POSIX_VERSION */
35 #endif /* HAVE_UNISTD_H */
37 #if defined (HAVE_STDLIB_H)
40 # include "ansi_stdlib.h"
41 #endif /* HAVE_STDLIB_H */
46 /* System-specific feature definitions and include files. */
49 #if defined (TIOCSTAT_IN_SYS_IOCTL)
50 # include <sys/ioctl.h>
51 #endif /* TIOCSTAT_IN_SYS_IOCTL */
53 /* Some standard library routines. */
56 #include "rlprivate.h"
59 /* **************************************************************** */
61 /* Utility Functions */
63 /* **************************************************************** */
65 /* Return 0 if C is not a member of the class of characters that belong
66 in words, or 1 if it is. */
68 int _rl_allow_pathname_alphabetic_chars = 0;
69 static const char *pathname_alphabetic_chars = "/-_=~.#$";
78 return (_rl_allow_pathname_alphabetic_chars &&
79 strchr (pathname_alphabetic_chars, c) != NULL);
82 /* How to abort things. */
89 rl_clear_pending_input ();
91 RL_UNSETSTATE (RL_STATE_MACRODEF);
92 while (rl_executing_macro)
93 _rl_pop_executing_macro ();
95 rl_last_func = (rl_command_func_t *)NULL;
96 longjmp (readline_top_level, 1);
101 rl_abort (count, key)
104 return (_rl_abort_internal ());
108 rl_tty_status (count, key)
111 #if defined (TIOCSTAT)
112 ioctl (1, TIOCSTAT, (char *)0);
113 rl_refresh_line (count, key);
120 /* Return a copy of the string between FROM and TO.
121 FROM is inclusive, TO is not. */
123 rl_copy_text (from, to)
129 /* Fix it if the caller is confused. */
134 copy = (char *)xmalloc (1 + length);
135 strncpy (copy, rl_line_buffer + from, length);
140 /* Increase the size of RL_LINE_BUFFER until it has enough space to hold
143 rl_extend_line_buffer (len)
146 while (len >= rl_line_buffer_len)
148 rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
149 rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len);
156 /* A function for simple tilde expansion. */
158 rl_tilde_expand (ignore, key)
161 register int start, end;
162 char *homedir, *temp;
168 if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
170 homedir = tilde_expand ("~");
171 _rl_replace_text (homedir, start, end);
174 else if (rl_line_buffer[start] != '~')
176 for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
184 while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
186 if (whitespace (rl_line_buffer[end]) || end >= rl_end)
189 /* If the first character of the current word is a tilde, perform
190 tilde expansion and insert the result. If not a tilde, do
192 if (rl_line_buffer[start] == '~')
194 len = end - start + 1;
195 temp = (char *)xmalloc (len + 1);
196 strncpy (temp, rl_line_buffer + start, len);
198 homedir = tilde_expand (temp);
201 _rl_replace_text (homedir, start, end);
207 /* **************************************************************** */
209 /* String Utility Functions */
211 /* **************************************************************** */
213 /* Determine if s2 occurs in s1. If so, return a pointer to the
214 match in s1. The compare is case insensitive. */
216 _rl_strindex (s1, s2)
217 register const char *s1, *s2;
219 register int i, l, len;
221 for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
222 if (_rl_strnicmp (s1 + i, s2, l) == 0)
223 return ((char *) (s1 + i));
224 return ((char *)NULL);
228 /* Find the first occurrence in STRING1 of any character from STRING2.
229 Return a pointer to the character in STRING1. */
231 _rl_strpbrk (string1, string2)
232 const char *string1, *string2;
234 register const char *scan;
235 #if defined (HANDLE_MULTIBYTE)
239 memset (&ps, 0, sizeof (mbstate_t));
243 return ((char *)NULL);
245 for (; *string1; string1++)
247 for (scan = string2; *scan; scan++)
249 if (*string1 == *scan)
250 return ((char *)string1);
252 #if defined (HANDLE_MULTIBYTE)
253 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
255 v = _rl_get_char_len (string1, &ps);
257 string += v - 1; /* -1 to account for auto-increment in loop */
261 return ((char *)NULL);
265 #if !defined (HAVE_STRCASECMP)
266 /* Compare at most COUNT characters from string1 to string2. Case
269 _rl_strnicmp (string1, string2, count)
270 char *string1, *string2;
273 register char ch1, ch2;
279 if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
287 /* strcmp (), but caseless. */
289 _rl_stricmp (string1, string2)
290 char *string1, *string2;
292 register char ch1, ch2;
294 while (*string1 && *string2)
298 if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
301 return (*string1 - *string2);
303 #endif /* !HAVE_STRCASECMP */
305 /* Stupid comparison routine for qsort () ing strings. */
307 _rl_qsort_string_compare (s1, s2)
310 #if defined (HAVE_STRCOLL)
311 return (strcoll (*s1, *s2));
315 result = **s1 - **s2;
317 result = strcmp (*s1, *s2);
323 /* Function equivalents for the macros defined in chardefs.h. */
324 #define FUNCTION_FOR_MACRO(f) int (f) (c) int c; { return f (c); }
326 FUNCTION_FOR_MACRO (_rl_digit_p)
327 FUNCTION_FOR_MACRO (_rl_digit_value)
328 FUNCTION_FOR_MACRO (_rl_lowercase_p)
329 FUNCTION_FOR_MACRO (_rl_pure_alphabetic)
330 FUNCTION_FOR_MACRO (_rl_to_lower)
331 FUNCTION_FOR_MACRO (_rl_to_upper)
332 FUNCTION_FOR_MACRO (_rl_uppercase_p)
334 /* Backwards compatibility, now that savestring has been removed from
335 all `public' readline header files. */
336 #undef _rl_savestring
341 return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s)));