summaryrefslogtreecommitdiff
path: root/usr/src/lib/libast/common/sfio/sfpeek.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libast/common/sfio/sfpeek.c')
-rw-r--r--usr/src/lib/libast/common/sfio/sfpeek.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/sfio/sfpeek.c b/usr/src/lib/libast/common/sfio/sfpeek.c
new file mode 100644
index 0000000000..9a2d3ef36b
--- /dev/null
+++ b/usr/src/lib/libast/common/sfio/sfpeek.c
@@ -0,0 +1,89 @@
+/***********************************************************************
+* *
+* This software is part of the ast package *
+* Copyright (c) 1985-2007 AT&T Knowledge Ventures *
+* and is licensed under the *
+* Common Public License, Version 1.0 *
+* by AT&T Knowledge Ventures *
+* *
+* A copy of the License is available at *
+* http://www.opensource.org/licenses/cpl1.0.txt *
+* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
+* *
+* Information and Software Systems Research *
+* AT&T Research *
+* Florham Park NJ *
+* *
+* Glenn Fowler <gsf@research.att.com> *
+* David Korn <dgk@research.att.com> *
+* Phong Vo <kpv@research.att.com> *
+* *
+***********************************************************************/
+#include "sfhdr.h"
+
+/* Safe access to the internal stream buffer.
+** This function is obsolete. sfreserve() should be used.
+**
+** Written by Kiem-Phong Vo (06/27/90).
+*/
+
+#if _BLD_sfio && defined(__EXPORT__)
+#define extern __EXPORT__
+#endif
+
+#if __STD_C
+extern ssize_t sfpeek(reg Sfio_t* f, Void_t** bp, reg size_t size)
+#else
+extern ssize_t sfpeek(f,bp,size)
+reg Sfio_t* f; /* file to peek */
+Void_t** bp; /* start of data area */
+reg size_t size; /* size of peek */
+#endif
+{ reg ssize_t n, sz;
+ reg int mode;
+
+ /* query for the extent of the remainder of the buffer */
+ if((sz = size) == 0 || !bp)
+ { if(f->mode&SF_INIT)
+ (void)_sfmode(f,0,0);
+
+ if((f->flags&SF_RDWRSTR) == SF_RDWRSTR)
+ { SFSTRSIZE(f);
+ n = (f->data+f->here) - f->next;
+ }
+ else n = f->endb - f->next;
+
+ if(!bp)
+ return n;
+ else if(n > 0) /* size == 0 */
+ { *bp = (Void_t*)f->next;
+ return 0;
+ }
+ /* else fall down and fill buffer */
+ }
+
+ if(!(mode = f->flags&SF_READ) )
+ mode = SF_WRITE;
+ if((int)f->mode != mode && _sfmode(f,mode,0) < 0)
+ return -1;
+
+ *bp = sfreserve(f, sz <= 0 ? 0 : sz > f->size ? f->size : sz, 0);
+
+ if(*bp && sz >= 0)
+ return sz;
+
+ if((n = sfvalue(f)) > 0)
+ { *bp = (Void_t*)f->next;
+ if(sz < 0)
+ { f->mode |= SF_PEEK;
+ f->endr = f->endw = f->data;
+ }
+ else
+ { if(sz > n)
+ sz = n;
+ f->next += sz;
+ }
+ }
+
+ return (sz >= 0 && n >= sz) ? sz : n;
+}