]> pd.if.org Git - pd_readline/commitdiff
More progress.
authorandy <andy@obsidian.(none)>
Mon, 27 Aug 2012 06:12:59 +0000 (18:12 +1200)
committerandy <andy@obsidian.(none)>
Mon, 27 Aug 2012 06:12:59 +0000 (18:12 +1200)
pd_readline2.c
pdmenu8.c [new file with mode: 0644]
pdmenu9.c [new file with mode: 0644]
testkey.c [new file with mode: 0644]

index 02b943d6f87be14760eeaf1be7c64570b4bf68d7..63a31e797e7c527c372eef46128a416ce429a782 100644 (file)
@@ -9,6 +9,8 @@
 /*  The code can now distinguish between a printable key    */ \r
 /*  and a key that should not be printed.                   */ \r
 \r
+/*  Backspace key, and left and right arrow keys now work.  */   \r
+\r
 /*  It will still be some time before this is a REAL        */ \r
 /*  readline, but we are "on the way"......                 */     \r
 /*  This code is released to the public domain.             */ \r
@@ -138,20 +140,44 @@ int main(void)
       /* F2 is 27, 79, 81.  */  \r
       /* F3 is 27, 79, 82.  */  \r
       /* F4 is 27, 79, 83.  */  \r
-           \r
-                \r
+      \r
+      /* Backspace */ \r
+      else if(key == 127) \r
+      { \r
+                buffer[bufpnt].key = key;  \r
+                /* Move 1 char to left */  \r
+                printf("\033[1D");\r
+                printf("\040"); \r
+                printf("\033[1D");  \r
+                bufpnt += 1;                   \r
+         }           \r
+                           \r
       else if(key == 27)        \r
-          {  \r
-                         \r
+          {                      \r
                          buffer[bufpnt].esc = 1;                        \r
                          key = getch(); \r
               if(key == 91)               \r
               buffer[bufpnt].lbr = 1;                \r
               key = getch(); \r
-              if( (key >= 65) && (key <= 68) )  \r
+              if(key == 65) /* Up arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key;                                            \r
+               }       \r
+               if(key == 66) /* Down arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key;                                            \r
+               }        \r
+               if(key == 67) /* Left arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key; \r
+                                printf("\033[1C");   \r
+               }\r
+                if(key == 68) /* Right arrow */ \r
                {                                \r
-                                buffer[bufpnt].key = key;                  \r
-               }                                 \r
+                                buffer[bufpnt].key = key; \r
+                                printf("\033[1D");                                                                                                                                               \r
+               }\r
+                                                 \r
             bufpnt += 1;           \r
           } \r
               \r
@@ -163,7 +189,7 @@ int main(void)
                         puts("\n");  \r
                         int j ; \r
                   /* Print the array of structs. */ \r
-                    for (j=0; j<20; j++)       \r
+                    for (j=0; j<bufpnt; j++)   \r
                     { \r
                            printf("Fnkey: %d ", buffer[j].fnkey  ) ; \r
                            printf("Ctrl:  %d ", buffer[j].ctrl   ) ;   \r
diff --git a/pdmenu8.c b/pdmenu8.c
new file mode 100644 (file)
index 0000000..63a31e7
--- /dev/null
+++ b/pdmenu8.c
@@ -0,0 +1,212 @@
+\r
+\r
+/*  pd_readline2.c                                          */  \r
+/*  Status (as at 26th Aug 2012) : useful progress.         */ \r
+/*  Keystroke sequences (along with the special flags       */ \r
+/*  like Esc, Ctrl, Alt etc are now stored in a buffer      */ \r
+/*  ( an array of structs ).                                */    \r
+\r
+/*  The code can now distinguish between a printable key    */ \r
+/*  and a key that should not be printed.                   */ \r
+\r
+/*  Backspace key, and left and right arrow keys now work.  */   \r
+\r
+/*  It will still be some time before this is a REAL        */ \r
+/*  readline, but we are "on the way"......                 */     \r
+/*  This code is released to the public domain.             */ \r
+/*  "Share and enjoy...."  ;)                               */  \r
+\r
+\r
+#include <string.h>   \r
+#include <stdio.h> \r
+#include <termios.h>  /* For getch()  */  \r
+\r
+/* This implementation of getch() is from here - */ \r
+/* http://wesley.vidiqatch.org/                  */ \r
+/* Thanks, Wesley!                               */  \r
+static struct termios old, new;\r
+\r
+/* Initialize new terminal i/o settings */\r
+void initTermios(int echo) {\r
+    tcgetattr(0, &old); /* grab old terminal i/o settings */\r
+    new = old; /* make new settings same as old settings */\r
+    new.c_lflag &= ~ICANON; /* disable buffered i/o */\r
+    new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */\r
+    tcsetattr(0, TCSANOW, &new); /* use these new terminal i/o settings now */\r
+}\r
+\r
+\r
+/* Restore old terminal i/o settings */\r
+void resetTermios(void) {\r
+    tcsetattr(0, TCSANOW, &old);\r
+}\r
+\r
+\r
+/* Read 1 character - echo defines echo mode */\r
+char getch_(int echo) {\r
+    char ch;\r
+    initTermios(echo);\r
+    ch = getchar();\r
+    resetTermios();\r
+    return ch;\r
+}\r
+\r
+\r
+/* Read 1 character without echo */\r
+char getch(void) {\r
+    return getch_(0);\r
+}\r
+\r
+\r
+/* Read 1 character with echo */\r
+char getche(void) {\r
+    return getch_(1);\r
+} \r
+\r
+\r
+\r
+/*  Helper function, to let us see if a .history file */ \r
+/*  exists in the current directory.  */ \r
+int fexists(char *fname)\r
+{  \r
+\r
+   FILE *fptr ;        \r
+       \r
+   fptr = fopen(fname, "r") ;  \r
+   \r
+   if ( !fptr )  return -1 ;  /* File does not exist in dir. */        \r
+        \r
+   fclose(fptr);  \r
+   return 0;    /* File DOES exist in dir.  */         \r
+\r
+} \r
+\r
+\r
+ /* Struct to store key sequences */ \r
+typedef struct { \r
+          int fnkey; \r
+          int ctrl; \r
+          int alt ; \r
+       int shf ; \r
+       int esc ; \r
+       int lbr ;  /* For left-bracket ([) of escape sequences */ \r
+       int key; \r
+   } keyseq ;         \r
+\r
+\r
+\r
+\r
+\r
+int main(void)\r
+{\r
+       \r
+  printf("Public Domain Readline \n");              \r
+      \r
+  /* Buffer - an array of keyseq structs.                     */  \r
+  /* Note - now that we store the keystrokes in here,         */ \r
+  /* we can look at the various flags and decide whether to   */ \r
+  /* "echo" the key (as normal) or suppress it (as with an    */ \r
+  /* arrow key).                                              */    \r
+  keyseq buffer[80] ;   \r
+  \r
+  /* Buffer "pointer"  */ \r
+  int bufpnt = 0; \r
+  \r
+  \r
+  /* Test for existence of history file. */  \r
+  int exists;  \r
+  exists = fexists(".history"); \r
+  printf("Result: %d \n", exists);  \r
+  \r
+  while(1) \r
+    {  \r
+                   \r
+      int key = getch(); \r
+       \r
+      /* Printable chars. */  \r
+      if ( (key >= 32)  && (key <= 126) ) \r
+      { \r
+               /* We have a printable key so print it. */   \r
+               putchar(key);                   \r
+        buffer[bufpnt].key = key;  \r
+        bufpnt += 1; \r
+      }  \r
+                                                                       \r
+      /* Up arrow is 27, 91, 65.    ( ESC [ A )   */   \r
+      /* Down arrow is 27, 91, 66.  ( ESC [ B )   */ \r
+      /* Right arrow is 27, 91, 67. ( ESC [ C )   */ \r
+      /* Left arrow is 27, 91, 68.  ( ESC [ D )   */    \r
+      /* Function keys.     */ \r
+      /* F2 is 27, 79, 81.  */  \r
+      /* F3 is 27, 79, 82.  */  \r
+      /* F4 is 27, 79, 83.  */  \r
+      \r
+      /* Backspace */ \r
+      else if(key == 127) \r
+      { \r
+                buffer[bufpnt].key = key;  \r
+                /* Move 1 char to left */  \r
+                printf("\033[1D");\r
+                printf("\040"); \r
+                printf("\033[1D");  \r
+                bufpnt += 1;                   \r
+         }           \r
+                           \r
+      else if(key == 27)        \r
+          {                      \r
+                         buffer[bufpnt].esc = 1;                        \r
+                         key = getch(); \r
+              if(key == 91)               \r
+              buffer[bufpnt].lbr = 1;                \r
+              key = getch(); \r
+              if(key == 65) /* Up arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key;                                            \r
+               }       \r
+               if(key == 66) /* Down arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key;                                            \r
+               }        \r
+               if(key == 67) /* Left arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key; \r
+                                printf("\033[1C");   \r
+               }\r
+                if(key == 68) /* Right arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key; \r
+                                printf("\033[1D");                                                                                                                                               \r
+               }\r
+                                                 \r
+            bufpnt += 1;           \r
+          } \r
+              \r
+                                          \r
+                                                 \r
+    /* The Enter key exits. Enter is 10 decimal */       \r
+        else if(key == 10)  \r
+               { \r
+                        puts("\n");  \r
+                        int j ; \r
+                  /* Print the array of structs. */ \r
+                    for (j=0; j<bufpnt; j++)   \r
+                    { \r
+                           printf("Fnkey: %d ", buffer[j].fnkey  ) ; \r
+                           printf("Ctrl:  %d ", buffer[j].ctrl   ) ;   \r
+                           printf("Alt:   %d ", buffer[j].alt    ) ; \r
+                           printf("Shf:   %d ", buffer[j].shf    ) ; \r
+                           printf("Esc:   %d ", buffer[j].esc    ) ; \r
+                           printf("Lbr:   %d ", buffer[j].lbr    ) ;  \r
+                   printf("Key:   %d \n", buffer[j].key  ) ; \r
+                }                      \r
+                                         \r
+             break;           \r
+         }  /* Key = Enter */   \r
+    }                \r
+                                      \r
+       return 0;\r
+}  \r
+\r
+\r
+\r
+\r
diff --git a/pdmenu9.c b/pdmenu9.c
new file mode 100644 (file)
index 0000000..322aa51
--- /dev/null
+++ b/pdmenu9.c
@@ -0,0 +1,224 @@
+\r
+\r
+/*  pd_readline2.c                                          */  \r
+/*  Status (as at 26th Aug 2012) : useful progress.         */ \r
+/*  Keystroke sequences (along with the special flags       */ \r
+/*  like Esc, Ctrl, Alt etc are now stored in a buffer      */ \r
+/*  ( an array of structs ).                                */    \r
+\r
+/*  The code can now distinguish between a printable key    */ \r
+/*  and a key that should not be printed.                   */ \r
+\r
+/*  Backspace key, and left and right arrow keys now work.  */   \r
+\r
+/*  It will still be some time before this is a REAL        */ \r
+/*  readline, but we are "on the way"......                 */     \r
+/*  This code is released to the public domain.             */ \r
+/*  "Share and enjoy...."  ;)                               */  \r
+\r
+\r
+#include <string.h>   \r
+#include <stdio.h> \r
+#include <termios.h>  /* For getch()  */  \r
+\r
+/* This implementation of getch() is from here - */ \r
+/* http://wesley.vidiqatch.org/                  */ \r
+/* Thanks, Wesley!                               */  \r
+static struct termios old, new;\r
+\r
+/* Initialize new terminal i/o settings */\r
+void initTermios(int echo) {\r
+    tcgetattr(0, &old); /* grab old terminal i/o settings */\r
+    new = old; /* make new settings same as old settings */\r
+    new.c_lflag &= ~ICANON; /* disable buffered i/o */\r
+    new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */\r
+    tcsetattr(0, TCSANOW, &new); /* use these new terminal i/o settings now */\r
+}\r
+\r
+\r
+/* Restore old terminal i/o settings */\r
+void resetTermios(void) {\r
+    tcsetattr(0, TCSANOW, &old);\r
+}\r
+\r
+\r
+/* Read 1 character - echo defines echo mode */\r
+char getch_(int echo) {\r
+    char ch;\r
+    initTermios(echo);\r
+    ch = getchar();\r
+    resetTermios();\r
+    return ch;\r
+}\r
+\r
+\r
+/* Read 1 character without echo */\r
+char getch(void) {\r
+    return getch_(0);\r
+}\r
+\r
+\r
+/* Read 1 character with echo */\r
+char getche(void) {\r
+    return getch_(1);\r
+} \r
+\r
+\r
+\r
+/*  Helper function, to let us see if a .history file */ \r
+/*  exists in the current directory.  */ \r
+int fexists(char *fname)\r
+{  \r
+\r
+   FILE *fptr ;        \r
+       \r
+   fptr = fopen(fname, "r") ;  \r
+   \r
+   if ( !fptr )  return -1 ;  /* File does not exist in dir. */        \r
+        \r
+   fclose(fptr);  \r
+   return 0;    /* File DOES exist in dir.  */         \r
+\r
+} \r
+\r
+\r
+/* Helper function to print escape sequences to terminal */ \r
+void prtseq(char *what) \r
+{   \r
+   if (strcmp(what, "left") )         printf("\033[1D"); \r
+   else if (strcmp(what, "right") )   printf("\033[1C");       \r
+   else if (strcmp(what, "bs") )   \r
+       printf("\033[1D");\r
+          printf("\040"); \r
+          printf("\033[1D");             \r
+}      \r
+\r
+\r
+\r
+\r
+ /* Struct to store key sequences */ \r
+typedef struct { \r
+          int fnkey; \r
+          int ctrl; \r
+          int alt ; \r
+       int shf ; \r
+       int esc ; \r
+       int lbr ;  /* For left-bracket ([) of escape sequences */ \r
+       int key; \r
+   } keyseq ;         \r
+\r
+\r
+\r
+\r
+\r
+int main(void)\r
+{\r
+       \r
+  printf("Public Domain Readline \n");              \r
+      \r
+  /* Buffer - an array of keyseq structs.                     */  \r
+  /* Note - now that we store the keystrokes in here,         */ \r
+  /* we can look at the various flags and decide whether to   */ \r
+  /* "echo" the key (as normal) or suppress it (as with an    */ \r
+  /* arrow key).                                              */    \r
+  keyseq buffer[80] ;   \r
+  \r
+  /* Buffer "pointer"  */ \r
+  int bufpnt = 0; \r
+  \r
+  \r
+  /* Test for existence of history file. */  \r
+  int exists;  \r
+  exists = fexists(".history"); \r
+  printf("Result: %d \n", exists);  \r
+  \r
+  while(1) \r
+    {  \r
+                   \r
+      int key = getch(); \r
+       \r
+      /* Printable chars. */  \r
+      if ( (key >= 32)  && (key <= 126) ) \r
+      { \r
+               /* We have a printable key so print it. */   \r
+               putchar(key);                   \r
+        buffer[bufpnt].key = key;  \r
+        bufpnt += 1; \r
+      }  \r
+                                                                       \r
+      /* Up arrow is 27, 91, 65.    ( ESC [ A )   */   \r
+      /* Down arrow is 27, 91, 66.  ( ESC [ B )   */ \r
+      /* Right arrow is 27, 91, 67. ( ESC [ C )   */ \r
+      /* Left arrow is 27, 91, 68.  ( ESC [ D )   */    \r
+      /* Function keys.     */ \r
+      /* F2 is 27, 79, 81.  */  \r
+      /* F3 is 27, 79, 82.  */  \r
+      /* F4 is 27, 79, 83.  */  \r
+      \r
+      /* Backspace */ \r
+      else if(key == 127) \r
+      { \r
+                buffer[bufpnt].key = key;  \r
+                /* Move 1 char to left */  \r
+                prtseq("bs"); \r
+                bufpnt += 1;                   \r
+         }           \r
+                           \r
+      else if(key == 27)        \r
+          {                      \r
+                         buffer[bufpnt].esc = 1;                        \r
+                         key = getch(); \r
+              if(key == 91)               \r
+              buffer[bufpnt].lbr = 1;                \r
+              key = getch(); \r
+              if(key == 65) /* Up arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key;                                            \r
+               }       \r
+               if(key == 66) /* Down arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key;                                            \r
+               }        \r
+               if(key == 67) /* Left arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key; \r
+                                prtseq("left");                                 \r
+               }\r
+                if(key == 68) /* Right arrow */ \r
+               {                                \r
+                                buffer[bufpnt].key = key; \r
+                                prtseq("right");                                \r
+               }\r
+                                                 \r
+            bufpnt += 1;           \r
+          } \r
+              \r
+                                          \r
+                                                 \r
+    /* The Enter key exits. Enter is 10 decimal */       \r
+        else if(key == 10)  \r
+               { \r
+                        puts("\n");  \r
+                        int j ; \r
+                  /* Print the array of structs. */ \r
+                    for (j=0; j<bufpnt; j++)   \r
+                    { \r
+                           printf("Fnkey: %d ", buffer[j].fnkey  ) ; \r
+                           printf("Ctrl:  %d ", buffer[j].ctrl   ) ;   \r
+                           printf("Alt:   %d ", buffer[j].alt    ) ; \r
+                           printf("Shf:   %d ", buffer[j].shf    ) ; \r
+                           printf("Esc:   %d ", buffer[j].esc    ) ; \r
+                           printf("Lbr:   %d ", buffer[j].lbr    ) ;  \r
+                   printf("Key:   %d \n", buffer[j].key  ) ; \r
+                }                      \r
+                                         \r
+             break;           \r
+         }  /* Key = Enter */   \r
+    }                \r
+                                      \r
+       return 0;\r
+}  \r
+\r
+\r
+\r
+\r
diff --git a/testkey.c b/testkey.c
new file mode 100644 (file)
index 0000000..f6e6246
--- /dev/null
+++ b/testkey.c
@@ -0,0 +1,26 @@
+
+
+/*  testkey.c  */ 
+
+/*  Prints the keycode for a given key */  
+
+
+
+#include <stdio.h> 
+#include <stdlib.h> 
+
+
+
+int main (void) 
+{
+
+int c; 
+
+while( (c == getchar() ) ) 
+{
+   printf("%d 0x%02X\n", c );
+} 
+
+return 0; 
+
+}