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

📄 sfsk.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include	"sfhdr.h"/*	Seek function that knows discipline****	Written by Kiem-Phong Vo.*/#if __STD_CSfoff_t sfsk(reg Sfio_t* f, Sfoff_t addr, reg int type, Sfdisc_t* disc)#elseSfoff_t sfsk(f,addr,type,disc)reg Sfio_t*	f;Sfoff_t		addr;reg int		type;Sfdisc_t*	disc;#endif{	Sfoff_t		p;	reg Sfdisc_t*	dc;	reg ssize_t	s;	reg int		local, mode;	SFMTXSTART(f, (Sfoff_t)(-1));	GETLOCAL(f,local);	if(!local && !(f->bits&SF_DCDOWN))	{	if((mode = f->mode&SF_RDWR) != (int)f->mode && _sfmode(f,mode,0) < 0)			SFMTXRETURN(f, (Sfoff_t)(-1));		if(SFSYNC(f) < 0)			SFMTXRETURN(f, (Sfoff_t)(-1));#ifdef MAP_TYPE		if(f->mode == SF_READ && (f->bits&SF_MMAP) && f->data)		{	SFMUNMAP(f, f->data, f->endb-f->data);			f->data = NIL(uchar*);		}#endif		f->next = f->endb = f->endr = f->endw = f->data;	}	if((type &= (SEEK_SET|SEEK_CUR|SEEK_END)) > SEEK_END)		SFMTXRETURN(f, (Sfoff_t)(-1));	for(;;)	{	dc = disc;		if(f->flags&SF_STRING)		{	SFSTRSIZE(f);			if(type == SEEK_SET)				s = (ssize_t)addr;			else if(type == SEEK_CUR)				s = (ssize_t)(addr + f->here);			else	s = (ssize_t)(addr + f->extent);		}		else		{	SFDISC(f,dc,seekf);			if(dc && dc->seekf)			{	SFDCSK(f,addr,type,dc,p);			}			else			{	p = syslseekf(f->file,(sfoff_t)addr,type);			}			if(p >= 0)				SFMTXRETURN(f,p);			s = -1;		}		if(local)			SETLOCAL(f);		switch(_sfexcept(f,SF_SEEK,s,dc))		{		case SF_EDISC:		case SF_ECONT:			if(f->flags&SF_STRING)				SFMTXRETURN(f, (Sfoff_t)s);			goto do_continue;		default:			SFMTXRETURN(f, (Sfoff_t)(-1));		}	do_continue:		for(dc = f->disc; dc; dc = dc->disc)			if(dc == disc)				break;		disc = dc;	}}

⌨️ 快捷键说明

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