source: trunk/third/readline/util.c @ 12992

Revision 12992, 7.7 KB checked in by kcr, 25 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12991, which included commits to RCS files with non-trunk default branches.
Line 
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_replace_text ();
68extern void _rl_pop_executing_macro ();
69extern void _rl_set_the_line ();
70extern void _rl_init_argument ();
71
72extern char *xmalloc (), *xrealloc ();
73
74/* **************************************************************** */
75/*                                                                  */
76/*                      Utility Functions                           */
77/*                                                                  */
78/* **************************************************************** */
79
80/* Return 0 if C is not a member of the class of characters that belong
81   in words, or 1 if it is. */
82
83int _rl_allow_pathname_alphabetic_chars = 0;
84static char *pathname_alphabetic_chars = "/-_=~.#$";
85
86int
87alphabetic (c)
88     int c;
89{
90  if (ALPHABETIC (c))
91    return (1);
92
93  return (_rl_allow_pathname_alphabetic_chars &&
94            strchr (pathname_alphabetic_chars, c) != NULL);
95}
96
97/* How to abort things. */
98int
99_rl_abort_internal ()
100{
101  ding ();
102  rl_clear_message ();
103  _rl_init_argument ();
104  rl_pending_input = 0;
105
106  _rl_defining_kbd_macro = 0;
107  while (_rl_executing_macro)
108    _rl_pop_executing_macro ();
109
110  rl_last_func = (Function *)NULL;
111  longjmp (readline_top_level, 1);
112  return (0);
113}
114
115int
116rl_abort (count, key)
117     int count, key;
118{
119  return (_rl_abort_internal ());
120}
121
122int
123rl_tty_status (count, key)
124     int count, key;
125{
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;
133}
134
135/* Return a copy of the string between FROM and TO.
136   FROM is inclusive, TO is not. */
137char *
138rl_copy_text (from, to)
139     int from, to;
140{
141  register int length;
142  char *copy;
143
144  /* Fix it if the caller is confused. */
145  if (from > to)
146    SWAP (from, to);
147
148  length = to - from;
149  copy = xmalloc (1 + length);
150  strncpy (copy, rl_line_buffer + from, length);
151  copy[length] = '\0';
152  return (copy);
153}
154
155/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
156   LEN characters. */
157void
158rl_extend_line_buffer (len)
159     int len;
160{
161  while (len >= rl_line_buffer_len)
162    {
163      rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
164      rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len);
165    }
166
167  _rl_set_the_line ();
168}
169
170
171/* A function for simple tilde expansion. */
172int
173rl_tilde_expand (ignore, key)
174     int ignore, key;
175{
176  register int start, end;
177  char *homedir, *temp;
178  int len;
179
180  end = rl_point;
181  start = end - 1;
182
183  if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
184    {
185      homedir = tilde_expand ("~");
186      _rl_replace_text (homedir, start, end);
187      return (0);
188    }
189  else if (rl_line_buffer[start] != '~')
190    {
191      for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
192        ;
193      start++;
194    }
195
196  end = start;
197  do
198    end++;
199  while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
200
201  if (whitespace (rl_line_buffer[end]) || end >= rl_end)
202    end--;
203
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] == '~')
208    {
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);
215
216      _rl_replace_text (homedir, start, end);
217    }
218
219  return (0);
220}
221
222/* **************************************************************** */
223/*                                                                  */
224/*                      String Utility Functions                    */
225/*                                                                  */
226/* **************************************************************** */
227
228/* Determine if s2 occurs in s1.  If so, return a pointer to the
229   match in s1.  The compare is case insensitive. */
230char *
231_rl_strindex (s1, s2)
232     register char *s1, *s2;
233{
234  register int i, l, len;
235
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);
240}
241
242#if !defined (HAVE_STRCASECMP)
243/* Compare at most COUNT characters from string1 to string2.  Case
244   doesn't matter. */
245int
246_rl_strnicmp (string1, string2, count)
247     char *string1, *string2;
248     int count;
249{
250  register char ch1, ch2;
251
252  while (count)
253    {
254      ch1 = *string1++;
255      ch2 = *string2++;
256      if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
257        count--;
258      else
259        break;
260    }
261  return (count);
262}
263
264/* strcmp (), but caseless. */
265int
266_rl_stricmp (string1, string2)
267     char *string1, *string2;
268{
269  register char ch1, ch2;
270
271  while (*string1 && *string2)
272    {
273      ch1 = *string1++;
274      ch2 = *string2++;
275      if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
276        return (1);
277    }
278  return (*string1 - *string2);
279}
280#endif /* !HAVE_STRCASECMP */
281
282/* Stupid comparison routine for qsort () ing strings. */
283int
284_rl_qsort_string_compare (s1, s2)
285  char **s1, **s2;
286{
287#if defined (HAVE_STRCOLL)
288  return (strcoll (*s1, *s2));
289#else
290  int result;
291
292  result = **s1 - **s2;
293  if (result == 0)
294    result = strcmp (*s1, *s2);
295
296  return result;
297#endif
298}
299
300/* Function equivalents for the macros defined in chartypes.h. */
301#undef _rl_uppercase_p
302int
303_rl_uppercase_p (c)
304     int c;
305{
306  return (isupper (c));
307}
308
309#undef _rl_lowercase_p
310int
311_rl_lowercase_p (c)
312     int c;
313{
314  return (islower (c));
315}
316
317#undef _rl_pure_alphabetic
318int
319_rl_pure_alphabetic (c)
320     int c;
321{
322  return (isupper (c) || islower (c));
323}
324
325#undef _rl_digit_p
326int
327_rl_digit_p (c)
328     int c;
329{
330  return (isdigit (c));
331}
332
333#undef _rl_to_lower
334int
335_rl_to_lower (c)
336     int c;
337{
338  return (isupper (c) ? tolower (c) : c);
339}
340
341#undef _rl_to_upper
342int
343_rl_to_upper (c)
344     int c;
345{
346  return (islower (c) ? toupper (c) : c);
347}
348
349#undef _rl_digit_value
350int
351_rl_digit_value (c)
352     int c;
353{
354  return (isdigit (c) ? c - '0' : c);
355}
356
357/* Backwards compatibility, now that savestring has been removed from
358   all `public' readline header files. */
359#undef _rl_savestring
360char *
361_rl_savestring (s)
362     char *s;
363{
364  return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));
365}
Note: See TracBrowser for help on using the repository browser.