📄 readline.c
字号:
/* -*-C-*- * * $Revision: 1.2 $ * $Author: mechavar $ * $Date: 2000/05/01 19:37:08 $ * * Copyright (c) 2000 ARM, INC. * All Rights Reserved. * * Project: BootStrap Loader * * */#include <string.h>#include "swis.h"#define START ('A'-'@')#define BACK ('B'-'@')#define ERASE_FWD ('D'-'@')#define END ('E'-'@')#define FORWARD ('F'-'@')#define ERASE ('H'-'@')#define ERASE_EOL ('K'-'@')#define ENTER ('M'-'@')#define REDRAW ('R'-'@')#define ERASE_LINE ('U'-'@')#define ERASE_SOL ('W'-'@')#define BACKSPACE ('H'-'@')#define DELETE (0x7f)#define LF ('\n')#define CR ('\r')#define CTRL_D ('D'-'@')extern int ReadC(void);extern void WriteC(int c);static void backspace(int n){ while (n--) WriteC(BACKSPACE);}static void backup(char *buffer, int pos){ backspace(strlen(&buffer[pos]));}static void redraw_eol(char *buffer, int pos){ int c; while (c = buffer[pos++]) WriteC(c);}static void redraw_line(char *prompt, char *buffer, int pos){ int c; WriteC(CR); while (c = *prompt++) WriteC(c); redraw_eol(buffer, 0); backup(buffer, pos);}static void delete(char *buffer, int pos){ if (buffer[pos] == 0) return; strcpy(&buffer[pos], &buffer[pos+1]); redraw_eol(buffer, pos); WriteC(' '); WriteC(BACKSPACE); backup(buffer, pos); return;}static int insert(char *buffer, int pos, int c){ char *s = &buffer[pos]; memmove(s+1, s, strlen(s)+1); buffer[pos] = c; redraw_eol(buffer, pos); pos++; backup(buffer, pos); return pos;}int ReadLineZ(char *buffer, int maxlen){ int pos = 0; int c; do { c =ReadC(); if (c == CR || c == LF) { buffer[pos] = 0; return pos; } if (c == CTRL_D) { buffer[0] = 0; return -1; } if (c >= ' ' && pos < maxlen) buffer[pos++] = c; } while (1);}int ReadLine(char *prompt, char *buffer, int maxlen){ int i; int pos = 0; int c; *buffer = 0; Write0(prompt); do { c = ReadC(); if (c == DELETE) c = ERASE; if (c < ' ') { switch (c) { case START: backspace(pos); pos = 0; break; case BACK: if (pos > 0) { WriteC(BACKSPACE); pos--; } break; case ERASE_FWD: if (strlen(buffer) == 0) { Write0("*EOF*\r\n"); return -1; } delete(buffer, pos); break; case END: redraw_eol(buffer, pos); pos = strlen(buffer); break; case FORWARD: if (buffer[pos]) { WriteC(buffer[pos]); pos++; } break; case ERASE: if (pos > 0) { WriteC(BACKSPACE); pos--; delete(buffer, pos); } break; case ENTER: WriteC(CR); WriteC(LF); return strlen(buffer); case REDRAW: WriteC(LF); redraw_line(prompt, buffer, pos); break; case ERASE_LINE: backspace(pos); i = pos = strlen(buffer); while (i--) WriteC(' '); backspace(pos); pos = 0; buffer[0] = 0; break; } } else if (strlen(buffer) < maxlen) pos = insert(buffer, pos, c); } while (1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -