|
|
@@ -6,6 +6,7 @@
|
|
|
struct buffer {
|
|
|
DA_DEF_STRUCT_ITEM(char, data);
|
|
|
size_t cur;
|
|
|
+ const char *filepath;
|
|
|
};
|
|
|
|
|
|
enum buffer_err {
|
|
|
@@ -16,6 +17,8 @@ enum buffer_err {
|
|
|
BUFFER_ERR_FAIL_READ_FILE,
|
|
|
BUFFER_ERR_START_GT_END,
|
|
|
BUFFER_ERR_INVALID_END_SIZE,
|
|
|
+ BUFFER_ERR_FAIL_GET_REALPATH,
|
|
|
+ BUFFER_ERR_FAIL_SAVE,
|
|
|
};
|
|
|
|
|
|
struct ret_buffer_err {
|
|
|
@@ -39,6 +42,7 @@ void buffer_destroy(struct buffer buf);
|
|
|
|
|
|
struct ret_buffer_err buffer_load_from_file(struct buffer buf,
|
|
|
const char *filepath);
|
|
|
+enum buffer_err buffer_save(struct buffer buf);
|
|
|
enum buffer_err buffer_save_to_file(struct buffer buf, const char *filepath);
|
|
|
|
|
|
struct buffer buffer_mv_cur_left(struct buffer buf);
|
|
|
@@ -81,6 +85,9 @@ void
|
|
|
buffer_destroy(struct buffer buf)
|
|
|
{
|
|
|
free(buf.data.items);
|
|
|
+ if ( buf.filepath != NULL ) {
|
|
|
+ free((char *) buf.filepath);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
struct ret_buffer_err
|
|
|
@@ -90,10 +97,23 @@ buffer_load_from_file(struct buffer buf, const char *filepath)
|
|
|
void *ptr;
|
|
|
size_t file_size;
|
|
|
enum file_err err;
|
|
|
+ char *fp = realpath(filepath, NULL);
|
|
|
+ if ( fp == NULL ) {
|
|
|
+ return (struct ret_buffer_err) {
|
|
|
+ .f1 = buf,
|
|
|
+ .f2 = BUFFER_ERR_FAIL_GET_REALPATH
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
RET_UNWRAP3(ptr, file_size, err,
|
|
|
- struct ret_void_p_err, file_read_all(filepath));
|
|
|
+ struct ret_void_p_err, file_read_all(fp));
|
|
|
|
|
|
if ( err != FILE_ERR_OK ) {
|
|
|
+ if ( err == FILE_ERR_EMPTY ) {
|
|
|
+ buf.filepath = fp;
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
+ free(fp);
|
|
|
return (struct ret_buffer_err) {
|
|
|
.f1 = buf,
|
|
|
.f2 = BUFFER_ERR_FAIL_READ_FILE
|
|
|
@@ -102,21 +122,31 @@ buffer_load_from_file(struct buffer buf, const char *filepath)
|
|
|
|
|
|
buffer_destroy(buf);
|
|
|
|
|
|
+ buf.filepath = fp;
|
|
|
buf.data.items = ptr;
|
|
|
buf.data.size = file_size - 1;
|
|
|
buf.data.cap = file_size;
|
|
|
|
|
|
+exit: ;
|
|
|
return (struct ret_buffer_err) {
|
|
|
.f1 = buf,
|
|
|
.f2 = BUFFER_ERR_OK
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+enum buffer_err
|
|
|
+buffer_save(struct buffer buf)
|
|
|
+{
|
|
|
+ return buffer_save_to_file(buf, buf.filepath);
|
|
|
+}
|
|
|
+
|
|
|
enum buffer_err
|
|
|
buffer_save_to_file(struct buffer buf, const char *filepath)
|
|
|
{
|
|
|
- (void) buf;
|
|
|
- (void) filepath;
|
|
|
+ enum file_err err = file_save(filepath, buf.data.items, buf.data.size);
|
|
|
+ if ( err != FILE_ERR_OK ) {
|
|
|
+ return BUFFER_ERR_FAIL_SAVE;
|
|
|
+ }
|
|
|
|
|
|
return BUFFER_ERR_OK;
|
|
|
}
|