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

MySQL数据库

开发平台:

Visual C++

  1. /* macro.c -- keyboard macros for readline. */
  2. /* Copyright (C) 1994 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. #if defined (HAVE_UNISTD_H)
  23. #  include <unistd.h>           /* for _POSIX_VERSION */
  24. #endif /* HAVE_UNISTD_H */
  25. #if defined (HAVE_STDLIB_H)
  26. #  include <stdlib.h>
  27. #else
  28. #  include "ansi_stdlib.h"
  29. #endif /* HAVE_STDLIB_H */
  30. #include <stdio.h>
  31. /* System-specific feature definitions and include files. */
  32. #include "rldefs.h"
  33. /* Some standard library routines. */
  34. #include "readline.h"
  35. #include "history.h"
  36. #define SWAP(s, e)  do { int t; t = s; s = e; e = t; } while (0)
  37. /* Forward definitions. */
  38. void _rl_push_executing_macro (), _rl_pop_executing_macro ();
  39. void _rl_add_macro_char ();
  40. /* Extern declarations. */
  41. extern int rl_explicit_arg;
  42. extern int rl_key_sequence_length;
  43. extern void _rl_abort_internal ();
  44. extern char *xmalloc (), *xrealloc ();
  45. /* **************************************************************** */
  46. /*     */
  47. /* Hacking Keyboard Macros      */
  48. /*     */
  49. /* **************************************************************** */
  50. /* Non-zero means to save keys that we dispatch on in a kbd macro. */
  51. int _rl_defining_kbd_macro = 0;
  52. /* The currently executing macro string.  If this is non-zero,
  53.    then it is a malloc ()'ed string where input is coming from. */
  54. char *_rl_executing_macro = (char *)NULL;
  55. /* The offset in the above string to the next character to be read. */
  56. static int executing_macro_index;
  57. /* The current macro string being built.  Characters get stuffed
  58.    in here by add_macro_char (). */
  59. static char *current_macro = (char *)NULL;
  60. /* The size of the buffer allocated to current_macro. */
  61. static int current_macro_size;
  62. /* The index at which characters are being added to current_macro. */
  63. static int current_macro_index;
  64. /* A structure used to save nested macro strings.
  65.    It is a linked list of string/index for each saved macro. */
  66. struct saved_macro {
  67.   struct saved_macro *next;
  68.   char *string;
  69.   int sindex;
  70. };
  71. /* The list of saved macros. */
  72. static struct saved_macro *macro_list = (struct saved_macro *)NULL;
  73. /* Set up to read subsequent input from STRING.
  74.    STRING is free ()'ed when we are done with it. */
  75. void
  76. _rl_with_macro_input (string)
  77.      char *string;
  78. {
  79.   _rl_push_executing_macro ();
  80.   _rl_executing_macro = string;
  81.   executing_macro_index = 0;
  82. }
  83. /* Return the next character available from a macro, or 0 if
  84.    there are no macro characters. */
  85. int
  86. _rl_next_macro_key ()
  87. {
  88.   if (_rl_executing_macro == 0)
  89.     return (0);
  90.   if (_rl_executing_macro[executing_macro_index] == 0)
  91.     {
  92.       _rl_pop_executing_macro ();
  93.       return (_rl_next_macro_key ());
  94.     }
  95.   return (_rl_executing_macro[executing_macro_index++]);
  96. }
  97. /* Save the currently executing macro on a stack of saved macros. */
  98. void
  99. _rl_push_executing_macro ()
  100. {
  101.   struct saved_macro *saver;
  102.   saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
  103.   saver->next = macro_list;
  104.   saver->sindex = executing_macro_index;
  105.   saver->string = _rl_executing_macro;
  106.   macro_list = saver;
  107. }
  108. /* Discard the current macro, replacing it with the one
  109.    on the top of the stack of saved macros. */
  110. void
  111. _rl_pop_executing_macro ()
  112. {
  113.   struct saved_macro *macro;
  114.   if (_rl_executing_macro)
  115.     free (_rl_executing_macro);
  116.   _rl_executing_macro = (char *)NULL;
  117.   executing_macro_index = 0;
  118.   if (macro_list)
  119.     {
  120.       macro = macro_list;
  121.       _rl_executing_macro = macro_list->string;
  122.       executing_macro_index = macro_list->sindex;
  123.       macro_list = macro_list->next;
  124.       free (macro);
  125.     }
  126. }
  127. /* Add a character to the macro being built. */
  128. void
  129. _rl_add_macro_char (c)
  130.      int c;
  131. {
  132.   if (current_macro_index + 1 >= current_macro_size)
  133.     {
  134.       if (current_macro == 0)
  135. current_macro = xmalloc (current_macro_size = 25);
  136.       else
  137. current_macro = xrealloc (current_macro, current_macro_size += 25);
  138.     }
  139.   current_macro[current_macro_index++] = c;
  140.   current_macro[current_macro_index] = '';
  141. }
  142. void
  143. _rl_kill_kbd_macro ()
  144. {
  145.   if (current_macro)
  146.     {
  147.       free (current_macro);
  148.       current_macro = (char *) NULL;
  149.     }
  150.   current_macro_size = current_macro_index = 0;
  151.   if (_rl_executing_macro)
  152.     {
  153.       free (_rl_executing_macro);
  154.       _rl_executing_macro = (char *) NULL;
  155.     }
  156.   executing_macro_index = 0;
  157.   _rl_defining_kbd_macro = 0;
  158. }
  159. /* Begin defining a keyboard macro.
  160.    Keystrokes are recorded as they are executed.
  161.    End the definition with rl_end_kbd_macro ().
  162.    If a numeric argument was explicitly typed, then append this
  163.    definition to the end of the existing macro, and start by
  164.    re-executing the existing macro. */
  165. int
  166. rl_start_kbd_macro (ignore1, ignore2)
  167.      int ignore1, ignore2;
  168. {
  169.   if (_rl_defining_kbd_macro)
  170.     {
  171.       _rl_abort_internal ();
  172.       return -1;
  173.     }
  174.   if (rl_explicit_arg)
  175.     {
  176.       if (current_macro)
  177. _rl_with_macro_input (savestring (current_macro));
  178.     }
  179.   else
  180.     current_macro_index = 0;
  181.   _rl_defining_kbd_macro = 1;
  182.   return 0;
  183. }
  184. /* Stop defining a keyboard macro.
  185.    A numeric argument says to execute the macro right now,
  186.    that many times, counting the definition as the first time. */
  187. int
  188. rl_end_kbd_macro (count, ignore)
  189.      int count, ignore;
  190. {
  191.   if (_rl_defining_kbd_macro == 0)
  192.     {
  193.       _rl_abort_internal ();
  194.       return -1;
  195.     }
  196.   current_macro_index -= rl_key_sequence_length - 1;
  197.   current_macro[current_macro_index] = '';
  198.   _rl_defining_kbd_macro = 0;
  199.   return (rl_call_last_kbd_macro (--count, 0));
  200. }
  201. /* Execute the most recently defined keyboard macro.
  202.    COUNT says how many times to execute it. */
  203. int
  204. rl_call_last_kbd_macro (count, ignore)
  205.      int count, ignore;
  206. {
  207.   if (current_macro == 0)
  208.     _rl_abort_internal ();
  209.   if (_rl_defining_kbd_macro)
  210.     {
  211.       ding (); /* no recursive macros */
  212.       current_macro[--current_macro_index] = ''; /* erase this char */
  213.       return 0;
  214.     }
  215.   while (count--)
  216.     _rl_with_macro_input (savestring (current_macro));
  217.   return 0;
  218. }
  219. void
  220. rl_push_macro_input (macro)
  221.      char *macro;
  222. {
  223.   _rl_with_macro_input (macro);
  224. }