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