Implement xmodem file history

This commit is contained in:
Aaron Cook 2024-05-13 00:10:19 -05:00
commit 64f8a0c54f
2 changed files with 37 additions and 0 deletions

View file

@ -44,6 +44,7 @@ ingest_start(bytenuts_t *bytenuts)
ingest.term_lock = &bytenuts->term_lock; ingest.term_lock = &bytenuts->term_lock;
ingest.config = &bytenuts->config; ingest.config = &bytenuts->config;
ingest.cmd_pg_cur = -1; ingest.cmd_pg_cur = -1;
ingest.xmodem_hist = bstr_history_create();
HOME = getenv("HOME"); HOME = getenv("HOME");
if (HOME) { if (HOME) {
@ -459,6 +460,8 @@ ingest_thread(void *arg)
free(ingest.history_filename); free(ingest.history_filename);
} }
bstr_history_destroy(ingest.xmodem_hist);
pthread_exit(NULL); pthread_exit(NULL);
return NULL; return NULL;
} }
@ -600,6 +603,8 @@ mode_xmodem(int block_sz)
switch (ch) { switch (ch) {
case '\n': case '\n':
bstr_history_new_entry(ingest.xmodem_hist, ingest.inbuf);
pthread_mutex_lock(ingest.term_lock); pthread_mutex_lock(ingest.term_lock);
werase(ingest.input); werase(ingest.input);
wmove(ingest.input, 0, 0); wmove(ingest.input, 0, 0);
@ -618,6 +623,34 @@ mode_xmodem(int block_sz)
auto_complete(); auto_complete();
ingest_refresh(); ingest_refresh();
break; break;
case KEY_BACKSPACE:
case KEY_UP:
/* fall-through */
case KEY_DOWN:
{
const char *filename;
if (ch == KEY_UP) {
bstr_history_older(ingest.xmodem_hist);
} else {
bstr_history_newer(ingest.xmodem_hist);
}
filename = bstr_history_atpos(ingest.xmodem_hist);
if (!filename) {
memset(ingest.inbuf, 0, sizeof(ingest.inbuf));
ingest.inpos = 0;
ingest.inlen = 0;
ingest_refresh();
break;
}
strncpy(ingest.inbuf, filename, sizeof(ingest.inbuf));
ingest.inpos = strlen(ingest.inbuf);
ingest.inlen = ingest.inpos;
ingest_refresh();
break;
}
default: default:
{ {
char tmp[1024]; char tmp[1024];
@ -653,6 +686,8 @@ mode_xmodem(int block_sz)
free(ingest.prepend); free(ingest.prepend);
ingest.prepend = NULL; ingest.prepend = NULL;
bstr_history_unset_pos(ingest.xmodem_hist);
bytenuts_set_status(STATUS_INGEST, "normal"); bytenuts_set_status(STATUS_INGEST, "normal");
ingest_refresh(); ingest_refresh();
return 0; return 0;

View file

@ -10,6 +10,7 @@
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include "bstr.h"
#include "bytenuts.h" #include "bytenuts.h"
enum ingest_mode_enum { enum ingest_mode_enum {
@ -46,6 +47,7 @@ typedef struct ingest_struct {
/* what command page is currently selected */ /* what command page is currently selected */
int cmd_pg_cur; int cmd_pg_cur;
struct timespec cmd_ts; /* last command sent timestamp */ struct timespec cmd_ts; /* last command sent timestamp */
bstr_history_handle xmodem_hist; /* xmodem filename transfer history */
} ingest_t; } ingest_t;
/* startup the input window thread */ /* startup the input window thread */