/[LeafOK_CVS]/lbbs/src/io.c
ViewVC logotype

Annotation of /lbbs/src/io.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (hide annotations)
Sat May 7 09:28:12 2005 UTC (20 years, 10 months ago) by sysadm
Branch: MAIN
Changes since 1.10: +14 -13 lines
Content type: text/x-csrc
*** empty log message ***

1 sysadm 1.1 /***************************************************************************
2     io.c - description
3     -------------------
4     begin : Mon Oct 18 2004
5     copyright : (C) 2004 by Leaflet
6     email : leaflet@leafok.com
7     ***************************************************************************/
8    
9     /***************************************************************************
10     * *
11     * This program is free software; you can redistribute it and/or modify *
12     * it under the terms of the GNU General Public License as published by *
13     * the Free Software Foundation; either version 2 of the License, or *
14     * (at your option) any later version. *
15     * *
16     ***************************************************************************/
17    
18     #include "io.h"
19     #include "common.h"
20 sysadm 1.11 #include "tcplib.h"
21 sysadm 1.1 #include <stdio.h>
22     #include <stdarg.h>
23 sysadm 1.9 #include <time.h>
24     #include <fcntl.h>
25     #include <unistd.h>
26 sysadm 1.5 #include <sys/ioctl.h>
27 sysadm 1.1
28     int
29 sysadm 1.6 outc (char c)
30 sysadm 1.1 {
31     int retval;
32    
33 sysadm 1.6 retval = fprintf (stdout, "%c", c);
34 sysadm 1.1
35     return retval;
36     }
37    
38     int
39 sysadm 1.6 prints (const char *format, ...)
40 sysadm 1.1 {
41     va_list args;
42     int retval;
43    
44     va_start (args, format);
45     retval = vfprintf (stdout, format, args);
46     va_end (args);
47    
48     return retval;
49     }
50    
51     int
52 sysadm 1.6 iflush ()
53 sysadm 1.1 {
54     int retval;
55 sysadm 1.6
56 sysadm 1.1 retval = fflush (stdout);
57 sysadm 1.6
58 sysadm 1.1 return retval;
59     }
60    
61     int
62     igetch ()
63     {
64     static char buf[256];
65 sysadm 1.3 unsigned char c, tmp[256];
66 sysadm 1.8 int out = KEY_NULL, loop = 1, in_esc = 0, in_ascii = 0, in_control = 0, i =
67 sysadm 1.9 0, j, result;
68 sysadm 1.6 static int len = 0, pos = 0;
69 sysadm 1.11 fd_set testfds;
70 sysadm 1.9 struct timeval timeout;
71 sysadm 1.1
72     if (pos >= len)
73 sysadm 1.6 {
74     pos = 0;
75 sysadm 1.9 len = 0;
76 sysadm 1.2
77 sysadm 1.11 FD_ZERO (&testfds);
78     FD_SET (0, &testfds);
79 sysadm 1.9
80     timeout.tv_sec = 1;
81     timeout.tv_usec = 0;
82    
83 sysadm 1.11 result = SignalSafeSelect (FD_SETSIZE, &testfds, (fd_set *) NULL,
84 sysadm 1.9 (fd_set *) NULL, &timeout);
85    
86 sysadm 1.11 if (result == 0)
87     {
88     return KEY_TIMEOUT;
89     }
90     if (result < 0)
91 sysadm 1.9 {
92     log_error ("select() error!\n");
93 sysadm 1.11 return KEY_NULL;
94     }
95     if (result > 0)
96     {
97 sysadm 1.9 if (FD_ISSET (0, &testfds))
98     {
99     len = read (0, buf, 255);
100     }
101     }
102 sysadm 1.5
103 sysadm 1.6 //For debug
104     //for (j = 0; j < len; j++)
105     // log_std ("<--[%u]\n", (buf[j] + 256) % 256);
106     }
107 sysadm 1.1
108     while (pos < len)
109     {
110     c = buf[pos++];
111    
112     if (c == '\0')
113 sysadm 1.6 {
114     out = c;
115     break;
116     }
117 sysadm 1.1
118 sysadm 1.3 if (c == KEY_CONTROL)
119 sysadm 1.6 {
120     if (in_control == 0)
121     {
122     in_control = 1;
123     i = 0;
124     continue;
125     }
126     }
127    
128 sysadm 1.3 if (in_control)
129 sysadm 1.6 {
130     tmp[i++] = c;
131     if (i >= 2)
132     {
133     out = (int) tmp[0] * 256 + tmp[1];
134     in_control = 0;
135     break;
136     }
137     continue;
138     }
139 sysadm 1.3
140 sysadm 1.1 if (c == ESC_KEY)
141     {
142     if (in_esc == 0)
143     {
144     in_esc = 1;
145     in_ascii = 1;
146     i = 0;
147     continue;
148     }
149     else
150     {
151     out = ESC_KEY;
152     in_esc = 0;
153     break;
154     }
155     }
156    
157     in_esc = 0;
158    
159     if (in_ascii)
160     {
161     tmp[i++] = c;
162     if (c == 'm')
163     {
164     in_ascii = 0;
165     continue;
166     }
167     if (i == 2 && c >= 'A' && c <= 'D')
168     {
169     in_ascii = 0;
170     switch (c)
171     {
172     case 'A':
173     out = KEY_UP;
174     break;
175     case 'B':
176     out = KEY_DOWN;
177     break;
178     case 'C':
179 sysadm 1.2 out = KEY_RIGHT;
180     break;
181     case 'D':
182 sysadm 1.1 out = KEY_LEFT;
183     break;
184 sysadm 1.2 }
185     break;
186     }
187     if (i == 3 && tmp[0] == 91 && tmp[2] == 126)
188     {
189     in_ascii = 0;
190     switch (tmp[1])
191     {
192     case 49:
193     out = KEY_HOME;
194     break;
195 sysadm 1.4 case 51:
196     out = KEY_DEL;
197     break;
198 sysadm 1.2 case 52:
199     out = KEY_END;
200     break;
201     case 53:
202     out = KEY_PGUP;
203     break;
204     case 54:
205 sysadm 1.8 out = KEY_PGDN;
206 sysadm 1.1 break;
207     }
208     break;
209     }
210     continue;
211     }
212    
213 sysadm 1.6 out = ((int) c + 256) % 256;
214 sysadm 1.1 break;
215     }
216    
217     //for debug
218 sysadm 1.5 //log_std ("-->[%u]\n", out);
219 sysadm 1.1
220     return out;
221     }
222 sysadm 1.5
223     int
224 sysadm 1.9 igetch_t (long int sec)
225     {
226     int ch;
227 sysadm 1.10 time_t t_begin = time (0);
228    
229     do
230     {
231     ch = igetch ();
232     }
233     while ((ch == KEY_TIMEOUT) && (time (0) - t_begin < sec));
234 sysadm 1.9
235     return ch;
236     }
237    
238     int
239 sysadm 1.6 ikbhit ()
240 sysadm 1.5 {
241     int len;
242 sysadm 1.6
243 sysadm 1.5 ioctl (0, FIONREAD, &len);
244 sysadm 1.6
245 sysadm 1.5 return len;
246     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1