xref: /plan9/sys/src/ape/lib/ap/stdio/fseek.c (revision d9dc5dd1222af33cc62eadd05bf208e8fc0098de)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * pANS stdio -- fseek
33e12c5d1SDavid du Colombier  */
43e12c5d1SDavid du Colombier #include "iolib.h"
fseek(FILE * f,long offs,int type)5*d9dc5dd1SDavid du Colombier int fseek(FILE *f, long offs, int type){
63e12c5d1SDavid du Colombier 	switch(f->state){
73e12c5d1SDavid du Colombier 	case ERR:
83e12c5d1SDavid du Colombier 	case CLOSED:
93e12c5d1SDavid du Colombier 		return -1;
103e12c5d1SDavid du Colombier 	case WR:
113e12c5d1SDavid du Colombier 		fflush(f);
123e12c5d1SDavid du Colombier 		break;
133e12c5d1SDavid du Colombier 	case RD:
143e12c5d1SDavid du Colombier 		if(type==1 && f->buf!=f->unbuf)
153e12c5d1SDavid du Colombier 			offs-=f->wp-f->rp;
163e12c5d1SDavid du Colombier 		break;
173e12c5d1SDavid du Colombier 	}
183e12c5d1SDavid du Colombier 	if(f->flags&STRING || lseek(f->fd, offs, type)==-1)
193e12c5d1SDavid du Colombier 		return -1;
203e12c5d1SDavid du Colombier 	if(f->state==RD) f->rp=f->wp=f->buf;
213e12c5d1SDavid du Colombier 	if(f->state!=OPEN)
223e12c5d1SDavid du Colombier 		f->state=RDWR;
233e12c5d1SDavid du Colombier 	return 0;
243e12c5d1SDavid du Colombier }
25