mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:47:36 +00:00
LibC: Add ungetc() and automatically flush streams on fclose().
This commit is contained in:
parent
0c2face7b0
commit
d1e55fb4d9
7 changed files with 39 additions and 3 deletions
|
@ -47,6 +47,8 @@ __BEGIN_DECLS
|
||||||
#define S_IWOTH 0002
|
#define S_IWOTH 0002
|
||||||
#define S_IXOTH 0001
|
#define S_IXOTH 0001
|
||||||
|
|
||||||
|
#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
|
||||||
|
|
||||||
#define S_IRWXG (S_IRWXU >> 3)
|
#define S_IRWXG (S_IRWXU >> 3)
|
||||||
#define S_IRWXO (S_IRWXG >> 3)
|
#define S_IRWXO (S_IRWXG >> 3)
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,10 @@
|
||||||
#define PRId16 "d"
|
#define PRId16 "d"
|
||||||
#define PRId32 "d"
|
#define PRId32 "d"
|
||||||
#define PRId64 "lld"
|
#define PRId64 "lld"
|
||||||
|
#define PRIi8 "d"
|
||||||
|
#define PRIi16 "d"
|
||||||
|
#define PRIi32 "d"
|
||||||
|
#define PRIi64 "lld"
|
||||||
#define PRIu8 "u"
|
#define PRIu8 "u"
|
||||||
#define PRIu16 "u"
|
#define PRIu16 "u"
|
||||||
#define PRIu32 "u"
|
#define PRIu32 "u"
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#define PAGE_SIZE 4096
|
#define PAGE_SIZE 4096
|
||||||
|
|
||||||
#define PATH_MAX 4096
|
#define PATH_MAX 4096
|
||||||
#define BUFSIZ 1024
|
|
||||||
|
|
||||||
#define INT_MAX INT32_MAX
|
#define INT_MAX INT32_MAX
|
||||||
#define INT_MIN INT32_MIN
|
#define INT_MIN INT32_MIN
|
||||||
|
|
|
@ -10,6 +10,7 @@ enum {
|
||||||
LC_CTYPE,
|
LC_CTYPE,
|
||||||
LC_COLLATE,
|
LC_COLLATE,
|
||||||
LC_TIME,
|
LC_TIME,
|
||||||
|
LC_MONETARY,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct lconv {
|
struct lconv {
|
||||||
|
|
|
@ -24,6 +24,16 @@ typedef __INT_FAST16_TYPE__ int_fast16_t;
|
||||||
typedef __INT_FAST32_TYPE__ int_fast32_t;
|
typedef __INT_FAST32_TYPE__ int_fast32_t;
|
||||||
typedef __INT_FAST64_TYPE__ int_fast64_t;
|
typedef __INT_FAST64_TYPE__ int_fast64_t;
|
||||||
|
|
||||||
|
typedef __UINT_LEAST8_TYPE__ uint_least8_t;
|
||||||
|
typedef __UINT_LEAST16_TYPE__ uint_least16_t;
|
||||||
|
typedef __UINT_LEAST32_TYPE__ uint_least32_t;
|
||||||
|
typedef __UINT_LEAST64_TYPE__ uint_least64_t;
|
||||||
|
|
||||||
|
typedef __INT_LEAST8_TYPE__ int_least8_t;
|
||||||
|
typedef __INT_LEAST16_TYPE__ int_least16_t;
|
||||||
|
typedef __INT_LEAST32_TYPE__ int_least32_t;
|
||||||
|
typedef __INT_LEAST64_TYPE__ int_least64_t;
|
||||||
|
|
||||||
#define __int8_t_defined 1
|
#define __int8_t_defined 1
|
||||||
#define __uint8_t_defined 1
|
#define __uint8_t_defined 1
|
||||||
#define __int16_t_defined 1
|
#define __int16_t_defined 1
|
||||||
|
|
|
@ -141,9 +141,12 @@ int getchar()
|
||||||
return getc(stdin);
|
return getc(stdin);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ungetc(int, FILE*)
|
int ungetc(int c, FILE* stream)
|
||||||
{
|
{
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT(stream);
|
||||||
|
stream->have_ungotten = true;
|
||||||
|
stream->ungotten = c;
|
||||||
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fputc(int ch, FILE* stream)
|
int fputc(int ch, FILE* stream)
|
||||||
|
@ -203,6 +206,18 @@ int ferror(FILE* stream)
|
||||||
size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream)
|
size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream)
|
||||||
{
|
{
|
||||||
assert(stream);
|
assert(stream);
|
||||||
|
if (!size)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (stream->have_ungotten) {
|
||||||
|
// FIXME: Support ungotten character even if size != 1.
|
||||||
|
ASSERT(size == 1);
|
||||||
|
((char*)ptr)[0] = stream->ungotten;
|
||||||
|
stream->have_ungotten = false;
|
||||||
|
--nmemb;
|
||||||
|
ptr = &((char*)ptr)[1];
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t nread = read(stream->fd, ptr, nmemb * size);
|
ssize_t nread = read(stream->fd, ptr, nmemb * size);
|
||||||
if (nread < 0)
|
if (nread < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -388,6 +403,7 @@ FILE* fdopen(int fd, const char* mode)
|
||||||
|
|
||||||
int fclose(FILE* stream)
|
int fclose(FILE* stream)
|
||||||
{
|
{
|
||||||
|
fflush(stream);
|
||||||
int rc = close(stream->fd);
|
int rc = close(stream->fd);
|
||||||
free(stream);
|
free(stream);
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
|
#define BUFSIZ 1024
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
#ifndef EOF
|
#ifndef EOF
|
||||||
#define EOF (-1)
|
#define EOF (-1)
|
||||||
|
@ -28,6 +30,8 @@ struct __STDIO_FILE {
|
||||||
char* buffer;
|
char* buffer;
|
||||||
size_t buffer_size;
|
size_t buffer_size;
|
||||||
size_t buffer_index;
|
size_t buffer_index;
|
||||||
|
bool have_ungotten;
|
||||||
|
char ungotten;
|
||||||
char default_buffer[BUFSIZ];
|
char default_buffer[BUFSIZ];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue