phobos/std/c/stdio.d
2012-09-17 00:59:51 -07:00

700 lines
16 KiB
D

/**
* C's <stdio.h> for the D programming language
* Authors: Walter Bright, Digital Mars, http://www.digitalmars.com
* License: Public Domain
* Source: $(PHOBOSSRC std/c/_stdio.d)
* Macros:
* WIKI=Phobos/StdCStdio
*/
module std.c.stdio;
import std.c.stddef;
private import std.c.stdarg;
extern (C):
version (Win32)
{ // Meaning Digital Mars C for Win32
const int _NFILE = 60; ///
const int BUFSIZ = 0x4000; ///
const int EOF = -1; ///
const int FOPEN_MAX = 20; ///
const int FILENAME_MAX = 256; /// 255 plus NULL
const int TMP_MAX = 32767; ///
const int _SYS_OPEN = 20; ///
const int SYS_OPEN = _SYS_OPEN; ///
const wchar WEOF = 0xFFFF; ///
struct _iobuf
{
align (1):
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
int __tmpnum;
}
enum { SEEK_SET, SEEK_CUR, SEEK_END }
alias _iobuf FILE; ///
enum
{
_F_RDWR = 0x0003,
_F_READ = 0x0001,
_F_WRIT = 0x0002,
_F_BUF = 0x0004,
_F_LBUF = 0x0008,
_F_ERR = 0x0010,
_F_EOF = 0x0020,
_F_BIN = 0x0040,
_F_IN = 0x0080,
_F_OUT = 0x0100,
_F_TERM = 0x0200,
}
extern FILE _iob[_NFILE];
extern void function() _fcloseallp;
extern ubyte __fhnd_info[_NFILE];
enum
{
FHND_APPEND = 0x04,
FHND_DEVICE = 0x08,
FHND_TEXT = 0x10,
FHND_BYTE = 0x20,
FHND_WCHAR = 0x40,
}
enum
{
_IOREAD = 1,
_IOWRT = 2,
_IONBF = 4,
_IOMYBUF = 8,
_IOEOF = 0x10,
_IOERR = 0x20,
_IOLBF = 0x40,
_IOSTRG = 0x40,
_IORW = 0x80,
_IOFBF = 0,
_IOAPP = 0x200,
_IOTRAN = 0x100,
}
const FILE *stdin = &_iob[0]; ///
const FILE *stdout = &_iob[1]; ///
const FILE *stderr = &_iob[2]; ///
const FILE *stdaux = &_iob[3]; ///
const FILE *stdprn = &_iob[4]; ///
alias int fpos_t; ///
const char[] _P_tmpdir = "\\";
const wchar[] _wP_tmpdir = "\\";
const int L_tmpnam = _P_tmpdir.length + 12;
///
int ferror(FILE *fp) { return fp._flag&_IOERR; }
///
int feof(FILE *fp) { return fp._flag&_IOEOF; }
///
void clearerr(FILE *fp) { fp._flag &= ~(_IOERR|_IOEOF); }
///
void rewind(FILE *fp) { fseek(fp,0L,SEEK_SET); fp._flag&=~_IOERR; }
int _bufsize(FILE *fp) { return fp._bufsiz; }
///
int fileno(FILE *fp) { return fp._file; }
int _snprintf(char *,size_t,char *,...);
int _vsnprintf(char *,size_t,char *,va_list);
int fwide(FILE* fp, int mode); ///
}
else version (Win64)
{
const int _NSTREAM_ = 512;
const int _NFILE = _NSTREAM_;
const int BUFSIZ = 512;
const int _IOB_ENTRIES = 20;
const int EOF = -1;
struct _iobuf
{ char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
}
alias _iobuf FILE;
const char[] _P_tmpdir = "\\";
const wchar[] _wP_tmpdir = "\\";
const int L_tmpnam = _P_tmpdir.length + 12;
const int L_tmpnam_s = _P_tmpdir.length + 16;
enum { SEEK_SET, SEEK_CUR, SEEK_END }
const int FILENAME_MAX = 260;
const int FOPEN_MAX = 20;
const int _SYS_OPEN = 20;
const int TMP_MAX = 32767;
const int _TMP_MAX_S = 2147483647;
alias long fpos_t;
FILE* __iob_func();
FILE* stdin; // = &__iob_func()[0];
FILE* stdout; // = &__iob_func()[1];
FILE* stderr; // = &__iob_func()[2];
enum
{
_IOREAD = 1,
_IOWRT = 2,
_IONBF = 4,
_IOMYBUF = 8,
_IOEOF = 0x10,
_IOERR = 0x20,
_IOLBF = 0x40,
_IOSTRG = 0x40,
_IORW = 0x80,
_IOFBF = 0,
_IOAPPEND = 0x200,
}
int ferror(FILE *fp) { return fp._flag&_IOERR; }
int feof(FILE *fp) { return fp._flag&_IOEOF; }
void clearerr(FILE *fp);
void rewind(FILE *fp);
int fileno(FILE *fp) { return fp._file; }
int _snprintf(char *,size_t,char *,...);
int _vsnprintf(char *,size_t,char *,va_list);
int fwide(FILE* fp, int mode) { return mode; }
int _filbuf(FILE *fp);
int _flsbuf(int c, FILE *fp);
int _fputc_nolock(int c, FILE *fp)
{
if (--fp._cnt >= 0)
return *fp._ptr++ = cast(char)c;
else
return _flsbuf(c, fp);
}
int _fgetc_nolock(FILE *fp)
{
if (--fp._cnt >= 0)
return *fp._ptr++;
else
return _filbuf(fp);
}
int _lock_file(FILE *fp);
int _unlock_file(FILE *fp);
}
else version (linux)
{
const int EOF = -1;
const int FOPEN_MAX = 16;
const int FILENAME_MAX = 4095;
const int TMP_MAX = 238328;
const int L_tmpnam = 20;
struct _iobuf
{
align (1):
int _flags;
char* _read_ptr;
char* _read_end;
char* _read_base;
char* _write_base;
char* _write_ptr;
char* _write_end;
char* _buf_base;
char* _buf_end;
char* _save_base;
char* _backup_base;
char* _save_end;
void* _markers;
_iobuf* _chain;
int _fileno;
int _blksize;
size_t _old_offset;
ushort _cur_column;
byte _vtable_offset;
char[1] _shortbuf;
void* _lock;
}
enum { SEEK_SET, SEEK_CUR, SEEK_END }
alias _iobuf FILE; ///
enum
{
_F_RDWR = 0x0003,
_F_READ = 0x0001,
_F_WRIT = 0x0002,
_F_BUF = 0x0004,
_F_LBUF = 0x0008,
_F_ERR = 0x0010,
_F_EOF = 0x0020,
_F_BIN = 0x0040,
_F_IN = 0x0080,
_F_OUT = 0x0100,
_F_TERM = 0x0200,
}
enum
{
_IOFBF = 0,
_IOLBF = 1,
_IONBF = 2,
}
alias int fpos_t;
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
FILE * fopen64(in char *,in char *); ///
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp);
void rewind(FILE *fp);
int _bufsize(FILE *fp);
int fileno(FILE *fp);
int snprintf(char *,size_t,char *,...);
int vsnprintf(char *,size_t,char *,va_list);
int fwide(FILE* fp, int mode); ///
}
else version (OSX)
{
const int EOF = -1;
const int BUFSIZ = 1024;
const int FOPEN_MAX = 20;
const int FILENAME_MAX = 1024;
const int TMP_MAX = 308915776;
const int L_tmpnam = 1024;
struct __sbuf
{
char* _base;
int _size;
}
struct _iobuf
{
align (1):
char* _p;
int _r;
int _w;
short _flags;
short _file;
__sbuf _bf;
int _lbfsize;
void* _cookie;
int function(void*) _close;
int function(void*, char*, int) _read;
fpos_t function(void*, fpos_t, int) _seek;
int function(void*, char*, int) _write;
__sbuf _ub;
void* _extra;
int _ur;
char[3] _ubuf;
char[1] _nbuf;
__sbuf _lb;
int _blksize;
fpos_t _offset;
}
enum { SEEK_SET, SEEK_CUR, SEEK_END }
alias _iobuf FILE; ///
enum
{
_F_RDWR = 0x0003,
_F_READ = 0x0001,
_F_WRIT = 0x0002,
_F_BUF = 0x0004,
_F_LBUF = 0x0008,
_F_ERR = 0x0010,
_F_EOF = 0x0020,
_F_BIN = 0x0040,
_F_IN = 0x0080,
_F_OUT = 0x0100,
_F_TERM = 0x0200,
}
enum
{
_IOFBF = 0,
_IOLBF = 1,
_IONBF = 2,
}
alias long fpos_t;
extern FILE *__stdinp;
extern FILE *__stdoutp;
extern FILE *__stderrp;
alias __stdinp stdin;
alias __stdoutp stdout;
alias __stderrp stderr;
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp);
void rewind(FILE *fp);
int _bufsize(FILE *fp);
int fileno(FILE *fp);
int snprintf(char *,size_t,char *,...);
int vsnprintf(char *,size_t,char *,va_list);
int fwide(FILE* fp, int mode); ///
}
else version (FreeBSD)
{
const int EOF = -1;
const int BUFSIZ = 1024;
const int FOPEN_MAX = 20;
const int FILENAME_MAX = 1024;
const int TMP_MAX = 308915776;
const int L_tmpnam = 1024;
struct __sbuf
{
char* _base;
int _size;
}
struct _iobuf
{
align (1):
char* _p;
int _r;
int _w;
short _flags;
short _file;
__sbuf _bf;
int _lbfsize;
void* _cookie;
int function(void*) _close;
int function(void*, char*, int) _read;
fpos_t function(void*, fpos_t, int) _seek;
int function(void*, char*, int) _write;
__sbuf _ub;
void* _extra;
int _ur;
char[3] _ubuf;
char[1] _nbuf;
__sbuf _lb;
int _blksize;
fpos_t _offset;
}
enum { SEEK_SET, SEEK_CUR, SEEK_END }
alias _iobuf FILE; ///
enum
{
_F_RDWR = 0x0003,
_F_READ = 0x0001,
_F_WRIT = 0x0002,
_F_BUF = 0x0004,
_F_LBUF = 0x0008,
_F_ERR = 0x0010,
_F_EOF = 0x0020,
_F_BIN = 0x0040,
_F_IN = 0x0080,
_F_OUT = 0x0100,
_F_TERM = 0x0200,
}
enum
{
_IOFBF = 0,
_IOLBF = 1,
_IONBF = 2,
}
alias long fpos_t;
extern FILE *__stdinp;
extern FILE *__stdoutp;
extern FILE *__stderrp;
alias __stdinp stdin;
alias __stdoutp stdout;
alias __stderrp stderr;
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp);
void rewind(FILE *fp);
int _bufsize(FILE *fp);
int fileno(FILE *fp);
int snprintf(char *,size_t,char *,...);
int vsnprintf(char *,size_t,char *,va_list);
int fwide(FILE* fp, int mode); ///
}
else version (OpenBSD)
{
const int EOF = -1;
const int BUFSIZ = 1024;
const int FOPEN_MAX = 20;
const int FILENAME_MAX = 1024;
const int TMP_MAX = 308915776;
const int L_tmpnam = 1024;
alias off_t fpos_t;
struct __sbuf
{
char* _base;
int _size;
}
struct FILE
{
char* _p;
int _r;
int _w;
short _flags;
short _file;
__sbuf _bf;
int _lbfsize;
void *_cookie;
int (*_close)(void *);
int (*_read)(void *, char *, int);
fpos_t (*_seek)(void *, fpos_t, int);
int (*_write)(void *, char *, int);
__sbuf _ext;
char *_up;
int _ur;
char _ubuf[3];
char _nbuf[1];
__sbuf _lb;
int _blksize;
fpos_t _offset;
}
extern FILE __sF[];
const FILE *stdin = &__sF[0]; ///
const FILE *stdout = &__sF[1]; ///
const FILE *stderr = &__sF[2]; ///
enum
{
_IOFBF = 0,
_IOLBF = 1,
_IONBF = 2,
}
enum { SEEK_SET, SEEK_CUR, SEEK_END }
int ferror(FILE *);
int feof(FILE *);
void clearerr(FILE *);
void rewind(FILE *);
int fileno(FILE *);
int snprintf(char *, size_t, char *, ...);
int vsnprintf(char *, size_t, char *, va_list);
int fseeko(FILE *, off_t, int);
off_t ftello(FILE *);
int fwide(FILE* fp, int mode); ///
}
else version (Solaris)
{
const int EOF = -1;
const int BUFSIZ = 1024;
const int FOPEN_MAX = 20;
const int FILENAME_MAX = 1024;
const int TMP_MAX = 17576;
const int L_tmpnam = 25;
const int _NFILE = 20;
struct __sbuf
{
char* _base;
int _size;
}
struct _iobuf
{
align (1):
int _cnt;
ubyte* _ptr;
ubyte* _base;
ubyte _flag;
ubyte _magic;
ubyte[2] __bitflags;
}
enum { SEEK_SET, SEEK_CUR, SEEK_END }
alias _iobuf FILE; ///
enum
{
_IOFBF = 0000,
_IOLBF = 0100,
_IONBF = 0200,
}
alias long fpos_t;
extern FILE _iob[_NFILE];
const FILE *stdin = &_iob[0]; ///
const FILE *stdout = &_iob[1]; ///
const FILE *stderr = &_iob[2]; ///
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp);
void rewind(FILE *fp);
int _bufsize(FILE *fp);
int fileno(FILE *fp);
int snprintf(char *,size_t,char *,...);
int vsnprintf(char *,size_t,char *,va_list);
int fwide(FILE* fp, int mode); ///
}
else
{
static assert(0);
}
char * tmpnam(char *); ///
FILE * fopen(in char *,in char *); ///
FILE * _fsopen(in char *,in char *,int ); ///
FILE * freopen(in char *,in char *,FILE *); ///
int fseek(FILE *,int,int); ///
int ftell(FILE *); ///
char * fgets(char *,int,FILE *); ///
int fgetc(FILE *); ///
int _fgetchar(); ///
int fflush(FILE *); ///
int fclose(FILE *); ///
int fputs(char *,FILE *); ///
char * gets(char *); ///
int fputc(int,FILE *); ///
int _fputchar(int); ///
int puts(char *); ///
int ungetc(int,FILE *); ///
size_t fread(void *,size_t,size_t,FILE *); ///
size_t fwrite(void *,size_t,size_t,FILE *); ///
//int printf(char *,...); ///
int fprintf(FILE *,char *,...); ///
int vfprintf(FILE *,char *,va_list); ///
int vprintf(char *,va_list); ///
int sprintf(char *,char *,...); ///
int vsprintf(char *,char *,va_list); ///
int scanf(char *,...); ///
int fscanf(FILE *,char *,...); ///
int sscanf(char *,char *,...); ///
void setbuf(FILE *,char *); ///
int setvbuf(FILE *,char *,int,size_t); ///
int remove(char *); ///
int rename(char *,char *); ///
void perror(char *); ///
int fgetpos(FILE *,fpos_t *); ///
int fsetpos(FILE *,fpos_t *); ///
FILE * tmpfile(); ///
int _rmtmp();
int _fillbuf(FILE *);
int _flushbu(int, FILE *);
int getw(FILE *FHdl); ///
int putw(int Word, FILE *FilePtr); ///
///
int getchar() { return getc(stdin); }
///
int putchar(int c) { return putc(c,stdout); }
///
int getc(FILE *fp) { return fgetc(fp); }
///
int putc(int c,FILE *fp) { return fputc(c,fp); }
int unlink(char *); ///
FILE * fdopen(int, char *); ///
int fgetchar(); ///
int fputchar(int); ///
int fcloseall(); ///
int filesize(char *); ///
int flushall(); ///
int getch(); ///
int getche(); ///
int kbhit(); ///
char * tempnam (char *dir, char *pfx); ///
wchar_t * _wtmpnam(wchar_t *); ///
FILE * _wfopen(wchar_t *, wchar_t *);
FILE * _wfsopen(wchar_t *, wchar_t *, int);
FILE * _wfreopen(wchar_t *, wchar_t *, FILE *);
wchar_t * fgetws(wchar_t *, int, FILE *); ///
int fputws(wchar_t *, FILE *); ///
wchar_t * _getws(wchar_t *);
int _putws(wchar_t *);
int wprintf(wchar_t *, ...); ///
int fwprintf(FILE *, wchar_t *, ...); ///
int vwprintf(wchar_t *, va_list); ///
int vfwprintf(FILE *, wchar_t *, va_list); ///
int swprintf(wchar_t *, wchar_t *, ...); ///
int vswprintf(wchar_t *, wchar_t *, va_list); ///
int _snwprintf(wchar_t *, size_t, wchar_t *, ...);
int _vsnwprintf(wchar_t *, size_t, wchar_t *, va_list);
int wscanf(wchar_t *, ...); ///
int fwscanf(FILE *, wchar_t *, ...); ///
int swscanf(wchar_t *, wchar_t *, ...); ///
int _wremove(wchar_t *);
void _wperror(wchar_t *);
FILE * _wfdopen(int, wchar_t *);
wchar_t * _wtempnam(wchar_t *, wchar_t *);
wchar_t fgetwc(FILE *); ///
wchar_t _fgetwchar_t();
wchar_t fputwc(wchar_t, FILE *); ///
wchar_t _fputwchar_t(wchar_t);
wchar_t ungetwc(wchar_t, FILE *); ///
///
wchar_t getwchar_t() { return fgetwc(stdin); }
///
wchar_t putwchar_t(wchar_t c) { return fputwc(c,stdout); }
///
wchar_t getwc(FILE *fp); // { return fgetwc(fp); }
///
wchar_t putwc(wchar_t c, FILE *fp); // { return fputwc(c, fp); }