1 /*
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)tputs.c 8.1 (Berkeley) 06/04/93";
10 #endif /* not lint */
11
12 #include <sgtty.h>
13 #include <ctype.h>
14
15 /*
16 * The following array gives the number of tens of milliseconds per
17 * character for each speed as returned by gtty. Thus since 300
18 * baud returns a 7, there are 33.3 milliseconds per char at 300 baud.
19 */
20 static
21 short tmspc10[] = {
22 0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5
23 };
24
25 short ospeed;
26 char PC;
27
28 /*
29 * Put the character string cp out, with padding.
30 * The number of affected lines is affcnt, and the routine
31 * used to output one character is outc.
32 */
tputs(cp,affcnt,outc)33 tputs(cp, affcnt, outc)
34 register char *cp;
35 int affcnt;
36 int (*outc)();
37 {
38 register int i = 0;
39 register int mspc10;
40
41 if (cp == 0)
42 return;
43
44 /*
45 * Convert the number representing the delay.
46 */
47 if (isdigit(*cp)) {
48 do
49 i = i * 10 + *cp++ - '0';
50 while (isdigit(*cp));
51 }
52 i *= 10;
53 if (*cp == '.') {
54 cp++;
55 if (isdigit(*cp))
56 i += *cp - '0';
57 /*
58 * Only one digit to the right of the decimal point.
59 */
60 while (isdigit(*cp))
61 cp++;
62 }
63
64 /*
65 * If the delay is followed by a `*', then
66 * multiply by the affected lines count.
67 */
68 if (*cp == '*')
69 cp++, i *= affcnt;
70
71 /*
72 * The guts of the string.
73 */
74 while (*cp)
75 (*outc)(*cp++);
76
77 /*
78 * If no delay needed, or output speed is
79 * not comprehensible, then don't try to delay.
80 */
81 if (i == 0)
82 return;
83 if (ospeed <= 0 || ospeed >= (sizeof tmspc10 / sizeof tmspc10[0]))
84 return;
85
86 /*
87 * Round up by a half a character frame,
88 * and then do the delay.
89 * Too bad there are no user program accessible programmed delays.
90 * Transmitting pad characters slows many
91 * terminals down and also loads the system.
92 */
93 mspc10 = tmspc10[ospeed];
94 i += mspc10 / 2;
95 for (i /= mspc10; i > 0; i--)
96 (*outc)(PC);
97 }
98