mirror of
https://github.com/dlang/phobos.git
synced 2025-04-28 14:10:30 +03:00
std.stdio: add glossary, fileno_t (#8772)
This commit is contained in:
parent
b3e664e174
commit
33f63dbd5d
1 changed files with 65 additions and 6 deletions
71
std/stdio.d
71
std/stdio.d
|
@ -34,9 +34,17 @@ $(TR $(TD Misc) $(TD
|
||||||
))
|
))
|
||||||
))
|
))
|
||||||
|
|
||||||
Standard I/O functions that extend $(B core.stdc.stdio). $(B core.stdc.stdio)
|
Standard I/O functions that extend $(LINK2 https://dlang.org/phobos/core_stdc_stdio.html, core.stdc.stdio). $(B core.stdc.stdio)
|
||||||
is $(D_PARAM public)ally imported when importing $(B std.stdio).
|
is $(D_PARAM public)ally imported when importing $(B std.stdio).
|
||||||
|
|
||||||
|
There are three layers of I/O:
|
||||||
|
$(OL
|
||||||
|
$(LI The lowest layer is the operating system layer. The two main schemes are Windows and Posix.)
|
||||||
|
$(LI C's $(TT stdio.h) which unifies the two operating system schemes.)
|
||||||
|
$(LI $(TT std.stdio), this module, unifies the various $(TT stdio.h) implementations into
|
||||||
|
a high level package for D programs.)
|
||||||
|
)
|
||||||
|
|
||||||
Source: $(PHOBOSSRC std/stdio.d)
|
Source: $(PHOBOSSRC std/stdio.d)
|
||||||
Copyright: Copyright The D Language Foundation 2007-.
|
Copyright: Copyright The D Language Foundation 2007-.
|
||||||
License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0).
|
License: $(HTTP boost.org/LICENSE_1_0.txt, Boost License 1.0).
|
||||||
|
@ -48,6 +56,55 @@ CSTDIO=$(HTTP cplusplus.com/reference/cstdio/$1/, $1)
|
||||||
*/
|
*/
|
||||||
module std.stdio;
|
module std.stdio;
|
||||||
|
|
||||||
|
/*
|
||||||
|
# Glossary
|
||||||
|
|
||||||
|
The three layers have many terms for their data structures and types.
|
||||||
|
Here we try to bring some sanity to them for the intrepid code spelunker.
|
||||||
|
|
||||||
|
## Windows
|
||||||
|
|
||||||
|
Handle
|
||||||
|
|
||||||
|
A Windows handle is an opaque object of type HANDLE.
|
||||||
|
The `HANDLE` for standard devices can be retrieved with
|
||||||
|
Windows `GetStdHandle()`.
|
||||||
|
|
||||||
|
## Posix
|
||||||
|
|
||||||
|
file descriptor, aka fileno, aka fildes
|
||||||
|
|
||||||
|
An int from 0..`FOPEN_MAX`, which is an index into some internal data
|
||||||
|
structure.
|
||||||
|
0 is for `stdin`, 1 for `stdout`, 2 for `stderr`.
|
||||||
|
Negative values usually indicate an error.
|
||||||
|
|
||||||
|
## stdio.h
|
||||||
|
|
||||||
|
`FILE`
|
||||||
|
|
||||||
|
A struct that encapsulates the C library's view of the operating system
|
||||||
|
files. A `FILE` should only be referred to via a pointer.
|
||||||
|
|
||||||
|
`fileno`
|
||||||
|
|
||||||
|
A field of `FILE` which is the Posix file descriptor for Posix systems, and
|
||||||
|
and an index into an array of file `HANDLE`s for Windows.
|
||||||
|
This array is how Posix behavior is emulated on Windows.
|
||||||
|
For Digital Mars C, that array is `__osfhnd[]`, and is initialized
|
||||||
|
at program start by the C runtime library.
|
||||||
|
In this module, they are typed as `fileno_t`.
|
||||||
|
|
||||||
|
`stdin`, `stdout`, `stderr`
|
||||||
|
|
||||||
|
Global pointers to `FILE` representing standard input, output, and error streams.
|
||||||
|
Being global means there are synchronization issues when multiple threads
|
||||||
|
are doing I/O on the same streams.
|
||||||
|
|
||||||
|
## std.stdio
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
import core.stdc.stddef : wchar_t;
|
import core.stdc.stddef : wchar_t;
|
||||||
public import core.stdc.stdio;
|
public import core.stdc.stdio;
|
||||||
import std.algorithm.mutation : copy;
|
import std.algorithm.mutation : copy;
|
||||||
|
@ -144,6 +201,7 @@ else
|
||||||
private alias FSChar = char;
|
private alias FSChar = char;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private alias fileno_t = int; // file descriptor, fildes, fileno
|
||||||
|
|
||||||
version (Windows)
|
version (Windows)
|
||||||
{
|
{
|
||||||
|
@ -207,7 +265,7 @@ version (DIGITAL_MARS_STDIO)
|
||||||
// @@@DEPRECATED_2.107@@@
|
// @@@DEPRECATED_2.107@@@
|
||||||
deprecated("internal function _fileno was unintentionally available from "
|
deprecated("internal function _fileno was unintentionally available from "
|
||||||
~ "std.stdio and will be removed afer 2.107")
|
~ "std.stdio and will be removed afer 2.107")
|
||||||
int _fileno(FILE* f) { return f._file; }
|
fileno_t _fileno(FILE* f) { return f._file; }
|
||||||
}
|
}
|
||||||
else version (MICROSOFT_STDIO)
|
else version (MICROSOFT_STDIO)
|
||||||
{
|
{
|
||||||
|
@ -1144,7 +1202,7 @@ Throws: `ErrnoException` if the file is not opened or the call to `fread` fails.
|
||||||
enforce(isOpen, "Attempting to read from an unopened file");
|
enforce(isOpen, "Attempting to read from an unopened file");
|
||||||
version (Windows)
|
version (Windows)
|
||||||
{
|
{
|
||||||
immutable fd = .fileno(_p.handle);
|
immutable fileno_t fd = .fileno(_p.handle);
|
||||||
immutable mode = .__setmode(fd, _O_BINARY);
|
immutable mode = .__setmode(fd, _O_BINARY);
|
||||||
scope(exit) .__setmode(fd, mode);
|
scope(exit) .__setmode(fd, mode);
|
||||||
version (DIGITAL_MARS_STDIO)
|
version (DIGITAL_MARS_STDIO)
|
||||||
|
@ -1234,7 +1292,7 @@ Throws: `ErrnoException` if the file is not opened or if the call to `fwrite` fa
|
||||||
|
|
||||||
version (Windows)
|
version (Windows)
|
||||||
{
|
{
|
||||||
immutable fd = .fileno(_p.handle);
|
immutable fileno_t fd = .fileno(_p.handle);
|
||||||
immutable oldMode = .__setmode(fd, _O_BINARY);
|
immutable oldMode = .__setmode(fd, _O_BINARY);
|
||||||
|
|
||||||
if (oldMode != _O_BINARY)
|
if (oldMode != _O_BINARY)
|
||||||
|
@ -2291,7 +2349,7 @@ Returns the `FILE*` corresponding to this object.
|
||||||
/**
|
/**
|
||||||
Returns the file number corresponding to this object.
|
Returns the file number corresponding to this object.
|
||||||
*/
|
*/
|
||||||
@property int fileno() const @trusted
|
@property fileno_t fileno() const @trusted
|
||||||
{
|
{
|
||||||
import std.exception : enforce;
|
import std.exception : enforce;
|
||||||
|
|
||||||
|
@ -3343,7 +3401,8 @@ is empty, throws an `Exception`. In case of an I/O error throws
|
||||||
|
|
||||||
version (Windows)
|
version (Windows)
|
||||||
{
|
{
|
||||||
int fd, oldMode;
|
fileno_t fd;
|
||||||
|
int oldMode;
|
||||||
version (DIGITAL_MARS_STDIO)
|
version (DIGITAL_MARS_STDIO)
|
||||||
ubyte oldInfo;
|
ubyte oldInfo;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue