|
|
@@ -4,6 +4,8 @@
|
|
|
#include <stdbool.h>
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
+#include "str.h"
|
|
|
+
|
|
|
struct buffer_line {
|
|
|
size_t start;
|
|
|
size_t end;
|
|
|
@@ -23,13 +25,14 @@ enum buffer_mode {
|
|
|
};
|
|
|
|
|
|
struct buffer {
|
|
|
+ struct str name;
|
|
|
struct buffer_data data;
|
|
|
struct buffer_line_da lines;
|
|
|
enum buffer_mode mode;
|
|
|
size_t render_start;
|
|
|
size_t cur;
|
|
|
size_t high_col;
|
|
|
- const char *filepath;
|
|
|
+ struct str filepath;
|
|
|
struct {
|
|
|
struct vec2 pos;
|
|
|
struct vec2 vel;
|
|
|
@@ -97,6 +100,8 @@ void buffer_mv_cur_down(struct buffer *buf);
|
|
|
|
|
|
bool buffer_check_and_fix_cur(struct buffer *buf);
|
|
|
|
|
|
+void buffer_insert_str_as_line(struct buffer *buf, struct str str);
|
|
|
+
|
|
|
void buffer_insert_char(struct buffer *buf, char c, size_t index);
|
|
|
void buffer_remove_char_mv_cur(struct buffer *buf, size_t index);
|
|
|
void buffer_remove_char(struct buffer *buf, size_t index);
|
|
|
@@ -158,8 +163,8 @@ void
|
|
|
buffer_destroy(struct buffer *buf)
|
|
|
{
|
|
|
free(buf->data.items);
|
|
|
- if ( buf->filepath != NULL ) {
|
|
|
- free((char *) buf->filepath);
|
|
|
+ if ( buf->filepath.data != NULL ) {
|
|
|
+ free((char *) buf->filepath.data);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -251,27 +256,21 @@ buffer_load_from_file(struct buffer *buf, const char *filepath,
|
|
|
void *ptr;
|
|
|
size_t file_size;
|
|
|
enum file_err file_err;
|
|
|
- char *fp = realpath(filepath, NULL);
|
|
|
- if ( fp == NULL ) {
|
|
|
- buffer_err_set(err, BUFFER_ERR_FAIL_GET_REALPATH);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- ptr = file_read_all(fp, &file_size, &file_err);
|
|
|
+ ptr = file_read_all(filepath, &file_size, &file_err);
|
|
|
|
|
|
if ( file_err != FILE_ERR_OK ) {
|
|
|
if ( file_err == FILE_ERR_EMPTY ) {
|
|
|
- buf->filepath = fp;
|
|
|
+ buf->filepath = str_from_cstr_ns(filepath);
|
|
|
goto exit;
|
|
|
}
|
|
|
- free(fp);
|
|
|
buffer_err_set(err, BUFFER_ERR_FAIL_READ_FILE);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
buffer_destroy(buf);
|
|
|
|
|
|
- buf->filepath = fp;
|
|
|
+ buf->name = str_from_cstr_ns(filepath);
|
|
|
+ buf->filepath = str_from_cstr_ns(filepath);
|
|
|
buf->data.items = ptr;
|
|
|
buf->data.size = file_size - 1;
|
|
|
buf->data.cap = file_size;
|
|
|
@@ -284,7 +283,7 @@ exit: ;
|
|
|
void
|
|
|
buffer_save(const struct buffer *buf, enum buffer_err *err)
|
|
|
{
|
|
|
- buffer_save_to_file(buf, buf->filepath, err);
|
|
|
+ buffer_save_to_file(buf, buf->filepath.data, err);
|
|
|
}
|
|
|
|
|
|
void
|
|
|
@@ -366,6 +365,22 @@ bool buffer_check_and_fix_cur(struct buffer *buf) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+void
|
|
|
+buffer_insert_str_as_line(struct buffer *buf, struct str str)
|
|
|
+{
|
|
|
+ struct str str_ = str_strip(str);
|
|
|
+
|
|
|
+ while ((buf->data.size + str_.size + 10) > buf->data.cap) {
|
|
|
+ DA_INC_CAP(buf->data);
|
|
|
+ }
|
|
|
+
|
|
|
+ memcpy(buf->data.items+buf->data.size, str_.data, str_.size);
|
|
|
+ buf->data.size += str_.size;
|
|
|
+
|
|
|
+ DA_APPEND(buf->data, '\n');
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void
|
|
|
buffer_insert_char(struct buffer *buf, char c, size_t index)
|
|
|
{
|