OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [readline/] [macro.c] - Diff between revs 834 and 842

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 834 Rev 842
/* macro.c -- keyboard macros for readline. */
/* macro.c -- keyboard macros for readline. */
 
 
/* Copyright (C) 1994 Free Software Foundation, Inc.
/* Copyright (C) 1994 Free Software Foundation, Inc.
 
 
   This file is part of the GNU Readline Library, a library for
   This file is part of the GNU Readline Library, a library for
   reading lines of text with interactive input and history editing.
   reading lines of text with interactive input and history editing.
 
 
   The GNU Readline Library is free software; you can redistribute it
   The GNU Readline Library is free software; you can redistribute it
   and/or modify it under the terms of the GNU General Public License
   and/or modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; either version 2, or
   as published by the Free Software Foundation; either version 2, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   The GNU Readline Library is distributed in the hope that it will be
   The GNU Readline Library is distributed in the hope that it will be
   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   The GNU General Public License is often shipped with GNU software, and
   The GNU General Public License is often shipped with GNU software, and
   is generally kept in a file called COPYING or LICENSE.  If you do not
   is generally kept in a file called COPYING or LICENSE.  If you do not
   have a copy of the license, write to the Free Software Foundation,
   have a copy of the license, write to the Free Software Foundation,
   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
#define READLINE_LIBRARY
#define READLINE_LIBRARY
 
 
#if defined (HAVE_CONFIG_H)
#if defined (HAVE_CONFIG_H)
#  include <config.h>
#  include <config.h>
#endif
#endif
 
 
#include <sys/types.h>
#include <sys/types.h>
 
 
#if defined (HAVE_UNISTD_H)
#if defined (HAVE_UNISTD_H)
#  include <unistd.h>           /* for _POSIX_VERSION */
#  include <unistd.h>           /* for _POSIX_VERSION */
#endif /* HAVE_UNISTD_H */
#endif /* HAVE_UNISTD_H */
 
 
#if defined (HAVE_STDLIB_H)
#if defined (HAVE_STDLIB_H)
#  include <stdlib.h>
#  include <stdlib.h>
#else
#else
#  include "ansi_stdlib.h"
#  include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */
#endif /* HAVE_STDLIB_H */
 
 
#include <stdio.h>
#include <stdio.h>
 
 
/* System-specific feature definitions and include files. */
/* System-specific feature definitions and include files. */
#include "rldefs.h"
#include "rldefs.h"
 
 
/* Some standard library routines. */
/* Some standard library routines. */
#include "readline.h"
#include "readline.h"
#include "history.h"
#include "history.h"
 
 
#include "rlprivate.h"
#include "rlprivate.h"
#include "xmalloc.h"
#include "xmalloc.h"
 
 
/* **************************************************************** */
/* **************************************************************** */
/*                                                                  */
/*                                                                  */
/*                      Hacking Keyboard Macros                     */
/*                      Hacking Keyboard Macros                     */
/*                                                                  */
/*                                                                  */
/* **************************************************************** */
/* **************************************************************** */
 
 
/* The currently executing macro string.  If this is non-zero,
/* The currently executing macro string.  If this is non-zero,
   then it is a malloc ()'ed string where input is coming from. */
   then it is a malloc ()'ed string where input is coming from. */
char *rl_executing_macro = (char *)NULL;
char *rl_executing_macro = (char *)NULL;
 
 
/* The offset in the above string to the next character to be read. */
/* The offset in the above string to the next character to be read. */
static int executing_macro_index;
static int executing_macro_index;
 
 
/* The current macro string being built.  Characters get stuffed
/* The current macro string being built.  Characters get stuffed
   in here by add_macro_char (). */
   in here by add_macro_char (). */
static char *current_macro = (char *)NULL;
static char *current_macro = (char *)NULL;
 
 
/* The size of the buffer allocated to current_macro. */
/* The size of the buffer allocated to current_macro. */
static int current_macro_size;
static int current_macro_size;
 
 
/* The index at which characters are being added to current_macro. */
/* The index at which characters are being added to current_macro. */
static int current_macro_index;
static int current_macro_index;
 
 
/* A structure used to save nested macro strings.
/* A structure used to save nested macro strings.
   It is a linked list of string/index for each saved macro. */
   It is a linked list of string/index for each saved macro. */
struct saved_macro {
struct saved_macro {
  struct saved_macro *next;
  struct saved_macro *next;
  char *string;
  char *string;
  int sindex;
  int sindex;
};
};
 
 
/* The list of saved macros. */
/* The list of saved macros. */
static struct saved_macro *macro_list = (struct saved_macro *)NULL;
static struct saved_macro *macro_list = (struct saved_macro *)NULL;
 
 
/* Set up to read subsequent input from STRING.
/* Set up to read subsequent input from STRING.
   STRING is free ()'ed when we are done with it. */
   STRING is free ()'ed when we are done with it. */
void
void
_rl_with_macro_input (string)
_rl_with_macro_input (string)
     char *string;
     char *string;
{
{
  _rl_push_executing_macro ();
  _rl_push_executing_macro ();
  rl_executing_macro = string;
  rl_executing_macro = string;
  executing_macro_index = 0;
  executing_macro_index = 0;
  RL_SETSTATE(RL_STATE_MACROINPUT);
  RL_SETSTATE(RL_STATE_MACROINPUT);
}
}
 
 
/* Return the next character available from a macro, or 0 if
/* Return the next character available from a macro, or 0 if
   there are no macro characters. */
   there are no macro characters. */
int
int
_rl_next_macro_key ()
_rl_next_macro_key ()
{
{
  int c;
  int c;
 
 
  if (rl_executing_macro == 0)
  if (rl_executing_macro == 0)
    return (0);
    return (0);
 
 
  if (rl_executing_macro[executing_macro_index] == 0)
  if (rl_executing_macro[executing_macro_index] == 0)
    {
    {
      _rl_pop_executing_macro ();
      _rl_pop_executing_macro ();
      return (_rl_next_macro_key ());
      return (_rl_next_macro_key ());
    }
    }
 
 
#if defined (READLINE_CALLBACKS)
#if defined (READLINE_CALLBACKS)
  c = rl_executing_macro[executing_macro_index++];
  c = rl_executing_macro[executing_macro_index++];
  if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD) && rl_executing_macro[executing_macro_index] == 0)
  if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD) && rl_executing_macro[executing_macro_index] == 0)
      _rl_pop_executing_macro ();
      _rl_pop_executing_macro ();
  return c;
  return c;
#else
#else
  return (rl_executing_macro[executing_macro_index++]);
  return (rl_executing_macro[executing_macro_index++]);
#endif
#endif
}
}
 
 
/* Save the currently executing macro on a stack of saved macros. */
/* Save the currently executing macro on a stack of saved macros. */
void
void
_rl_push_executing_macro ()
_rl_push_executing_macro ()
{
{
  struct saved_macro *saver;
  struct saved_macro *saver;
 
 
  saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
  saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
  saver->next = macro_list;
  saver->next = macro_list;
  saver->sindex = executing_macro_index;
  saver->sindex = executing_macro_index;
  saver->string = rl_executing_macro;
  saver->string = rl_executing_macro;
 
 
  macro_list = saver;
  macro_list = saver;
}
}
 
 
/* Discard the current macro, replacing it with the one
/* Discard the current macro, replacing it with the one
   on the top of the stack of saved macros. */
   on the top of the stack of saved macros. */
void
void
_rl_pop_executing_macro ()
_rl_pop_executing_macro ()
{
{
  struct saved_macro *macro;
  struct saved_macro *macro;
 
 
  FREE (rl_executing_macro);
  FREE (rl_executing_macro);
  rl_executing_macro = (char *)NULL;
  rl_executing_macro = (char *)NULL;
  executing_macro_index = 0;
  executing_macro_index = 0;
 
 
  if (macro_list)
  if (macro_list)
    {
    {
      macro = macro_list;
      macro = macro_list;
      rl_executing_macro = macro_list->string;
      rl_executing_macro = macro_list->string;
      executing_macro_index = macro_list->sindex;
      executing_macro_index = macro_list->sindex;
      macro_list = macro_list->next;
      macro_list = macro_list->next;
      free (macro);
      free (macro);
    }
    }
 
 
  if (rl_executing_macro == 0)
  if (rl_executing_macro == 0)
    RL_UNSETSTATE(RL_STATE_MACROINPUT);
    RL_UNSETSTATE(RL_STATE_MACROINPUT);
}
}
 
 
/* Add a character to the macro being built. */
/* Add a character to the macro being built. */
void
void
_rl_add_macro_char (c)
_rl_add_macro_char (c)
     int c;
     int c;
{
{
  if (current_macro_index + 1 >= current_macro_size)
  if (current_macro_index + 1 >= current_macro_size)
    {
    {
      if (current_macro == 0)
      if (current_macro == 0)
        current_macro = (char *)xmalloc (current_macro_size = 25);
        current_macro = (char *)xmalloc (current_macro_size = 25);
      else
      else
        current_macro = (char *)xrealloc (current_macro, current_macro_size += 25);
        current_macro = (char *)xrealloc (current_macro, current_macro_size += 25);
    }
    }
 
 
  current_macro[current_macro_index++] = c;
  current_macro[current_macro_index++] = c;
  current_macro[current_macro_index] = '\0';
  current_macro[current_macro_index] = '\0';
}
}
 
 
void
void
_rl_kill_kbd_macro ()
_rl_kill_kbd_macro ()
{
{
  if (current_macro)
  if (current_macro)
    {
    {
      free (current_macro);
      free (current_macro);
      current_macro = (char *) NULL;
      current_macro = (char *) NULL;
    }
    }
  current_macro_size = current_macro_index = 0;
  current_macro_size = current_macro_index = 0;
 
 
  FREE (rl_executing_macro);
  FREE (rl_executing_macro);
  rl_executing_macro = (char *) NULL;
  rl_executing_macro = (char *) NULL;
  executing_macro_index = 0;
  executing_macro_index = 0;
 
 
  RL_UNSETSTATE(RL_STATE_MACRODEF);
  RL_UNSETSTATE(RL_STATE_MACRODEF);
}
}
 
 
/* Begin defining a keyboard macro.
/* Begin defining a keyboard macro.
   Keystrokes are recorded as they are executed.
   Keystrokes are recorded as they are executed.
   End the definition with rl_end_kbd_macro ().
   End the definition with rl_end_kbd_macro ().
   If a numeric argument was explicitly typed, then append this
   If a numeric argument was explicitly typed, then append this
   definition to the end of the existing macro, and start by
   definition to the end of the existing macro, and start by
   re-executing the existing macro. */
   re-executing the existing macro. */
int
int
rl_start_kbd_macro (ignore1, ignore2)
rl_start_kbd_macro (ignore1, ignore2)
     int ignore1, ignore2;
     int ignore1, ignore2;
{
{
  if (RL_ISSTATE (RL_STATE_MACRODEF))
  if (RL_ISSTATE (RL_STATE_MACRODEF))
    {
    {
      _rl_abort_internal ();
      _rl_abort_internal ();
      return -1;
      return -1;
    }
    }
 
 
  if (rl_explicit_arg)
  if (rl_explicit_arg)
    {
    {
      if (current_macro)
      if (current_macro)
        _rl_with_macro_input (savestring (current_macro));
        _rl_with_macro_input (savestring (current_macro));
    }
    }
  else
  else
    current_macro_index = 0;
    current_macro_index = 0;
 
 
  RL_SETSTATE(RL_STATE_MACRODEF);
  RL_SETSTATE(RL_STATE_MACRODEF);
  return 0;
  return 0;
}
}
 
 
/* Stop defining a keyboard macro.
/* Stop defining a keyboard macro.
   A numeric argument says to execute the macro right now,
   A numeric argument says to execute the macro right now,
   that many times, counting the definition as the first time. */
   that many times, counting the definition as the first time. */
int
int
rl_end_kbd_macro (count, ignore)
rl_end_kbd_macro (count, ignore)
     int count, ignore;
     int count, ignore;
{
{
  if (RL_ISSTATE (RL_STATE_MACRODEF) == 0)
  if (RL_ISSTATE (RL_STATE_MACRODEF) == 0)
    {
    {
      _rl_abort_internal ();
      _rl_abort_internal ();
      return -1;
      return -1;
    }
    }
 
 
  current_macro_index -= rl_key_sequence_length - 1;
  current_macro_index -= rl_key_sequence_length - 1;
  current_macro[current_macro_index] = '\0';
  current_macro[current_macro_index] = '\0';
 
 
  RL_UNSETSTATE(RL_STATE_MACRODEF);
  RL_UNSETSTATE(RL_STATE_MACRODEF);
 
 
  return (rl_call_last_kbd_macro (--count, 0));
  return (rl_call_last_kbd_macro (--count, 0));
}
}
 
 
/* Execute the most recently defined keyboard macro.
/* Execute the most recently defined keyboard macro.
   COUNT says how many times to execute it. */
   COUNT says how many times to execute it. */
int
int
rl_call_last_kbd_macro (count, ignore)
rl_call_last_kbd_macro (count, ignore)
     int count, ignore;
     int count, ignore;
{
{
  if (current_macro == 0)
  if (current_macro == 0)
    _rl_abort_internal ();
    _rl_abort_internal ();
 
 
  if (RL_ISSTATE (RL_STATE_MACRODEF))
  if (RL_ISSTATE (RL_STATE_MACRODEF))
    {
    {
      rl_ding ();               /* no recursive macros */
      rl_ding ();               /* no recursive macros */
      current_macro[--current_macro_index] = '\0';      /* erase this char */
      current_macro[--current_macro_index] = '\0';      /* erase this char */
      return 0;
      return 0;
    }
    }
 
 
  while (count--)
  while (count--)
    _rl_with_macro_input (savestring (current_macro));
    _rl_with_macro_input (savestring (current_macro));
  return 0;
  return 0;
}
}
 
 
void
void
rl_push_macro_input (macro)
rl_push_macro_input (macro)
     char *macro;
     char *macro;
{
{
  _rl_with_macro_input (macro);
  _rl_with_macro_input (macro);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.