00001
00002
00003
00004 #include "win.h"
00005 #include <string.h>
00006
00007 #include <termio.h>
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <fcntl.h>
00017
00018 #define MYCMASK 0377
00019 #define BACKSPACE 8
00020 #define TAB 9
00021 #define LINE_FEED 10
00022 #define CARRIAGE_RETURN 13
00023 #define REFRESH 18
00024 #define KILL_LINE 21
00025 #define KILL_WORD 23
00026 #define DEL 127
00027
00028 #define IDLESTRNGCNT_MAX 255
00029
00030
00031
00032
00033
00034 struct termios ios0, ios1;
00035
00036
00037 char idlestrng[256];
00038 int fd, idlestrngcnt;
00039
00040 get_timeout()
00041
00042
00043
00044
00045
00046
00047 {
00048 char c;
00049
00050 if ( (c = getchar_ub()) > 0) return(process_char(c));
00051
00052 return(0);
00053
00054
00055 }
00056
00057 getchar_ub()
00058 {
00059 char c;
00060
00061 return ((read(0, &c, 1) > 0) ? c & MYCMASK : EOF);
00062 }
00063
00064 process_char(c)
00065 char c;
00066 {
00067 int i,idletog = 0;
00068
00069 if (c == '\b' || c == DEL) {
00070
00071
00072
00073 if (idlestrngcnt > 0)
00074 erase_char();
00075 else {
00076
00077
00078 }
00079 }
00080 else if (c == KILL_WORD) {
00081
00082
00083
00084 if (idlestrngcnt > 0)
00085 erase_word();
00086 else {
00087
00088
00089 }
00090 }
00091 else if (c == REFRESH) {
00092
00093
00094
00095 putchar('^');putchar('R');putchar('\n');
00096 for (i = 0; i < idlestrngcnt; i++) putchar(idlestrng[i]);
00097 fflush(stdout);
00098 }
00099 else if (c == KILL_LINE) {
00100
00101
00102
00103 if (idlestrngcnt == 0) {
00104
00105
00106 }
00107 while(idlestrngcnt) erase_char();
00108 idlestrng[0] = '\0';
00109 }
00110 else if (c == '\n' || (c >= ' '&& c <= '~')) {
00111
00112 idlestrng[idlestrngcnt] = c;
00113 idlestrng[++idlestrngcnt] = '\0';
00114
00115 if (c == '\n') idletog++;
00116
00117 if (idlestrngcnt >= IDLESTRNGCNT_MAX) {
00118 idlestrng[idlestrngcnt] = '\n';
00119 idletog++;
00120 }
00121 putchar(c);
00122 fflush(stdout);
00123 }
00124 return(idletog);
00125 }
00126
00127 erase_char()
00128 {
00129 idlestrngcnt--;
00130 putchar('\b');
00131 putchar(' ');
00132 putchar('\b');
00133 fflush(stdout);
00134 idlestrng[idlestrngcnt] = '\0';
00135 }
00136
00137 erase_word()
00138 {
00139 int i,is = 0,len,lens;
00140
00141 len = idlestrngcnt;
00142
00143 i = idlestrngcnt-1;
00144 for(i=idlestrngcnt-1;i>=0;i--) if (idlestrng[i] != ' ') break;
00145 lens = i;
00146
00147 for(i=0;i<lens;i++)
00148 if (idlestrng[i] == ' ' || idlestrng[i] == ';') is = i;
00149
00150 if (is!=0) is = is+1;
00151 for(i=is;i<len;i++) erase_char();
00152 }
00153
00154
00155 set_timeout()
00156 {
00157
00158
00159
00160 if ( (fd = open("/dev/tty", O_RDONLY)) < 0 ) exit(1);
00161 ioctl(fd, TCGETA, &ios0);
00162 ioctl(fd, TCGETA, &ios1);
00163
00164
00165
00166 ios1.c_lflag &= 0xfff5;
00167
00168
00169
00170 ios1.c_cc[VMIN] = 0;
00171 ios1.c_cc[VTIME] = 1;
00172
00173 ioctl(fd, TCSETA, &ios1);
00174
00175 idlestrngcnt = 0;
00176 idlestrng[0] = '\0';
00177 }
00178
00179 reset_term(strng)
00180 char *strng;
00181 {
00182
00183
00184
00185 ioctl(fd, TCSETA, &ios0);
00186
00187 close(fd);
00188
00189 strcat(strng,idlestrng);
00190 }
00191
00192 clear_buffer()
00193 {
00194 idlestrng[0] = '\0';
00195 idlestrngcnt = 0;
00196 }