add :refresh command
[cmus.git] / cmdline.c
blobab1bb4c77724d08c2835a4da3e84e8c61e8217b1
1 /*
2 * Copyright 2005 Timo Hirvonen
3 */
5 #include <cmdline.h>
7 #include <uchar.h>
8 #include <xmalloc.h>
9 #include <debug.h>
11 struct cmdline cmdline;
13 #define SANITY_CHECK() \
14 do { \
15 BUG_ON(cmdline.bpos > cmdline.blen); \
16 BUG_ON(cmdline.bpos < 0); \
17 BUG_ON(cmdline.cpos < 0); \
18 } while (0)
21 void cmdline_init(void)
23 cmdline.blen = 0;
24 cmdline.clen = 0;
25 cmdline.bpos = 0;
26 cmdline.cpos = 0;
27 cmdline.size = 128;
28 cmdline.line = xnew(char, cmdline.size);
29 cmdline.line[0] = 0;
32 void cmdline_insert_ch(uchar ch)
34 int size;
36 SANITY_CHECK();
38 size = u_char_size(ch);
39 if (cmdline.blen + size > cmdline.size) {
40 cmdline.size *= 2;
41 cmdline.line = xrenew(char, cmdline.line, cmdline.size);
43 memmove(cmdline.line + cmdline.bpos + size,
44 cmdline.line + cmdline.bpos,
45 cmdline.blen - cmdline.bpos + 1);
46 u_set_char_raw(cmdline.line, &cmdline.bpos, ch);
47 cmdline.cpos++;
48 cmdline.blen += size;
49 cmdline.clen++;
52 void cmdline_backspace(void)
54 int bpos, size;
56 SANITY_CHECK();
58 if (cmdline.bpos == 0)
59 return;
61 bpos = cmdline.bpos;
62 u_prev_char_pos(cmdline.line, &bpos);
63 size = cmdline.bpos - bpos;
65 memmove(cmdline.line + bpos,
66 cmdline.line + cmdline.bpos,
67 cmdline.blen - cmdline.bpos + 1);
68 cmdline.bpos -= size;
69 cmdline.cpos--;
70 cmdline.blen -= size;
71 cmdline.clen--;
74 void cmdline_delete_ch(void)
76 uchar ch;
77 int size, bpos;
79 SANITY_CHECK();
81 if (cmdline.bpos == cmdline.blen)
82 return;
83 bpos = cmdline.bpos;
84 u_get_char(cmdline.line, &bpos, &ch);
85 size = u_char_size(ch);
86 cmdline.blen -= size;
87 cmdline.clen--;
88 memmove(cmdline.line + cmdline.bpos,
89 cmdline.line + cmdline.bpos + size,
90 cmdline.blen - cmdline.bpos + 1);
93 void cmdline_set_text(const char *text)
95 int len = strlen(text);
97 if (len >= cmdline.size) {
98 while (len >= cmdline.size)
99 cmdline.size *= 2;
100 cmdline.line = xrenew(char, cmdline.line, cmdline.size);
102 memcpy(cmdline.line, text, len + 1);
103 cmdline.cpos = u_strlen(cmdline.line);
104 cmdline.bpos = len;
105 cmdline.clen = cmdline.cpos;
106 cmdline.blen = len;
109 void cmdline_clear(void)
111 cmdline.blen = 0;
112 cmdline.clen = 0;
113 cmdline.bpos = 0;
114 cmdline.cpos = 0;
115 cmdline.line[0] = 0;
118 void cmdline_move_left(void)
120 SANITY_CHECK();
122 if (cmdline.bpos > 0) {
123 cmdline.cpos--;
124 u_prev_char_pos(cmdline.line, &cmdline.bpos);
128 void cmdline_move_right(void)
130 SANITY_CHECK();
132 if (cmdline.bpos < cmdline.blen) {
133 uchar ch;
135 u_get_char(cmdline.line, &cmdline.bpos, &ch);
136 cmdline.cpos++;
140 void cmdline_move_home(void)
142 SANITY_CHECK();
144 cmdline.cpos = 0;
145 cmdline.bpos = 0;
148 void cmdline_move_end(void)
150 SANITY_CHECK();
152 cmdline.cpos = cmdline.clen;
153 cmdline.bpos = cmdline.blen;