No specific user configuration
[platform/upstream/bash.git] / lib / readline / examples / manexamp.c
1 /* manexamp.c -- The examples which appear in the documentation are here. */
2
3 /* Copyright (C) 1987-2009 Free Software Foundation, Inc.
4
5    This file is part of the GNU Readline Library (Readline), a library for
6    reading lines of text with interactive input and history editing.
7
8    Readline is free software: you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation, either version 3 of the License, or
11    (at your option) any later version.
12
13    Readline is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include <stdio.h>
23 #include <readline/readline.h>
24
25 /* **************************************************************** */
26 /*                                                                  */
27 /*                      How to Emulate gets ()                      */
28 /*                                                                  */
29 /* **************************************************************** */
30
31 /* A static variable for holding the line. */
32 static char *line_read = (char *)NULL;
33
34 /* Read a string, and return a pointer to it.  Returns NULL on EOF. */
35 char *
36 rl_gets ()
37 {
38   /* If the buffer has already been allocated, return the memory
39      to the free pool. */
40   if (line_read)
41     {
42       free (line_read);
43       line_read = (char *)NULL;
44     }
45
46   /* Get a line from the user. */
47   line_read = readline ("");
48
49   /* If the line has any text in it, save it on the history. */
50   if (line_read && *line_read)
51     add_history (line_read);
52
53   return (line_read);
54 }
55
56 /* **************************************************************** */
57 /*                                                                  */
58 /*        Writing a Function to be Called by Readline.              */
59 /*                                                                  */
60 /* **************************************************************** */
61
62 /* Invert the case of the COUNT following characters. */
63 invert_case_line (count, key)
64      int count, key;
65 {
66   register int start, end;
67
68   start = rl_point;
69
70   if (count < 0)
71     {
72       direction = -1;
73       count = -count;
74     }
75   else
76     direction = 1;
77       
78   /* Find the end of the range to modify. */
79   end = start + (count * direction);
80
81   /* Force it to be within range. */
82   if (end > rl_end)
83     end = rl_end;
84   else if (end < 0)
85     end = -1;
86
87   if (start > end)
88     {
89       int temp = start;
90       start = end;
91       end = temp;
92     }
93
94   if (start == end)
95     return;
96
97   /* Tell readline that we are modifying the line, so save the undo
98      information. */
99   rl_modifying (start, end);
100
101   for (; start != end; start += direction)
102     {
103       if (_rl_uppercase_p (rl_line_buffer[start]))
104         rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]);
105       else if (_rl_lowercase_p (rl_line_buffer[start]))
106         rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]);
107     }
108
109   /* Move point to on top of the last character changed. */
110   rl_point = end - direction;
111 }