1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 #include "sfhdr.h"
23
24 /* Tell the current location in a given stream
25 **
26 ** Written by Kiem-Phong Vo.
27 */
28
29 #if __STD_C
sftell(Sfio_t * f)30 Sfoff_t sftell(Sfio_t* f)
31 #else
32 Sfoff_t sftell(f)
33 Sfio_t *f;
34 #endif
35 {
36 reg int mode;
37 Sfoff_t p;
38 SFMTXDECL(f);
39
40 SFMTXENTER(f, (Sfoff_t)(-1));
41
42 /* set the stream to the right mode */
43 if((mode = f->mode&SF_RDWR) != (int)f->mode && _sfmode(f,mode,0) < 0)
44 SFMTXRETURN(f, (Sfoff_t)(-1));
45
46 /* throw away ungetc data */
47 if(f->disc == _Sfudisc)
48 (void)sfclose((*_Sfstack)(f,NIL(Sfio_t*)));
49
50 if(f->flags&SF_STRING)
51 SFMTXRETURN(f, (Sfoff_t)(f->next-f->data));
52
53 /* let sfseek() handle the hard case */
54 if(f->extent >= 0 && (f->flags&(SF_SHARE|SF_APPENDWR)) )
55 p = sfseek(f,(Sfoff_t)0,SEEK_CUR);
56 else p = f->here + ((f->mode&SF_WRITE) ? f->next-f->data : f->next-f->endb);
57
58 SFMTXRETURN(f,p);
59 }
60