14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*8462SApril.Chin@Sun.COM * Copyright (c) 1985-2008 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 7*8462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #include "sfhdr.h" 234887Schin 244887Schin /* Write out a character n times 254887Schin ** 264887Schin ** Written by Kiem-Phong Vo. 274887Schin */ 284887Schin 294887Schin #if __STD_C 30*8462SApril.Chin@Sun.COM ssize_t sfnputc(Sfio_t* f, int c, size_t n) 314887Schin #else 324887Schin ssize_t sfnputc(f,c,n) 33*8462SApril.Chin@Sun.COM Sfio_t* f; /* file to write */ 34*8462SApril.Chin@Sun.COM int c; /* char to be written */ 35*8462SApril.Chin@Sun.COM size_t n; /* number of time to repeat */ 364887Schin #endif 374887Schin { 384887Schin reg uchar* ps; 394887Schin reg ssize_t p, w; 404887Schin uchar buf[128]; 414887Schin reg int local; 42*8462SApril.Chin@Sun.COM SFMTXDECL(f); 434887Schin 44*8462SApril.Chin@Sun.COM SFMTXENTER(f,-1); 454887Schin 464887Schin GETLOCAL(f,local); 474887Schin if(SFMODE(f,local) != SF_WRITE && _sfmode(f,SF_WRITE,local) < 0) 484887Schin SFMTXRETURN(f, -1); 494887Schin 504887Schin SFLOCK(f,local); 514887Schin 524887Schin /* write into a suitable buffer */ 534887Schin if((size_t)(p = (f->endb-(ps = f->next))) < n) 544887Schin { ps = buf; p = sizeof(buf); } 554887Schin if((size_t)p > n) 564887Schin p = n; 574887Schin MEMSET(ps,c,p); 584887Schin ps -= p; 594887Schin 604887Schin w = n; 614887Schin if(ps == f->next) 624887Schin { /* simple sfwrite */ 634887Schin f->next += p; 644887Schin if(c == '\n') 654887Schin (void)SFFLSBUF(f,-1); 664887Schin goto done; 674887Schin } 684887Schin 694887Schin for(;;) 704887Schin { /* hard write of data */ 714887Schin if((p = SFWRITE(f,(Void_t*)ps,p)) <= 0 || (n -= p) <= 0) 724887Schin { w -= n; 734887Schin goto done; 744887Schin } 754887Schin if((size_t)p > n) 764887Schin p = n; 774887Schin } 784887Schin done : 794887Schin SFOPEN(f,local); 804887Schin SFMTXRETURN(f, w); 814887Schin } 82