Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/sfio/sfnputc.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1985-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
20
* *
21
***********************************************************************/
22
#include "sfhdr.h"
23
24
/* Write out a character n times
25
**
26
** Written by Kiem-Phong Vo.
27
*/
28
29
#if __STD_C
30
ssize_t sfnputc(Sfio_t* f, int c, size_t n)
31
#else
32
ssize_t sfnputc(f,c,n)
33
Sfio_t* f; /* file to write */
34
int c; /* char to be written */
35
size_t n; /* number of time to repeat */
36
#endif
37
{
38
reg uchar* ps;
39
reg ssize_t p, w;
40
uchar buf[128];
41
reg int local;
42
SFMTXDECL(f); /* declare a local stream variable for multithreading */
43
44
SFMTXENTER(f,-1);
45
46
GETLOCAL(f,local);
47
if(SFMODE(f,local) != SF_WRITE && _sfmode(f,SF_WRITE,local) < 0)
48
SFMTXRETURN(f, -1);
49
50
SFLOCK(f,local);
51
52
/* write into a suitable buffer */
53
if((size_t)(p = (f->endb-(ps = f->next))) < n)
54
{ ps = buf; p = sizeof(buf); }
55
if((size_t)p > n)
56
p = n;
57
MEMSET(ps,c,p);
58
ps -= p;
59
60
w = n;
61
if(ps == f->next)
62
{ /* simple sfwrite */
63
f->next += p;
64
if(c == '\n')
65
(void)SFFLSBUF(f,-1);
66
goto done;
67
}
68
69
for(;;)
70
{ /* hard write of data */
71
if((p = SFWRITE(f,(Void_t*)ps,p)) <= 0 || (n -= p) <= 0)
72
{ w -= n;
73
goto done;
74
}
75
if((size_t)p > n)
76
p = n;
77
}
78
done :
79
SFOPEN(f,local);
80
SFMTXRETURN(f, w);
81
}
82
83