[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Lost] [Patch] [2/2] readline an neue Eingabesequenzen anpassen



* 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;
 
+            // 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);
                         }
-                        
+
                         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
+                    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) {

Attachment: signature.asc
Description: This is a digitally signed message part.