13f5 #include #include #include #include #define ESC 0x1B #define LEFT 0x4B #define RIGHT 0x4D #define HOME 0x47 #define END 0x4F #define INSERT 0x52 #define DELETE 0x53 #define BACKSPC 0x08 #define ENTER 0x0D #define CTLEND 0x75 #define CTLHOME 0x77 #define CTLRT 0x74 #define CTLLFT 0x73 int edgets(char *s, int maxlen, int mk_upper) { char temp[82]; int insert = 1, done = 0, pos, len, i, j, c, zeroflag; static char curstart[2] = {6,4}; union REGS regs; cprintf("%s",s); strcpy(temp,s); pos = strlen(s); len = strlen(s); while (!done) { zeroflag = 0; if ((c = getch()) == 0) { zeroflag = 1; c = getch(); } if(mk_upper) c = toupper(c); switch (c) { case ESC : if (len == 0) break; for (i = pos; i < len; i++) putch(' '); for (i = len-1; i >= 0; i--) { putch(BACKSPC); putch(' '); putch(BACKSPC); } pos = len = 0; break; case LEFT : if (zeroflag) { if (pos == 0) break; pos--; putch(BACKSPC); break; } case RIGHT : if (zeroflag) { if (pos == len) break; if (pos != maxlen) { putch(temp[pos]); pos++; } break; } case HOME : if (zeroflag) { while (pos-- > 0) putch(BACKSPC); pos = 0; break; } case END : if (zeroflag) { while (pos < len) putch(temp[pos++]); break; } case INSERT : if (zeroflag) { insert = (!(insert)); regs.h.ah = 0x01; regs.h.ch = curstart[insert]; regs.h.cl = 7; int86(0x10, ®s, ®s); break; } case DELETE : if (zeroflag) { if (pos == len) break; for (i = pos; i < len; i++) temp[i] = temp[i + 1]; len--; for (i = pos; i < len; i++) putch(temp[i]); putch(' '); for (i = len + 1; i > pos; i--) putch(BACKSPC); break; } case BACKSPC : if (c == BACKSPC) { if (pos == 0) break; if (pos != len) { for (i = pos - 1; i < len; i++) temp[i] = temp[i + 1]; pos--; len--; putch(BACKSPC); for (i = pos; i < len; i++) putch(temp[i]); putch(' '); for (i = len; i >= pos; i--) putch(BACKSPC); } else { putch(BACKSPC); putch(' '); putch(BACKSPC); pos = --len; } break; } case ENTER : if (c == ENTER) { done = 1; break; } case CTLEND : if (zeroflag) { for (i = pos; i < len; ++i) putch(' '); for (i = pos; i < len; ++i) putch(BACKSPC); len = pos; break; } case CTLHOME : if (zeroflag) { if (pos == 0) break; if (pos != len) { while (0 != pos) { for (i = pos - 1; i < len; i++) temp[i] = temp[i + 1]; pos--; len--; putch(BACKSPC); for (i = pos; i < len; i++) putch(temp[i]); putch(' '); for (i = len; i >= pos; i--) putch(BACKSPC); } } else { while (0 != pos) { putch(BACKSPC); putch(' '); putch(BACKSPC); pos = --len; } } break; } case CTLRT : if (zeroflag) { do { if (pos == len) break; if (pos != maxlen) { putch(temp[pos]); pos++; } } while (isspace(temp[pos])); do { if (pos == len) break; if (pos != maxlen) { putch(temp[pos]); pos++; } } while (!isspace(temp[pos])); break; } case CTLLFT : if (zeroflag) { do { if (pos == 0) break; pos--; putch(BACKSPC); } while (isspace(temp[pos])); while(1) { if (pos == 0) break; pos--; if(!isspace(temp[pos])) putch(BACKSPC); else { pos++; break; } } break; } default : if (zeroflag) break; if (c == 0 || pos == maxlen) break; if ((!(insert)) || pos == len) { temp[pos++] = (char)c; if (pos > len) len++; putch(c); } else { if(len == maxlen) break; for (i = len++; i >= pos; i--) temp[i + 1] = temp[i]; temp[pos++] = (char)c; putch(c); for (i = pos; i < len; i++) putch(temp[i]); for (i = len; i > pos; i--) putch(BACKSPC); } } } temp[len] = '\0'; strcpy(s, temp); return len; } . 0