mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-28 00:02:28 +00:00
Get GNU GMP test suite fully passing
- Fix stdio fmemopen() buffer behaviors - Fix scanf() to return EOF when appropriate - Prefer fseek/ftell names over fseeko/ftello - Ensure locale field is always set in the TIB - Fix recent regression in vfprintf() return count - Make %n directive in scanf() have standard behavior
This commit is contained in:
parent
755ae64e73
commit
63a1636e1f
20 changed files with 228 additions and 51 deletions
|
@ -18,6 +18,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/mem/gc.h"
|
||||
#include "libc/mem/gc.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
|
@ -28,7 +29,7 @@
|
|||
|
||||
TEST(fgetln, test) {
|
||||
FILE *f;
|
||||
f = fmemopen(_gc(strdup(kHyperion)), kHyperionSize, "r+");
|
||||
f = fmemopen(gc(strdup(kHyperion)), kHyperionSize, "r+");
|
||||
EXPECT_STREQ("The fall of Hyperion - a Dream\n", fgetln(f, 0));
|
||||
EXPECT_STREQ("John Keats\n", fgetln(f, 0));
|
||||
EXPECT_STREQ("\n", fgetln(f, 0));
|
||||
|
@ -81,7 +82,7 @@ TEST(fgetln, testReadingFromStdin_doesntLeakMemory) {
|
|||
}
|
||||
|
||||
BENCH(fgetln, bench) {
|
||||
FILE *f = fmemopen(_gc(strdup(kHyperion)), kHyperionSize, "r+");
|
||||
FILE *f = fmemopen(gc(strdup(kHyperion)), kHyperionSize, "r+");
|
||||
EZBENCH2("fgetln", donothing, fgetln(f, 0));
|
||||
EZBENCH2("xgetline", donothing, free(xgetline(f)));
|
||||
fclose(f);
|
||||
|
|
|
@ -16,7 +16,12 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/mem/gc.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/stdio/temp.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(fmemopen, testWriteRewindRead) {
|
||||
|
@ -30,10 +35,43 @@ TEST(fmemopen, testWriteRewindRead) {
|
|||
fclose(f);
|
||||
}
|
||||
|
||||
/* 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)); */
|
||||
/* } */
|
||||
TEST(fmemopen_fprintf, test) {
|
||||
FILE *f = fmemopen(NULL, BUFSIZ, "w+");
|
||||
EXPECT_EQ(1, fprintf(f, "%ld", 0L));
|
||||
rewind(f);
|
||||
char buf[8] = {0};
|
||||
EXPECT_EQ(1, fread(&buf, 1, 8, f));
|
||||
EXPECT_STREQ("0", buf);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
TEST(fmemopen, seekEofRead) {
|
||||
FILE *f = fmemopen("x", 1, "r+");
|
||||
ASSERT_SYS(EINVAL, -1, fseek(f, -1, SEEK_SET));
|
||||
ASSERT_SYS(EINVAL, -1, fseek(f, +1, SEEK_END));
|
||||
ASSERT_EQ(0, fseek(f, 0, SEEK_END));
|
||||
ASSERT_FALSE(feof(f));
|
||||
ASSERT_EQ(-1, fgetc(f));
|
||||
ASSERT_TRUE(feof(f));
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
TEST(tmpfile_fprintf, test) {
|
||||
FILE *f = tmpfile();
|
||||
EXPECT_EQ(1, fprintf(f, "%ld", 0L));
|
||||
rewind(f);
|
||||
char buf[8] = {0};
|
||||
EXPECT_EQ(1, fread(&buf, 1, 8, f));
|
||||
EXPECT_STREQ("0", buf);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
TEST(fmemopen, small) {
|
||||
FILE *f = fmemopen(gc(malloc(1)), 1, "w+");
|
||||
EXPECT_EQ(3, fprintf(f, "%ld", 123L));
|
||||
rewind(f);
|
||||
char buf[8] = {0};
|
||||
EXPECT_EQ(1, fread(&buf, 1, 8, f));
|
||||
EXPECT_STREQ("1", buf);
|
||||
fclose(f);
|
||||
}
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/mem/gc.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
|
|
|
@ -42,7 +42,6 @@ TEST(sscanf, testMultiple) {
|
|||
|
||||
TEST(sscanf, testDecimal) {
|
||||
EXPECT_EQ(123, sscanf1("123", "%d"));
|
||||
EXPECT_EQ(123, sscanf1("123", "%n"));
|
||||
EXPECT_EQ(123, sscanf1("123", "%u"));
|
||||
EXPECT_EQ((uint32_t)-123, sscanf1("-123", "%d"));
|
||||
}
|
||||
|
@ -258,3 +257,30 @@ TEST(sscanf, test0) {
|
|||
ASSERT_EQ(sscanf("0", "%b", &v), 1);
|
||||
ASSERT_EQ(v, 0);
|
||||
}
|
||||
|
||||
TEST(sscanf, n) {
|
||||
int x, y;
|
||||
EXPECT_EQ(1, sscanf("7 2 3 4", "%d%n", &x, &y));
|
||||
EXPECT_EQ(7, x);
|
||||
EXPECT_EQ(1, y);
|
||||
}
|
||||
|
||||
TEST(sscanf, eofForNoMatching) {
|
||||
int y = 666;
|
||||
char x[8] = "hi";
|
||||
EXPECT_EQ(-1, sscanf(" ", "%s%n", &x, &y));
|
||||
EXPECT_STREQ("hi", x);
|
||||
EXPECT_EQ(666, y);
|
||||
}
|
||||
|
||||
TEST(sscanf, eofConditions) {
|
||||
int x = 666;
|
||||
EXPECT_EQ(-1, sscanf("", "%d", &x));
|
||||
EXPECT_EQ(666, x);
|
||||
EXPECT_EQ(-1, sscanf(" ", "%d", &x));
|
||||
EXPECT_EQ(666, x);
|
||||
EXPECT_EQ(-1, sscanf("123", "%*d%d", &x));
|
||||
EXPECT_EQ(666, x);
|
||||
EXPECT_EQ(-1, sscanf("123", "%*d%n", &x));
|
||||
EXPECT_EQ(666, x);
|
||||
}
|
||||
|
|
24
test/libc/str/locale_test.c
Normal file
24
test/libc/str/locale_test.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/str/unicode.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
TEST(locale, test) {
|
||||
EXPECT_STREQ(".", localeconv()->decimal_point);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue