This repository has been archived by the owner on Oct 12, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 422
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add fopencookie, fmemopen, open_memstream, open_wmemstream, setbuffer…
… [v6]
- Loading branch information
Danny Milosavljevic
committed
Dec 6, 2014
1 parent
bdf35f3
commit ae79e36
Showing
2 changed files
with
150 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,105 @@ | ||
| /** | ||
| * D header file for GNU stdio. | ||
| * | ||
| * Copyright: Danny Milosavljevic 2014 | ||
| * License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>. | ||
| * Authors: Danny Milosavljevic | ||
| */ | ||
| module core.sys.linux.stdio; | ||
| version (linux): | ||
| import core.sys.posix.stdio; | ||
| import core.sys.posix.sys.types : ssize_t, off64_t = off_t; | ||
| import core.sys.linux.config : __USE_FILE_OFFSET64; | ||
| import core.stdc.stdio : FILE; | ||
| import core.stdc.stddef : wchar_t, size_t; | ||
|
|
||
| extern(C) nothrow | ||
| { | ||
| alias ssize_t function(void *cookie, char *buf, size_t size) cookie_read_function_t; | ||
| alias ssize_t function(void *cookie, const(char) *buf, size_t size) cookie_write_function_t; | ||
| alias int function(void *cookie, off64_t *offset, int whence) cookie_seek_function_t; | ||
| alias int function(void *cookie) cookie_close_function_t; | ||
|
|
||
| struct cookie_io_functions_t | ||
| { | ||
| cookie_read_function_t read; | ||
| cookie_write_function_t write; | ||
| cookie_seek_function_t seek; | ||
| cookie_close_function_t close; | ||
| } | ||
| FILE* fopencookie(in void* cookie, in char* mode, cookie_io_functions_t io_funcs); | ||
| void setbuffer(FILE *stream, char *buf, size_t size); // note: _BSD_SOURCE | ||
| } | ||
|
|
||
| unittest | ||
| { | ||
| static int flag = 0; | ||
| static int written = 0; | ||
| static int closed = 0; | ||
| // Note: this test needs to run on both a 32 and a 64 bit machine, both have to pass. | ||
| import core.stdc.errno : errno, EBADF; | ||
| //import core.sys.posix.sys.stat : off64_t; | ||
| import core.stdc.stdio : FILE, fflush, fileno, fprintf, fgetc, EOF, fclose; | ||
| import core.stdc.string : memcpy, memset; | ||
| extern (C) ssize_t specialRead(void *cookie, char *buf, size_t size) nothrow | ||
| { | ||
| memset(buf, 'a', size); | ||
| return size; | ||
| } | ||
| extern (C) int specialClose(void* cookie) nothrow | ||
| { | ||
| ++closed; | ||
| return 0; | ||
| } | ||
| extern (C) ssize_t specialWrite(void *cookie, const(char) *buf, size_t size) nothrow | ||
| { | ||
| int* c = cast(int*) cookie; | ||
| flag = *c; | ||
| written += size; | ||
| return size; | ||
| } | ||
| int dummy = 42; | ||
| cookie_io_functions_t fns = | ||
| { | ||
| read: &specialRead, | ||
| write: &specialWrite, | ||
| close: &specialClose, | ||
| }; | ||
| FILE* f = fopencookie(&dummy, "r+", fns); | ||
| assert(f !is null); | ||
| //File.open(); | ||
| //auto g = File(f); | ||
| assert(fileno(f) == -1 && errno == EBADF); | ||
| assert(fprintf(f, "hello") == "hello".length); | ||
| //assert(errno == EBADF); | ||
| assert(fflush(f) == 0); | ||
| assert(written == "hello".length); | ||
| // Note: do not swap reading and writing here. | ||
| int c = 0; | ||
| while((c = fgetc(f)) != EOF) | ||
| { | ||
| assert(c == 'a'); | ||
| break; // endless otherwise | ||
| } | ||
| assert(c == 'a'); | ||
| assert(fclose(f) == 0); | ||
| assert(closed == 1); | ||
| assert(flag == dummy); | ||
| //stdin.getFP(); | ||
| //assert(stdin.fileno() == 0); | ||
| } | ||
|
|
||
| unittest | ||
| { /* setbuffer */ | ||
| char buf; | ||
| int c; | ||
| byte[10] dummy = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; | ||
| FILE* f = fmemopen(dummy.ptr, 10, "r"); | ||
| assert(f !is null); | ||
| setbuffer(f, &buf, 1); | ||
| assert(fgetc(f) == 1); | ||
| assert(fgetc(f) == 2); | ||
| assert(fgetc(f) == 3); | ||
| assert(fgetc(f) == 4); | ||
| assert(fclose(f) == 0); | ||
| } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters