1 /* util.c -- readline utility functions */
3 /* Copyright (C) 1987-2005 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 2, 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 59 Temple Place, Suite 330, Boston, MA 02111 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. */
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 #if defined (HANDLE_MULTIBYTE)
93 return (_rl_allow_pathname_alphabetic_chars
&&
94 strchr (pathname_alphabetic_chars
, c
) != NULL
);
98 /* How to abort things. */
100 _rl_abort_internal ()
104 _rl_reset_argument ();
105 rl_clear_pending_input ();
107 RL_UNSETSTATE (RL_STATE_MACRODEF
);
108 while (rl_executing_macro
)
109 _rl_pop_executing_macro ();
111 rl_last_func
= (rl_command_func_t
*)NULL
;
112 longjmp (readline_top_level
, 1);
117 rl_abort (count
, key
)
120 return (_rl_abort_internal ());
124 rl_tty_status (count
, key
)
127 #if defined (TIOCSTAT)
128 ioctl (1, TIOCSTAT
, (char *)0);
129 rl_refresh_line (count
, key
);
136 /* Return a copy of the string between FROM and TO.
137 FROM is inclusive, TO is not. */
139 rl_copy_text (from
, to
)
145 /* Fix it if the caller is confused. */
150 copy
= (char *)xmalloc (1 + length
);
151 strncpy (copy
, rl_line_buffer
+ from
, length
);
156 /* Increase the size of RL_LINE_BUFFER until it has enough space to hold
159 rl_extend_line_buffer (len
)
162 while (len
>= rl_line_buffer_len
)
164 rl_line_buffer_len
+= DEFAULT_BUFFER_SIZE
;
165 rl_line_buffer
= (char *)xrealloc (rl_line_buffer
, rl_line_buffer_len
);
172 /* A function for simple tilde expansion. */
174 rl_tilde_expand (ignore
, key
)
177 register int start
, end
;
178 char *homedir
, *temp
;
184 if (rl_point
== rl_end
&& rl_line_buffer
[rl_point
] == '~')
186 homedir
= tilde_expand ("~");
187 _rl_replace_text (homedir
, start
, end
);
190 else if (rl_line_buffer
[start
] != '~')
192 for (; !whitespace (rl_line_buffer
[start
]) && start
>= 0; start
--)
200 while (whitespace (rl_line_buffer
[end
]) == 0 && end
< rl_end
);
202 if (whitespace (rl_line_buffer
[end
]) || end
>= rl_end
)
205 /* If the first character of the current word is a tilde, perform
206 tilde expansion and insert the result. If not a tilde, do
208 if (rl_line_buffer
[start
] == '~')
210 len
= end
- start
+ 1;
211 temp
= (char *)xmalloc (len
+ 1);
212 strncpy (temp
, rl_line_buffer
+ start
, len
);
214 homedir
= tilde_expand (temp
);
217 _rl_replace_text (homedir
, start
, end
);
223 /* **************************************************************** */
225 /* String Utility Functions */
227 /* **************************************************************** */
229 /* Determine if s2 occurs in s1. If so, return a pointer to the
230 match in s1. The compare is case insensitive. */
232 _rl_strindex (s1
, s2
)
233 register const char *s1
, *s2
;
235 register int i
, l
, len
;
237 for (i
= 0, l
= strlen (s2
), len
= strlen (s1
); (len
- i
) >= l
; i
++)
238 if (_rl_strnicmp (s1
+ i
, s2
, l
) == 0)
239 return ((char *) (s1
+ i
));
240 return ((char *)NULL
);
244 /* Find the first occurrence in STRING1 of any character from STRING2.
245 Return a pointer to the character in STRING1. */
247 _rl_strpbrk (string1
, string2
)
248 const char *string1
, *string2
;
250 register const char *scan
;
251 #if defined (HANDLE_MULTIBYTE)
255 memset (&ps
, 0, sizeof (mbstate_t));
258 for (; *string1
; string1
++)
260 for (scan
= string2
; *scan
; scan
++)
262 if (*string1
== *scan
)
263 return ((char *)string1
);
265 #if defined (HANDLE_MULTIBYTE)
266 if (MB_CUR_MAX
> 1 && rl_byte_oriented
== 0)
268 v
= _rl_get_char_len (string1
, &ps
);
270 string1
+= v
- 1; /* -1 to account for auto-increment in loop */
274 return ((char *)NULL
);
278 #if !defined (HAVE_STRCASECMP)
279 /* Compare at most COUNT characters from string1 to string2. Case
282 _rl_strnicmp (string1
, string2
, count
)
283 char *string1
, *string2
;
286 register char ch1
, ch2
;
292 if (_rl_to_upper(ch1
) == _rl_to_upper(ch2
))
300 /* strcmp (), but caseless. */
302 _rl_stricmp (string1
, string2
)
303 char *string1
, *string2
;
305 register char ch1
, ch2
;
307 while (*string1
&& *string2
)
311 if (_rl_to_upper(ch1
) != _rl_to_upper(ch2
))
314 return (*string1
- *string2
);
316 #endif /* !HAVE_STRCASECMP */
318 /* Stupid comparison routine for qsort () ing strings. */
320 _rl_qsort_string_compare (s1
, s2
)
323 #if defined (HAVE_STRCOLL)
324 return (strcoll (*s1
, *s2
));
328 result
= **s1
- **s2
;
330 result
= strcmp (*s1
, *s2
);
336 /* Function equivalents for the macros defined in chardefs.h. */
337 #define FUNCTION_FOR_MACRO(f) int (f) (c) int c; { return f (c); }
339 FUNCTION_FOR_MACRO (_rl_digit_p
)
340 FUNCTION_FOR_MACRO (_rl_digit_value
)
341 FUNCTION_FOR_MACRO (_rl_lowercase_p
)
342 FUNCTION_FOR_MACRO (_rl_pure_alphabetic
)
343 FUNCTION_FOR_MACRO (_rl_to_lower
)
344 FUNCTION_FOR_MACRO (_rl_to_upper
)
345 FUNCTION_FOR_MACRO (_rl_uppercase_p
)
347 /* Backwards compatibility, now that savestring has been removed from
348 all `public' readline header files. */
349 #undef _rl_savestring
354 return (strcpy ((char *)xmalloc (1 + (int)strlen (s
)), (s
)));