summaryrefslogtreecommitdiff
path: root/src/dged/text.h
blob: 1ad6dbce4e9e7369b48501fcad6205ade8755ffb (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
117
118
119
#ifndef _TEXT_H
#define _TEXT_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#include "location.h"
#include "utf8.h"

struct text;

enum line_endings {
  LineEnding_LF,
  LineEnding_CRLF,
};

struct text_chunk {
  uint8_t *text;
  uint32_t nbytes;
  uint32_t line;
  bool allocated;
};

struct text *text_create(uint32_t initial_capacity);
void text_destroy(struct text *text);

/**
 * Clear the text without reclaiming memory
 */
void text_clear(struct text *text);

void text_insert_at(struct text *text, uint32_t line, uint32_t offset,
                    uint8_t *bytes, uint32_t nbytes, uint32_t *lines_added);

void text_append(struct text *text, uint8_t *bytes, uint32_t nbytes,
                 uint32_t *lines_added);

void text_delete(struct text *text, uint32_t start_line, uint32_t start_offset,
                 uint32_t end_line, uint32_t end_offset);

enum line_endings text_get_line_ending(const struct text *);

size_t text_size(const struct text *text);
uint32_t text_num_lines(const struct text *text);
uint32_t text_line_size(const struct text *text, uint32_t lineidx);
struct utf8_codepoint_iterator
text_line_codepoint_iterator(const struct text *text, uint32_t lineidx);
struct utf8_codepoint_iterator
text_chunk_codepoint_iterator(const struct text_chunk *chunk);

typedef void (*chunk_cb)(struct text_chunk *chunk, void *userdata);
void text_for_each_line(struct text *text, uint32_t line, uint32_t nlines,
                        chunk_cb callback, void *userdata);

void text_for_each_chunk(struct text *text, chunk_cb callback, void *userdata);

struct text_chunk text_get_line(struct text *text, uint32_t line);
struct text_chunk text_get_region(struct text *text, uint32_t start_line,
                                  uint32_t start_offset, uint32_t end_line,
                                  uint32_t end_offset);

struct text_chunk text_get(struct text *text, void *(*alloc)(size_t size));

enum text_property_type {
  TextProperty_Colors,
  TextProperty_Data,
};

struct text_property_colors {
  bool set_fg;
  uint32_t fg;
  bool set_bg;
  uint32_t bg;
  bool underline;
  bool inverted;
};

struct text_property {
  struct location start;
  struct location end;
  enum text_property_type type;
  union property_data {
    struct text_property_colors colors;
    void *userdata;
  } data;
};

typedef uint64_t layer_id;
enum layer_ids {
  PropertyLayer_Default = 0,
};

void text_add_property(struct text *text, uint32_t start_line,
                       uint32_t start_offset, uint32_t end_line,
                       uint32_t end_offset, struct text_property property);

void text_add_property_to_layer(struct text *text, uint32_t start_line,
                                uint32_t start_offset, uint32_t end_line,
                                uint32_t end_offset,
                                struct text_property property, layer_id layer);

layer_id text_add_property_layer(struct text *text);
void text_remove_property_layer(struct text *text, layer_id layer);

void text_get_properties(struct text *text, uint32_t line, uint32_t offset,
                         struct text_property **properties,
                         uint32_t max_nproperties, uint32_t *nproperties);

void text_get_properties_filtered(struct text *text, uint32_t line,
                                  uint32_t offset,
                                  struct text_property **properties,
                                  uint32_t max_nproperties,
                                  uint32_t *nproperties, layer_id layer);

void text_clear_properties(struct text *text);
void text_clear_property_layer(struct text *text, layer_id layer);

#endif