[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) {