add rdline
This commit is contained in:
parent
4580d576a8
commit
dce27c5d22
53
boot/boot.c
53
boot/boot.c
@ -33,26 +33,55 @@ machdep(void)
|
|||||||
static void
|
static void
|
||||||
puts(char *s)
|
puts(char *s)
|
||||||
{
|
{
|
||||||
for(;*s;++s)
|
for(;*s; ++s)
|
||||||
putchar(*s);
|
putchar(*s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
putcn(char *s, int n)
|
||||||
|
{
|
||||||
|
for(int i=0; i < n; ++i)
|
||||||
|
putchar(s[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
rdline(char *buf, int n)
|
||||||
|
{
|
||||||
|
char *p = buf;
|
||||||
|
char *e = buf + n;
|
||||||
|
|
||||||
|
while(p < e){
|
||||||
|
int c = getchar();
|
||||||
|
switch(c){
|
||||||
|
case '\177':
|
||||||
|
case '\b':
|
||||||
|
if(p > buf){
|
||||||
|
putchar('\177');
|
||||||
|
*--p = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
case '\r':
|
||||||
|
goto done;
|
||||||
|
default:
|
||||||
|
*p++ = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
done:
|
||||||
|
return p - buf;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
boot(int bootdev)
|
boot(int bootdev)
|
||||||
{
|
{
|
||||||
|
machdep();
|
||||||
|
for(;;){
|
||||||
char buf[8192];
|
char buf[8192];
|
||||||
|
|
||||||
machdep();
|
|
||||||
putchar('\n');
|
|
||||||
for(;;){
|
|
||||||
int i=0, c=0;
|
|
||||||
|
|
||||||
puts("\nboot >> ");
|
puts("\nboot >> ");
|
||||||
do{
|
int l = rdline(buf, sizeof(buf));
|
||||||
c = getchar();
|
putcn(buf, l);
|
||||||
buf[i++] = c;
|
|
||||||
}while(c != '\n' && i < sizeof(buf) - 1);
|
|
||||||
buf[i-1] = 0;
|
|
||||||
puts(buf);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,6 @@
|
|||||||
#include "fn.h"
|
#include "fn.h"
|
||||||
|
|
||||||
#define TABWIDTH 8
|
#define TABWIDTH 8
|
||||||
#define DEL '\177'
|
|
||||||
|
|
||||||
static void conputc(int c);
|
static void conputc(int c);
|
||||||
static int congetc(void);
|
static int congetc(void);
|
||||||
@ -16,9 +15,9 @@ getchar(void)
|
|||||||
int c;
|
int c;
|
||||||
|
|
||||||
c = congetc();
|
c = congetc();
|
||||||
if( c == '\r')
|
if(c == '\r')
|
||||||
c = '\n';
|
c = '\n';
|
||||||
if((c < ' ' && c != '\n') || c == DEL)
|
if((c < ' ' && c != '\n') || c == '\177')
|
||||||
return c;
|
return c;
|
||||||
putchar(c);
|
putchar(c);
|
||||||
return c;
|
return c;
|
||||||
@ -28,12 +27,12 @@ void
|
|||||||
putchar(int c)
|
putchar(int c)
|
||||||
{
|
{
|
||||||
switch(c){
|
switch(c){
|
||||||
case DEL:
|
case '\177':
|
||||||
conputc('\b');
|
conputc('\b');
|
||||||
conputc(' ');
|
conputc(' ');
|
||||||
case '\b':
|
case '\b':
|
||||||
conputc('\b');
|
conputc('\b');
|
||||||
if(pos)
|
if(pos > 0)
|
||||||
--pos;
|
--pos;
|
||||||
break;
|
break;
|
||||||
case '\t':
|
case '\t':
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user