/* * wnix, a Unix-like operating system for WebAssembly applications. * Copyright (C) 2025 Xavier Del Campo Romero * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #ifndef _STDLIB_H #define _STDLIB_H #include #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 #define abort() __abort(__FILE__, __LINE__) typedef struct { int quot, rem; } div_t; int abs(int __v); long labs(long __v); long long llabs(long long __v); void *__malloc(size_t __n); void *__calloc(size_t __nemb, size_t __size); void *__realloc(void *__ptr, size_t __size); void __free(void *__p); long strtol(const char *__s, char **__end, int __base); long long strtoll(const char *__s, char **__end, int __base); unsigned long strtoul(const char *__s, char **__end, int __base); unsigned long long strtoull(const char *__s, char **__end, int __base); void __abort(const char *__file, int __lineno); div_t div(int __numerator, int __denominator); #if 1 #define malloc(__n) __malloc(__n) #define calloc(__n, __sz) __calloc(__n, __sz) #define realloc(__p, __n) __realloc(__p, __n) #define free(__p) __free(__p) #else #define RED "\x1b[31m" #define GREEN "\x1b[32m" #define YELLOW "\x1b[33m" #define RESET "\x1b[0m" #define malloc(__n) ({void *__p; \ int Printf(const char *, ...); \ Printf(GREEN "-> %s:%d (%s)", __FILE__, __LINE__, __func__); \ __p = __malloc(__n); \ Printf(", p=%p" RESET "\n", __p); \ size_t ta_num_free(); \ size_t ta_num_used(); \ size_t ta_num_fresh(); \ Printf("%s: free=%lu, used=%lu, fresh=%lu\n", __func__, \ (unsigned long)ta_num_free(), \ (unsigned long)ta_num_used(), \ (unsigned long)ta_num_fresh()); \ __p;}) #define realloc(__p, __n) ({void *__np; \ int Printf(const char *, ...); \ size_t ta_num_free(); \ size_t ta_num_used(); \ size_t ta_num_fresh(); \ Printf(YELLOW "-> %s:%d (%s)", __FILE__, __LINE__, __func__); \ __np = __realloc(__p, __n); \ Printf(", np=%p" RESET "\n", __np); \ Printf("%s: free=%lu, used=%lu, fresh=%lu\n", __func__, \ (unsigned long)ta_num_free(), \ (unsigned long)ta_num_used(), \ (unsigned long)ta_num_fresh()); \ __np;}) #define calloc(__n, __sz) ({void *__p; \ int Printf(const char *, ...); \ size_t ta_num_free(); \ size_t ta_num_used(); \ size_t ta_num_fresh(); \ Printf(YELLOW "-> %s:%d (%s)", __FILE__, __LINE__, __func__); \ __p = __calloc(__n, __sz); \ Printf(", p=%p" RESET "\n", __p); \ Printf("%s: free=%lu, used=%lu, fresh=%lu\n", __func__, \ (unsigned long)ta_num_free(), \ (unsigned long)ta_num_used(), \ (unsigned long)ta_num_fresh()); \ __p;}) #define free(__p) ({ \ int Printf(const char *, ...); \ size_t ta_num_free(); \ size_t ta_num_used(); \ size_t ta_num_fresh(); \ Printf(RED "<- %s:%d (%s), p=%p" RESET "\n", \ __FILE__, __LINE__, __func__, __p); \ __free(__p);\ Printf("%s: free=%lu, used=%lu, fresh=%lu\n", \ __func__, \ (unsigned long)ta_num_free(), \ (unsigned long)ta_num_used(), \ (unsigned long)ta_num_fresh()); \ }) #endif #endif