1. 程式人生 > >裸機實現回寫,行輸入

裸機實現回寫,行輸入

沒有標準庫真麻煩,寫一個簡單的shell,費時間的全在字元處理上了。

先把寫好的程式碼記下,免得以後重寫

 

// 取字元,並回寫
#define
echo_getc(c) do{ \ static int count = 0; \ \ do {(c) = getc();} \ while ((c) == '\b' && count == 0); \ if ((c) == '\b' && count > 0) { \ putc((c)); \ putc(
' '); \ count--; \ putc((c)); \ } else if (((c) == 0x0d) || ((c) == 0x0a)) { \ count = 0; \ } else { \ putc((c)); \ count++; \ } \ }while(0);
// 行輸入
#define gets(buf) do{\ char c = 0; \ int i = 0; \ do { \ echo_getc(c); \
if (c == '\r') \ break; \ else if (c != '\b') \ (buf)[i++] = c; \ else if (i > 0) \ i--; \ else \ continue; \ }while(1); \ (buf)[i] = 0; \ putc('\r'); \ putc('\n'); \ }while(0);

 

// 標準輸入
int
scanf(const char * fmt, ...) { int i = 0; unsigned char c; va_list args; while(1) { echo_getc(c); if((c == 0x0d) || (c == 0x0a)) { g_pcInBuf[i] = '\0'; break; } else if (c != '\b') { g_pcInBuf[i++] = c; } else if (i > 0) { i--; } else { continue; } } va_start(args,fmt); i = vsscanf(g_pcInBuf,fmt,args); va_end(args); printf("\n"); return i; }