]> pd.if.org Git - pd_readline/blob - pdmenu5.c
More good progress.
[pd_readline] / pdmenu5.c
1 \r
2 \r
3 /*  pd_readline.c                                           */  \r
4 /*  Status (as at 26th Aug 2012) : useful progress.         */ \r
5 /*  Keystroke sequences (along with the special flags       */ \r
6 /*  like Esc, Ctrl, Alt etc are now stored in a buffer      */ \r
7 /*  ( an array of structs ).                                */    \r
8 /*  It will still be some time before this is a REAL        */ \r
9 /*  readline, but we are "on the way"......                 */     \r
10 /*  This code is released to the public domain.             */ \r
11 /*  "Share and enjoy...."  ;)                               */  \r
12 \r
13 \r
14 #include <string.h>   \r
15 #include <stdio.h> \r
16 \r
17 \r
18 /*  Helper function, to let us see if a .history file */ \r
19 /*  exists in the current directory.  */ \r
20 int fexists(char *fname)\r
21 {  \r
22 \r
23    FILE *fptr ;         \r
24         \r
25    fptr = fopen(fname, "r") ;  \r
26    \r
27    if ( !fptr )  return -1 ;  /* File does not exist in dir. */         \r
28          \r
29    fclose(fptr);  \r
30    return 0;    /* File DOES exist in dir.  */          \r
31 \r
32\r
33 \r
34 \r
35  /* Struct to store key sequences */ \r
36 typedef struct { \r
37            int fnkey; \r
38            int ctrl; \r
39            int alt ; \r
40        int shf ; \r
41        int esc ; \r
42        int lbr ;  /* For left-bracket ([) of escape sequences */ \r
43        int key; \r
44    } keyseq ;         \r
45 \r
46 \r
47 \r
48 \r
49 \r
50 int main(void)\r
51 {\r
52         \r
53   printf("Public Domain Readline \n");              \r
54   printf("NOTE! - at the moment, we are using \n");  \r
55   printf("NON-echoing reads, storing the keystrokes \n");  \r
56   printf("in a buffer \n");   \r
57     \r
58   \r
59   /* Buffer - an array of keyseq structs.                     */  \r
60   /* Note - now that we store the keystrokes in here,         */ \r
61   /* we can look at the various flags and decide whether to   */ \r
62   /* "echo" the key (as normal) or suppress it (as with an    */ \r
63   /* arrow key).                                              */    \r
64   keyseq buffer[80] ;   \r
65   \r
66   /* Buffer "pointer"  */ \r
67   int bufpnt = 0; \r
68   \r
69   \r
70   /* Test for existence of history file. */  \r
71   int exists;  \r
72   exists = fexists(".history"); \r
73   printf("Result: %d \n", exists);  \r
74   \r
75   while(1) \r
76     {  \r
77                    \r
78       int key = getchar(); \r
79        \r
80       /* Printable chars. */  \r
81       if ( (key >= 32)  && (key <= 126) ) \r
82       { \r
83                 putchar(key);                   \r
84         buffer[bufpnt].key = key;  \r
85         bufpnt += 1; \r
86       }  \r
87                                                                        \r
88       /* Up arrow is 27, 91, 65.    ( ESC [ A )   */   \r
89       /* Down arrow is 27, 91, 66.  ( ESC [ B )   */ \r
90       /* Right arrow is 27, 91, 67. ( ESC [ C )   */ \r
91       /* Left arrow is 27, 91, 68.  ( ESC [ D )   */    \r
92       /* Function keys.     */ \r
93       /* F2 is 27, 79, 81.  */  \r
94       /* F3 is 27, 79, 82.  */  \r
95       /* F4 is 27, 79, 83.  */  \r
96            \r
97                 \r
98       else if(key == 27)        \r
99           {                       \r
100                           buffer[bufpnt].esc = 1;                        \r
101                           key = getchar(); \r
102               if(key == 91)               \r
103               buffer[bufpnt].lbr = 1;                \r
104               key = getchar(); \r
105               if( (key >= 65) && (key <= 68) )  \r
106                {                                 \r
107                                  buffer[bufpnt].key = key;                  \r
108                }                                  \r
109             bufpnt += 1;            \r
110           } \r
111               \r
112                                           \r
113                                                  \r
114     /* The Enter key exits. Enter is 10 decimal */        \r
115         else if(key == 10)  \r
116                 { \r
117                          int j ; \r
118                    /* Print the array of structs. */ \r
119                      for (j=0; j<10; j++)       \r
120                      { \r
121                             printf("Fnkey: %d ", buffer[j].fnkey  ) ; \r
122                             printf("Ctrl:  %d ", buffer[j].ctrl   ) ;   \r
123                             printf("Alt:   %d ", buffer[j].alt    ) ; \r
124                             printf("Shf:   %d ", buffer[j].shf    ) ; \r
125                             printf("Esc:   %d ", buffer[j].esc    ) ; \r
126                             printf("Lbr:   %d ", buffer[j].lbr    ) ;  \r
127                     printf("Key:   %d \n", buffer[j].key  ) ; \r
128                  }                      \r
129                                           \r
130              break;           \r
131          }  /* Key = Enter */   \r
132     }                \r
133                                       \r
134         return 0;\r
135 }  \r
136 \r
137 \r
138 \r
139 \r