Merge from vendor branch BINUTILS:
[dragonfly.git] / contrib / libreadline / examples / manexamp.c
1 /* manexamp.c -- The examples which appear in the documentation are here. */
2
3 #include <stdio.h>
4 #include <readline/readline.h>
5
6
7 /* **************************************************************** */
8 /*                                                                  */
9 *                       How to Emulate gets ()                      */
10 /*                                                                  */
11 /* **************************************************************** */
12
13 /* A static variable for holding the line. */
14 static char *line_read = (char *)NULL;
15
16 /* Read a string, and return a pointer to it.  Returns NULL on EOF. */
17 char *
18 rl_gets ()
19 {
20   /* If the buffer has already been allocated, return the memory
21      to the free pool. */
22   if (line_read)
23     {
24       free (line_read);
25       line_read = (char *)NULL;
26     }
27
28   /* Get a line from the user. */
29   line_read = readline ("");
30
31   /* If the line has any text in it, save it on the history. */
32   if (line_read && *line_read)
33     add_history (line_read);
34
35   return (line_read);
36 }
37
38 /* **************************************************************** */
39 /*                                                                  */
40 /*        Writing a Function to be Called by Readline.              */
41 /*                                                                  */
42 /* **************************************************************** */
43
44 /* Invert the case of the COUNT following characters. */
45 invert_case_line (count, key)
46      int count, key;
47 {
48   register int start, end;
49
50   start = rl_point;
51
52   if (count < 0)
53     {
54       direction = -1;
55       count = -count;
56     }
57   else
58     direction = 1;
59       
60   /* Find the end of the range to modify. */
61   end = start + (count * direction);
62
63   /* Force it to be within range. */
64   if (end > rl_end)
65     end = rl_end;
66   else if (end < 0)
67     end = -1;
68
69   if (start > end)
70     {
71       int temp = start;
72       start = end;
73       end = temp;
74     }
75
76   if (start == end)
77     return;
78
79   /* Tell readline that we are modifying the line, so save the undo
80      information. */
81   rl_modifying (start, end);
82
83   for (; start != end; start += direction)
84     {
85       if (uppercase_p (rl_line_buffer[start]))
86         rl_line_buffer[start] = to_lower (rl_line_buffer[start]);
87       else if (lowercase_p (rl_line_buffer[start]))
88         rl_line_buffer[start] = to_upper (rl_line_buffer[start]);
89     }
90
91   /* Move point to on top of the last character changed. */
92   rl_point = end - direction;
93 }
94