2 visor - lightweight system-independent text editor and framework
3 Copyright (C) 2019 John Tsiombikas <nuclear@member.fsf.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>.
18 #ifndef LIB_VISOR_TEXTED_CORE_H_
19 #define LIB_VISOR_TEXTED_CORE_H_
22 typedef long vi_motion;
39 VI_MOT_WORD_NEXT = 'w',
40 VI_MOT_WORD_END = 'e',
41 VI_MOT_WORD_BEG = 'b',
42 VI_MOT_WORDP_NEXT = 'W',
43 VI_MOT_WORDP_BEG = 'B',
44 VI_MOT_LINE_BEG = '^',
45 VI_MOT_LINE_END = '$',
46 VI_MOT_SENT_NEXT = ')',
47 VI_MOT_SENT_PREV = '(',
48 VI_MOT_PAR_NEXT = '}',
49 VI_MOT_PAR_PREV = '{',
50 VI_MOT_SECT_NEXT = ']',
51 VI_MOT_SECT_PREV = '[',
52 VI_MOT_FIND_NEXT = 'f',
53 VI_MOT_FIND_PREV = 'F',
54 VI_MOT_FINDTO_NEXT = 't',
55 VI_MOT_FINDTO_PREV = 'T',
64 #define VI_MOTION(d, n) (((long)(n) << 8) | ((long)(d)))
67 void *(*malloc)(unsigned long);
69 void *(*realloc)(void*, unsigned long); /* can be null, will use malloc/free */
73 vi_file *(*open)(const char *path);
74 long (*size)(vi_file *file);
75 void (*close)(vi_file *file);
76 void *(*map)(vi_file *file);
77 void (*unmap)(vi_file *file);
78 long (*read)(vi_file *file, void *buf, long count);
79 long (*write)(vi_file *file, void *buf, long count);
80 long (*seek)(vi_file *file, long offs, int whence);
84 void (*clear)(void *cls);
85 void (*clear_line)(void *cls);
86 void (*clear_line_at)(int y, void *cls);
87 void (*setcursor)(int x, int y, void *cls);
88 void (*putchar)(char c, void *cls);
89 void (*putchar_at)(int x, int y, char c, void *cls);
90 void (*scroll)(int nlines, void *cls);
91 void (*del_back)(void *cls);
92 void (*del_fwd)(void *cls);
93 void (*status)(char *s, void *cls);
96 /* Create a new instance of the visor editor.
97 * The alloc argument can be used to provide custom memory allocation
98 * functions. It can be null in a hosted build, or if you set the HAVE_LIBC
99 * preprocessor macro, in which case the standard library allocator will be
102 struct visor *vi_create(struct vi_alloc *mm);
103 void vi_destroy(struct visor *vi);
105 void vi_set_fileops(struct visor *vi, struct vi_fileops *fop);
106 void vi_set_ttyops(struct visor *vi, struct vi_ttyops *tty);
108 /* vi_new_buf creates a new buffer and inserts it in the buffer list. If the
109 * path pointer is null, the new buffer will be empty, otherwise it's as if it
110 * was followed by a vi_buf_read call to read a file into the buffer.
112 struct vi_buffer *vi_new_buf(struct visor *vi, const char *path);
113 int vi_delete_buf(struct visor *vi, struct vi_buffer *vb);
114 int vi_num_buf(struct visor *vi);
116 struct vi_buffer *vi_getcur_buf(struct visor *vi);
117 void vi_setcur_buf(struct visor *vi, struct vi_buffer *vb);
119 struct vi_buffer *vi_next_buf(struct visor *vi);
120 struct vi_buffer *vi_prev_buf(struct visor *vi);
123 /* reset a buffer to the newly created state, freeing all resources */
124 void vi_buf_reset(struct vi_buffer *vb);
126 /* Read a file into the buffer.
127 * Returns 0 on success, -1 on failure.
129 int vi_buf_read(struct vi_buffer *vb, const char *path);
131 /* Write the buffer out to a file. If the path is null, the buffer will be
132 * written out to the same file that was last read. If the path is null and
133 * no file was ever read in this buffer, the write fails.
134 * Returns 0 on success, -1 on failure.
136 int vi_buf_write(struct vi_buffer *vb, const char *path);
137 long vi_buf_size(struct vi_buffer *vb);
139 /* find the span which corresponds to the specified text position */
140 struct vi_span *vi_buf_find_span(struct vi_buffer *vb, vi_addr at);
142 void vi_buf_ins_begin(struct vi_buffer *vb, vi_motion mot);
143 void vi_buf_insert(struct vi_buffer *vb, char *s);
144 void vi_buf_ins_end(struct vi_buffer *vb);
146 void vi_buf_del(struct vi_buffer *vb, vi_motion mot);
147 void vi_buf_yank(struct vi_buffer *vb, vi_motion mot);
149 #endif /* LIB_VISOR_TEXTED_CORE_H_ */