|
@@ -17,9 +17,15 @@ struct buffer;
|
|
|
typedef void (*buffer_hook_func)(struct buffer *);
|
|
typedef void (*buffer_hook_func)(struct buffer *);
|
|
|
DA_DEF_STRUCT(buffer_hook_func, buffer_hook_da);
|
|
DA_DEF_STRUCT(buffer_hook_func, buffer_hook_da);
|
|
|
|
|
|
|
|
|
|
+enum buffer_mode {
|
|
|
|
|
+ BUFFER_MODE_TEXT = 0,
|
|
|
|
|
+ BUFFER_MODE_FILE_BROWSER,
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
struct buffer {
|
|
struct buffer {
|
|
|
struct buffer_data data;
|
|
struct buffer_data data;
|
|
|
struct buffer_line_da lines;
|
|
struct buffer_line_da lines;
|
|
|
|
|
+ enum buffer_mode mode;
|
|
|
size_t render_start;
|
|
size_t render_start;
|
|
|
size_t cur;
|
|
size_t cur;
|
|
|
size_t high_col;
|
|
size_t high_col;
|
|
@@ -114,6 +120,8 @@ size_t buffer_calc_cur_col(const struct buffer *buf);
|
|
|
size_t buffer_calc_cur_row(const struct buffer *buf);
|
|
size_t buffer_calc_cur_row(const struct buffer *buf);
|
|
|
struct ret_size_t_size_t buffer_calc_cur_pos(const struct buffer *buf);
|
|
struct ret_size_t_size_t buffer_calc_cur_pos(const struct buffer *buf);
|
|
|
|
|
|
|
|
|
|
+struct buffer buffer_list_dir(const char *path);
|
|
|
|
|
+
|
|
|
void buffer_err_set(enum buffer_err *err, enum buffer_err err_);
|
|
void buffer_err_set(enum buffer_err *err, enum buffer_err err_);
|
|
|
|
|
|
|
|
#if defined(BUFFER_IMP) || defined(IMP)
|
|
#if defined(BUFFER_IMP) || defined(IMP)
|
|
@@ -171,9 +179,7 @@ buffer_parse_lines(struct buffer *buf)
|
|
|
tail->start = i + 1;
|
|
tail->start = i + 1;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if ( tail->end == 0 ) {
|
|
|
|
|
- tail->end = data.size;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ DA_TAIL(buf->lines).end = data.size;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#define MAX(a, b) ((a) > (b)) * (a) + ((a) < (b)) * (b)
|
|
#define MAX(a, b) ((a) > (b)) * (a) + ((a) < (b)) * (b)
|
|
@@ -386,7 +392,7 @@ buffer_remove_char_mv_cur(struct buffer *buf, size_t index)
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ( buf->data.size == index ) {
|
|
|
|
|
|
|
+ if ( buf->data.size - 1 == index ) {
|
|
|
buf->data.items[--buf->data.size] = 0;
|
|
buf->data.items[--buf->data.size] = 0;
|
|
|
--buf->cur;
|
|
--buf->cur;
|
|
|
return;
|
|
return;
|
|
@@ -409,7 +415,7 @@ buffer_remove_char(struct buffer *buf, size_t index)
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ( buf->data.size == index ) {
|
|
|
|
|
|
|
+ if ( buf->data.size - 1 == index ) {
|
|
|
buf->data.items[--buf->data.size] = 0;
|
|
buf->data.items[--buf->data.size] = 0;
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
@@ -641,6 +647,28 @@ buffer_calc_cur_pos(const struct buffer *buf)
|
|
|
};
|
|
};
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+struct buffer
|
|
|
|
|
+buffer_list_dir(const char *path)
|
|
|
|
|
+{
|
|
|
|
|
+ struct buffer buf = buffer_create();
|
|
|
|
|
+ size_t files_size = 0;
|
|
|
|
|
+ const char **files = list_dir(path, &files_size, NULL);
|
|
|
|
|
+ if ( files == NULL ) {
|
|
|
|
|
+ fprintf(stderr, "[ERROR] Failed to open dir: %s\n", path);
|
|
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
|
|
+ }
|
|
|
|
|
+ for ( size_t i = 0; i < files_size; ++i ) {
|
|
|
|
|
+ const char *str = files[i];
|
|
|
|
|
+ while ( *str != '\0' ) {
|
|
|
|
|
+ DA_APPEND(buf.data, *str);
|
|
|
|
|
+ str++;
|
|
|
|
|
+ }
|
|
|
|
|
+ DA_APPEND(buf.data, '\n');
|
|
|
|
|
+ }
|
|
|
|
|
+ list_dir_destroy(files);
|
|
|
|
|
+ return buf;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void
|
|
void
|
|
|
buffer_err_set(enum buffer_err *err, enum buffer_err err_)
|
|
buffer_err_set(enum buffer_err *err, enum buffer_err err_)
|
|
|
{
|
|
{
|