summaryrefslogtreecommitdiff
path: root/firmware/src/editor.c
blob: 7b5eeb186342de54a7a3a9854f002a1db42406db (plain) (blame)
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;
}