sfflsbuf.c
来自「su 的源代码库」· C语言 代码 · 共 99 行
C
99 行
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved. */#include "sfhdr.h"/* Write a buffer out to a file descriptor or** extending a buffer for a SF_STRING stream.**** Written by Kiem-Phong Vo*/#if __STD_Cint _sfflsbuf(reg Sfio_t* f, reg int c)#elseint _sfflsbuf(f,c)reg Sfio_t* f; /* write out the buffered content of this stream */reg int c; /* if c>=0, c is also written out */ #endif{ reg ssize_t n, w; reg uchar* data; uchar outc; reg int local, isall; int inpc = c; SFMTXSTART(f,-1); GETLOCAL(f,local); for(;; f->mode &= ~SF_LOCK) { /* check stream mode */ if(SFMODE(f,local) != SF_WRITE && _sfmode(f,SF_WRITE,local) < 0) SFMTXRETURN(f, -1); SFLOCK(f,local); /* current data extent */ n = f->next - (data = f->data); if(n == (f->endb-data) && (f->flags&SF_STRING)) { /* extend string stream buffer */ (void)SFWR(f,data,1,f->disc); /* !(f->flags&SF_STRING) is required because exception handlers may turn a string stream to a file stream */ if(f->next < f->endb || !(f->flags&SF_STRING) ) n = f->next - (data = f->data); else { SFOPEN(f,local); SFMTXRETURN(f, -1); } } if(c >= 0) { /* write into buffer */ if(n < (f->endb - (data = f->data))) { *f->next++ = c; if(c == '\n' && (f->flags&SF_LINE) && !(f->flags&SF_STRING)) { c = -1; n += 1; } else break; } else if(n == 0) { /* unbuffered io */ outc = (uchar)c; data = &outc; c = -1; n = 1; } } if(n == 0 || (f->flags&SF_STRING)) break; isall = SFISALL(f,isall); if((w = SFWR(f,data,n,f->disc)) > 0) { if((n -= w) > 0) /* save unwritten data, then resume */ memcpy((char*)f->data,(char*)data+w,n); f->next = f->data+n; if(c < 0 && (!isall || n == 0)) break; } else if(w == 0) { SFOPEN(f,local); SFMTXRETURN(f, -1); } else if(c < 0) break; } SFOPEN(f,local); if(inpc < 0) inpc = f->endb-f->next; SFMTXRETURN(f,inpc);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?