📄 texcept.c
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved. */#include "sftest.h"static int Type;static int Sfn;#if __STD_Cstatic int except(Sfio_t* f, int type, Void_t* data, Sfdisc_t* disc)#elsestatic int except(f, type, data, disc)Sfio_t* f;int type;Void_t* data;Sfdisc_t* disc;#endif{ switch(type) { case SF_WRITE : Sfn += 1; return 0; case SF_CLOSING: if(Type == SF_CLOSING) return 0; case SF_SYNC: if(Type == SF_CLOSING) return 0; } Type = type; return -1;}#if __STD_Cstatic int except2(Sfio_t* f, int type, Void_t* data, Sfdisc_t* disc)#elsestatic int except2(f, type, data, disc)Sfio_t* f;int type;Void_t* data;Sfdisc_t* disc;#endif{ return 0;}#if __STD_Cstatic int except3(Sfio_t* f, int type, Void_t* data, Sfdisc_t* disc)#elsestatic int except3(f, type, data, disc)Sfio_t* f;int type;Void_t* data;Sfdisc_t* disc;#endif{ if(type == SF_LOCKED) { Type = type; return -1; } return 0;}#if __STD_Cstatic ssize_t readfunc(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)#elsestatic ssize_t readfunc(f, buf, n, disc)Sfio_t* f;Void_t* buf;size_t n;Sfdisc_t* disc;#endif{ if(sfgetc(f) >= 0) terror("Can't access stream here!"); return 0;}static Sfdisc_t Disc, Disc2;MAIN(){ Sfio_t *f, *f2; char buf[1024]; char rbuf[4*1024]; off_t o; int i; if(!(f = sfopen(NIL(Sfio_t*), tstfile(0), "w")) ) terror("Can't open file\n"); sfset(f,SF_IOCHECK,1); Disc.exceptf = except; if(!sfdisc(f,&Disc) ) terror("Pushing discipline failed\n"); sfdisc(f,&Disc); if(Type != SF_DPUSH) terror("Did not get push event\n"); /* this is to test sfraise(NULL,...) */ if(!(f2 = sfopen(NIL(Sfio_t*), tstfile(0), "w")) ) terror("Can't open file\n"); sfdisc(f2,&Disc); Sfn = 0; if(sfraise(0, SF_WRITE, 0) < 0) terror("sfraise failed\n"); if(Sfn != 2) terror("Didn't get right event count"); sfdisc(f,NIL(Sfdisc_t*)); if(Type != SF_DPOP) terror("Did not get pop event\n"); sfwrite(f,"123",3); sfsync(f); if(Type != SF_SYNC) terror("Did not get sync event\n"); sfwrite(f,"123",3); sfpurge(f); if(Type != SF_PURGE) terror("Did not get purge event\n"); sfclose(f); if(Type != SF_CLOSING) terror("Did not get close event\n"); sfclose(f); if(Type != SF_FINAL) terror("Did not get final event\n"); if(!(f = sfopen(NIL(Sfio_t*), tstfile(0), "r")) ) terror("Can't open file\n"); Disc2.readf = readfunc; Disc2.exceptf = except3; sfdisc(f,&Disc2); if(sfgetc(f) >= 0) terror("There should be no data here\n"); if(Type != SF_LOCKED) terror("Did not get lock event\n"); /* test to see if sfclose() preserves seek location */ if(!(f = sftmp(0)) ) terror("Can't create temp file\n"); sfsetbuf(f,buf,sizeof(buf)); for(i = 0; i < sizeof(rbuf); ++i) rbuf[i] = i; sfwrite(f,rbuf,sizeof(rbuf)); sfset(f,SF_WRITE,0); Disc.exceptf = except2; sfdisc(f,&Disc); sfseek(f,(Sfoff_t)0,0); if(sfread(f,rbuf,4) != 4) terror("reading 4 bytes\n"); for(i = 0; i < 4; ++i) if(rbuf[i] != i) terror("wrong 4 bytes\n"); sfsync(f); if((o = lseek(sffileno(f), (off_t)0, SEEK_CUR)) != 4) terror("Wrong seek location %lld\n", (Sfoff_t)o); if((i = dup(sffileno(f))) < 0) terror("Can't dup file descriptor\n"); if((o = lseek(i, (off_t)0, SEEK_CUR)) != 4) terror("Wrong seek location %lld\n", (Sfoff_t)o); sfclose(f); if((o = lseek(i, (off_t)0, SEEK_CUR)) != 4) terror("Wrong seek location %lld\n", (Sfoff_t)o); TSTEXIT(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -