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