1N/A/***********************************************************************
1N/A* *
1N/A* This software is part of the ast package *
1N/A* Copyright (c) 1985-2011 AT&T Intellectual Property *
1N/A* and is licensed under the *
1N/A* Common Public License, Version 1.0 *
1N/A* by AT&T Intellectual Property *
1N/A* *
1N/A* A copy of the License is available at *
1N/A* http://www.opensource.org/licenses/cpl1.0.txt *
1N/A* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1N/A* *
1N/A* Information and Software Systems Research *
1N/A* AT&T Research *
1N/A* Florham Park NJ *
1N/A* *
1N/A* Glenn Fowler <gsf@research.att.com> *
1N/A* David Korn <dgk@research.att.com> *
1N/A* Phong Vo <kpv@research.att.com> *
1N/A* *
1N/A***********************************************************************/
1N/A#include "sfhdr.h"
1N/A
1N/A/* Safe access to the internal stream buffer.
1N/A** This function is obsolete. sfreserve() should be used.
1N/A**
1N/A** Written by Kiem-Phong Vo (06/27/90).
1N/A*/
1N/A
1N/A#if _BLD_sfio && defined(__EXPORT__)
1N/A#define extern __EXPORT__
1N/A#endif
1N/A
1N/A#if __STD_C
1N/Aextern ssize_t sfpeek(reg Sfio_t* f, Void_t** bp, reg size_t size)
1N/A#else
1N/Aextern ssize_t sfpeek(f,bp,size)
1N/Areg Sfio_t* f; /* file to peek */
1N/AVoid_t** bp; /* start of data area */
1N/Areg size_t size; /* size of peek */
1N/A#endif
1N/A{ reg ssize_t n, sz;
1N/A reg int mode;
1N/A
1N/A /* query for the extent of the remainder of the buffer */
1N/A if((sz = size) == 0 || !bp)
1N/A { if(f->mode&SF_INIT)
1N/A (void)_sfmode(f,0,0);
1N/A
1N/A if((f->flags&SF_RDWRSTR) == SF_RDWRSTR)
1N/A { SFSTRSIZE(f);
1N/A n = (f->data+f->here) - f->next;
1N/A }
1N/A else n = f->endb - f->next;
1N/A
1N/A if(!bp)
1N/A return n;
1N/A else if(n > 0) /* size == 0 */
1N/A { *bp = (Void_t*)f->next;
1N/A return 0;
1N/A }
1N/A /* else fall down and fill buffer */
1N/A }
1N/A
1N/A if(!(mode = f->flags&SF_READ) )
1N/A mode = SF_WRITE;
1N/A if((int)f->mode != mode && _sfmode(f,mode,0) < 0)
1N/A return -1;
1N/A
1N/A *bp = sfreserve(f, sz <= 0 ? 0 : sz > f->size ? f->size : sz, 0);
1N/A
1N/A if(*bp && sz >= 0)
1N/A return sz;
1N/A
1N/A if((n = sfvalue(f)) > 0)
1N/A { *bp = (Void_t*)f->next;
1N/A if(sz < 0)
1N/A { f->mode |= SF_PEEK;
1N/A f->endr = f->endw = f->data;
1N/A }
1N/A else
1N/A { if(sz > n)
1N/A sz = n;
1N/A f->next += sz;
1N/A }
1N/A }
1N/A
1N/A return (sz >= 0 && n >= sz) ? sz : n;
1N/A}