This repo is for the storage of a public-domain
readline-and-command-history implementation.
-Update - 5th Sep 2012 -
+Update - 6th Sep 2012 -
Almost there!
-The code now "pretty much" works as expected.
-( However, pressing Enter exits the program rather
+The code now pretty much works as expected.
+
+It looks like the stack-smash problem has now
+been fixed. I've give the code a pretty good
+hammering and it didn't give me problems.
+
+Pressing Enter still exits the program rather
than storing the existing command-line and "staying
-in the program". I hope to fix this soon. )
+in the program". I hope to change this soon.
You can edit a command-line (using backspace).
You can move around with left and right-arrow
the up-arrow key, and you can scroll up and down
through the command-history.
-*** CAUTION! *** - There is, however, an occasional
-problem with "stack-smashing".
-
-
This code is released to the public domain.
"Share and enjoy........ ;) "
/* See the UNLICENSE file for details. */
/* TO DO - */
-/* a) Fix the "stack smash" problem. */
-/* b) Put much of the code into a header file. */
-/* c) Change so that pressing Enter adds the current */
+/* a) Add support for Home and End (of line) keys. */
+/* b) Add support for function keys. */
+/* c) Add support for Insert key so that text can be */
+/* inserted. */
+/* d) Put much of the code into a header file. */
+/* e) Change so that pressing Enter adds the current */
/* line of commands to the command-history. */
/* ( May look at using Ctrl-D to exit, as Python */
/* does with its command-line. ) */
-/* d) Add support for copying and pasting text via */
+/* f) Add support for copying and pasting text via */
/* Ctrl-C and Ctrl-V. */
char hist[20][80];
+
/* Read the file into the array of strings. */
void readfile(char *fname)
{
/* Our "command-history" file. */
readfile("test.txt");
-/* Main buffer for the command-line. */
-char buffer[80];
-
-/* Main buffer "pointer" */
-int bufpnt = 0;
/* "Pointer" for the history file. */
int histpnt = 20;
while(1)
{
- int key = getch();
- buffer[bufpnt] = key;
- bufpnt += 1;
+ int key = getch();
/* Printable chars. */
if ( (key >= 32) && (key <= 126) )
{
/* We have a printable key so print it. */
- putchar(key);
- bufpnt += 1;
+ putchar(key);
}
/* Up arrow is 27, 91, 65. ( ESC [ A ) */
/* Backspace */
else if(key == 127)
{
- /* Move left 1 char and delete that char */
- bufpnt -= 1;
+ /* Move left 1 char and delete that char */
printf("\033[1D");
printf("\040");
- printf("\033[1D");
- /* Move 1 char to left again */
- bufpnt -= 1;
+ printf("\033[1D");
}
/* We have an escape key-sequence */
histpnt -= 1;
/* Clear to end of line. */
printf("\033[80D");
- printf("\033[K");
- /* Move buffer pointer to start of line */
- bufpnt = 0;
- /* Clear the array. */
- memset(buffer, 0, sizeof(char)*80);
+ printf("\033[K");
/* Print the pointed-at command-sequence. */
putline(hist[histpnt]);
}
histpnt += 1;
/* Clear to end of line. */
printf("\033[80D");
- printf("\033[K");
- /* Move buffer pointer to start of line */
- bufpnt = 0;
- /* Clear the array. */
- memset(buffer, 0, sizeof(char)*80);
+ printf("\033[K");
/* Print the pointed-at command-sequence. */
putline(hist[histpnt]);
}
if(key == 67) /* Left arrow */
{
- /* Move one character to the left. */
+ /* Move one character to the left. */
printf("\033[1C");
}
if(key == 68) /* Right arrow */
{
- /* Move one character to the right. */
+ /* Move one character to the right. */
printf("\033[1D");
}