EMILE/second/cli.c

111 lines
1.8 KiB
C
Raw Normal View History

2005-08-27 21:24:26 +00:00
/*
*
* (c) 2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
*
*/
#define __NO_INLINE__ /* to avoid inline putchar() */
2005-08-27 21:24:26 +00:00
#include <stdio.h>
#include <string.h>
#include "console.h"
#define LEFT_ARROW() if (pos > 0) \
{ \
putchar('\b'); \
pos--; \
}
#define RIGHT_ARROW() if (pos < l) \
{ \
putchar(s[pos]);\
pos++; \
}
#define DELETE() if (pos < l) \
{ \
strcpy(s + pos, s + pos + 1); \
l--; \
console_cursor_save(); \
printf("%s", s + pos); \
putchar(' '); \
console_cursor_restore(); \
}
2005-08-27 21:24:26 +00:00
void cli_edit(char *s, int length)
{
int l = strlen(s);
int pos = l;
int c;
2005-08-27 21:24:26 +00:00
int i;
console_cursor_off();
2005-08-27 21:24:26 +00:00
printf("%s", s);
console_cursor_on();
2005-08-27 21:24:26 +00:00
while ((c = console_getchar()) != '\r')
{
retry:
if (c == 0)
continue;
2005-08-27 21:24:26 +00:00
if ( (c > 0x1f) && (c < 0x7f) && (l < length - 1) )
{
for (i = l; i > pos; i--)
s[i] = s[i - 1];
s[pos] = c;
putchar(c);
2005-08-27 21:24:26 +00:00
pos++;
l++;
console_cursor_save();
printf("%s", s + pos);
console_cursor_restore();
2005-08-27 21:24:26 +00:00
}
else switch(c)
{
case '':
while ((c = console_getchar()) == 0);
if ( c != '[' )
goto retry;
while ((c = console_getchar()) == 0);
switch(c)
2005-08-27 21:24:26 +00:00
{
case 'D':
LEFT_ARROW();
break;
case 'C':
RIGHT_ARROW();
break;
case '3':
if (console_getchar() == '~')
DELETE();
break;
default:
goto retry;
2005-08-27 21:24:26 +00:00
}
break;
case '':
LEFT_ARROW();
break;
2005-08-27 21:24:26 +00:00
case '':
RIGHT_ARROW();
2005-08-27 21:24:26 +00:00
break;
case '\b': /* backspace */
if (pos > 0)
{
putchar('\b');
pos--;
l--;
2005-08-27 21:24:26 +00:00
strcpy(s + pos, s + pos + 1);
console_cursor_save();
2005-08-27 21:24:26 +00:00
printf("%s", s + pos);
putchar(' ');
console_cursor_restore();
2005-08-27 21:24:26 +00:00
}
break;
case 0x7f: /* Delete */
DELETE();
2005-08-27 21:24:26 +00:00
break;
}
}
}