scrollback struct, strip \r from reads, realloc scrollback

This commit is contained in:
Joseph Ferano 2022-09-14 13:53:26 +07:00
parent ced79ea7f0
commit 938e1db316

70
bt.c
View File

@ -10,13 +10,18 @@
#include <string.h> #include <string.h>
#include <raylib.h> #include <raylib.h>
typedef struct scrollback {
float height;
float ypos;
int capacity;
int length;
char *buf;
} scrollback;
// PTY // PTY
int master; int master;
int slave; int slave;
// Scrollback
char *scrollback;
void spawn(void) { void spawn(void) {
openpty(&master, &slave, NULL, NULL, NULL); openpty(&master, &slave, NULL, NULL, NULL);
pid_t p = fork(); pid_t p = fork();
@ -52,7 +57,7 @@ Font *load_font() {
return fontDefault; return fontDefault;
} }
int read_pty(char *buf) { int read_pty(scrollback *sb) {
ssize_t nread; ssize_t nread;
char readbuf[256]; char readbuf[256];
switch (nread = read(master, readbuf, sizeof(readbuf))) { switch (nread = read(master, readbuf, sizeof(readbuf))) {
@ -66,21 +71,34 @@ int read_pty(char *buf) {
printf("EOF\n"); printf("EOF\n");
return 0; return 0;
default: default:
if (sb->length + nread > sb->capacity) {
sb->capacity *= 2;
sb->buf = realloc(sb->buf, sb->capacity);
}
if (readbuf[nread - 1] == '\n') { if (readbuf[nread - 1] == '\n') {
printf("this\n"); printf("this\n");
nread--; nread--;
} }
readbuf[nread] = '\0'; int nreturns = 0;
strcat(buf, readbuf); for (int i = 0; i < nread; i++) {
printf("Amount of bytes read %lu\n", nread); if (readbuf[i] == '\r') {
printf("FD: %i Buf %s\n", master, buf); nreturns++;
return nread; for (int j = i; j < nread; j++) {
readbuf[j] = readbuf[j + 1];
}
}
}
readbuf[nread - nreturns] = '\0';
strcat(sb->buf, readbuf);
return nread - nreturns;
} }
} }
int main(void) { int main(void) {
spawn(); spawn();
scrollback sb = { 0 };
const int screenWidth = 800; const int screenWidth = 800;
const int screenHeight = 550; const int screenHeight = 550;
@ -90,9 +108,10 @@ int main(void) {
Font *fontDefault = load_font(); Font *fontDefault = load_font();
scrollback = malloc(4098); sb.capacity = 2048;
scrollback[0] = '\0'; sb.buf = malloc(sb.capacity);
int sb_len = 0; sb.buf[0] = '\0';
sb.length = 0;
char buf[128]; char buf[128];
int buf_len = 0; int buf_len = 0;
@ -103,6 +122,8 @@ int main(void) {
FD_ZERO(&rset); FD_ZERO(&rset);
FD_SET(master, &rset); FD_SET(master, &rset);
sb.ypos = 0;
while (!WindowShouldClose()) { while (!WindowShouldClose()) {
int key = GetCharPressed(); int key = GetCharPressed();
fontsize += GetMouseWheelMove(); fontsize += GetMouseWheelMove();
@ -111,15 +132,15 @@ int main(void) {
buf[buf_len] = (char)key; buf[buf_len] = (char)key;
buf[buf_len + 1] = '\0'; buf[buf_len + 1] = '\0';
buf_len++; buf_len++;
scrollback[sb_len] = (char)key; sb.buf[sb.length] = (char)key;
scrollback[sb_len + 1] = '\0'; sb.buf[sb.length + 1] = '\0';
sb_len++; sb.length++;
} }
key = GetCharPressed(); key = GetCharPressed();
} }
if (IsKeyPressed(KEY_ENTER)) { if (IsKeyPressed(KEY_ENTER)) {
sb_len -= buf_len; sb.length -= buf_len;
scrollback[sb_len] = '\0'; sb.buf[sb.length] = '\0';
write(master, buf, buf_len); write(master, buf, buf_len);
write(master, "\r", 1); write(master, "\r", 1);
buf[0] = '\0'; buf[0] = '\0';
@ -129,27 +150,26 @@ int main(void) {
if (buf_len > 0) { if (buf_len > 0) {
buf_len--; buf_len--;
buf[buf_len] = '\0'; buf[buf_len] = '\0';
sb_len--; sb.length--;
scrollback[sb_len] = '\0'; sb.buf[sb.length] = '\0';
} }
} }
// Drawing // Drawing
BeginDrawing(); BeginDrawing();
/* update(buf, &buf_len, rset); */
{ {
int nread = read_pty(scrollback); int nread = read_pty(&sb);
if (nread > 0) { if (nread > 0) {
/* printf("Amount of bytes read %i\n", nread); */ sb.length += nread;
sb_len += nread; new_read = true;
} }
ClearBackground(RAYWHITE); ClearBackground(RAYWHITE);
DrawTextEx(*fontDefault, scrollback, (Vector2){ 10 , 10 }, fontsize, 1, BLACK); DrawTextEx(*fontDefault, sb.buf, (Vector2){ 0, sb.ypos }, fontsize, 1, BLACK);
} }
EndDrawing(); EndDrawing();
} }
free(sb.buf);
close(master); close(master);
CloseWindow(); CloseWindow();
return 0;
} }