Ver código fonte

[buffer.h] Various misc changes

- Adding buffer mode
- Adding function to create buffer with list_dir output
Vinicius Teshima 1 ano atrás
pai
commit
6cb5bd0858
1 arquivos alterados com 33 adições e 5 exclusões
  1. 33 5
      src/buffer.h

+ 33 - 5
src/buffer.h

@@ -17,9 +17,15 @@ struct buffer;
 typedef void (*buffer_hook_func)(struct buffer *);
 DA_DEF_STRUCT(buffer_hook_func, buffer_hook_da);
 
+enum buffer_mode {
+	BUFFER_MODE_TEXT = 0,
+	BUFFER_MODE_FILE_BROWSER,
+};
+
 struct buffer {
 	struct buffer_data data;
 	struct buffer_line_da lines;
+	enum buffer_mode mode;
 	size_t render_start;
 	size_t cur;
 	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);
 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_);
 
 #if defined(BUFFER_IMP) || defined(IMP)
@@ -171,9 +179,7 @@ buffer_parse_lines(struct buffer *buf)
 			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)
@@ -386,7 +392,7 @@ buffer_remove_char_mv_cur(struct buffer *buf, size_t index)
 		return;
 	}
 
-	if ( buf->data.size == index ) {
+	if ( buf->data.size - 1 == index ) {
 		buf->data.items[--buf->data.size] = 0;
 		--buf->cur;
 		return;
@@ -409,7 +415,7 @@ buffer_remove_char(struct buffer *buf, size_t index)
 		return;
 	}
 
-	if ( buf->data.size == index ) {
+	if ( buf->data.size - 1 == index ) {
 		buf->data.items[--buf->data.size] = 0;
 		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
 buffer_err_set(enum buffer_err *err, enum buffer_err err_)
 {