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

Annotation of /lbbs/src/io.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16 - (hide annotations)
Wed Apr 30 09:18:19 2025 UTC (10 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.15: +1 -0 lines
Content type: text/x-csrc
Add missing header files
Update compile dependency

1 sysadm 1.1 /***************************************************************************
2 sysadm 1.14 io.c - description
3     -------------------
4     begin : Mon Oct 18 2004
5     copyright : (C) 2004 by Leaflet
6     email : leaflet@leafok.com
7 sysadm 1.1 ***************************************************************************/
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 sysadm 1.16 #include "log.h"
20 sysadm 1.1 #include "common.h"
21 sysadm 1.11 #include "tcplib.h"
22 sysadm 1.1 #include <stdio.h>
23     #include <stdarg.h>
24 sysadm 1.9 #include <time.h>
25     #include <fcntl.h>
26     #include <unistd.h>
27 sysadm 1.5 #include <sys/ioctl.h>
28 sysadm 1.1
29 sysadm 1.14 int outc(char c)
30 sysadm 1.1 {
31 sysadm 1.14 int retval;
32 sysadm 1.1
33 sysadm 1.14 retval = fprintf(stdout, "%c", c);
34 sysadm 1.1
35 sysadm 1.14 return retval;
36 sysadm 1.1 }
37    
38 sysadm 1.14 int prints(const char *format, ...)
39 sysadm 1.1 {
40 sysadm 1.14 va_list args;
41     int retval;
42 sysadm 1.1
43 sysadm 1.14 va_start(args, format);
44     retval = vfprintf(stdout, format, args);
45     va_end(args);
46 sysadm 1.1
47 sysadm 1.14 return retval;
48 sysadm 1.1 }
49    
50 sysadm 1.14 int iflush()
51 sysadm 1.1 {
52 sysadm 1.14 int retval;
53 sysadm 1.6
54 sysadm 1.14 retval = fflush(stdout);
55 sysadm 1.6
56 sysadm 1.14 return retval;
57 sysadm 1.1 }
58    
59 sysadm 1.14 int igetch()
60 sysadm 1.1 {
61 sysadm 1.14 static char buf[256];
62     unsigned char c, tmp[256];
63     int out = KEY_NULL, loop = 1, in_esc = 0, in_ascii = 0, in_control = 0, i = 0, j, result;
64     static int len = 0, pos = 0;
65     fd_set testfds;
66     struct timeval timeout;
67 sysadm 1.1
68 sysadm 1.14 // Stop on system exit
69     if (SYS_exit)
70     return KEY_NULL;
71 sysadm 1.12
72 sysadm 1.14 if (pos >= len)
73     {
74     pos = 0;
75     len = 0;
76 sysadm 1.2
77 sysadm 1.14 FD_ZERO(&testfds);
78     FD_SET(0, &testfds);
79 sysadm 1.9
80 sysadm 1.14 timeout.tv_sec = 1;
81     timeout.tv_usec = 0;
82 sysadm 1.9
83 sysadm 1.14 result = SignalSafeSelect(FD_SETSIZE, &testfds, (fd_set *)NULL,
84     (fd_set *)NULL, &timeout);
85 sysadm 1.9
86 sysadm 1.14 if (result == 0)
87     {
88     return KEY_TIMEOUT;
89     }
90     if (result < 0)
91     {
92     log_error("select() error (%d) !\n", result);
93     return KEY_NULL;
94     }
95     if (result > 0)
96     {
97     if (FD_ISSET(0, &testfds))
98     {
99     len = read(0, buf, 255);
100     }
101     }
102    
103     // For debug
104     // for (j = 0; j < len; j++)
105     // log_std ("<--[%u]\n", (buf[j] + 256) % 256);
106 sysadm 1.11 }
107 sysadm 1.14
108     while (pos < len)
109 sysadm 1.11 {
110 sysadm 1.14 c = buf[pos++];
111 sysadm 1.5
112 sysadm 1.14 if (c == '\0')
113     {
114     out = c;
115     break;
116     }
117 sysadm 1.1
118 sysadm 1.14 if (c == KEY_CONTROL)
119     {
120     if (in_control == 0)
121     {
122     in_control = 1;
123     i = 0;
124     continue;
125     }
126     }
127 sysadm 1.1
128 sysadm 1.14 if (in_control)
129     {
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.6
140 sysadm 1.14 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 sysadm 1.3
157 sysadm 1.14 in_esc = 0;
158 sysadm 1.1
159 sysadm 1.14 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     out = KEY_RIGHT;
180     break;
181     case 'D':
182     out = KEY_LEFT;
183     break;
184     }
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     case 51:
196     out = KEY_DEL;
197     break;
198     case 52:
199     out = KEY_END;
200     break;
201     case 53:
202     out = KEY_PGUP;
203     break;
204     case 54:
205     out = KEY_PGDN;
206     break;
207     }
208     break;
209     }
210     continue;
211     }
212 sysadm 1.1
213 sysadm 1.14 out = ((int)c + 256) % 256;
214     break;
215 sysadm 1.1 }
216    
217 sysadm 1.14 // for debug
218     // log_std ("-->[%u]\n", out);
219 sysadm 1.1
220 sysadm 1.14 return out;
221 sysadm 1.1 }
222 sysadm 1.5
223 sysadm 1.14 int igetch_t(long int sec)
224 sysadm 1.9 {
225 sysadm 1.14 int ch;
226     time_t t_begin = time(0);
227 sysadm 1.10
228 sysadm 1.14 do
229     {
230     ch = igetch();
231 sysadm 1.15 } while ((ch == KEY_TIMEOUT || ch == 0xa || ch == 0x0) && (time(0) - t_begin < sec));
232 sysadm 1.9
233 sysadm 1.14 return ch;
234 sysadm 1.9 }
235    
236 sysadm 1.14 int ikbhit()
237 sysadm 1.5 {
238 sysadm 1.14 int len;
239 sysadm 1.6
240 sysadm 1.14 ioctl(0, FIONREAD, &len);
241 sysadm 1.6
242 sysadm 1.14 return len;
243 sysadm 1.5 }

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