xref: /plan9/sys/src/libstdio/fseeko.c (revision dc5a79c1208f0704eeb474acc990728f8b4854f5)
1*dc5a79c1SDavid du Colombier /*
2*dc5a79c1SDavid du Colombier  * pANS stdio -- fseeko
3*dc5a79c1SDavid du Colombier  */
4*dc5a79c1SDavid du Colombier #include "iolib.h"
fseeko(FILE * f,long long offs,int type)5*dc5a79c1SDavid du Colombier int fseeko(FILE *f, long long offs, int type){
6*dc5a79c1SDavid du Colombier 	switch(f->state){
7*dc5a79c1SDavid du Colombier 	case ERR:
8*dc5a79c1SDavid du Colombier 	case CLOSED:
9*dc5a79c1SDavid du Colombier 		return -1;
10*dc5a79c1SDavid du Colombier 	case WR:
11*dc5a79c1SDavid du Colombier 		fflush(f);
12*dc5a79c1SDavid du Colombier 		break;
13*dc5a79c1SDavid du Colombier 	case RD:
14*dc5a79c1SDavid du Colombier 		if(type==1 && f->buf!=f->unbuf)
15*dc5a79c1SDavid du Colombier 			offs-=f->wp-f->rp;
16*dc5a79c1SDavid du Colombier 		break;
17*dc5a79c1SDavid du Colombier 	}
18*dc5a79c1SDavid du Colombier 	if(f->flags&STRING || seek(f->fd, offs, type)==-1) return -1;
19*dc5a79c1SDavid du Colombier 	if(f->state==RD) f->rp=f->wp=f->buf;
20*dc5a79c1SDavid du Colombier 	if(f->state!=OPEN)
21*dc5a79c1SDavid du Colombier 		f->state=RDWR;
22*dc5a79c1SDavid du Colombier 	return 0;
23*dc5a79c1SDavid du Colombier }
24