diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
commit | 3950ffe2a485479f6561c27364d3d7df5a21d124 (patch) | |
tree | 468c6e14449d1b1e279222ec32f676b0311917d2 /src/lib/libast/sfio/sfnputc.c | |
download | ksh-upstream.tar.gz |
Imported Upstream version 93u+upstream
Diffstat (limited to 'src/lib/libast/sfio/sfnputc.c')
-rw-r--r-- | src/lib/libast/sfio/sfnputc.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/lib/libast/sfio/sfnputc.c b/src/lib/libast/sfio/sfnputc.c new file mode 100644 index 0000000..58a1430 --- /dev/null +++ b/src/lib/libast/sfio/sfnputc.c @@ -0,0 +1,81 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2011 AT&T Intellectual Property * +* and is licensed under the * +* Eclipse Public License, Version 1.0 * +* by AT&T Intellectual Property * +* * +* A copy of the License is available at * +* http://www.eclipse.org/org/documents/epl-v10.html * +* (with md5 checksum b35adb5213ca9657e911e9befb180842) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* Phong Vo <kpv@research.att.com> * +* * +***********************************************************************/ +#include "sfhdr.h" + +/* Write out a character n times +** +** Written by Kiem-Phong Vo. +*/ + +#if __STD_C +ssize_t sfnputc(Sfio_t* f, int c, size_t n) +#else +ssize_t sfnputc(f,c,n) +Sfio_t* f; /* file to write */ +int c; /* char to be written */ +size_t n; /* number of time to repeat */ +#endif +{ + reg uchar* ps; + reg ssize_t p, w; + uchar buf[128]; + reg int local; + SFMTXDECL(f); /* declare a local stream variable for multithreading */ + + SFMTXENTER(f,-1); + + GETLOCAL(f,local); + if(SFMODE(f,local) != SF_WRITE && _sfmode(f,SF_WRITE,local) < 0) + SFMTXRETURN(f, -1); + + SFLOCK(f,local); + + /* write into a suitable buffer */ + if((size_t)(p = (f->endb-(ps = f->next))) < n) + { ps = buf; p = sizeof(buf); } + if((size_t)p > n) + p = n; + MEMSET(ps,c,p); + ps -= p; + + w = n; + if(ps == f->next) + { /* simple sfwrite */ + f->next += p; + if(c == '\n') + (void)SFFLSBUF(f,-1); + goto done; + } + + for(;;) + { /* hard write of data */ + if((p = SFWRITE(f,(Void_t*)ps,p)) <= 0 || (n -= p) <= 0) + { w -= n; + goto done; + } + if((size_t)p > n) + p = n; + } +done : + SFOPEN(f,local); + SFMTXRETURN(f, w); +} |