From: Sam Leffler Date: Tue, 28 Jun 1983 04:57:06 +0000 (-0800) Subject: date and time created 83/06/27 13:57:06 by sam X-Git-Tag: BSD-4_2-Snapshot-Development~1318 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/789eab2e0aa4dfe7d2ed15a1fae3d16505c1d6f5 date and time created 83/06/27 13:57:06 by sam SCCS-vsn: lib/libterm/tputs.c 4.1 --- diff --git a/usr/src/lib/libterm/tputs.c b/usr/src/lib/libterm/tputs.c new file mode 100644 index 0000000000..6c6627f99b --- /dev/null +++ b/usr/src/lib/libterm/tputs.c @@ -0,0 +1,91 @@ +#ifndef lint +static char sccsid[] = "@(#)tputs.c 4.1 (Berkeley) %G%"; +#endif + +/* Copyright (c) 1979 Regents of the University of California */ +#include +#include + +/* + * The following array gives the number of tens of milliseconds per + * character for each speed as returned by gtty. Thus since 300 + * baud returns a 7, there are 33.3 milliseconds per char at 300 baud. + */ +static +short tmspc10[] = { + 0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5 +}; + +short ospeed; +char PC; + +/* + * Put the character string cp out, with padding. + * The number of affected lines is affcnt, and the routine + * used to output one character is outc. + */ +tputs(cp, affcnt, outc) + register char *cp; + int affcnt; + int (*outc)(); +{ + register int i = 0; + register int mspc10; + + if (cp == 0) + return; + + /* + * Convert the number representing the delay. + */ + if (isdigit(*cp)) { + do + i = i * 10 + *cp++ - '0'; + while (isdigit(*cp)); + } + i *= 10; + if (*cp == '.') { + cp++; + if (isdigit(*cp)) + i += *cp - '0'; + /* + * Only one digit to the right of the decimal point. + */ + while (isdigit(*cp)) + cp++; + } + + /* + * If the delay is followed by a `*', then + * multiply by the affected lines count. + */ + if (*cp == '*') + cp++, i *= affcnt; + + /* + * The guts of the string. + */ + while (*cp) + (*outc)(*cp++); + + /* + * If no delay needed, or output speed is + * not comprehensible, then don't try to delay. + */ + if (i == 0) + return; + if (ospeed <= 0 || ospeed >= (sizeof tmspc10 / sizeof tmspc10[0])) + return; + + /* + * Round up by a half a character frame, + * and then do the delay. + * Too bad there are no user program accessible programmed delays. + * Transmitting pad characters slows many + * terminals down and also loads the system. + */ + mspc10 = tmspc10[ospeed]; + i += mspc10 / 2; + for (i /= mspc10; i > 0; i--) + (*outc)(PC); +}