📄 sfpurge.c
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved. */#include "sfhdr.h"/* Delete all pending data in the buffer**** Written by Kiem-Phong Vo.*/#if __STD_Cint sfpurge(reg Sfio_t* f)#elseint sfpurge(f)reg Sfio_t* f;#endif{ reg int mode; SFMTXSTART(f,-1); if((mode = f->mode&SF_RDWR) != (int)f->mode && _sfmode(f,mode|SF_SYNCED,0) < 0) SFMTXRETURN(f, -1); if((f->flags&SF_IOCHECK) && f->disc && f->disc->exceptf) (void)(*f->disc->exceptf)(f,SF_PURGE,(Void_t*)((int)1),f->disc); if(f->disc == _Sfudisc) (void)sfclose((*_Sfstack)(f,NIL(Sfio_t*))); /* cannot purge read string streams */ if((f->flags&SF_STRING) && (f->mode&SF_READ) ) goto done; SFLOCK(f,0); /* if memory map must be a read stream, pretend data is gone */#ifdef MAP_TYPE if(f->bits&SF_MMAP) { f->here -= f->endb - f->next; if(f->data) { SFMUNMAP(f,f->data,f->endb-f->data); SFSK(f,f->here,SEEK_SET,f->disc); } SFOPEN(f,0); SFMTXRETURN(f, 0); }#endif switch(f->mode&~SF_LOCK) { default : SFOPEN(f,0); SFMTXRETURN(f, -1); case SF_WRITE : f->next = f->data; if(!f->proc || !(f->flags&SF_READ) || !(f->mode&SF_WRITE) ) break; /* 2-way pipe, must clear read buffer */ (void)_sfmode(f,SF_READ,1); /* fall through */ case SF_READ: if(f->extent >= 0 && f->endb > f->next) { f->here -= f->endb-f->next; SFSK(f,f->here,SEEK_SET,f->disc); } f->endb = f->next = f->data; break; } SFOPEN(f,0);done: if((f->flags&SF_IOCHECK) && f->disc && f->disc->exceptf) (void)(*f->disc->exceptf)(f,SF_PURGE,(Void_t*)((int)0),f->disc); SFMTXRETURN(f, 0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -