]> git.saurik.com Git - apple/libc.git/blobdiff - stdio/local.h
Libc-763.11.tar.gz
[apple/libc.git] / stdio / local.h
index ae80de0f523e2430526e9c04b60db3c711cfe033..73958b7c7c829e608cb1d59df378e3043551bd5d 100644 (file)
@@ -1,25 +1,4 @@
-/*
- * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-/*
+/*-
  * Copyright (c) 1990, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
+ *
+ *     @(#)local.h     8.3 (Berkeley) 7/3/94
+ * $FreeBSD: src/lib/libc/stdio/local.h,v 1.33 2008/05/05 16:03:52 jhb Exp $
  */
 
+#include <sys/cdefs.h>
+#include "xlocale_private.h"
+#include <sys/types.h> /* for off_t */
+#include <pthread.h>
+#include <limits.h>
+#include <string.h>
+#include <wchar.h>
+
 /*
  * Information local to this implementation of stdio,
  * in particular, macros and private variables.
  */
 
-extern int     __sflush __P((FILE *));
-extern FILE    *__sfp __P((void));
-extern int     __srefill __P((FILE *));
-extern int     __sread __P((void *, char *, int));
-extern int     __swrite __P((void *, char const *, int));
-extern fpos_t  __sseek __P((void *, fpos_t, int));
-extern int     __sclose __P((void *));
-extern void    __sinit __P((void));
-extern void    _cleanup __P((void));
-extern void    (*__cleanup) __P((void));
-extern void    __smakebuf __P((FILE *));
-extern int     __swhatbuf __P((FILE *, size_t *, int *));
-extern int     _fwalk __P((int (*)(FILE *)));
-extern int     __swsetup __P((FILE *));
-extern int     __sflags __P((const char *, int *));
+extern int     _sread(FILE *, char *, int);
+extern int     _swrite(FILE *, char const *, int);
+extern fpos_t  _sseek(FILE *, fpos_t, int);
+extern int     _ftello(FILE *, fpos_t *);
+extern int     _fseeko(FILE *, off_t, int, int);
+extern int     __fflush(FILE *fp);
+extern void    __fcloseall(void);
+extern wint_t  __fgetwc(FILE *, locale_t);
+extern wint_t  __fputwc(wchar_t, FILE *, locale_t);
+extern int     __sflush(FILE *);
+extern FILE    *__sfp(int);
+extern void    __sfprelease(FILE *);   /* mark free and update count as needed */
+extern int     __slbexpand(FILE *, size_t);
+extern int     __srefill(FILE *);
+extern int     __srefill0(FILE *);
+extern int     __srefill1(FILE *);
+extern int     __sread(void *, char *, int);
+extern int     __swrite(void *, char const *, int);
+extern fpos_t  __sseek(void *, fpos_t, int);
+extern int     __sclose(void *);
+extern void    __sinit(void);
+extern void    _cleanup(void);
+extern void    (*__cleanup)(void);
+extern void    __smakebuf(FILE *);
+extern int     __swhatbuf(FILE *, size_t *, int *);
+extern int     _fwalk(int (*)(FILE *));
+extern int     __svfscanf_l(FILE *, locale_t, const char *, __va_list) __DARWIN_LDBL_COMPAT(__svfscanf_l);
+extern int     __swsetup(FILE *);
+extern int     __sflags(const char *, int *);
+extern int     __ungetc(int, FILE *);
+extern wint_t  __ungetwc(wint_t, FILE *, locale_t);
+extern int     __vfprintf(FILE *, locale_t, const char *, __va_list) __DARWIN_LDBL_COMPAT(__vfprintf);
+extern int     __vfscanf(FILE *, const char *, __va_list) __DARWIN_LDBL_COMPAT(__vfscanf);
+extern int     __vfwprintf(FILE *, locale_t, const wchar_t *, __va_list) __DARWIN_LDBL_COMPAT(__vfwprintf);
+extern int     __vfwscanf(FILE * __restrict, locale_t, const wchar_t * __restrict,
+                   __va_list) __DARWIN_LDBL_COMPAT(__vfwscanf);
+extern size_t  __fread(void * __restrict buf, size_t size, size_t count,
+               FILE * __restrict fp);
+extern int     __sdidinit;
 
-extern int __sdidinit;
-extern void (*__cleanup) __P((void));
+
+/* hold a buncha junk that would grow the ABI */
+struct __sFILEX {
+       unsigned char   *up;    /* saved _p when _p is doing ungetc data */
+       pthread_mutex_t fl_mutex;       /* used for MT-safety */
+       pthread_t       fl_owner;       /* current owner */
+       int             fl_count;       /* recursive lock count */
+       int             orientation:2;  /* orientation for fwide() */
+       int             counted:1;      /* stream counted against STREAM_MAX */
+       mbstate_t       mbstate;        /* multibyte conversion state */
+};
+
+#define _up            _extra->up
+#define _fl_mutex      _extra->fl_mutex
+#define _fl_owner      _extra->fl_owner
+#define _fl_count      _extra->fl_count
+#define _orientation   _extra->orientation
+#define _mbstate       _extra->mbstate
+#define _counted       _extra->counted
+
+#define        INITEXTRA(fp) do { \
+       (fp)->_extra->up = NULL; \
+       (fp)->_extra->fl_mutex = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER; \
+       (fp)->_extra->fl_owner = NULL; \
+       (fp)->_extra->fl_count = 0; \
+       (fp)->_extra->orientation = 0; \
+       memset(&(fp)->_extra->mbstate, 0, sizeof(mbstate_t)); \
+       (fp)->_extra->counted = 0; \
+} while(0);
 
 /*
- * Return true iff the given FILE cannot be written now.
+ * Prepare the given FILE for writing, and return 0 iff it
+ * can be written now.  Otherwise, return EOF and set errno.
  */
-#define        cantwrite(fp) \
-       ((((fp)->_flags & __SWR) == 0 || (fp)->_bf._base == NULL) && \
+#define        prepwrite(fp) \
+       ((((fp)->_flags & __SWR) == 0 || \
+           ((fp)->_bf._base == NULL && ((fp)->_flags & __SSTR) == 0)) && \
         __swsetup(fp))
 
 /*
@@ -105,3 +144,12 @@ extern void (*__cleanup) __P((void));
        free((char *)(fp)->_lb._base); \
        (fp)->_lb._base = NULL; \
 }
+
+/*
+ * Set the orientation for a stream. If o > 0, the stream has wide-
+ * orientation. If o < 0, the stream has byte-orientation.
+ */
+#define        ORIENT(fp, o)   do {                            \
+       if ((fp)->_orientation == 0)                    \
+               (fp)->_orientation = (o);               \
+} while (0)