CE edit Introduce viewer mode
All checks were successful
Build ISO image / build-and-deploy (push) Successful in 1m54s
Build documentation / build-and-deploy (push) Successful in 47s

This commit is contained in:
2026-04-29 02:13:49 +02:00
parent 1ea7b4171e
commit da621c7ec6
3 changed files with 60 additions and 9 deletions

View File

@@ -130,7 +130,8 @@ static size_t count_digits(size_t n) {
return count; return count;
} }
void edit_start(const char* volume, const char* file_path, const char* text, size_t text_len) { void edit_start(const char* volume, const char* file_path, const char* text, size_t text_len,
bool readonly) {
editor.volume = volume; editor.volume = volume;
editor.path = file_path; editor.path = file_path;
@@ -244,7 +245,7 @@ void edit_start(const char* volume, const char* file_path, const char* text, siz
switch (ch) { switch (ch) {
case '\b': case '\b':
if (editor.mode == EDIT_MODE_NORMAL) { if (editor.mode == EDIT_MODE_NORMAL && !readonly) {
if (editor.cursor.col > 0) { if (editor.cursor.col > 0) {
in_gb_move(&editor.current_line->gb, editor.cursor.col); in_gb_move(&editor.current_line->gb, editor.cursor.col);
editor.cursor.col--; editor.cursor.col--;
@@ -271,7 +272,7 @@ void edit_start(const char* volume, const char* file_path, const char* text, siz
} }
break; break;
case '\t': case '\t':
if (editor.mode == EDIT_MODE_NORMAL) { if (editor.mode == EDIT_MODE_NORMAL && !readonly) {
in_gb_move(&editor.current_line->gb, editor.cursor.col); in_gb_move(&editor.current_line->gb, editor.cursor.col);
for (size_t i = 0; i < sizeof(TAB_INSERT) - 1; i++) for (size_t i = 0; i < sizeof(TAB_INSERT) - 1; i++)
in_gb_insert(&wrealloc, NULL, &editor.current_line->gb, TAB_INSERT[i]); in_gb_insert(&wrealloc, NULL, &editor.current_line->gb, TAB_INSERT[i]);
@@ -280,7 +281,7 @@ void edit_start(const char* volume, const char* file_path, const char* text, siz
} }
break; break;
case '\n': { case '\n': {
if (editor.mode == EDIT_MODE_NORMAL) { if (editor.mode == EDIT_MODE_NORMAL && !readonly) {
in_gb_move(&editor.current_line->gb, editor.cursor.col); in_gb_move(&editor.current_line->gb, editor.cursor.col);
struct edit_line* new_line = malloc(sizeof(*new_line)); struct edit_line* new_line = malloc(sizeof(*new_line));
@@ -311,7 +312,7 @@ void edit_start(const char* volume, const char* file_path, const char* text, siz
if (strcmp(editor.cmdbuf.buffer, "q") == 0) { if (strcmp(editor.cmdbuf.buffer, "q") == 0) {
edit_run = false; edit_run = false;
editor.mode = EDIT_MODE_NORMAL; editor.mode = EDIT_MODE_NORMAL;
} else if (strcmp(editor.cmdbuf.buffer, "w") == 0) { } else if (strcmp(editor.cmdbuf.buffer, "w") == 0 && !readonly) {
struct filewriter fw; struct filewriter fw;
if (!(filewriter_init(&fw, editor.volume, editor.path, FW_CREATE_FILE) < 0)) { if (!(filewriter_init(&fw, editor.volume, editor.path, FW_CREATE_FILE) < 0)) {
struct list_node_link *line_link, *tmp_line_link; struct list_node_link *line_link, *tmp_line_link;
@@ -335,7 +336,7 @@ void edit_start(const char* volume, const char* file_path, const char* text, siz
} }
} break; } break;
case KB_DELETE: case KB_DELETE:
if (editor.mode == EDIT_MODE_NORMAL) { if (editor.mode == EDIT_MODE_NORMAL && !readonly) {
size_t len = in_gb_length(&editor.current_line->gb); size_t len = in_gb_length(&editor.current_line->gb);
if (editor.cursor.col < len) { if (editor.cursor.col < len) {
@@ -409,7 +410,7 @@ void edit_start(const char* volume, const char* file_path, const char* text, siz
editor.cmdbuf.buffer[editor.cmdbuf.len++] = ch; editor.cmdbuf.buffer[editor.cmdbuf.len++] = ch;
editor.cmdbuf.buffer[editor.cmdbuf.len] = '\0'; editor.cmdbuf.buffer[editor.cmdbuf.len] = '\0';
} }
} else if (editor.mode == EDIT_MODE_NORMAL) { } else if (editor.mode == EDIT_MODE_NORMAL && !readonly) {
in_gb_move(&editor.current_line->gb, editor.cursor.col); in_gb_move(&editor.current_line->gb, editor.cursor.col);
in_gb_insert(&wrealloc, NULL, &editor.current_line->gb, ch); in_gb_insert(&wrealloc, NULL, &editor.current_line->gb, ch);
editor.cursor.col++; editor.cursor.col++;

View File

@@ -1,8 +1,10 @@
#ifndef _EDIT_H #ifndef _EDIT_H
#define _EDIT_H #define _EDIT_H
#include <stdbool.h>
#include <stddef.h> #include <stddef.h>
void edit_start(const char* volume, const char* path, const char* text, size_t text_len); void edit_start(const char* volume, const char* path, const char* text, size_t text_len,
bool readonly);
#endif // _EDIT_H #endif // _EDIT_H

View File

@@ -385,7 +385,49 @@ static void edit(struct context* context, const char* path_string) {
volume_close(); volume_close();
edit_start(volume, path, str, desc.size); edit_start(volume, path, str, desc.size, false);
}
static void view(struct context* context, const char* path_string) {
struct desc desc;
char volume[VOLUME_MAX];
const char* path;
int ret;
if (!path_parse(path_string, volume, &path)) {
cprintf(context, "ERROR bad path '%s'\n", path_string);
return;
}
if ((ret = volume_open(volume)) < 0) {
cprintf(context, "ERROR could not open volume '%s': %s\n", volume, str_status[-ret]);
return;
}
if ((ret = describe(path, &desc)) < 0) {
cprintf(context, "ERROR could not describe '%s': %s\n", path, str_status[-ret]);
volume_close();
return;
}
char* str = malloc(desc.size + 1);
if (str == NULL) {
volume_close();
return;
}
memset(str, 0, desc.size);
if ((ret = read_file(path, 0, (uint8_t*)str, desc.size)) < 0) {
free(str);
volume_close();
return;
}
volume_close();
edit_start(volume, path, str, desc.size, true);
} }
static void quit1(struct context* context) { static void quit1(struct context* context) {
@@ -407,6 +449,7 @@ static void help(struct context* context) {
cprintf(context, "mkdir <directory path>\n"); cprintf(context, "mkdir <directory path>\n");
cprintf(context, "rm <path>\n"); cprintf(context, "rm <path>\n");
cprintf(context, "edit <path>\n"); cprintf(context, "edit <path>\n");
cprintf(context, "view <path>\n");
cprintf(context, "terminfo\n"); cprintf(context, "terminfo\n");
cprintf(context, "cls\n"); cprintf(context, "cls\n");
cprintf(context, "procinfo\n"); cprintf(context, "procinfo\n");
@@ -476,6 +519,11 @@ static void execute_cmd(struct ast_cmd* cmd, struct context* context, bool run_b
edit(context, cmd->args[0]); edit(context, cmd->args[0]);
else else
cprintf(context, "ERROR No file path provided\n"); cprintf(context, "ERROR No file path provided\n");
} else if (strcmp(cmd->name, "view") == 0) {
if (cmd->arg_count == 1)
view(context, cmd->args[0]);
else
cprintf(context, "ERROR No file path provided\n");
} else if (strcmp(cmd->name, "terminfo") == 0) { } else if (strcmp(cmd->name, "terminfo") == 0) {
terminfo(context); terminfo(context);
} else if (strcmp(cmd->name, "cls") == 0) { } else if (strcmp(cmd->name, "cls") == 0) {