1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
  24  * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
  25  */
  26 
  27 /*      Copyright (c) 1988 AT&T     */
  28 /*        All Rights Reserved   */
  29 
  30 /*
  31  * User-visible pieces of the ANSI C standard I/O package.
  32  */
  33 
  34 #ifndef _STDIO_H
  35 #define _STDIO_H
  36 
  37 #include <sys/feature_tests.h>
  38 
  39 #ifdef  __cplusplus
  40 extern "C" {
  41 #endif
  42 
  43 /*
  44  * Do all of our 'redefine_extname' processing before
  45  * declarations of the associated functions are seen.
  46  * This is necessary to keep gcc happy.
  47  */
  48 #if defined(__PRAGMA_REDEFINE_EXTNAME)
  49 
  50 /* large file compilation environment setup */
  51 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
  52 #pragma redefine_extname        fopen           fopen64
  53 #pragma redefine_extname        freopen         freopen64
  54 #pragma redefine_extname        tmpfile         tmpfile64
  55 #pragma redefine_extname        fgetpos         fgetpos64
  56 #pragma redefine_extname        fsetpos         fsetpos64
  57 #if defined(_LARGEFILE_SOURCE)
  58 #pragma redefine_extname        fseeko          fseeko64
  59 #pragma redefine_extname        ftello          ftello64
  60 #endif  /* _LARGEFILE_SOURCE */
  61 #endif  /* !defined(_LP64) && _FILE_OFFSET_BITS == 64 */
  62 
  63 /* In the LP64 compilation environment, all APIs are already large file */
  64 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
  65 #pragma redefine_extname        fopen64         fopen
  66 #pragma redefine_extname        freopen64       freopen
  67 #pragma redefine_extname        tmpfile64       tmpfile
  68 #pragma redefine_extname        fgetpos64       fgetpos
  69 #pragma redefine_extname        fsetpos64       fsetpos
  70 #if defined(_LARGEFILE_SOURCE)
  71 #pragma redefine_extname        fseeko64        fseeko
  72 #pragma redefine_extname        ftello64        ftello
  73 #endif  /* _LARGEFILE_SOURCE */
  74 #endif  /* defined(_LP64) && defined(_LARGEFILE64_SOURCE) */
  75 
  76 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
  77 
  78 #ifdef  __cplusplus
  79 }
  80 #endif
  81 
  82 #include <iso/stdio_iso.h>
  83 
  84 /*
  85  * If feature test macros are set that enable interfaces that use types
  86  * defined in <sys/types.h>, get those types by doing the include.
  87  *
  88  * Note that in asking for the interfaces associated with this feature test
  89  * macro one also asks for definitions of the POSIX types.
  90  */
  91 
  92 /*
  93  * Allow global visibility for symbols defined in
  94  * C++ "std" namespace in <iso/stdio_iso.h>.
  95  */
  96 #if __cplusplus >= 199711L
  97 using std::FILE;
  98 using std::size_t;
  99 using std::fpos_t;
 100 using std::remove;
 101 using std::rename;
 102 using std::tmpfile;
 103 using std::tmpnam;
 104 using std::fclose;
 105 using std::fflush;
 106 using std::fopen;
 107 using std::freopen;
 108 using std::setbuf;
 109 using std::setvbuf;
 110 using std::fprintf;
 111 using std::fscanf;
 112 using std::printf;
 113 using std::scanf;
 114 using std::sprintf;
 115 using std::sscanf;
 116 using std::vfprintf;
 117 using std::vprintf;
 118 using std::vsprintf;
 119 using std::fgetc;
 120 using std::fgets;
 121 using std::fputc;
 122 using std::fputs;
 123 using std::getc;
 124 using std::getchar;
 125 using std::gets;
 126 using std::putc;
 127 using std::putchar;
 128 using std::puts;
 129 using std::ungetc;
 130 using std::fread;
 131 using std::fwrite;
 132 using std::fgetpos;
 133 using std::fseek;
 134 using std::fsetpos;
 135 using std::ftell;
 136 using std::rewind;
 137 using std::clearerr;
 138 using std::feof;
 139 using std::ferror;
 140 using std::perror;
 141 #ifndef _LP64
 142 using std::__filbuf;
 143 using std::__flsbuf;
 144 #endif  /* _LP64 */
 145 #endif  /*  __cplusplus >= 199711L */
 146 
 147 /*
 148  * This header needs to be included here because it relies on the global
 149  * visibility of FILE and size_t in the C++ environment.
 150  */
 151 #include <iso/stdio_c99.h>
 152 
 153 #ifdef  __cplusplus
 154 extern "C" {
 155 #endif
 156 
 157 #if defined(_LARGEFILE_SOURCE) || defined(_XPG5)
 158 #ifndef _OFF_T
 159 #define _OFF_T
 160 #if defined(_LP64) || _FILE_OFFSET_BITS == 32
 161 typedef long            off_t;
 162 #else
 163 typedef __longlong_t    off_t;
 164 #endif
 165 #ifdef  _LARGEFILE64_SOURCE
 166 #ifdef _LP64
 167 typedef off_t           off64_t;
 168 #else
 169 typedef __longlong_t    off64_t;
 170 #endif
 171 #endif /* _LARGEFILE64_SOURCE */
 172 #endif /* _OFF_T */
 173 #endif /* _LARGEFILE_SOURCE */
 174 
 175 #ifdef _LARGEFILE64_SOURCE
 176 #ifdef _LP64
 177 typedef fpos_t          fpos64_t;
 178 #else
 179 typedef __longlong_t    fpos64_t;
 180 #endif
 181 #endif /* _LARGEFILE64_SOURCE */
 182 
 183 /*
 184  * XPG4 requires that va_list be defined in <stdio.h> "as described in
 185  * <stdarg.h>".  ANSI-C and POSIX require that the namespace of <stdio.h>
 186  * not be polluted with this name.
 187  */
 188 #if defined(_XPG4) && !defined(_VA_LIST)
 189 #define _VA_LIST
 190 typedef __va_list va_list;
 191 #endif  /* defined(_XPG4 && !defined(_VA_LIST) */
 192 
 193 #if defined(__EXTENSIONS__) || !defined(_STRICT_STDC) || \
 194                 defined(__XOPEN_OR_POSIX)
 195 
 196 #define L_ctermid       9
 197 
 198 /* Marked LEGACY in SUSv2 and removed in SUSv3 */
 199 #if !defined(_XPG6) || defined(__EXTENSIONS__)
 200 #define L_cuserid       9
 201 #endif
 202 
 203 #endif /* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
 204 
 205 #if defined(__EXTENSIONS__) || \
 206         (!defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE)) || \
 207         defined(_XOPEN_SOURCE)
 208 
 209 #define P_tmpdir        "/var/tmp/"
 210 #endif /* defined(__EXTENSIONS__) || (!defined(_STRICT_STDC) ... */
 211 
 212 #ifndef _STDIO_ALLOCATE
 213 extern unsigned char     _sibuf[], _sobuf[];
 214 #endif
 215 
 216 /* large file compilation environment setup */
 217 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
 218 #if !defined(__PRAGMA_REDEFINE_EXTNAME)
 219 extern FILE     *fopen64(const char *, const char *);
 220 extern FILE     *freopen64(const char *, const char *, FILE *);
 221 extern FILE     *tmpfile64(void);
 222 extern int      fgetpos64(FILE *, fpos_t *);
 223 extern int      fsetpos64(FILE *, const fpos_t *);
 224 #define fopen                   fopen64
 225 #define freopen                 freopen64
 226 #define tmpfile                 tmpfile64
 227 #define fgetpos                 fgetpos64
 228 #define fsetpos                 fsetpos64
 229 #ifdef  _LARGEFILE_SOURCE
 230 #define fseeko                  fseeko64
 231 #define ftello                  ftello64
 232 #endif
 233 #endif  /* !__PRAGMA_REDEFINE_EXTNAME */
 234 #endif  /* !_LP64 && _FILE_OFFSET_BITS == 64 */
 235 
 236 #ifndef _LP64
 237 extern unsigned char    *_bufendtab[];
 238 extern FILE             *_lastbuf;
 239 #endif
 240 
 241 /* In the LP64 compilation environment, all APIs are already large file */
 242 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
 243 #if !defined(__PRAGMA_REDEFINE_EXTNAME)
 244 #define fopen64         fopen
 245 #define freopen64       freopen
 246 #define tmpfile64       tmpfile
 247 #define fgetpos64       fgetpos
 248 #define fsetpos64       fsetpos
 249 #ifdef  _LARGEFILE_SOURCE
 250 #define fseeko64        fseeko
 251 #define ftello64        ftello
 252 #endif
 253 #endif  /* !__PRAGMA_REDEFINE_EXTNAME */
 254 #endif  /* _LP64 && _LARGEFILE64_SOURCE */
 255 
 256 #ifndef _SSIZE_T
 257 #define _SSIZE_T
 258 #if defined(_LP64) || defined(_I32LPx)
 259 typedef long    ssize_t;        /* size of something in bytes or -1 */
 260 #else
 261 typedef int     ssize_t;        /* (historical version) */
 262 #endif
 263 #endif  /* !_SSIZE_T */
 264 
 265 #if defined(__EXTENSIONS__) || \
 266         (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
 267         defined(_REENTRANT)
 268 extern char     *tmpnam_r(char *);
 269 #endif
 270 
 271 #if defined(__EXTENSIONS__) || \
 272         (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
 273 extern int fcloseall(void);
 274 extern void setbuffer(FILE *, char *, size_t);
 275 extern int setlinebuf(FILE *);
 276 /* PRINTFLIKE2 */
 277 extern int asprintf(char **, const char *, ...);
 278 /* PRINTFLIKE2 */
 279 extern int vasprintf(char **, const char *, __va_list);
 280 #endif
 281 
 282 #if defined(__EXTENSIONS__) || \
 283         (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
 284         /* || defined(_XPG7) */
 285 extern ssize_t getdelim(char **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD,
 286         int, FILE *_RESTRICT_KYWD);
 287 extern ssize_t getline(char **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD,
 288         FILE *_RESTRICT_KYWD);
 289 #endif  /* __EXTENSIONS__ ... */
 290 
 291 /*
 292  * The following are known to POSIX and XOPEN, but not to ANSI-C.
 293  */
 294 #if defined(__EXTENSIONS__) || \
 295         !defined(_STRICT_STDC) || defined(__XOPEN_OR_POSIX)
 296 
 297 extern FILE     *fdopen(int, const char *);
 298 extern char     *ctermid(char *);
 299 extern int      fileno(FILE *);
 300 
 301 #endif  /* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
 302 
 303 /*
 304  * The following are known to POSIX.1c, but not to ANSI-C or XOPEN.
 305  */
 306 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
 307         (_POSIX_C_SOURCE - 0 >= 199506L)
 308 extern void     flockfile(FILE *);
 309 extern int      ftrylockfile(FILE *);
 310 extern void     funlockfile(FILE *);
 311 extern int      getc_unlocked(FILE *);
 312 extern int      getchar_unlocked(void);
 313 extern int      putc_unlocked(int, FILE *);
 314 extern int      putchar_unlocked(int);
 315 
 316 #endif  /* defined(__EXTENSIONS__) || defined(_REENTRANT).. */
 317 
 318 /*
 319  * The following are known to XOPEN, but not to ANSI-C or POSIX.
 320  */
 321 #if defined(__EXTENSIONS__) || !defined(_STRICT_STDC) || \
 322         defined(_XOPEN_SOURCE)
 323 extern FILE     *popen(const char *, const char *);
 324 extern char     *tempnam(const char *, const char *);
 325 extern int      pclose(FILE *);
 326 #if !defined(_XOPEN_SOURCE)
 327 extern int      getsubopt(char **, char *const *, char **);
 328 #endif /* !defined(_XOPEN_SOURCE) */
 329 
 330 /* Marked LEGACY in SUSv2 and removed in SUSv3 */
 331 #if !defined(_XPG6) || defined(__EXTENSIONS__)
 332 extern char     *cuserid(char *);
 333 extern int      getopt(int, char *const *, const char *);
 334 extern char     *optarg;
 335 extern int      optind, opterr, optopt;
 336 extern int      getw(FILE *);
 337 extern int      putw(int, FILE *);
 338 #endif /* !defined(_XPG6) || defined(__EXTENSIONS__) */
 339 
 340 #endif  /* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */
 341 
 342 /*
 343  * The following are defined as part of the Large File Summit interfaces.
 344  */
 345 #if defined(_LARGEFILE_SOURCE) || defined(_XPG5)
 346 extern int      fseeko(FILE *, off_t, int);
 347 extern off_t    ftello(FILE *);
 348 #endif
 349 
 350 /*
 351  * The following are defined as part of the transitional Large File Summit
 352  * interfaces.
 353  */
 354 #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 355             !defined(__PRAGMA_REDEFINE_EXTNAME))
 356 extern FILE     *fopen64(const char *, const char *);
 357 extern FILE     *freopen64(const char *, const char *, FILE *);
 358 extern FILE     *tmpfile64(void);
 359 extern int      fgetpos64(FILE *, fpos64_t *);
 360 extern int      fsetpos64(FILE *, const fpos64_t *);
 361 extern int      fseeko64(FILE *, off64_t, int);
 362 extern off64_t  ftello64(FILE *);
 363 #endif
 364 
 365 #if !defined(__lint)
 366 
 367 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
 368             (_POSIX_C_SOURCE - 0 >= 199506L)
 369 #ifndef _LP64
 370 #define getc_unlocked(p)        (--(p)->_cnt < 0 \
 371                                         ? __filbuf(p) \
 372                                         : (int)*(p)->_ptr++)
 373 #define putc_unlocked(x, p)     (--(p)->_cnt < 0 \
 374                                         ? __flsbuf((x), (p)) \
 375                                         : (int)(*(p)->_ptr++ = \
 376                                         (unsigned char) (x)))
 377 #endif  /* _LP64 */
 378 #define getchar_unlocked()      getc_unlocked(stdin)
 379 #define putchar_unlocked(x)     putc_unlocked((x), stdout)
 380 #endif  /* defined(__EXTENSIONS__) || defined(_REENTRANT).. */
 381 
 382 #endif  /* !defined(__lint) */
 383 
 384 #ifdef  __cplusplus
 385 }
 386 #endif
 387 
 388 #endif  /* _STDIO_H */