[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] [Patch] [2/2] readline an neue Eingabesequenzen anpassen
Am Samstag, 16. August 2008 14:07:55 schrieb Antoine Kaufmann:
> * libc: readline() an die neuen vt100-Eingabesequenzen anpassen
> Index: trunk/src/modules/lib/readline.c
> ===================================================================
> --- trunk.orig/src/modules/lib/readline.c
> +++ trunk/src/modules/lib/readline.c
> @@ -43,17 +43,6 @@
>
> #define BUFFER_SIZE 255
>
> -
> -#define KEY_LEFT 75
> -#define KEY_RIGHT 77
> -#define KEY_UP 72
> -#define KEY_DOWN 80
> -
> -#define KEY_HOME 71
> -#define KEY_END 79
> -#define KEY_INS 82
> -#define KEY_DEL 83
> -
> static list_t* history = NULL;
>
> /**
> @@ -280,21 +269,29 @@ char* readline(const char* prompt)
> while (!enter)
> {
> char c = keyboard_read_char();
> -
> +
> switch (c) {
> +
> case '\0':
> c = keyboard_read_char();
> - switch (c) {
> - // Ende der Eingabedatei
> - case '\0':
> - enter = TRUE;
> -
> - printf("\r\n");
> - fflush(stdout);
> - break;
> + enter = TRUE;
> + break;
Ist das printf und fflush jetzt nicht mehr nötig?
>
> + // Escapesequenzen fuer Kontrolltasten verarbeiten
> + case '\033':
> + {
> + char buf[4];
> + int i;
> + memset(buf, 0, sizeof(buf));
> +
> + if ((buf [0] = keyboard_read_char())!= '[') {
> + goto seq_nomatch;
> + }
> +
> + buf[1] = keyboard_read_char();
> + switch (buf[1]) {
> // Links
> - case KEY_LEFT:
> + case 'D':
> if (pos > 0) {
> printf("\033[1D");
> fflush(stdout);
> @@ -303,7 +300,7 @@ char* readline(const char* prompt)
> break;
>
> // Rechts
> - case KEY_RIGHT:
> + case 'C':
> if (pos < size) {
> printf("\033[1C");
> fflush(stdout);
> @@ -312,9 +309,9 @@ char* readline(const char* prompt)
> break;
>
> // Hoch/Runter
> - case KEY_UP:
> - case KEY_DOWN:
> - if (c == KEY_UP) {
> + case 'A':
> + case 'B':
> + if (buf[1] == 'A') {
> if (history_pos < (int) list_size(history) -
> 1) { history_pos++;
> } else {
> @@ -330,11 +327,11 @@ char* readline(const char* prompt)
>
> memset(buffer, 0, BUFFER_SIZE);
> if (history_pos > -1) {
> - strncpy(buffer,
> - list_get_element_at(history, history_pos),
> + strncpy(buffer,
> + list_get_element_at(history, history_pos),
> BUFFER_SIZE - 1);
Ich schätze, das ist irgendeine Whitespaceänderung, die mit dem Patch nichts
zu tun hat? Macht nur das svn blame kaputt, rauslassen.
> }
> -
> +
> char* format;
> asprintf(&format, "\033[%dD", pos);
> printf("%s\033[K%s", format, buffer);
> @@ -344,9 +341,14 @@ char* readline(const char* prompt)
> pos = size = strlen(buffer);
>
> break;
> -
> - // Entfernen
> - case KEY_DEL:
> +
> + // Delete
Gibt es einen Grund, warum du die deutschen Tastenbezeichnungen rauslöschst
und durch englische ersetzt?
> + case '3':
> + // Der Delete-Taste muss noch eine Tilde folgen
> + if ((buf[2] = keyboard_read_char()) != '~') {
> + goto seq_nomatch;
> + }
> +
> if (pos < size) {
> delchar(buffer, pos);
> size--;
> @@ -354,37 +356,36 @@ char* readline(const char* prompt)
> fflush(stdout);
> }
> break;
> -
> - // Pos1
> - case KEY_HOME:
> - {
> - char* format;
> - asprintf(&format, "\033[%dD", pos);
> - printf("%s", format);
> - free(format);
>
>
> +
> + // Home
> + case 'H':
> + printf("\033[%dD", pos);
> pos = 0;
> fflush(stdout);
> break;
> - }
> -
> - // Ende
> - case KEY_END:
> - {
> - char* format;
> - asprintf(&format, "\033[%dC", strlen(buffer) -
> pos); - printf("%s", format);
> - free(format);
>
> + // End
> + case 'F':
> + printf("\033[%dC", strlen(buffer) - pos);
> pos = strlen(buffer);
> delchar(buffer, pos);
> printf("\033[K\033[s%s\033[u", &buffer[pos]);
> fflush(stdout);
> break;
> - }
> +
> + default:
> + goto seq_nomatch;
> }
> +
> break;
> +seq_nomatch:
> + for (i = 0; (c = buf[i]); i++) {
> + ungetc(buf[i], stdin);
> + }
> + break;
> + }
>
> case '\b':
> if (pos > 0) {