almost all of stdio.h

This commit is contained in:
pommicket 2022-02-14 16:52:33 -05:00
parent d0d868433e
commit c15db88951
7 changed files with 403 additions and 62 deletions

View file

@ -59,15 +59,107 @@ static unsigned char __syscall_data[] = {
(((unsigned long (*)(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long))__syscall_data)\
(no, arg1, arg2, arg3, arg4, arg5, arg6))
long read(int fd, void *buf, size_t count) {
return __syscall(0, fd, buf, count, 0, 0, 0);
}
long write(int fd, void *buf, size_t count) {
__syscall(1, fd, buf, count, 0, 0, 0);
return __syscall(1, fd, buf, count, 0, 0, 0);
}
void _Exit(int status) {
return __syscall(60, status, 0, 0, 0, 0, 0);
}
typedef long time_t;
struct timespec {
time_t tv_sec;
long tv_nsec;
};
#define CLOCK_REALTIME 0
#define CLOCK_MONOTONIC 1
int clock_gettime(int clock, struct timespec *tp) {
return __syscall(228, clock, tp, 0, 0, 0, 0);
}
#define F_OK 0
#define R_OK 4
#define W_OK 2
#define X_OK 1
int access(const char *pathname, int mode) {
return __syscall(21, pathname, mode, 0, 0, 0, 0);
}
int errno;
#define EIO 5
#define EDOM 33
#define ERANGE 34
#define PROT_READ 1
#define PROT_WRITE 2
#define PROT_EXEC 4
#define MAP_SHARED 0x01
#define MAP_ANONYMOUS 0x20
#define MAP_PRIVATE 0x02
void *mmap(void *addr, size_t length, int prot, int flags, int fd, long offset) {
return __syscall(9, addr, length, prot, flags, fd, offset);
}
int munmap(void *addr, size_t length) {
return __syscall(11, addr, length, 0, 0, 0, 0);
}
void *malloc(size_t n) {
void *memory;
size_t bytes = n + 16;
memory = mmap(0, bytes, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
if ((uint64_t)memory > 0xffffffffffff0000) return NULL;
*(uint64_t *)memory = bytes;
return (char *)memory + 16;
}
void free(void *ptr) {
uint64_t *memory = (char *)ptr - 16;
uint64_t size = *memory;
munmap(memory, size);
}
void *calloc(size_t nmemb, size_t size) {
if (nmemb > 0xffffffffffffffff / size)
return NULL;
return malloc(nmemb * size);
}
size_t strlen(char *s) {
char *t = s;
while (*t) ++t;
return t - s;
}
typedef struct {
int fd;
unsigned char eof;
unsigned char err;
} FILE;
FILE _stdin = {0}, *stdin;
FILE _stdout = {1}, *stdout;
FILE _stderr = {2}, *stderr;
int main();
int _main(int argc, char **argv) {
stdin = &_stdin;
stdout = &_stdout;
stderr = &_stderr;
return main(argc, argv);
}
#endif // _STDC_COMMON_H