text: /* manexamp.c -- The examples which appear in the documentation are here. */
  
  /* Copyright (C) 1987-2009 Free Software Foundation, Inc.
  
     This file is part of the GNU Readline Library (Readline), a library for
     reading lines of text with interactive input and history editing.
  
     Readline is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.
  
     Readline is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
  
     You should have received a copy of the GNU General Public License
     along with Readline.  If not, see <http://www.gnu.org/licenses/>.
  */
  
  #include <stdio.h>
  #include <readline/readline.h>
  
  /* **************************************************************** */
  /*                                                                  */
  /*   			How to Emulate gets ()			    */
  /*                                                                  */
  /* **************************************************************** */
  
  /* A static variable for holding the line. */
  static char *line_read = (char *)NULL;
  
  /* Read a string, and return a pointer to it.  Returns NULL on EOF. */
  char *
  rl_gets ()
  {
    /* If the buffer has already been allocated, return the memory
       to the free pool. */
    if (line_read)
      {
        free (line_read);
        line_read = (char *)NULL;
      }
  
    /* Get a line from the user. */
    line_read = readline ("");
  
    /* If the line has any text in it, save it on the history. */
    if (line_read && *line_read)
      add_history (line_read);
  
    return (line_read);
  }
  
  /* **************************************************************** */
  /*                                                                  */
  /*        Writing a Function to be Called by Readline.              */
  /*                                                                  */
  /* **************************************************************** */
  
  /* Invert the case of the COUNT following characters. */
  invert_case_line (count, key)
       int count, key;
  {
    register int start, end;
  
    start = rl_point;
  
    if (count < 0)
      {
        direction = -1;
        count = -count;
      }
    else
      direction = 1;
        
    /* Find the end of the range to modify. */
    end = start + (count * direction);
  
    /* Force it to be within range. */
    if (end > rl_end)
      end = rl_end;
    else if (end < 0)
      end = -1;
  
    if (start > end)
      {
        int temp = start;
        start = end;
        end = temp;
      }
  
    if (start == end)
      return;
  
    /* Tell readline that we are modifying the line, so save the undo
       information. */
    rl_modifying (start, end);
  
    for (; start != end; start += direction)
      {
        if (_rl_uppercase_p (rl_line_buffer[start]))
  	rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]);
        else if (_rl_lowercase_p (rl_line_buffer[start]))
  	rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]);
      }
  
    /* Move point to on top of the last character changed. */
    rl_point = end - direction;
  }
  