1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright (c) 1995, by Sun Microsystems, Inc. 24 * All rights reserved. 25 */ 26 27 /* 28 * tputs.c 29 * 30 * XCurses Library 31 * 32 * Copyright 1990, 1995 by Mortice Kern Systems Inc. All rights reserved. 33 * 34 */ 35 36 #ifdef M_RCSID 37 #ifndef lint 38 static char rcsID[] = "$Header: /rd/src/libc/xcurses/rcs/tputs.c 1.4 1995/07/19 12:44:45 ant Exp $"; 39 #endif 40 #endif 41 42 #include <private.h> 43 #include <ctype.h> 44 #include <string.h> 45 #include <stdlib.h> 46 47 int 48 __m_putchar(byte) 49 int byte; 50 { 51 return putchar(byte); 52 } 53 54 int 55 (putp)(const char *s) 56 { 57 int code; 58 59 #ifdef M_CURSES_TRACE 60 __m_trace("putp(%p = \"%s\")", s, s); 61 #endif 62 63 code = tputs(s, 1, __m_putchar); 64 65 return __m_return_code("putp", code); 66 } 67 68 /*f 69 * Apply padding information to a string and write it out. 70 * Note the '/' option is not supported. 71 */ 72 int 73 tputs(string, affcnt, putout) 74 const char *string; 75 int affcnt; 76 int (*putout)(int); 77 { 78 char *mark; 79 int i, baud, len, null, number; 80 81 #ifdef M_CURSES_TRACE 82 __m_trace("tputs(%p = \"%s\", %d, %p)", string, string, affcnt, putout); 83 #endif 84 85 baud = baudrate(); 86 null = pad_char == (char *) 0 ? '\0' : pad_char[0]; 87 88 for (len = 0; *string; ++string){ 89 /* Look for "$<num.????>" */ 90 if (*string == '$' 91 && string[1] == '<' 92 && (isdigit(string[2]) || string[2] == '.') 93 && (mark = strchr(string, '>'))){ 94 number = atoi(string+2) * 10; 95 if ((string = strchr(string, '.')) != (char *) 0) 96 number += *++string-'0'; 97 string = mark; 98 if (*--mark == '*') 99 number *= affcnt; 100 if (padding_baud_rate && baud >= padding_baud_rate 101 && !xon_xoff) { 102 number = (baud/10 * number)/1000; 103 len += number; 104 if (putout != (int (*)(int)) 0) { 105 for (i=0; i < number; i++) 106 (void) (*putout)(null); 107 } 108 } 109 } else { 110 ++len; 111 if (putout != (int (*)(int)) 0) 112 (void) (*putout)(*string); 113 } 114 } 115 116 return __m_return_int("tputs", len); 117 } 118 119 120