-
Notifications
You must be signed in to change notification settings - Fork 0
/
Line.cpp
85 lines (71 loc) · 1.17 KB
/
Line.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "Line.h"
Line::Line()
{
size = 80;
buffer = (char *)malloc(size * sizeof(char));
gapstart = 0;
gapend = size;
}
void Line::insert(char c)
{
if (gapstart < gapend) {
buffer[gapstart++] = c;
}
if (gapstart == gapend) {
size *= 2;
buffer = (char *)realloc(buffer, size * sizeof(char));
for (int i = size/2-1, j = size-1; i >= gapend; --i, --j) {
buffer[j] = buffer[i];
}
gapend += size/2;
}
}
void Line::del()
{
if (gapend < size)
++gapend;
}
void Line::backspace()
{
if (gapstart > 0)
--gapstart;
}
int Line::getCursorPosition() const
{
return gapstart;
}
int Line::getLength() const
{
return gapstart + (size - gapend);
}
char Line::getCharAt(int idx) const
{
if (idx >= gapstart)
idx += gapend - gapstart;
return buffer[idx];
}
void Line::moveCursorLeft()
{
if (gapstart > 0) {
buffer[--gapend] = buffer[--gapstart];
}
}
void Line::moveCursorRight()
{
if (gapend < size) {
buffer[gapstart++] = buffer[gapend++];
}
}
void Line::moveCursorTo(int idx)
{
if (idx < 0)
idx = 0;
if (idx > getLength())
idx = getLength();
while (idx > gapstart) {
moveCursorRight();
}
while (idx < gapstart) {
moveCursorLeft();
}
}