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 *
rl_gets()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. */
invert_case_line(count,key)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 }
112