+static inline void
+clear_ungetc_buffer (FILE *fp)
+{
+#if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+# if defined __NetBSD__ || defined __OpenBSD__
+ struct __sfileext
+ {
+ struct __sbuf _ub; /* ungetc buffer */
+ /* More fields, not relevant here. */
+ };
+# define HASUB(fp) (((struct __sfileext *) (fp)->_ext._base)->_ub._base != NULL)
+# else
+# define HASUB(fp) ((fp)->_ub._base != NULL)
+# endif
+ if (HASUB (fp))
+ {
+ fp->_p += stream->_r;
+ fp->_r = 0;
+ }
+#endif
+}
+
+#if defined __sferror && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+
+static inline int
+disable_seek_optimization (FILE *fp)
+{
+ int saved_flags = fp->_flags & (__SOPT | __SNPT);
+ fp->_flags = (fp->_flags & ~__SOPT) | __SNPT;
+ return saved_flags;
+}
+
+static inline void
+restore_seek_optimization (FILE *fp, int saved_flags)
+{
+ fp->_flags = (fp->_flags & ~(__SOPT | __SNPT)) | saved_flags;
+}
+
+#endif
+
+static inline void
+update_fpos_cache (FILE *fp)
+{
+#if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */
+ fp->_offset = pos;
+ fp->_flags |= __SOFF;
+#endif
+}
+