util.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:8k
源码类别:

MySQL数据库

开发平台:

Visual C++

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