sfdctee.c

来自「su 的源代码库」· C语言 代码 · 共 85 行

C
85
字号
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include	"sfdchdr.h"/*	A discipline to tee the output to a stream to another stream.**	This is similar to what the "tee" program does. As implemented**	this discipline only works with file streams.****	Written by Kiem-Phong Vo, kpv@research.att.com, 03/18/1998.*//* the discipline structure for tee-ing */typedef struct _tee_s{	Sfdisc_t	disc;	/* the sfio discipline structure */	Sfio_t*		tee;	/* the stream to tee to */	int		status;	/* if tee stream is still ok */} Tee_t;/*	write to the teed stream.  */#if __STD_Cstatic ssize_t teewrite(Sfio_t* f, const Void_t* buf, size_t size, Sfdisc_t* disc)#elsestatic ssize_t teewrite(f,buf,size,disc)Sfio_t* 	f;	/* the stream being written to */Void_t*		buf;	/* the buffer of data being output */size_t		size;	/* the data size */Sfdisc_t*	disc;	/* the tee discipline */#endif{	reg Tee_t*	te = (Tee_t*)disc;	/* tee data if still ok */	if(te->status == 0 && sfwrite(te->tee,buf,size) != (ssize_t)size)		te->status = -1;	/* do the actual write */	return sfwr(f,buf,size,disc);}/* on close, remove the discipline */#if __STD_Cstatic int teeexcept(Sfio_t* f, int type, Void_t* data, Sfdisc_t* disc)#elsestatic int teeexcept(f,type,data,disc)Sfio_t*		f;int		type;Void_t*		data;Sfdisc_t*	disc;#endif{	if(type == SF_FINAL || type == SF_DPOP)		free(disc);	return 0;}#if __STD_Cint sfdctee(Sfio_t* f, Sfio_t* tee)#elseint sfdctee(f, tee)Sfio_t*	f;	/* stream to tee from	*/Sfio_t*	tee;	/* stream to tee to	*/#endif{	reg Tee_t*	te;	if(!(te = (Tee_t*)malloc(sizeof(Tee_t))) )		return -1;	te->disc.readf = NIL(Sfread_f);	te->disc.seekf = NIL(Sfseek_f);	te->disc.writef = teewrite;	te->disc.exceptf = teeexcept;	te->tee = tee;	te->status = 0;	if(sfdisc(f,(Sfdisc_t*)te) != (Sfdisc_t*)te)	{	free(te);		return -1;	}	return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?