diff options
Diffstat (limited to '05/stdc_common.h')
-rw-r--r-- | 05/stdc_common.h | 65 |
1 files changed, 58 insertions, 7 deletions
diff --git a/05/stdc_common.h b/05/stdc_common.h index 10144a8..a3a8e7f 100644 --- a/05/stdc_common.h +++ b/05/stdc_common.h @@ -108,6 +108,23 @@ int getpid(void) { return __syscall(39, 0, 0, 0, 0, 0, 0); } +int fork(void) { + return __syscall(57, 0, 0, 0, 0, 0, 0); +} + +int execve(const char *pathname, char *const argv[], char *const envp[]) { + return __syscall(59, pathname, argv, envp, 0, 0, 0); +} + + +#define _WEXITSTATUS(status) (((status) & 0xff00) >> 8) +#define _WIFEXITED(status) (__WTERMSIG(status) == 0) +#define _WIFSIGNALED(status) \ + (((signed char) (((status) & 0x7f) + 1) >> 1) > 0) +int wait4(int pid, int *status, int options, struct rusage *rusage) { + return __syscall(61, pid, status, options, rusage, 0, 0); +} + #define SIGABRT 6 #define SIGFPE 8 #define SIGKILL 9 @@ -184,7 +201,13 @@ int munmap(void *addr, size_t length) { return __syscall(11, addr, length, 0, 0, 0, 0); } +#define MREMAP_MAYMOVE 1 +void *_mremap(void *addr, size_t old_size, size_t new_size, int flags) { + return __syscall(25, addr, old_size, new_size, flags, 0, 0); +} + void *malloc(size_t n) { + if (!n) return NULL; void *memory; size_t bytes = n + 16; memory = mmap(0, bytes, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); @@ -194,17 +217,12 @@ void *malloc(size_t n) { } void free(void *ptr) { + if (!ptr) return; 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; @@ -212,6 +230,13 @@ size_t strlen(char *s) { return t - s; } +void *memcpy(void *s1, const void *s2, size_t n) { + char *p = s1, *end = p + n, *q = s2; + while (p < end) + *p++ = *q++; + return s1; +} + int isspace(int c) { return c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v'; } @@ -430,10 +455,30 @@ double strtod(const char *nptr, char **endptr) { return sum * sign; } +char *strerror(int errnum) { + switch (errnum) { + case ERANGE: return "Range error"; + case EDOM: return "Domain error"; + case EIO: return "I/O error"; + } + return "Other error"; +} + +typedef void (*_ExitHandler)(void); +_ExitHandler _exit_handlers[33]; +int _n_exit_handlers; + +void exit(int status) { + int i; + for (i = _n_exit_handlers - 1; i >= 0; --i) + _exit_handlers[i](); + _Exit(status); +} int main(); static char **_envp; +static uint64_t _rand_seed; int _main(int argc, char **argv) { int i; @@ -445,6 +490,12 @@ int _main(int argc, char **argv) { stdout = &_stdout; stderr = &_stderr; + /* + "If rand is called before any calls to srand have been made, + the same sequence shall be generated as when srand is first + called with a seed value of 1." C89 ยง 4.10.2.2 + */ + _rand_seed = 1; // initialize powers of 10 _powers_of_10 = _powers_of_10_dat + _NPOW10; for (i = 0; i < _NPOW10; ++i) { @@ -464,7 +515,7 @@ int _main(int argc, char **argv) { p.exponent -= 1; } - return main(argc, argv); + exit(main(argc, argv)); } |