14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*10898Sroland.mainz@nrubsig.org * Copyright (c) 1985-2009 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.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 /* Delete all pending data in the buffer 254887Schin ** 264887Schin ** Written by Kiem-Phong Vo. 274887Schin */ 284887Schin 294887Schin #if __STD_C 308462SApril.Chin@Sun.COM int sfpurge(Sfio_t* f) 314887Schin #else 324887Schin int sfpurge(f) 338462SApril.Chin@Sun.COM Sfio_t* f; 344887Schin #endif 354887Schin { 364887Schin reg int mode; 378462SApril.Chin@Sun.COM SFMTXDECL(f); 384887Schin 398462SApril.Chin@Sun.COM SFMTXENTER(f,-1); 404887Schin 414887Schin if((mode = f->mode&SF_RDWR) != (int)f->mode && _sfmode(f,mode|SF_SYNCED,0) < 0) 424887Schin SFMTXRETURN(f, -1); 434887Schin 444887Schin if((f->flags&SF_IOCHECK) && f->disc && f->disc->exceptf) 454887Schin (void)(*f->disc->exceptf)(f,SF_PURGE,(Void_t*)((int)1),f->disc); 464887Schin 474887Schin if(f->disc == _Sfudisc) 484887Schin (void)sfclose((*_Sfstack)(f,NIL(Sfio_t*))); 494887Schin 504887Schin /* cannot purge read string streams */ 514887Schin if((f->flags&SF_STRING) && (f->mode&SF_READ) ) 524887Schin goto done; 534887Schin 544887Schin SFLOCK(f,0); 554887Schin 564887Schin /* if memory map must be a read stream, pretend data is gone */ 574887Schin #ifdef MAP_TYPE 584887Schin if(f->bits&SF_MMAP) 594887Schin { f->here -= f->endb - f->next; 604887Schin if(f->data) 614887Schin { SFMUNMAP(f,f->data,f->endb-f->data); 62*10898Sroland.mainz@nrubsig.org (void)SFSK(f,f->here,SEEK_SET,f->disc); 634887Schin } 644887Schin SFOPEN(f,0); 654887Schin SFMTXRETURN(f, 0); 664887Schin } 674887Schin #endif 684887Schin 694887Schin switch(f->mode&~SF_LOCK) 704887Schin { 714887Schin default : 724887Schin SFOPEN(f,0); 734887Schin SFMTXRETURN(f, -1); 744887Schin case SF_WRITE : 754887Schin f->next = f->data; 764887Schin if(!f->proc || !(f->flags&SF_READ) || !(f->mode&SF_WRITE) ) 774887Schin break; 784887Schin 794887Schin /* 2-way pipe, must clear read buffer */ 804887Schin (void)_sfmode(f,SF_READ,1); 814887Schin /* fall through */ 824887Schin case SF_READ: 834887Schin if(f->extent >= 0 && f->endb > f->next) 844887Schin { f->here -= f->endb-f->next; 85*10898Sroland.mainz@nrubsig.org (void)SFSK(f,f->here,SEEK_SET,f->disc); 864887Schin } 874887Schin f->endb = f->next = f->data; 884887Schin break; 894887Schin } 904887Schin 914887Schin SFOPEN(f,0); 924887Schin 934887Schin done: 944887Schin if((f->flags&SF_IOCHECK) && f->disc && f->disc->exceptf) 954887Schin (void)(*f->disc->exceptf)(f,SF_PURGE,(Void_t*)((int)0),f->disc); 964887Schin 974887Schin SFMTXRETURN(f, 0); 984887Schin } 99