util.c revision 26500
1/* util.c -- readline utility functions */
2
3/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
4
5   This file is part of the GNU Readline Library, a library for
6   reading lines of text with interactive input and history editing.
7
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.
12
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.
17
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
23
24#if defined (HAVE_CONFIG_H)
25#  include <config.h>
26#endif
27
28#include <sys/types.h>
29#include <fcntl.h>
30#include "posixjmp.h"
31
32#if defined (HAVE_UNISTD_H)
33#  include <unistd.h>           /* for _POSIX_VERSION */
34#endif /* HAVE_UNISTD_H */
35
36#if defined (HAVE_STDLIB_H)
37#  include <stdlib.h>
38#else
39#  include "ansi_stdlib.h"
40#endif /* HAVE_STDLIB_H */
41
42#include <stdio.h>
43#include <ctype.h>
44
45/* System-specific feature definitions and include files. */
46#include "rldefs.h"
47
48#if defined (TIOCSTAT_IN_SYS_IOCTL)
49#  include <sys/ioctl.h>
50#endif /* TIOCSTAT_IN_SYS_IOCTL */
51
52/* Some standard library routines. */
53#include "readline.h"
54
55#define SWAP(s, e)  do { int t; t = s; s = e; e = t; } while (0)
56
57/* Pseudo-globals imported from readline.c */
58extern int readline_echoing_p;
59extern procenv_t readline_top_level;
60extern int rl_line_buffer_len;
61extern Function *rl_last_func;
62
63extern int _rl_defining_kbd_macro;
64extern char *_rl_executing_macro;
65
66/* Pseudo-global functions imported from other library files. */
67extern void _rl_pop_executing_macro ();
68extern void _rl_set_the_line ();
69extern void _rl_init_argument ();
70
71extern char *xmalloc (), *xrealloc ();
72
73/* **************************************************************** */
74/*								    */
75/*			Utility Functions			    */
76/*								    */
77/* **************************************************************** */
78
79/* Return 0 if C is not a member of the class of characters that belong
80   in words, or 1 if it is. */
81
82int _rl_allow_pathname_alphabetic_chars = 0;
83static char *pathname_alphabetic_chars = "/-_=~.#$";
84
85int
86alphabetic (c)
87     int c;
88{
89  if (ALPHABETIC (c))
90    return (1);
91
92  return (_rl_allow_pathname_alphabetic_chars &&
93	    strchr (pathname_alphabetic_chars, c) != NULL);
94}
95
96/* How to abort things. */
97int
98_rl_abort_internal ()
99{
100  ding ();
101  rl_clear_message ();
102  _rl_init_argument ();
103  rl_pending_input = 0;
104
105  _rl_defining_kbd_macro = 0;
106  while (_rl_executing_macro)
107    _rl_pop_executing_macro ();
108
109  rl_last_func = (Function *)NULL;
110  longjmp (readline_top_level, 1);
111  return (0);
112}
113
114int
115rl_abort (count, key)
116     int count, key;
117{
118  return (_rl_abort_internal ());
119}
120
121int
122rl_tty_status (count, key)
123     int count, key;
124{
125#if defined (TIOCSTAT)
126  ioctl (1, TIOCSTAT, (char *)0);
127  rl_refresh_line ();
128#else
129  ding ();
130#endif
131  return 0;
132}
133
134/* Return a copy of the string between FROM and TO.
135   FROM is inclusive, TO is not. */
136char *
137rl_copy_text (from, to)
138     int from, to;
139{
140  register int length;
141  char *copy;
142
143  /* Fix it if the caller is confused. */
144  if (from > to)
145    SWAP (from, to);
146
147  length = to - from;
148  copy = xmalloc (1 + length);
149  strncpy (copy, rl_line_buffer + from, length);
150  copy[length] = '\0';
151  return (copy);
152}
153
154/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
155   LEN characters. */
156void
157rl_extend_line_buffer (len)
158     int len;
159{
160  while (len >= rl_line_buffer_len)
161    {
162      rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
163      rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len);
164    }
165
166  _rl_set_the_line ();
167}
168
169/* **************************************************************** */
170/*								    */
171/*			String Utility Functions		    */
172/*								    */
173/* **************************************************************** */
174
175/* Determine if s2 occurs in s1.  If so, return a pointer to the
176   match in s1.  The compare is case insensitive. */
177char *
178_rl_strindex (s1, s2)
179     register char *s1, *s2;
180{
181  register int i, l, len;
182
183  for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
184    if (_rl_strnicmp (s1 + i, s2, l) == 0)
185      return (s1 + i);
186  return ((char *)NULL);
187}
188
189#if !defined (HAVE_STRCASECMP)
190/* Compare at most COUNT characters from string1 to string2.  Case
191   doesn't matter. */
192int
193_rl_strnicmp (string1, string2, count)
194     char *string1, *string2;
195     int count;
196{
197  register char ch1, ch2;
198
199  while (count)
200    {
201      ch1 = *string1++;
202      ch2 = *string2++;
203      if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
204	count--;
205      else
206        break;
207    }
208  return (count);
209}
210
211/* strcmp (), but caseless. */
212int
213_rl_stricmp (string1, string2)
214     char *string1, *string2;
215{
216  register char ch1, ch2;
217
218  while (*string1 && *string2)
219    {
220      ch1 = *string1++;
221      ch2 = *string2++;
222      if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
223	return (1);
224    }
225  return (*string1 - *string2);
226}
227#endif /* !HAVE_STRCASECMP */
228
229/* Stupid comparison routine for qsort () ing strings. */
230int
231_rl_qsort_string_compare (s1, s2)
232  char **s1, **s2;
233{
234#if defined (HAVE_STRCOLL)
235  return (strcoll (*s1, *s2));
236#else
237  int result;
238
239  result = **s1 - **s2;
240  if (result == 0)
241    result = strcmp (*s1, *s2);
242
243  return result;
244#endif
245}
246
247/* Function equivalents for the macros defined in chartypes.h. */
248#undef _rl_uppercase_p
249int
250_rl_uppercase_p (c)
251     int c;
252{
253  return (isupper (c));
254}
255
256#undef _rl_lowercase_p
257int
258_rl_lowercase_p (c)
259     int c;
260{
261  return (islower (c));
262}
263
264#undef _rl_pure_alphabetic
265int
266_rl_pure_alphabetic (c)
267     int c;
268{
269  return (isupper (c) || islower (c));
270}
271
272#undef _rl_digit_p
273int
274_rl_digit_p (c)
275     int c;
276{
277  return (isdigit (c));
278}
279
280#undef _rl_to_lower
281int
282_rl_to_lower (c)
283     int c;
284{
285  return (isupper (c) ? tolower (c) : c);
286}
287
288#undef _rl_to_upper
289int
290_rl_to_upper (c)
291     int c;
292{
293  return (islower (c) ? toupper (c) : c);
294}
295
296#undef _rl_digit_value
297int
298_rl_digit_value (c)
299     int c;
300{
301  return (isdigit (c) ? c - '0' : c);
302}
303