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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/* parc
* Copyright (C) 2025 Ekaitz Zarraga <ekaitz@elenq.tech>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include "piece-table.h"
typedef struct _string
{
char *start;
size_t length;
}
string;
void
string_init (string *str)
{
str->start = NULL;
str->length = 0;
}
string
read_file (const char *path)
{
/*
* The buffer has to be freed later.
*/
string out;
FILE *in;
char *buff = NULL;
size_t read = 0, total_size = 0, block_size = 1024;
in = fopen (path, "r"); /* TODO: Error handling!*/
do
{
buff = realloc (buff, sizeof (*buff) * (total_size + block_size));
read = fread (buff + total_size, sizeof (*buff), block_size, in);
total_size += read;
}
while (read == block_size );
buff = realloc (buff, sizeof (*buff) * total_size);
fclose (in);
out.start = buff;
out.length = total_size;
return out;
}
typedef struct _editor
{
piece_table *pt;
const char *path;
string orig;
}
editor;
/*
* https://texteditors.org/cgi-bin/wiki.pl?Implementing_Undo_For_Text_Editors
*/
editor *
editor_create (void)
{
editor *ed = malloc (sizeof (*ed));
ed->pt = piece_table_create_from_str ("", 0);
ed->path = NULL;
string_init (&ed->orig);
return ed;
}
void
editor_open (editor *ed, const char *path)
{
ed->path = path;
piece_table_destroy (ed->pt);
ed->orig = read_file (ed->path);
ed->pt = piece_table_create_from_str (ed->orig.start, ed->orig.length);
}
void
editor_destroy (editor *ed)
{
free (ed->orig.start);
piece_table_destroy (ed->pt);
free (ed);
}
void
editor_display (editor *ed)
{
/* Debug only */
size_t len = piece_table_length (ed->pt);
char *disp = malloc (sizeof (*disp) * len + 1);
piece_table_to_string (ed->pt, disp, len);
printf ("%s", disp);
free (disp);
}
|