Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / sfio / sfnputc.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: sfnputc.c /main/3 1995/11/01 18:31:47 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46 #include        "sfhdr.h"
47
48 /*      Write out a character n times
49 **
50 **      Written by Kiem-Phong Vo (06/27/90)
51 */
52
53 #if __STD_C
54 sfnputc(reg Sfio_t* f, reg int c, reg int n)
55 #else
56 sfnputc(f,c,n)
57 reg Sfio_t      *f;     /* file to write */
58 reg int         c;      /* char to be written */
59 reg int         n;      /* number of time to repeat */
60 #endif
61 {
62         reg uchar       *ps;
63         reg int         p, w;
64         uchar           buf[128];
65         reg int         local;
66
67         GETLOCAL(f,local);
68         if(SFMODE(f,local) != SF_WRITE && _sfmode(f,SF_WRITE,local) < 0)
69                 return -1;
70
71         SFLOCK(f,local);
72
73         /* write into a suitable buffer */
74         if((p = (f->endb-(ps = f->next))) < n)
75                 { ps = buf; p = sizeof(buf); }
76         if(p > n)
77                 p = n;
78         MEMSET(ps,c,p);
79         ps -= p;
80
81         w = n;
82         if(ps == f->next)
83         {       /* simple sfwrite */
84                 f->next += p;
85                 if(c == '\n')
86                         (void)SFFLSBUF(f,-1);
87                 goto done;
88         }
89
90         for(;;)
91         {       /* hard write of data */
92                 if((p = SFWRITE(f,(Void_t*)ps,p)) <= 0 || (n -= p) <= 0)
93                 {       w -= n;
94                         goto done;
95                 }
96                 if(p > n)
97                         p = n;
98         }
99 done :
100         SFOPEN(f,local);
101         return w;
102 }