/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 1985-2011 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Glenn Fowler <[email protected]> *17* David Korn <[email protected]> *18* Phong Vo <[email protected]> *19* *20***********************************************************************/21#include "sfhdr.h"2223/* Safe access to the internal stream buffer.24** This function is obsolete. sfreserve() should be used.25**26** Written by Kiem-Phong Vo (06/27/90).27*/2829#if _BLD_sfio && defined(__EXPORT__)30#define extern __EXPORT__31#endif3233#if __STD_C34extern ssize_t sfpeek(reg Sfio_t* f, Void_t** bp, reg size_t size)35#else36extern ssize_t sfpeek(f,bp,size)37reg Sfio_t* f; /* file to peek */38Void_t** bp; /* start of data area */39reg size_t size; /* size of peek */40#endif41{ reg ssize_t n, sz;42reg int mode;4344/* query for the extent of the remainder of the buffer */45if((sz = size) == 0 || !bp)46{ if(f->mode&SF_INIT)47(void)_sfmode(f,0,0);4849if((f->flags&SF_RDWRSTR) == SF_RDWRSTR)50{ SFSTRSIZE(f);51n = (f->data+f->here) - f->next;52}53else n = f->endb - f->next;5455if(!bp)56return n;57else if(n > 0) /* size == 0 */58{ *bp = (Void_t*)f->next;59return 0;60}61/* else fall down and fill buffer */62}6364if(!(mode = f->flags&SF_READ) )65mode = SF_WRITE;66if((int)f->mode != mode && _sfmode(f,mode,0) < 0)67return -1;6869*bp = sfreserve(f, sz <= 0 ? 0 : sz > f->size ? f->size : sz, 0);7071if(*bp && sz >= 0)72return sz;7374if((n = sfvalue(f)) > 0)75{ *bp = (Void_t*)f->next;76if(sz < 0)77{ f->mode |= SF_PEEK;78f->endr = f->endw = f->data;79}80else81{ if(sz > n)82sz = n;83f->next += sz;84}85}8687return (sz >= 0 && n >= sz) ? sz : n;88}899091