|
|
1.1 root 1: /* ttywrite.c - ttywrite, writcopy */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <tty.h>
6: #include <io.h>
7: #include <slu.h>
8:
9: /*------------------------------------------------------------------------
10: * ttywrite - write one or more characters to a tty device
11: *------------------------------------------------------------------------
12: */
13: ttywrite(devptr, buff, count)
14: struct devsw *devptr;
15: char *buff;
16: int count;
17: {
18: register struct tty *ttyp;
19: int ncopied;
20: PStype ps;
21:
22: if (count < 0)
23: return(SYSERR);
24: if (count == 0)
25: return(OK);
26: disable(ps);
27: ttyp = &tty[devptr->dvminor];
28: count -= (ncopied = writcopy(buff, ttyp, count));
29: buff += ncopied;
30: for ( ; count>0 ; count--)
31: ttyputc(devptr, *buff++);
32: restore(ps);
33: return(OK);
34: }
35:
36: /*------------------------------------------------------------------------
37: * writcopy - high-speed copy from user's buffer into system buffer
38: *------------------------------------------------------------------------
39: */
40: LOCAL writcopy(buff, ttyp, count)
41: char *buff;
42: struct tty *ttyp;
43: int count;
44: {
45: register int avail;
46: register char *cp, *qhead, *qend, *uend;
47:
48: avail = scount(ttyp->osem);
49: qhead = &ttyp->obuff[ttyp->ohead];
50: qend = &ttyp->obuff[OBUFLEN];
51: cp = buff;
52: uend = buff + count;
53: while (avail-- > 1 && cp < uend) {
54: if (*cp == NEWLINE && ttyp->ocrlf) {
55: *qhead++ = RETURN;
56: --avail;
57: if ( qhead >= qend )
58: qhead = ttyp->obuff;
59: }
60: *qhead++ = *cp++;
61: if ( qhead >= qend )
62: qhead = ttyp->obuff;
63: } /* avail decremented one*/
64: ttyp->ohead = qhead - ttyp->obuff; /* extra time when loop */
65: sreset(ttyp->osem, ++avail); /* condition fails. */
66: (ttyp->ioaddr)->ctstat = SLUENABLE;
67: return(cp - buff);
68: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.