⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sfungetc.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include	"sfhdr.h"/*	Push back one byte to a given SF_READ stream****	Written by Kiem-Phong Vo.*/#if __STD_Cstatic int _uexcept(reg Sfio_t* f, reg int type, Void_t* val, reg Sfdisc_t* disc)#elsestatic int _uexcept(f,type,val,disc)reg Sfio_t	*f;reg int		type;Void_t*		val;reg Sfdisc_t	*disc;#endif{		NOTUSED(val);	/* hmm! This should never happen */	if(disc != _Sfudisc)		return -1;	/* close the unget stream */	if(type != SF_CLOSING)		(void)sfclose((*_Sfstack)(f,NIL(Sfio_t*)));	return 1;}#if __STD_Cint sfungetc(reg Sfio_t* f, reg int c)#elseint sfungetc(f,c)reg Sfio_t*	f;	/* push back one byte to this stream */reg int		c;	/* the value to be pushed back */#endif{	reg Sfio_t*	uf;	SFMTXSTART(f, -1)	if(c < 0 || (f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0))		SFMTXRETURN(f, -1);	SFLOCK(f,0);	/* fast handling of the typical unget */	if(f->next > f->data && f->next[-1] == (uchar)c)	{	f->next -= 1;		goto done;	}	/* make a string stream for unget characters */	if(f->disc != _Sfudisc)	{	if(!(uf = sfnew(NIL(Sfio_t*),NIL(char*),(size_t)SF_UNBOUND,				-1,SF_STRING|SF_READ)))		{	c = -1;			goto done;		}		_Sfudisc->exceptf = _uexcept;		sfdisc(uf,_Sfudisc);		SFOPEN(f,0); (void)sfstack(f,uf); SFLOCK(f,0);	}	/* space for data */	if(f->next == f->data)	{	reg uchar*	data;		if(f->size < 0)			f->size = 0;		if(!(data = (uchar*)malloc(f->size+16)))		{	c = -1;			goto done;		}		f->flags |= SF_MALLOC;		if(f->data)			memcpy((char*)(data+16),(char*)f->data,f->size);		f->size += 16;		f->data  = data;		f->next  = data+16;		f->endb  = data+f->size;	}	*--f->next = (uchar)c;done:	SFOPEN(f,0);	SFMTXRETURN(f, c);}

⌨️ 快捷键说明

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