Lines Matching refs:f

30 static void newpos(Sfio_t* f, Sfoff_t p)  in newpos()  argument
32 static void newpos(f, p) in newpos()
33 Sfio_t* f; in newpos()
38 if((f->bits&SF_MMAP) && f->data)
39 { SFMUNMAP(f, f->data, f->endb-f->data);
40 f->data = NIL(uchar*);
43 f->next = f->endr = f->endw = f->data;
44 f->endb = (f->mode&SF_WRITE) ? f->data+f->size : f->data;
45 if((f->here = p) < 0)
46 { f->extent = -1;
47 f->here = 0;
52 Sfoff_t sfseek(Sfio_t* f, Sfoff_t p, int type) in sfseek() argument
54 Sfoff_t sfseek(f,p,type) in sfseek()
55 Sfio_t* f; /* seek to a new location in this stream */ in sfseek()
62 SFMTXDECL(f);
64 SFMTXENTER(f, (Sfoff_t)(-1));
66 GETLOCAL(f,local);
68 hardseek = (type|f->flags)&(SF_SHARE|SF_PUBLIC);
70 if(hardseek && f->mode == (SF_READ|SF_SYNCED) )
71 { newpos(f,f->here);
72 f->mode = SF_READ;
76 if((int)SFMODE(f,local) != (mode = f->mode&SF_RDWR))
77 { int flags = f->flags;
80 f->flags |= SF_SHARE|SF_PUBLIC;
81 mode = _sfmode(f,mode,local);
83 f->flags = flags;
86 SFMTXRETURN(f, (Sfoff_t)(-1));
90 (f->mode&SF_READ) && !(f->flags&SF_STRING);
96 SFMTXRETURN(f, (Sfoff_t)(-1));
99 if(f->extent < 0)
101 (void)SFSK(f,(Sfoff_t)0,SEEK_CUR,f->disc);
102 SFMTXRETURN(f, (Sfoff_t)(-1));
106 if(f->disc == _Sfudisc)
107 (void)sfclose((*_Sfstack)(f,NIL(Sfio_t*)));
110 SFLOCK(f,local);
113 f->flags &= ~(SF_EOF|SF_ERROR);
115 while(f->flags&SF_STRING)
116 { SFSTRSIZE(f);
119 r = p + (f->next - f->data);
121 r = p + f->extent;
124 if(r >= 0 && r <= f->size)
126 f->next = f->data+p;
127 f->here = p;
128 if(p > f->extent)
129 memclear((char*)(f->data+f->extent),(int)(p-f->extent));
134 if(SFSK(f,r,SEEK_SET,f->disc) != r)
138 else if(!(f->flags&SF_STRING))
144 if(f->mode&SF_WRITE)
146 if(!hardseek && type < SEEK_END && !(f->flags&SF_APPENDWR) )
147 { s = f->here + (f->next - f->data);
155 if(f->next > f->data && SFSYNC(f) < 0)
161 if(type == SEEK_END || (f->mode&SF_WRITE) )
163 p = SFSK(f, p, type, f->disc);
165 { r = p + (type == SEEK_CUR ? f->here : 0);
166 p = (hardseek || r != f->here) ? SFSK(f,r,SEEK_SET,f->disc) : r;
169 newpos(f,p);
175 s = f->here - (f->endb - f->next);
177 if(r <= f->here && r >= (f->here - (f->endb-f->data)) )
179 { if((s = SFSK(f, (Sfoff_t)0, SEEK_CUR, f->disc)) == f->here ||
181 (s = SFSK(f, f->here, SEEK_SET, f->disc)) == f->here) )
188 { newpos(f,s);
194 f->next = f->endb - (f->here - r);
205 if(f->bits&SF_MMAP)
208 if((f->next - f->data) < ((f->endb - f->data)/4) )
209 { SFSETBUF(f,(Void_t*)f->tiny,(size_t)SF_UNBOUND);
215 newpos(f,p);
222 if(f->endb > f->next)
224 f->iosz = (f->next - f->data) + (f->endb - f->next)/2;
225 f->iosz = ((f->iosz + f->blksz-1)/f->blksz)*f->blksz;
227 if(f->iosz >= f->size)
228 f->iosz = 0;
231 f->next = f->endr = f->endb = f->data;
234 if(p < f->lpos && f->size > f->blksz && (p + f->blksz) > s)
235 { if((r = s - f->size) < 0)
239 else if(f->blksz > 0 && f->size >= 2*f->blksz)
240 r = p - (p%f->blksz);
245 if(f->iosz > 0 && (p > f->lpos || p < f->lpos-f->size) )
246 f->bits |= SF_JUSTSEEK;
249 if((hardseek || r != f->here) && (f->here = SFSK(f,r,SEEK_SET,f->disc)) != r)
251 f->here = SFSK(f,p,SEEK_SET,f->disc);
252 if(f->here != p)
258 { (void)SFRD(f, f->data, f->size, f->disc);
259 if(p <= f->here && p >= (f->here - (f->endb - f->data)) )
260 f->next = f->endb - (size_t)(f->here-p);
262 { f->next = f->endb = f->data;
263 if((f->here = SFSK(f,p,SEEK_SET,f->disc)) != p)
269 if(f->here < 0) /* hasn't been the best of time */
270 { f->extent = -1;
271 f->here = 0;
274 f->lpos = p;
276 SFOPEN(f,local);
279 sfsync(f);
280 SFMTXRETURN(f, p);