|
|
1.1 root 1: /* ttyread.c - ttyread, readcopy */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <tty.h>
6: #include <io.h>
7:
8: /*------------------------------------------------------------------------
9: * ttyread - read one or more characters from a tty device
10: *------------------------------------------------------------------------
11: */
12: ttyread(devptr, buff, count)
13: struct devsw *devptr;
14: int count;
15: char *buff;
16: {
17: PStype ps;
18: register struct tty *iptr;
19: int avail, nread;
20: char ch, eofch;
21: int donow, dolater;
22:
23: if (count < 0)
24: return(SYSERR);
25: disable(ps);
26: if ( (avail=scount((iptr= &tty[devptr->dvminor])->isem)) < 0)
27: avail = 0;
28: if (count == 0) { /* read whatever is available */
29: if (avail == 0) {
30: restore(ps);
31: return(0);
32: }
33: count = avail;
34: }
35: if (count < avail) {
36: donow = count;
37: dolater = 0;
38: } else {
39: donow = avail;
40: dolater = count - avail;
41: }
42: nread = 0;
43: if (donow > 0) {
44: ch = iptr->ibuff[iptr->itail++];
45: if (iptr->itail >= IBUFLEN)
46: iptr->itail = 0;
47: if ( ((eofch=iptr->ieofc) == ch) && iptr->ieof) {
48: sreset(iptr->isem, avail-1);
49: restore(ps);
50: return(EOF);
51: }
52: *buff++ = ch;
53: for (nread=1 ; nread < donow ; ) {
54: ch = iptr->ibuff[iptr->itail];
55: if ( (ch==eofch) && iptr->ieof) {
56: sreset(iptr->isem, avail - nread);
57: restore(ps);
58: return(nread);
59: }
60: *buff++ = ch;
61: if (++iptr->itail >= IBUFLEN)
62: iptr->itail = 0;
63: nread++;
64: if (ch == NEWLINE || ch == RETURN) {
65: sreset(iptr->isem, avail - nread);
66: restore(ps);
67: return(nread);
68: }
69: }
70: sreset(iptr->isem, avail - nread);
71: }
72: donow = nread;
73: for (nread=0 ; nread < dolater ; ) {
74: wait(iptr->isem);
75: ch = iptr->ibuff[iptr->itail];
76: if (ch == iptr->ieofc && iptr->ieof) {
77: if (nread == 0 && donow == 0) {
78: if (++iptr->itail >= IBUFLEN)
79: iptr->itail = 0;
80: restore(ps);
81: return(EOF);
82: }
83: signal(iptr->isem);
84: break;
85: }
86: *buff++ = ch;
87: nread++;
88: if (++iptr->itail >= IBUFLEN)
89: iptr->itail = 0;
90: if (ch == NEWLINE || ch == RETURN)
91: break;
92: }
93: restore(ps);
94: return(donow + nread);
95: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.