⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readline.c

📁 AT91所有开发板的资料 AT91所有开发板的资料
💻 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 + -