1define rline_beep ()
2{
3   () = fputs ("\007", stdout);
4   () = fflush (stdout);
5}
6
7define rline_bol ()
8{
9   rline_call ("bol");
10}
11
12define rline_eol ()
13{
14   rline_call ("eol");
15}
16
17define rline_delete_line ()
18{
19   rline_set_line ("");
20}
21
22define rline_deleol ()
23{
24   rline_call ("deleol");
25}
26
27define rline_left ()
28{
29   rline_call ("left");
30}
31
32define rline_right ()
33{
34   rline_call ("right");
35}
36
37define rline_bdel ()
38{
39   rline_call ("bdel");
40}
41
42private define skip_non_word_chars (line, p)
43{
44   variable p1 = p, ch;
45   do
46     {
47	p = p1;
48	(p1, ch) = strskipchar (line, p, 1);
49     }
50   while (ch && not isalnum(ch));
51   return p;
52}
53
54private define skip_word_chars (line, p)
55{
56   variable p1 = p, ch;
57   do
58     {
59	p = p1;
60	(p1, ch) = strskipchar (line, p, 1);
61     }
62   while (isalnum(ch));
63   return p;
64}
65
66private define bskip_non_word_chars (line, p)
67{
68   variable p1 = p, ch;
69   do
70     {
71	p = p1;
72	(p1, ch) = strbskipchar (line, p, 1);
73     }
74   while (ch && not isalnum(ch));
75   return p;
76}
77
78private define bskip_word_chars (line, p)
79{
80   variable p1 = p, ch;
81   do
82     {
83	p = p1;
84	(p1, ch) = strbskipchar (line, p, 1);
85     }
86   while (isalnum(ch));
87   return p;
88}
89
90define rline_bskip_word ()
91{
92   variable line = rline_get_line (), p = rline_get_point ();
93   rline_set_point (bskip_word_chars (line, bskip_non_word_chars(line, p)));
94}
95
96define rline_skip_word ()
97{
98   variable line = rline_get_line (), p = rline_get_point ();
99   rline_set_point (skip_word_chars (line, skip_non_word_chars(line, p)));
100}
101
102private variable Mark = NULL;
103private variable Paste_Buffer = "";
104
105define rline_set_mark ()
106{
107   Mark = rline_get_point ();
108}
109
110private define get_mark (mp)
111{
112   if (Mark == NULL)
113     {
114	rline_beep ();
115	return -1;
116     }
117   @mp = Mark;
118   Mark = NULL;
119   return 0;
120}
121
122private define get_region (mp, pp)
123{
124   variable m;
125   if (-1 == get_mark (&m))
126     return -1;
127
128   variable p = rline_get_point ();
129   if (p < m)
130     (p, m) = (m, p);
131   @mp = m;
132   @pp = p;
133   return 0;
134}
135
136private define copy_region_to_pastebuffer (m, p)
137{
138   variable line = rline_get_line ();
139   Paste_Buffer = substrbytes (line, m+1, (p-m));
140}
141
142define rline_copy_region ()
143{
144   variable m, p;
145   if (-1 == get_region (&m, &p))
146     return;
147   copy_region_to_pastebuffer (m, p);
148}
149
150define rline_kill_region ()
151{
152   variable m, p;
153   if (-1 == get_region (&m, &p))
154     return;
155
156   copy_region_to_pastebuffer (m, p);
157   rline_set_point (m);
158   rline_del (p-m);
159}
160
161define rline_kill_eol ()
162{
163   rline_set_mark ();
164   rline_eol ();
165   rline_kill_region ();
166}
167
168define rline_kill_bol ()
169{
170   rline_set_mark ();
171   rline_bol ();
172   rline_kill_region ();
173}
174
175define rline_yank ()
176{
177   rline_ins (Paste_Buffer);
178}
179