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 (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. 24 */ 25 26 /* Copyright (c) 1988 AT&T */ 27 /* All Rights Reserved */ 28 29 /* 30 * User-visible pieces of the ANSI C standard I/O package. 31 */ 32 33 #ifndef _STDIO_H 34 #define _STDIO_H 35 36 #include <sys/feature_tests.h> 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 /* 43 * Do all of our 'redefine_extname' processing before 44 * declarations of the associated functions are seen. 45 * This is necessary to keep gcc happy. 46 */ 47 #if defined(__PRAGMA_REDEFINE_EXTNAME) 48 49 /* large file compilation environment setup */ 50 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64 51 #pragma redefine_extname fopen fopen64 52 #pragma redefine_extname freopen freopen64 53 #pragma redefine_extname tmpfile tmpfile64 54 #pragma redefine_extname fgetpos fgetpos64 55 #pragma redefine_extname fsetpos fsetpos64 56 #if defined(_LARGEFILE_SOURCE) 57 #pragma redefine_extname fseeko fseeko64 58 #pragma redefine_extname ftello ftello64 59 #endif /* _LARGEFILE_SOURCE */ 60 #endif /* !defined(_LP64) && _FILE_OFFSET_BITS == 64 */ 61 62 /* In the LP64 compilation environment, all APIs are already large file */ 63 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE) 64 #pragma redefine_extname fopen64 fopen 65 #pragma redefine_extname freopen64 freopen 66 #pragma redefine_extname tmpfile64 tmpfile 67 #pragma redefine_extname fgetpos64 fgetpos 68 #pragma redefine_extname fsetpos64 fsetpos 69 #if defined(_LARGEFILE_SOURCE) 70 #pragma redefine_extname fseeko64 fseeko 71 #pragma redefine_extname ftello64 ftello 72 #endif /* _LARGEFILE_SOURCE */ 73 #endif /* defined(_LP64) && defined(_LARGEFILE64_SOURCE) */ 74 75 #endif /* __PRAGMA_REDEFINE_EXTNAME */ 76 77 #ifdef __cplusplus 78 } 79 #endif 80 81 #include <iso/stdio_iso.h> 82 83 /* 84 * If feature test macros are set that enable interfaces that use types 85 * defined in <sys/types.h>, get those types by doing the include. 86 * 87 * Note that in asking for the interfaces associated with this feature test 88 * macro one also asks for definitions of the POSIX types. 89 */ 90 91 /* 92 * Allow global visibility for symbols defined in 93 * C++ "std" namespace in <iso/stdio_iso.h>. 94 */ 95 #if __cplusplus >= 199711L 96 using std::FILE; 97 using std::size_t; 98 using std::fpos_t; 99 using std::remove; 100 using std::rename; 101 using std::tmpfile; 102 using std::tmpnam; 103 using std::fclose; 104 using std::fflush; 105 using std::fopen; 106 using std::freopen; 107 using std::setbuf; 108 using std::setvbuf; 109 using std::fprintf; 110 using std::fscanf; 111 using std::printf; 112 using std::scanf; 113 using std::sprintf; 114 using std::sscanf; 115 using std::vfprintf; 116 using std::vprintf; 117 using std::vsprintf; 118 using std::fgetc; 119 using std::fgets; 120 using std::fputc; 121 using std::fputs; 122 using std::getc; 123 using std::getchar; 124 using std::gets; 125 using std::putc; 126 using std::putchar; 127 using std::puts; 128 using std::ungetc; 129 using std::fread; 130 using std::fwrite; 131 using std::fgetpos; 132 using std::fseek; 133 using std::fsetpos; 134 using std::ftell; 135 using std::rewind; 136 using std::clearerr; 137 using std::feof; 138 using std::ferror; 139 using std::perror; 140 #ifndef _LP64 141 using std::__filbuf; 142 using std::__flsbuf; 143 #endif /* _LP64 */ 144 #endif /* __cplusplus >= 199711L */ 145 146 /* 147 * This header needs to be included here because it relies on the global 148 * visibility of FILE and size_t in the C++ environment. 149 */ 150 #include <iso/stdio_c99.h> 151 152 #ifdef __cplusplus 153 extern "C" { 154 #endif 155 156 #if defined(_LARGEFILE_SOURCE) || defined(_XPG5) 157 #ifndef _OFF_T 158 #define _OFF_T 159 #if defined(_LP64) || _FILE_OFFSET_BITS == 32 160 typedef long off_t; 161 #else 162 typedef __longlong_t off_t; 163 #endif 164 #ifdef _LARGEFILE64_SOURCE 165 #ifdef _LP64 166 typedef off_t off64_t; 167 #else 168 typedef __longlong_t off64_t; 169 #endif 170 #endif /* _LARGEFILE64_SOURCE */ 171 #endif /* _OFF_T */ 172 #endif /* _LARGEFILE_SOURCE */ 173 174 #ifdef _LARGEFILE64_SOURCE 175 #ifdef _LP64 176 typedef fpos_t fpos64_t; 177 #else 178 typedef __longlong_t fpos64_t; 179 #endif 180 #endif /* _LARGEFILE64_SOURCE */ 181 182 /* 183 * XPG4 requires that va_list be defined in <stdio.h> "as described in 184 * <stdarg.h>". ANSI-C and POSIX require that the namespace of <stdio.h> 185 * not be polluted with this name. 186 */ 187 #if defined(_XPG4) && !defined(_VA_LIST) 188 #define _VA_LIST 189 typedef __va_list va_list; 190 #endif /* defined(_XPG4 && !defined(_VA_LIST) */ 191 192 #if defined(__EXTENSIONS__) || !defined(_STRICT_STDC) || \ 193 defined(__XOPEN_OR_POSIX) 194 195 #define L_ctermid 9 196 197 /* Marked LEGACY in SUSv2 and removed in SUSv3 */ 198 #if !defined(_XPG6) || defined(__EXTENSIONS__) 199 #define L_cuserid 9 200 #endif 201 202 #endif /* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */ 203 204 #if defined(__EXTENSIONS__) || \ 205 (!defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE)) || \ 206 defined(_XOPEN_SOURCE) 207 208 #define P_tmpdir "/var/tmp/" 209 #endif /* defined(__EXTENSIONS__) || (!defined(_STRICT_STDC) ... */ 210 211 #ifndef _STDIO_ALLOCATE 212 extern unsigned char _sibuf[], _sobuf[]; 213 #endif 214 215 /* large file compilation environment setup */ 216 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64 217 #if !defined(__PRAGMA_REDEFINE_EXTNAME) 218 #if defined(__STDC__) 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 #else /* defined(__STDC__) */ 225 extern FILE *fopen64(); 226 extern FILE *freopen64(); 227 extern FILE *tmpfile64(); 228 extern int fgetpos64(); 229 extern int fsetpos64(); 230 #endif /* defined(__STDC__) */ 231 #define fopen fopen64 232 #define freopen freopen64 233 #define tmpfile tmpfile64 234 #define fgetpos fgetpos64 235 #define fsetpos fsetpos64 236 #ifdef _LARGEFILE_SOURCE 237 #define fseeko fseeko64 238 #define ftello ftello64 239 #endif 240 #endif /* !__PRAGMA_REDEFINE_EXTNAME */ 241 #endif /* !_LP64 && _FILE_OFFSET_BITS == 64 */ 242 243 #ifndef _LP64 244 extern unsigned char *_bufendtab[]; 245 extern FILE *_lastbuf; 246 #endif 247 248 /* In the LP64 compilation environment, all APIs are already large file */ 249 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE) 250 #if !defined(__PRAGMA_REDEFINE_EXTNAME) 251 #define fopen64 fopen 252 #define freopen64 freopen 253 #define tmpfile64 tmpfile 254 #define fgetpos64 fgetpos 255 #define fsetpos64 fsetpos 256 #ifdef _LARGEFILE_SOURCE 257 #define fseeko64 fseeko 258 #define ftello64 ftello 259 #endif 260 #endif /* !__PRAGMA_REDEFINE_EXTNAME */ 261 #endif /* _LP64 && _LARGEFILE64_SOURCE */ 262 263 #ifndef _SSIZE_T 264 #define _SSIZE_T 265 #if defined(_LP64) || defined(_I32LPx) 266 typedef long ssize_t; /* size of something in bytes or -1 */ 267 #else 268 typedef int ssize_t; /* (historical version) */ 269 #endif 270 #endif /* !_SSIZE_T */ 271 272 #if defined(__STDC__) 273 274 #if defined(__EXTENSIONS__) || \ 275 (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \ 276 defined(_REENTRANT) 277 extern char *tmpnam_r(char *); 278 #endif 279 280 #if defined(__EXTENSIONS__) || \ 281 (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) 282 extern int fcloseall(void); 283 extern void setbuffer(FILE *, char *, size_t); 284 extern int setlinebuf(FILE *); 285 /* PRINTFLIKE2 */ 286 extern int asprintf(char **, const char *, ...); 287 /* PRINTFLIKE2 */ 288 extern int vasprintf(char **, const char *, __va_list); 289 #endif 290 291 #if defined(__EXTENSIONS__) || \ 292 (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) 293 /* || defined(_XPG7) */ 294 extern ssize_t getdelim(char **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD, 295 int, FILE *_RESTRICT_KYWD); 296 extern ssize_t getline(char **_RESTRICT_KYWD, size_t *_RESTRICT_KYWD, 297 FILE *_RESTRICT_KYWD); 298 #endif /* __EXTENSIONS__ ... */ 299 300 /* 301 * The following are known to POSIX and XOPEN, but not to ANSI-C. 302 */ 303 #if defined(__EXTENSIONS__) || \ 304 !defined(_STRICT_STDC) || defined(__XOPEN_OR_POSIX) 305 306 extern FILE *fdopen(int, const char *); 307 extern char *ctermid(char *); 308 extern int fileno(FILE *); 309 310 #endif /* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */ 311 312 /* 313 * The following are known to POSIX.1c, but not to ANSI-C or XOPEN. 314 */ 315 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \ 316 (_POSIX_C_SOURCE - 0 >= 199506L) 317 extern void flockfile(FILE *); 318 extern int ftrylockfile(FILE *); 319 extern void funlockfile(FILE *); 320 extern int getc_unlocked(FILE *); 321 extern int getchar_unlocked(void); 322 extern int putc_unlocked(int, FILE *); 323 extern int putchar_unlocked(int); 324 325 #endif /* defined(__EXTENSIONS__) || defined(_REENTRANT).. */ 326 327 /* 328 * The following are known to XOPEN, but not to ANSI-C or POSIX. 329 */ 330 #if defined(__EXTENSIONS__) || !defined(_STRICT_STDC) || \ 331 defined(_XOPEN_SOURCE) 332 extern FILE *popen(const char *, const char *); 333 extern char *tempnam(const char *, const char *); 334 extern int pclose(FILE *); 335 #if !defined(_XOPEN_SOURCE) 336 extern int getsubopt(char **, char *const *, char **); 337 #endif /* !defined(_XOPEN_SOURCE) */ 338 339 /* Marked LEGACY in SUSv2 and removed in SUSv3 */ 340 #if !defined(_XPG6) || defined(__EXTENSIONS__) 341 extern char *cuserid(char *); 342 extern int getopt(int, char *const *, const char *); 343 extern char *optarg; 344 extern int optind, opterr, optopt; 345 extern int getw(FILE *); 346 extern int putw(int, FILE *); 347 #endif /* !defined(_XPG6) || defined(__EXTENSIONS__) */ 348 349 #endif /* defined(__EXTENSIONS__) || !defined(_STRICT_STDC) ... */ 350 351 /* 352 * The following are defined as part of the Large File Summit interfaces. 353 */ 354 #if defined(_LARGEFILE_SOURCE) || defined(_XPG5) 355 extern int fseeko(FILE *, off_t, int); 356 extern off_t ftello(FILE *); 357 #endif 358 359 /* 360 * The following are defined as part of the transitional Large File Summit 361 * interfaces. 362 */ 363 #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \ 364 !defined(__PRAGMA_REDEFINE_EXTNAME)) 365 extern FILE *fopen64(const char *, const char *); 366 extern FILE *freopen64(const char *, const char *, FILE *); 367 extern FILE *tmpfile64(void); 368 extern int fgetpos64(FILE *, fpos64_t *); 369 extern int fsetpos64(FILE *, const fpos64_t *); 370 extern int fseeko64(FILE *, off64_t, int); 371 extern off64_t ftello64(FILE *); 372 #endif 373 374 #else /* !defined __STDC__ */ 375 376 #ifndef _LP64 377 #define _bufend(p) ((fileno(p) < _NFILE) ? _bufendtab[fileno(p)] : \ 378 (unsigned char *)_realbufend(p)) 379 #define _bufsiz(p) (_bufend(p) - (p)->_base) 380 #endif /* _LP64 */ 381 382 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \ 383 defined(_REENTRANT) 384 extern char *tmpnam_r(); 385 #endif 386 387 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) 388 extern int fcloseall(); 389 extern void setbuffer(); 390 extern int setlinebuf(); 391 extern int asprintf(); 392 extern int vasprintf(); 393 #endif 394 395 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) 396 /* || defined(_XPG7) */ 397 extern ssize_t getdelim(); 398 extern ssize_t getline(); 399 #endif /* __EXTENSIONS__ ... */ 400 401 #if defined(__EXTENSIONS__) || defined(__XOPEN_OR_POSIX) 402 extern FILE *fdopen(); 403 extern char *ctermid(); 404 extern int fileno(); 405 #endif /* defined(__EXTENSIONS__) || defined(__XOPEN_OR_POSIX) */ 406 407 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \ 408 (_POSIX_C_SOURCE - 0 >= 199506L) 409 extern void flockfile(); 410 extern int ftrylockfile(); 411 extern void funlockfile(); 412 extern int getc_unlocked(); 413 extern int getchar_unlocked(); 414 extern int putc_unlocked(); 415 extern int putchar_unlocked(); 416 #endif /* defined(__EXTENSIONS__) || defined(_REENTRANT).. */ 417 418 #if defined(__EXTENSIONS__) || defined(_XOPEN_SOURCE) 419 extern FILE *popen(); 420 extern char *tempnam(); 421 extern int pclose(); 422 423 #if !defined(_XOPEN_SOURCE) 424 extern int getsubopt(); 425 #endif /* !defined(_XOPEN_SOURCE) */ 426 427 #if !defined(_XPG6) || defined(__EXTENSIONS__) 428 extern char *cuserid(); 429 extern int getopt(); 430 extern char *optarg; 431 extern int optind, opterr, optopt; 432 extern int getw(); 433 extern int putw(); 434 #endif /* !defined(_XPG6) || defined(__EXTENSIONS__) */ 435 436 #endif /* defined(__EXTENSIONS__) || defined(_XOPEN_SOURCE) */ 437 438 #if defined(_LARGEFILE_SOURCE) || defined(_XPG5) 439 extern int fseeko(); 440 extern off_t ftello(); 441 #endif 442 443 #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \ 444 !defined(__PRAGMA_REDEFINE_EXTNAME)) 445 extern FILE *fopen64(); 446 extern FILE *freopen64(); 447 extern FILE *tmpfile64(); 448 extern int fgetpos64(); 449 extern int fsetpos64(); 450 extern int fseeko64(); 451 extern off64_t ftello64(); 452 #endif 453 454 #endif /* __STDC__ */ 455 456 #if !defined(__lint) 457 458 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \ 459 (_POSIX_C_SOURCE - 0 >= 199506L) 460 #ifndef _LP64 461 #ifdef __STDC__ 462 #define getc_unlocked(p) (--(p)->_cnt < 0 \ 463 ? __filbuf(p) \ 464 : (int)*(p)->_ptr++) 465 #define putc_unlocked(x, p) (--(p)->_cnt < 0 \ 466 ? __flsbuf((x), (p)) \ 467 : (int)(*(p)->_ptr++ = \ 468 (unsigned char) (x))) 469 #else 470 #define getc_unlocked(p) (--(p)->_cnt < 0 \ 471 ? _filbuf(p) \ 472 : (int)*(p)->_ptr++) 473 #define putc_unlocked(x, p) (--(p)->_cnt < 0 \ 474 ? _flsbuf((x), (p)) \ 475 : (int)(*(p)->_ptr++ = \ 476 (unsigned char) (x))) 477 #endif /* __STDC__ */ 478 #endif /* _LP64 */ 479 #define getchar_unlocked() getc_unlocked(stdin) 480 #define putchar_unlocked(x) putc_unlocked((x), stdout) 481 #endif /* defined(__EXTENSIONS__) || defined(_REENTRANT).. */ 482 483 #endif /* !defined(__lint) */ 484 485 #ifdef __cplusplus 486 } 487 #endif 488 489 #endif /* _STDIO_H */