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
86
87
|
#include "editor.h"
#include <string.h>
Editor newEditor(unsigned int size) {
unsigned char* block = calloc(1, size + 1);
if (block == NULL)
return NULL;
Editor editor;
editor.front.start = editor.front.end = block;
editor.back.start = editor.back.end = block + size;
return editor;
}
inline void freeEditor(Editor editor) {
free(editor.front.start);
}
inline unsigned int getFreeSpace(Editor editor) {
return editor.back.start - editor.front.end;
}
inline unsigned isFull(Editor editor) {
return getFreeSpace(editor) == NULL;
}
unsigned char* getNearCursor(Editor editor, signed int start, signed int end) {
unsigned char* block = (unsigned char*) calloc(1, end - start + 1);
if (block == NULL)
return NULL;
memcpy(block, editor.front.end + start, min(end - start, max(0, 0 - start)));
memcpy(block + max(0, 0 - start), editor.back.start + max(0, start), end - max(0, start));
return block;
}
void moveCursor(Editor editor, signed int change) {
if (change > 0) {
change = max(editor.back.end - editor.back.start, change);
memcpy(editor.front.end, editor.back.start, change);
editor.front.end += change;
editor.back.start += change;
} else if (change < 0) {
change = max(editor.front.end - editor.front.start, 0 - change);
memcpy(editor.back.start - change, editor.front.end - change, change);
editor.front.end -= change;
editor.back.start -= change;
}
}
inline void writeAtCursor(Editor editor, unsigned char character) {
editor.front.end++;
*editor.front.end = character;
}
void writeStringAtCursor(Editor editor, unsigned char* string) {
editor.front.end++;
memcpy(editor.front.end, string, strlen(string));
editor.front.end += strlen(string) - 1;
}
inline void writeAfterCursor(Editor editor, unsigned char character) {
editor.back.start--;
*editor.back.start = character;
}
void writeStringAfterCursor(Editor editor, unsigned char* string) {
editor.back.start -= strlen(string);
memcpy(editor.back.start, string, strlen(string));
}
inline void deleteAtCursor(Editor editor) {
editor.front.end--;
}
inline void deleteNAtCursor(Editor editor, unsigned int length) {
editor.front.end -= length;
}
inline void deleteAfterCursor(Editor editor) {
editor.back.start++;
}
inline void deleteNAfterCursor(Editor editor, unsigned int length) {
editor.back.start += length;
}
|