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 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. */
48 #if defined (TIOCSTAT_IN_SYS_IOCTL)
49 # include <sys/ioctl.h>
50 #endif /* TIOCSTAT_IN_SYS_IOCTL */
52 /* Some standard library routines. */
55 #include "rlprivate.h"
58 /* **************************************************************** */
60 /* Utility Functions */
62 /* **************************************************************** */
64 /* Return 0 if C is not a member of the class of characters that belong
65 in words, or 1 if it is. */
67 int _rl_allow_pathname_alphabetic_chars
= 0;
68 static const char *pathname_alphabetic_chars
= "/-_=~.#$";
77 return (_rl_allow_pathname_alphabetic_chars
&&
78 strchr (pathname_alphabetic_chars
, c
) != NULL
);
81 /* How to abort things. */
88 rl_clear_pending_input ();
90 RL_UNSETSTATE (RL_STATE_MACRODEF
);
91 while (rl_executing_macro
)
92 _rl_pop_executing_macro ();
94 rl_last_func
= (rl_command_func_t
*)NULL
;
95 longjmp (readline_top_level
, 1);
100 rl_abort (count
, key
)
103 return (_rl_abort_internal ());
107 rl_tty_status (count
, key
)
110 #if defined (TIOCSTAT)
111 ioctl (1, TIOCSTAT
, (char *)0);
112 rl_refresh_line (count
, key
);
119 /* Return a copy of the string between FROM and TO.
120 FROM is inclusive, TO is not. */
122 rl_copy_text (from
, to
)
128 /* Fix it if the caller is confused. */
133 copy
= (char *)xmalloc (1 + length
);
134 strncpy (copy
, rl_line_buffer
+ from
, length
);
139 /* Increase the size of RL_LINE_BUFFER until it has enough space to hold
142 rl_extend_line_buffer (len
)
145 while (len
>= rl_line_buffer_len
)
147 rl_line_buffer_len
+= DEFAULT_BUFFER_SIZE
;
148 rl_line_buffer
= (char *)xrealloc (rl_line_buffer
, rl_line_buffer_len
);
155 /* A function for simple tilde expansion. */
157 rl_tilde_expand (ignore
, key
)
160 register int start
, end
;
161 char *homedir
, *temp
;
167 if (rl_point
== rl_end
&& rl_line_buffer
[rl_point
] == '~')
169 homedir
= tilde_expand ("~");
170 _rl_replace_text (homedir
, start
, end
);
173 else if (rl_line_buffer
[start
] != '~')
175 for (; !whitespace (rl_line_buffer
[start
]) && start
>= 0; start
--)
183 while (whitespace (rl_line_buffer
[end
]) == 0 && end
< rl_end
);
185 if (whitespace (rl_line_buffer
[end
]) || end
>= rl_end
)
188 /* If the first character of the current word is a tilde, perform
189 tilde expansion and insert the result. If not a tilde, do
191 if (rl_line_buffer
[start
] == '~')
193 len
= end
- start
+ 1;
194 temp
= (char *)xmalloc (len
+ 1);
195 strncpy (temp
, rl_line_buffer
+ start
, len
);
197 homedir
= tilde_expand (temp
);
200 _rl_replace_text (homedir
, start
, end
);
206 /* **************************************************************** */
208 /* String Utility Functions */
210 /* **************************************************************** */
212 /* Determine if s2 occurs in s1. If so, return a pointer to the
213 match in s1. The compare is case insensitive. */
215 _rl_strindex (s1
, s2
)
216 register const char *s1
, *s2
;
218 register int i
, l
, len
;
220 for (i
= 0, l
= strlen (s2
), len
= strlen (s1
); (len
- i
) >= l
; i
++)
221 if (_rl_strnicmp (s1
+ i
, s2
, l
) == 0)
222 return ((char *) (s1
+ i
));
223 return ((char *)NULL
);
227 /* Find the first occurrence in STRING1 of any character from STRING2.
228 Return a pointer to the character in STRING1. */
230 _rl_strpbrk (string1
, string2
)
231 const char *string1
, *string2
;
233 register const char *scan
;
234 #if defined (HANDLE_MULTIBYTE)
238 memset (&ps
, 0, sizeof (mbstate_t));
241 for (; *string1
; string1
++)
243 for (scan
= string2
; *scan
; scan
++)
245 if (*string1
== *scan
)
246 return ((char *)string1
);
248 #if defined (HANDLE_MULTIBYTE)
249 if (MB_CUR_MAX
> 1 && rl_byte_oriented
== 0)
251 v
= _rl_get_char_len (string1
, &ps
);
253 string1
+= v
- 1; /* -1 to account for auto-increment in loop */
257 return ((char *)NULL
);
261 #if !defined (HAVE_STRCASECMP)
262 /* Compare at most COUNT characters from string1 to string2. Case
265 _rl_strnicmp (string1
, string2
, count
)
266 char *string1
, *string2
;
269 register char ch1
, ch2
;
275 if (_rl_to_upper(ch1
) == _rl_to_upper(ch2
))
283 /* strcmp (), but caseless. */
285 _rl_stricmp (string1
, string2
)
286 char *string1
, *string2
;
288 register char ch1
, ch2
;
290 while (*string1
&& *string2
)
294 if (_rl_to_upper(ch1
) != _rl_to_upper(ch2
))
297 return (*string1
- *string2
);
299 #endif /* !HAVE_STRCASECMP */
301 /* Stupid comparison routine for qsort () ing strings. */
303 _rl_qsort_string_compare (s1
, s2
)
306 #if defined (HAVE_STRCOLL)
307 return (strcoll (*s1
, *s2
));
311 result
= **s1
- **s2
;
313 result
= strcmp (*s1
, *s2
);
319 /* Function equivalents for the macros defined in chardefs.h. */
320 #define FUNCTION_FOR_MACRO(f) int (f) (c) int c; { return f (c); }
322 FUNCTION_FOR_MACRO (_rl_digit_p
)
323 FUNCTION_FOR_MACRO (_rl_digit_value
)
324 FUNCTION_FOR_MACRO (_rl_lowercase_p
)
325 FUNCTION_FOR_MACRO (_rl_pure_alphabetic
)
326 FUNCTION_FOR_MACRO (_rl_to_lower
)
327 FUNCTION_FOR_MACRO (_rl_to_upper
)
328 FUNCTION_FOR_MACRO (_rl_uppercase_p
)
330 /* Backwards compatibility, now that savestring has been removed from
331 all `public' readline header files. */
332 #undef _rl_savestring
337 return (strcpy ((char *)xmalloc (1 + (int)strlen (s
)), (s
)));