diff options
author | pommicket <pommicket@gmail.com> | 2022-02-18 12:36:57 -0500 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2022-02-18 12:36:57 -0500 |
commit | 826d1afd58c2e064a9c8fdb09eda1b08469de1a8 (patch) | |
tree | b4fedc589a1944f6cf3f451a9db976b431e89b25 /05/tcc-0.9.25/stdlib.h | |
parent | c42c5d94b8944e19cd17a5b540e4c70013c62b92 (diff) |
newer version of tcc almost working
Diffstat (limited to '05/tcc-0.9.25/stdlib.h')
-rw-r--r-- | 05/tcc-0.9.25/stdlib.h | 193 |
1 files changed, 0 insertions, 193 deletions
diff --git a/05/tcc-0.9.25/stdlib.h b/05/tcc-0.9.25/stdlib.h deleted file mode 100644 index c2f83eb..0000000 --- a/05/tcc-0.9.25/stdlib.h +++ /dev/null @@ -1,193 +0,0 @@ -#ifndef _STDLIB_H -#define _STDLIB_H - -#include <stdc_common.h> - -#define EXIT_FAILURE (-1) -#define EXIT_SUCCESS 0 -#define RAND_MAX 2147483647 -// @NONSTANDARD: we don't define MB_CUR_MAX or any of the mbtowc functions - -typedef struct { - int quot; - int rem; -} div_t; - -typedef struct { - long quot; - long rem; -} ldiv_t; - -char *getenv(const char *name) { - int i, j; - for (i = 0; _envp[i]; ++i) { - char *key = _envp[i]; - for (j = 0; key[j] != '=' && name[j]; ++j) - if (name[j] != key[j]) - break; - if (key[j] == '=' && !name[j]) - return key + (j+1); - } - return NULL; -} - -double atof(const char *nptr) { - return strtod(nptr, NULL); -} - -int atoi(const char *nptr) { - return _clamp_long_to_int(strtol(nptr, NULL, 10)); -} - -long atol(const char *nptr) { - return strtol(nptr, NULL, 10); -} - -int rand(void) { - // https://en.wikipedia.org/wiki/Linear_congruential_generator - // we're using musl/newlib's constants - _rand_seed = 6364136223846793005 * _rand_seed + 1; - return _rand_seed >> 33; -} - -void srand(unsigned seed) { - _rand_seed = seed; -} - -void *calloc(size_t nmemb, size_t size) { - if (nmemb > 0xffffffffffffffff / size) - return NULL; - // NB: our malloc implementation returns zeroed memory - return malloc(nmemb * size); -} - -void *realloc(void *ptr, size_t size) { - if (!ptr) return malloc(size); - if (!size) { - free(ptr); - return NULL; - } - uint64_t *memory = (char *)ptr - 16; - uint64_t old_size = *memory; - uint64_t *new_memory = _mremap(memory, old_size, size, MREMAP_MAYMOVE); - if ((uint64_t)new_memory > 0xffffffffffff0000) return NULL; - *new_memory = size; - return (char *)new_memory + 16; -} - - -int atexit(void (*func)(void)) { - if (_n_exit_handlers >= 32) return -1; - _exit_handlers[_n_exit_handlers++] = func; - return 0; -} - -int system(const char *string) { - if (!string) return 1; - - int pid = fork(); - if (pid < 0) { - return -1; - } else if (pid == 0) { - // child - char *argv[] = { - "/bin/sh", - "-c", - 0, - 0 - }; - argv[2] = string; - execve("/bin/sh", argv, _envp); - // on success, execve does not return. - _Exit(-1); - } else { - // parent - int status = 0; - int ret = wait4(pid, &status, 0, NULL); - if (ret != pid) return -1; - if (_WIFSIGNALED(status)) return -1; - return _WEXITSTATUS(status); - } - -} - -void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { - size_t lo = 0; - size_t hi = nmemb; - while (lo < hi) { - size_t mid = (lo + hi) >> 1; - void *elem = (char *)base + mid * size; - int cmp = compar(key, elem); - if (cmp < 0) { - // key < elem - hi = mid; - } else if (cmp) { - // key > elem - lo = mid + 1; - } else { - return elem; - } - } - return NULL; -} - -void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { - // quicksort - if (nmemb < 2) return; - - void *temp = malloc(size); - void *mid = (char *)base + ((nmemb >> 1) * size); // choose middle element to speed up sorting an already-sorted array - size_t pivot_index = 0, i; - for (i = 0; i < nmemb; ++i) { - void *elem = (char *)base + i * size; - if (compar(elem, mid) < 0) - ++pivot_index; - } - void *pivot = (char *)base + pivot_index * size; - memcpy(temp, pivot, size); - memcpy(pivot, mid, size); - memcpy(mid, temp, size); - - char *l, *r = (char *)base + (nmemb-1) * size; - for (l = base; l < r;) { - if (compar(l, pivot) > 0) { - // swap l and r - memcpy(temp, l, size); - memcpy(l, r, size); - memcpy(r, temp, size); - r -= size; - } else { - // l is already in the right place - l += size; - } - } - - qsort(base, pivot_index, size, compar); - qsort((char *)pivot + size, nmemb - 1 - pivot_index, size, compar); - - free(temp); -} - -int abs(int x) { - return x >= 0 ? x : -x; -} - -long labs(long x) { - return x >= 0 ? x : -x; -} - -div_t div(int numer, int denom) { - div_t d; - d.quot = numer / denom; - d.rem = numer % denom; - return d; -} - -ldiv_t ldiv(long numer, long denom) { - ldiv_t d; - d.quot = numer / denom; - d.rem = numer % denom; - return d; -} - -#endif // _STDLIB_H |