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)));