|
|
1.1 root 1: /*
2:
3: Copyright 1990,1991 Eric R. Smith. All rights reserved.
4:
5: */
6:
7:
8:
9: /* MiNT routines for doing console I/O */
10:
11:
12:
13: #include "mint.h"
14:
15:
16:
17: /*
18:
19: * These routines are what Cconout, Cauxout, etc. ultimately call.
20:
21: * They take an integer argument which is the user's file handle,
22:
23: * and do the translation to a file ptr (and return an appropriate error
24:
25: * message if necessary.
26:
27: * "mode" may be RAW, COOKED, ECHO, or COOKED|ECHO.
28:
29: * note that the user may call them directly via Finstat(), Foutstat(),
30:
31: * Fgetchar(), and Fputchar()
32:
33: */
34:
35:
36:
37: long
38:
39: file_instat(h)
40:
41: int h;
42:
43: {
44:
45: FILEPTR *f;
46:
47: long r;
48:
49: PROC *proc;
50:
51: int fh = h;
52:
53:
54:
55: #if O_GLOBAL
56:
57: if (fh >= 100) {
58:
59: proc = rootproc;
60:
61: fh -= 100;
62:
63: } else
64:
65: #endif
66:
67: proc = curproc;
68:
69:
70:
71: if (fh < MIN_HANDLE || fh >=MAX_OPEN || !(f = proc->handle[fh])) {
72:
73: DEBUG("Finstat: bad handle %d", h);
74:
75: return EIHNDL;
76:
77: }
78:
79: r = 1; /* default is to assume input waiting (e.g. TOS files)*/
80:
81: (void)(*f->dev->ioctl)(f, FIONREAD, &r);
82:
83:
84:
85: return r;
86:
87: }
88:
89:
90:
91: long
92:
93: file_outstat(h)
94:
95: int h;
96:
97: {
98:
99: FILEPTR *f;
100:
101: long r;
102:
103: int fh = h;
104:
105: PROC *proc;
106:
107: #if O_GLOBAL
108:
109: if (fh >= 100) {
110:
111: fh -= 100;
112:
113: proc = rootproc;
114:
115: } else
116:
117: #endif
118:
119: proc = curproc;
120:
121:
122:
123: if (fh < MIN_HANDLE || fh >=MAX_OPEN || !(f = proc->handle[fh])) {
124:
125: DEBUG("Foutstat: bad handle %d", h);
126:
127: return EIHNDL;
128:
129: }
130:
131: r = 1; /* default is to assume output OK (e.g. TOS files) */
132:
133: (void)(*f->dev->ioctl)(f, FIONWRITE, &r);
134:
135: return r;
136:
137: }
138:
139:
140:
141: long
142:
143: file_getchar(h, mode)
144:
145: int h, mode;
146:
147: {
148:
149: FILEPTR *f;
150:
151: char c;
152:
153: long r;
154:
155: int fh = h;
156:
157: PROC *proc;
158:
159:
160:
161: #if O_GLOBAL
162:
163: if (fh >= 100) {
164:
165: fh -= 100;
166:
167: proc = rootproc;
168:
169: } else
170:
171: #endif
172:
173: proc = curproc;
174:
175: if (fh < MIN_HANDLE || fh >=MAX_OPEN || !(f = proc->handle[fh])) {
176:
177: DEBUG("Fgetchar: bad handle %d", h);
178:
179: return EIHNDL;
180:
181: }
182:
183: if (is_terminal(f)) {
184:
185: return tty_getchar(f, mode);
186:
187: }
188:
189: r = (*f->dev->read)(f, &c, 1L);
190:
191: if (r != 1)
192:
193: return MiNTEOF;
194:
195: else
196:
197: return ((long)c) & 0xff;
198:
199: }
200:
201:
202:
203: long
204:
205: file_putchar(h, c, mode)
206:
207: int h;
208:
209: long c;
210:
211: int mode;
212:
213: {
214:
215: FILEPTR *f;
216:
217: char ch;
218:
219: int fh = h;
220:
221: PROC *proc;
222:
223:
224:
225: #if O_GLOBAL
226:
227: if (fh >= 100) {
228:
229: fh -= 100;
230:
231: proc = rootproc;
232:
233: } else
234:
235: #endif
236:
237: proc = curproc;
238:
239:
240:
241: if (fh < MIN_HANDLE || fh >=MAX_OPEN || !(f = proc->handle[fh])) {
242:
243: DEBUG("Fputchar: bad handle %d", h);
244:
245: return EIHNDL;
246:
247: }
248:
249: if (is_terminal(f)) {
250:
251: return tty_putchar(f, c & 0x7fffffffL, mode);
252:
253: }
254:
255: ch = c & 0x00ff;
256:
257: return (*f->dev->write)(f, &ch, 1L);
258:
259: }
260:
261:
262:
263: /*
264:
265: * OK, here are the GEMDOS console I/O routines
266:
267: */
268:
269:
270:
271: long
272:
273: c_conin()
274:
275: {
276:
277: return file_getchar(0, COOKED|ECHO);
278:
279: }
280:
281:
282:
283: long
284:
285: c_conout(c)
286:
287: int c;
288:
289: {
290:
291: return file_putchar(1, (long)c, COOKED);
292:
293: }
294:
295:
296:
297: long
298:
299: c_auxin()
300:
301: {
302:
303: return file_getchar(2, RAW);
304:
305: }
306:
307:
308:
309: long
310:
311: c_auxout(c)
312:
313: int c;
314:
315: {
316:
317: return file_putchar(2, (long)c, RAW);
318:
319: }
320:
321:
322:
323: long
324:
325: c_prnout(c)
326:
327: int c;
328:
329: {
330:
331: return file_putchar(3, (long)c, RAW);
332:
333: }
334:
335:
336:
337: long
338:
339: c_rawio(c)
340:
341: int c;
342:
343: {
344:
345: long r;
346:
347:
348:
349: if (c == 0x00ff) {
350:
351: if (!file_instat(0))
352:
353: return 0;
354:
355: r = file_getchar(0, RAW);
356:
357: if (r <= 0)
358:
359: return 0;
360:
361: return r;
362:
363: }
364:
365: else
366:
367: return file_putchar(1, (long)c, RAW);
368:
369: }
370:
371:
372:
373: long
374:
375: c_rawcin()
376:
377: {
378:
379: return file_getchar(0, RAW);
380:
381: }
382:
383:
384:
385: long
386:
387: c_necin()
388:
389: {
390:
391: return file_getchar(0,COOKED|NOECHO);
392:
393: }
394:
395:
396:
397: long
398:
399: c_conws(str)
400:
401: const char *str;
402:
403: {
404:
405: const char *p = str;
406:
407: long cnt = 0;
408:
409:
410:
411: while (*p++) cnt++;
412:
413: return f_write(1, cnt, str);
414:
415: }
416:
417:
418:
419: long
420:
421: c_conrs(buf)
422:
423: char *buf;
424:
425: {
426:
427: long size, r;
428:
429: char *s;
430:
431:
432:
433: size = ((long)*buf) & 0xff;
434:
435: r = f_read(0, size, buf+2);
436:
437: if (r < 0) {
438:
439: buf[1] = 0;
440:
441: return r;
442:
443: }
444:
445: /* if reading from a file, stop at first CR or LF encountered */
446:
447: s = buf+2;
448:
449: size = 0;
450:
451: while(r-- > 0) {
452:
453: if (*s == '\r' || *s == '\n')
454:
455: break;
456:
457: s++; size++;
458:
459: }
460:
461: buf[1] = (char)size;
462:
463: return 0;
464:
465: }
466:
467:
468:
469: long
470:
471: c_conis()
472:
473: {
474:
475: return -(!!file_instat(0));
476:
477: }
478:
479:
480:
481: long
482:
483: c_conos()
484:
485: {
486:
487: return -(!!file_outstat(1));
488:
489: }
490:
491:
492:
493: long
494:
495: c_prnos()
496:
497: {
498:
499: return -(!!file_outstat(3));
500:
501: }
502:
503:
504:
505: long
506:
507: c_auxis()
508:
509: {
510:
511: return -(!!file_instat(2));
512:
513: }
514:
515:
516:
517: long
518:
519: c_auxos()
520:
521: {
522:
523: return -(!!file_outstat(2));
524:
525: }
526:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.