Como fazer com que as teclas de seta e o backspace funcionem corretamente ao solicitar informações do usuário no programa C usando termios.h?

Então, eu tenho o código a seguir, que basicamente lê apenas as entradas de caracteres e as imprime até que 'q' seja inserido.

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<termios.h>

int main(void) {
    char c; 
    static struct termios oldtio, newtio;
    tcgetattr(0, &oldtio);
    newtio = oldtio;
    newtio.c_lflag &= ~ICANON;
    newtio.c_lflag &= ~ECHO;
    tcsetattr(0, TCSANOW, &newtio);

    printf("Give text: ");
    fflush(stdout);
    while (1) {
        read(0, &c, 1);
        printf("%c", c);
        fflush(stdout);
        if (c == 'q') { break; }
    }
    printf("\n"); 
    tcsetattr(0, TCSANOW, &oldtio);

    return 0;
}

No início da função principal, desligo o modo canônico para tornar o usuário capaz de ver sua entrada quando está dando. Também desativo o eco para que coisas como "^ [[A" não apareçam ao pressionar a tecla de seta para cima, por exemplo. Isso funciona, mas também sou capaz de mover o cursor para as linhas superiores de uma janela de terminal e isso não é bom. Existe uma maneira de corrigir isso para que o usuário possa se mover apenas dentro da linha atual?

Outro problema é o backspace. Quando pressiono, o programa imprime um símbolo estranho (que suponho ser 0x7f) em vez de apagar o caractere deixado no local atual do cursor. Eu deveria lidar com a saída da tecla backspace no programa de alguma forma, mas não sei como fazê-lo, pois é esse número hexadecimal estranho. Alguma dica para isso?

Uma opção em que eu também estava pensando em fazer esse trabalho é usar o modo canônico para que as teclas de seta e as funcionalidades de backspace sejam automaticamente usadas. No entanto, o modo canônico funciona linha por linha e, portanto, o texto não aparece até que "Enter" seja pressionado pelo usuário. Até agora, eu não descobri nenhuma maneira de fazer o usuário ver sua entrada enquanto digitava. Isso é possível?

E, por favor, não ncurses ou sugestões readline. Eu quero fazer isso usando termios.h.

questionAnswers(2)

yourAnswerToTheQuestion