mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-28 07:18:30 +00:00
Add epoll and do more release readiness changes
This change also pays off some of the remaining technical debt with stdio, file descriptors, and memory managemnt polyfills.
This commit is contained in:
parent
a9ea949df8
commit
3e4fd4b0ad
271 changed files with 5706 additions and 1365 deletions
|
@ -24,6 +24,7 @@
|
|||
TEST(fgetwc, testAscii_oneChar) {
|
||||
FILE *f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
EXPECT_EQ('A', fputc('A', f));
|
||||
rewind(f);
|
||||
EXPECT_EQ('A', fgetc(f));
|
||||
fclose(f);
|
||||
}
|
||||
|
@ -32,6 +33,7 @@ TEST(fgetwc, testAscii_twoChar) {
|
|||
FILE *f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
EXPECT_EQ('A', fputc('A', f));
|
||||
EXPECT_EQ('B', fputc('B', f));
|
||||
rewind(f);
|
||||
EXPECT_EQ('A', fgetc(f));
|
||||
EXPECT_EQ('B', fgetc(f));
|
||||
fclose(f);
|
||||
|
@ -40,6 +42,7 @@ TEST(fgetwc, testAscii_twoChar) {
|
|||
TEST(fgetwc, testUnicode_oneChar) {
|
||||
FILE *f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
EXPECT_EQ(L'𐌰', fputwc(L'𐌰', f));
|
||||
rewind(f);
|
||||
EXPECT_EQ(L'𐌰', fgetwc(f));
|
||||
fclose(f);
|
||||
}
|
||||
|
@ -50,7 +53,20 @@ TEST(fgetwc, testUnicode_oneChar_writtenAsRawUtf8) {
|
|||
EXPECT_EQ(0x90, fputc(0x90, f));
|
||||
EXPECT_EQ(0x8C, fputc(0x8C, f));
|
||||
EXPECT_EQ(0xB0, fputc(0xB0, f));
|
||||
rewind(f);
|
||||
EXPECT_EQ(L'𐌰', fgetwc(f));
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
TEST(fgetwc, testUnicode_spuriousContChars_synchronizedBeforeRead) {
|
||||
FILE *f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
EXPECT_EQ(0x90, fputc(0x90, f));
|
||||
EXPECT_EQ(0x90, fputc(0x90, f));
|
||||
EXPECT_EQ(0xF0, fputc(0xF0, f));
|
||||
EXPECT_EQ(0x90, fputc(0x90, f));
|
||||
EXPECT_EQ(0x8C, fputc(0x8C, f));
|
||||
EXPECT_EQ(0xB0, fputc(0xB0, f));
|
||||
rewind(f);
|
||||
EXPECT_EQ(L'𐌰', fgetwc(f));
|
||||
EXPECT_EQ(-1u, fgetwc(f));
|
||||
fclose(f);
|
||||
}
|
||||
|
|
|
@ -17,54 +17,23 @@
|
|||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||||
│ 02110-1301 USA │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/bits/bits.h"
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
int pipefd[2];
|
||||
FILE *f, *reader, *writer;
|
||||
|
||||
TEST(fgetc, testEnd) {
|
||||
f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
EXPECT_EQ(EOF, fgetc(f));
|
||||
EXPECT_TRUE(feof(f));
|
||||
EXPECT_FALSE(ferror(f));
|
||||
EXPECT_EQ(0, fclose(f));
|
||||
TEST(fmemopen, testWriteRewindRead) {
|
||||
char c;
|
||||
FILE *f;
|
||||
f = fmemopen(NULL, BUFSIZ, "w+");
|
||||
EXPECT_EQ(1, fwrite("c", 1, 1, f));
|
||||
rewind(f);
|
||||
EXPECT_EQ(1, fread(&c, 1, 1, f));
|
||||
EXPECT_EQ('c', c);
|
||||
}
|
||||
|
||||
TEST(fgetwc, testEnd) {
|
||||
f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
EXPECT_EQ(WEOF, fgetwc(f));
|
||||
EXPECT_TRUE(feof(f));
|
||||
EXPECT_FALSE(ferror(f));
|
||||
EXPECT_EQ(0, fclose(f));
|
||||
}
|
||||
|
||||
TEST(fgetwc, testMultibyte) {
|
||||
f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
EXPECT_EQ(L'𝑥', fputwc(L'𝑥', f));
|
||||
EXPECT_EQ(L'𝑦', fputwc(L'𝑦', f));
|
||||
EXPECT_EQ(L'𝑧', fputwc(L'𝑧', f));
|
||||
EXPECT_EQ(L'𝑥', fgetwc(f));
|
||||
EXPECT_EQ(L'𝑦', fgetwc(f));
|
||||
EXPECT_EQ(L'𝑧', fgetwc(f));
|
||||
EXPECT_EQ(WEOF, fgetwc(f));
|
||||
EXPECT_TRUE(feof(f));
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
TEST(fgetc, testPipe) {
|
||||
ASSERT_NE(-1, pipe(pipefd));
|
||||
writer = fdopen(pipefd[1], "w");
|
||||
reader = fdopen(pipefd[0], "r");
|
||||
EXPECT_EQ('a', fputc('a', writer));
|
||||
EXPECT_EQ('b', fputc('b', writer));
|
||||
EXPECT_EQ('c', fputc('c', writer));
|
||||
EXPECT_EQ(3, fflush(writer));
|
||||
EXPECT_EQ('a', fgetc(reader));
|
||||
EXPECT_EQ('b', fgetc(reader));
|
||||
EXPECT_EQ('c', fgetc(reader));
|
||||
EXPECT_EQ(0, fclose(reader));
|
||||
EXPECT_EQ(0, fclose(writer));
|
||||
}
|
||||
/* TEST(fmemopen, testWriteRead_readsNothingButNotEof) { */
|
||||
/* char c; */
|
||||
/* FILE *f; */
|
||||
/* f = fmemopen(NULL, BUFSIZ, "w+"); */
|
||||
/* EXPECT_EQ(1, fwrite("c", 1, 1, f)); */
|
||||
/* EXPECT_EQ(0, fread(&c, 1, 1, f)); */
|
||||
/* } */
|
|
@ -20,10 +20,11 @@
|
|||
#include "libc/bits/bits.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(getline, testEmpty) {
|
||||
FILE *f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
FILE *f = fmemopen("", 0, "r+");
|
||||
char *line = NULL;
|
||||
size_t linesize = 0;
|
||||
EXPECT_EQ(-1, getline(&line, &linesize, f));
|
||||
|
@ -34,8 +35,7 @@ TEST(getline, testEmpty) {
|
|||
}
|
||||
|
||||
TEST(getline, testOneWithoutLineFeed) {
|
||||
FILE *f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
ASSERT_EQ(5, fwrite("hello", 1, 5, f));
|
||||
FILE *f = fmemopen("hello", 5, "r+");
|
||||
char *line = NULL;
|
||||
size_t linesize = 0;
|
||||
ASSERT_EQ(5, getline(&line, &linesize, f));
|
||||
|
@ -48,8 +48,8 @@ TEST(getline, testOneWithoutLineFeed) {
|
|||
}
|
||||
|
||||
TEST(getline, testTwoLines) {
|
||||
FILE *f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
ASSERT_EQ(12, fwrite("hello\nthere\n", 1, 12, f));
|
||||
const char *s = "hello\nthere\n";
|
||||
FILE *f = fmemopen(s, strlen(s), "r+");
|
||||
char *line = NULL;
|
||||
size_t linesize = 0;
|
||||
ASSERT_EQ(6, getline(&line, &linesize, f));
|
||||
|
@ -64,8 +64,8 @@ TEST(getline, testTwoLines) {
|
|||
}
|
||||
|
||||
TEST(getline, testBinaryLine_countExcludesOnlyTheBonusNul) {
|
||||
FILE *f = fmemopen(NULL, BUFSIZ, "r+");
|
||||
fwrite("he\0\3o\n", 1, 6, f);
|
||||
const char s[] = "he\0\3o\n";
|
||||
FILE *f = fmemopen(s, sizeof(s), "r+");
|
||||
char *line = NULL;
|
||||
size_t linesize = 0;
|
||||
ASSERT_EQ(6, getline(&line, &linesize, f));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue