]> pd.if.org Git - pd_readline/blob - pdmenu6.c
More good progress.
[pd_readline] / pdmenu6.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 /* A custom getchar to test the character type. */ \r
48 int mygetchar(void) \r
49 {\r
50    int ch = getchar();   \r
51    if (  (ch >= 32)  && (ch <= 126) ) \r
52     { \r
53        putchar(ch); \r
54        return ch;   \r
55     } \r
56     else \r
57     { \r
58        return ch;          \r
59     }    \r
60    \r
61 }\r
62 \r
63 \r
64 \r
65 int main(void)\r
66 {\r
67         \r
68   printf("Public Domain Readline \n");              \r
69   printf("NOTE! - at the moment, we are using \n");  \r
70   printf("NON-echoing reads, storing the keystrokes \n");  \r
71   printf("in a buffer \n");   \r
72     \r
73   \r
74   /* Buffer - an array of keyseq structs.                     */  \r
75   /* Note - now that we store the keystrokes in here,         */ \r
76   /* we can look at the various flags and decide whether to   */ \r
77   /* "echo" the key (as normal) or suppress it (as with an    */ \r
78   /* arrow key).                                              */    \r
79   keyseq buffer[80] ;   \r
80   \r
81   /* Buffer "pointer"  */ \r
82   int bufpnt = 0; \r
83   \r
84   \r
85   /* Test for existence of history file. */  \r
86   int exists;  \r
87   exists = fexists(".history"); \r
88   printf("Result: %d \n", exists);  \r
89   \r
90   while(1) \r
91     {  \r
92                    \r
93       int key = mygetchar(); \r
94        \r
95       /* Printable chars. */  \r
96       if ( (key >= 32)  && (key <= 126) ) \r
97       { \r
98                 putchar(key);                   \r
99         buffer[bufpnt].key = key;  \r
100         bufpnt += 1; \r
101       }  \r
102                                                                        \r
103       /* Up arrow is 27, 91, 65.    ( ESC [ A )   */   \r
104       /* Down arrow is 27, 91, 66.  ( ESC [ B )   */ \r
105       /* Right arrow is 27, 91, 67. ( ESC [ C )   */ \r
106       /* Left arrow is 27, 91, 68.  ( ESC [ D )   */    \r
107       /* Function keys.     */ \r
108       /* F2 is 27, 79, 81.  */  \r
109       /* F3 is 27, 79, 82.  */  \r
110       /* F4 is 27, 79, 83.  */  \r
111            \r
112                 \r
113       else if(key == 27)        \r
114           {                       \r
115                           buffer[bufpnt].esc = 1;                        \r
116                           key = mygetchar(); \r
117               if(key == 91)               \r
118               buffer[bufpnt].lbr = 1;                \r
119               key = mygetchar(); \r
120               if( (key >= 65) && (key <= 68) )  \r
121                {                                 \r
122                                  buffer[bufpnt].key = key;                  \r
123                }                                  \r
124             bufpnt += 1;            \r
125           } \r
126               \r
127                                           \r
128                                                  \r
129     /* The Enter key exits. Enter is 10 decimal */        \r
130         else if(key == 10)  \r
131                 { \r
132                          int j ; \r
133                    /* Print the array of structs. */ \r
134                      for (j=0; j<10; j++)       \r
135                      { \r
136                             printf("Fnkey: %d ", buffer[j].fnkey  ) ; \r
137                             printf("Ctrl:  %d ", buffer[j].ctrl   ) ;   \r
138                             printf("Alt:   %d ", buffer[j].alt    ) ; \r
139                             printf("Shf:   %d ", buffer[j].shf    ) ; \r
140                             printf("Esc:   %d ", buffer[j].esc    ) ; \r
141                             printf("Lbr:   %d ", buffer[j].lbr    ) ;  \r
142                     printf("Key:   %d \n", buffer[j].key  ) ; \r
143                  }                      \r
144                                           \r
145              break;           \r
146          }  /* Key = Enter */   \r
147     }                \r
148                                       \r
149         return 0;\r
150 }  \r
151 \r
152 \r
153 \r
154 \r