* build fix
[binutils-gdb.git] / readline / util.c
blob1dc3b664f1cde0c08340ab784801c42f2798093f
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)
25 # include <config.h>
26 #endif
28 #include <sys/types.h>
29 #include <fcntl.h>
30 #include "posixjmp.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)
37 # include <stdlib.h>
38 #else
39 # include "ansi_stdlib.h"
40 #endif /* HAVE_STDLIB_H */
42 #include <stdio.h>
43 #include <ctype.h>
45 /* System-specific feature definitions and include files. */
46 #include "rldefs.h"
48 #if defined (TIOCSTAT_IN_SYS_IOCTL)
49 # include <sys/ioctl.h>
50 #endif /* TIOCSTAT_IN_SYS_IOCTL */
52 /* Some standard library routines. */
53 #include "readline.h"
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 /* **************************************************************** */
75 /* */
76 /* Utility Functions */
77 /* */
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 = "/-_=~.#$";
86 int
87 alphabetic (c)
88 int c;
90 if (ALPHABETIC (c))
91 return (1);
93 return (_rl_allow_pathname_alphabetic_chars &&
94 strchr (pathname_alphabetic_chars, c) != NULL);
97 /* How to abort things. */
98 int
99 _rl_abort_internal ()
101 ding ();
102 rl_clear_message ();
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);
112 return (0);
116 rl_abort (count, key)
117 int count, key;
119 return (_rl_abort_internal ());
123 rl_tty_status (count, key)
124 int count, key;
126 #if defined (TIOCSTAT)
127 ioctl (1, TIOCSTAT, (char *)0);
128 rl_refresh_line (count, key);
129 #else
130 ding ();
131 #endif
132 return 0;
135 /* Return a copy of the string between FROM and TO.
136 FROM is inclusive, TO is not. */
137 char *
138 rl_copy_text (from, to)
139 int from, to;
141 register int length;
142 char *copy;
144 /* Fix it if the caller is confused. */
145 if (from > to)
146 SWAP (from, to);
148 length = to - from;
149 copy = xmalloc (1 + length);
150 strncpy (copy, rl_line_buffer + from, length);
151 copy[length] = '\0';
152 return (copy);
155 /* Increase the size of RL_LINE_BUFFER until it has enough space to hold
156 LEN characters. */
157 void
158 rl_extend_line_buffer (len)
159 int 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);
167 _rl_set_the_line ();
171 /* A function for simple tilde expansion. */
173 rl_tilde_expand (ignore, key)
174 int ignore, key;
176 register int start, end;
177 char *homedir, *temp;
178 int len;
180 end = rl_point;
181 start = end - 1;
183 if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
185 homedir = tilde_expand ("~");
186 _rl_replace_text (homedir, start, end);
187 return (0);
189 else if (rl_line_buffer[start] != '~')
191 for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
193 start++;
196 end = start;
198 end++;
199 while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
201 if (whitespace (rl_line_buffer[end]) || end >= rl_end)
202 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
206 nothing. */
207 if (rl_line_buffer[start] == '~')
209 len = end - start + 1;
210 temp = xmalloc (len + 1);
211 strncpy (temp, rl_line_buffer + start, len);
212 temp[len] = '\0';
213 homedir = tilde_expand (temp);
214 free (temp);
216 _rl_replace_text (homedir, start, end);
219 return (0);
222 /* **************************************************************** */
223 /* */
224 /* String Utility Functions */
225 /* */
226 /* **************************************************************** */
228 /* Determine if s2 occurs in s1. If so, return a pointer to the
229 match in s1. The compare is case insensitive. */
230 char *
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)
238 return (s1 + i);
239 return ((char *)NULL);
242 #if !defined (HAVE_STRCASECMP)
243 /* Compare at most COUNT characters from string1 to string2. Case
244 doesn't matter. */
246 _rl_strnicmp (string1, string2, count)
247 char *string1, *string2;
248 int count;
250 register char ch1, ch2;
252 while (count)
254 ch1 = *string1++;
255 ch2 = *string2++;
256 if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
257 count--;
258 else
259 break;
261 return (count);
264 /* strcmp (), but caseless. */
266 _rl_stricmp (string1, string2)
267 char *string1, *string2;
269 register char ch1, ch2;
271 while (*string1 && *string2)
273 ch1 = *string1++;
274 ch2 = *string2++;
275 if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
276 return (1);
278 return (*string1 - *string2);
280 #endif /* !HAVE_STRCASECMP */
282 /* Stupid comparison routine for qsort () ing strings. */
284 _rl_qsort_string_compare (s1, s2)
285 char **s1, **s2;
287 #if defined (HAVE_STRCOLL)
288 return (strcoll (*s1, *s2));
289 #else
290 int result;
292 result = **s1 - **s2;
293 if (result == 0)
294 result = strcmp (*s1, *s2);
296 return result;
297 #endif
300 /* Function equivalents for the macros defined in chartypes.h. */
301 #undef _rl_uppercase_p
303 _rl_uppercase_p (c)
304 int c;
306 return (isupper (c));
309 #undef _rl_lowercase_p
311 _rl_lowercase_p (c)
312 int c;
314 return (islower (c));
317 #undef _rl_pure_alphabetic
319 _rl_pure_alphabetic (c)
320 int c;
322 return (isupper (c) || islower (c));
325 #undef _rl_digit_p
327 _rl_digit_p (c)
328 int c;
330 return (isdigit (c));
333 #undef _rl_to_lower
335 _rl_to_lower (c)
336 int c;
338 return (isupper (c) ? tolower (c) : c);
341 #undef _rl_to_upper
343 _rl_to_upper (c)
344 int c;
346 return (islower (c) ? toupper (c) : c);
349 #undef _rl_digit_value
351 _rl_digit_value (c)
352 int c;
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
360 char *
361 _rl_savestring (s)
362 char *s;
364 return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));