#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#define MALLOC_MAX_ALIGN 64
static void* aligned_alloc_impl(size_t alignment, size_t size) {
if (alignment <= MALLOC_MAX_ALIGN)
return malloc(size); size_t total = size + alignment + sizeof(void*);
void* base = malloc(total);
if (!base)
return NULL;
uintptr_t raw = (uintptr_t)base + sizeof(void*);
uintptr_t aligned = (raw + (alignment - 1)) & ~(uintptr_t)(alignment - 1);
((void**)aligned)[-1] = base; return (void*)aligned;
}
void* aligned_alloc(size_t alignment, size_t size) { return aligned_alloc_impl(alignment, size); }
int posix_memalign(void** out, size_t alignment, size_t size) {
void* p = aligned_alloc_impl(alignment, size);
if (!p)
return 12; *out = p;
return 0;
}
void aligned_free(void* ptr) {
if (ptr)
free(((void**)ptr)[-1]);
}
typedef struct _GapFile GapFile;
GapFile* stderr;
GapFile* stdout;
int vfprintf(GapFile* stream, const char* format, va_list ap) {
(void)stream;
(void)format;
(void)ap;
return 0;
}
int fprintf(GapFile* stream, const char* format, ...) {
(void)stream;
(void)format;
return 0;
}
int fputc(int c, GapFile* stream) {
(void)stream;
return c;
}
int fputs(const char* s, GapFile* stream) {
(void)s;
(void)stream;
return 0;
}
int fflush(GapFile* stream) {
(void)stream;
return 0;
}
int puts(const char* s) {
(void)s;
return 0;
}
typedef struct {
long _dummy;
} gap_pthread_t;
int pthread_mutex_init(void* m, const void* attr) {
(void)m;
(void)attr;
return 0;
}
int pthread_mutex_destroy(void* m) {
(void)m;
return 0;
}
int pthread_mutex_lock(void* m) {
(void)m;
return 0;
}
int pthread_mutex_trylock(void* m) {
(void)m;
return 0;
}
int pthread_mutex_unlock(void* m) {
(void)m;
return 0;
}
int pthread_cond_init(void* c, const void* attr) {
(void)c;
(void)attr;
return 0;
}
int pthread_cond_destroy(void* c) {
(void)c;
return 0;
}
int pthread_cond_signal(void* c) {
(void)c;
return 0;
}
int pthread_cond_broadcast(void* c) {
(void)c;
return 0;
}
int pthread_cond_wait(void* c, void* m) {
(void)c;
(void)m;
return 0;
}
int pthread_cond_timedwait(void* c, void* m, const void* ts) {
(void)c;
(void)m;
(void)ts;
return 0;
}
int pthread_create(void* thread, const void* attr, void* (*start)(void*), void* arg) {
(void)thread;
(void)attr;
(void)start;
(void)arg;
return 1; }
int pthread_join(gap_pthread_t thread, void** retval) {
(void)thread;
(void)retval;
return 0;
}
int pthread_detach(gap_pthread_t thread) {
(void)thread;
return 0;
}
gap_pthread_t pthread_self(void) {
gap_pthread_t t = { 0 };
return t;
}
int pthread_equal(gap_pthread_t a, gap_pthread_t b) {
(void)a;
(void)b;
return 1;
}
struct gap_timeval {
long tv_sec;
long tv_usec;
};
int gettimeofday(struct gap_timeval* tv, void* tz) {
(void)tz;
if (tv) {
tv->tv_sec = 0;
tv->tv_usec = 0;
}
return 0;
}
struct gap_timespec {
long tv_sec;
long tv_nsec;
};
int clock_gettime(int clk, struct gap_timespec* ts) {
(void)clk;
if (ts) {
ts->tv_sec = 0;
ts->tv_nsec = 0;
}
return 0;
}
int nanosleep(const struct gap_timespec* req, struct gap_timespec* rem) {
(void)req;
(void)rem;
return 0; }
double modf(double x, double* iptr) {
double i = __builtin_trunc(x);
*iptr = i;
return x - i;
}
int tolower(int c) { return (c >= 'A' && c <= 'Z') ? c + ('a' - 'A') : c; }
int toupper(int c) { return (c >= 'a' && c <= 'z') ? c - ('a' - 'A') : c; }
double strtod(const char* s, char** end) {
const char* p = s;
while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || *p == '\f' || *p == '\v')
++p;
int sign = 1;
if (*p == '+' || *p == '-') {
if (*p == '-')
sign = -1;
++p;
}
double value = 0.0;
int any = 0;
while (*p >= '0' && *p <= '9') {
value = value * 10.0 + (*p - '0');
++p;
any = 1;
}
if (*p == '.') {
++p;
double scale = 0.1;
while (*p >= '0' && *p <= '9') {
value += (*p - '0') * scale;
scale *= 0.1;
++p;
any = 1;
}
}
if (any && (*p == 'e' || *p == 'E')) {
const char* e = p + 1;
int esign = 1;
if (*e == '+' || *e == '-') {
if (*e == '-')
esign = -1;
++e;
}
if (*e >= '0' && *e <= '9') {
int exp = 0;
while (*e >= '0' && *e <= '9') {
exp = exp * 10 + (*e - '0');
++e;
}
p = e;
double factor = 1.0;
for (int i = 0; i < exp; ++i)
factor *= 10.0;
value = (esign < 0) ? value / factor : value * factor;
}
}
if (end)
*end = (char*)(any ? p : s);
return sign * value;
}
float strtof(const char* s, char** end) { return (float)strtod(s, end); }
long double strtold(const char* s, char** end) { return (long double)strtod(s, end); }
static char gap_unknown_error[] = "unknown error";
char* strerror(int errnum) {
(void)errnum;
return gap_unknown_error;
}
int strerror_r(int errnum, char* buf, size_t buflen) {
(void)errnum;
if (buf && buflen) {
size_t i = 0;
for (; gap_unknown_error[i] && i + 1 < buflen; ++i)
buf[i] = gap_unknown_error[i];
buf[i] = 0;
}
return 0;
}
GapFile* stdin;
int printf(const char* fmt, ...) {
(void)fmt;
return 0;
}
int vprintf(const char* fmt, va_list ap) {
(void)fmt;
(void)ap;
return 0;
}
int sprintf(char* s, const char* fmt, ...) {
if (s)
s[0] = 0;
(void)fmt;
return 0;
}
int sscanf(const char* s, const char* fmt, ...) {
(void)s;
(void)fmt;
return 0;
}
int vsscanf(const char* s, const char* fmt, va_list ap) {
(void)s;
(void)fmt;
(void)ap;
return 0;
}
int vasprintf(char** out, const char* fmt, va_list ap) {
(void)fmt;
(void)ap;
if (out)
*out = NULL;
return -1;
}
size_t fwrite(const void* ptr, size_t size, size_t nmemb, GapFile* stream) {
(void)ptr;
(void)stream;
(void)size;
return nmemb;
}
int getc(GapFile* stream) {
(void)stream;
return -1; }
int ungetc(int c, GapFile* stream) {
(void)stream;
return c;
}
size_t __ctype_get_mb_cur_max(void) { return 1; }
typedef int gap_wchar_t;
size_t wcslen(const gap_wchar_t* s) {
size_t n = 0;
if (s)
while (s[n])
++n;
return n;
}
gap_wchar_t* wmemchr(const gap_wchar_t* s, gap_wchar_t c, size_t n) {
if (s)
for (size_t i = 0; i < n; ++i)
if (s[i] == c)
return (gap_wchar_t*)(s + i);
return NULL;
}
int mbtowc(gap_wchar_t* pwc, const char* s, size_t n) {
if (!s)
return 0;
if (n == 0)
return -1;
if (pwc)
*pwc = (unsigned char)*s;
return *s ? 1 : 0;
}
size_t mbrtowc(gap_wchar_t* pwc, const char* s, size_t n, void* ps) {
(void)ps;
if (!s)
return 0;
if (n == 0)
return (size_t)-2;
if (pwc)
*pwc = (unsigned char)*s;
return *s ? 1 : 0;
}
size_t wcrtomb(char* s, gap_wchar_t wc, void* ps) {
(void)ps;
if (s)
*s = (char)wc;
return 1;
}
size_t mbrlen(const char* s, size_t n, void* ps) {
return mbrtowc(NULL, s, n, ps);
}
size_t mbsrtowcs(gap_wchar_t* dst, const char** src, size_t len, void* ps) {
(void)ps;
if (!src || !*src)
return 0;
const char* s = *src;
size_t i = 0;
for (; (dst ? i < len : 1) && s[i]; ++i)
if (dst)
dst[i] = (unsigned char)s[i];
if (dst) {
if (i < len)
dst[i] = 0;
*src = s[i] ? s + i : NULL;
}
return i;
}
size_t mbsnrtowcs(gap_wchar_t* dst, const char** src, size_t nms, size_t len, void* ps) {
(void)nms;
return mbsrtowcs(dst, src, len, ps);
}
size_t wcsnrtombs(char* dst, const gap_wchar_t** src, size_t nwc, size_t len, void* ps) {
(void)ps;
if (!src || !*src)
return 0;
const gap_wchar_t* s = *src;
size_t i = 0;
for (; (dst ? i < len : 1) && i < nwc && s[i]; ++i)
if (dst)
dst[i] = (char)s[i];
if (dst)
*src = s[i] ? s + i : NULL;
return i;
}
int fputwc(gap_wchar_t c, GapFile* stream) {
(void)stream;
return c;
}
gap_wchar_t getwc(GapFile* stream) {
(void)stream;
return -1;
}
gap_wchar_t ungetwc(gap_wchar_t c, GapFile* stream) {
(void)stream;
return c;
}
typedef void* gap_locale_t;
static int gap_locale_obj;
gap_locale_t newlocale(int mask, const char* name, gap_locale_t base) {
(void)mask;
(void)name;
(void)base;
return &gap_locale_obj;
}
void freelocale(gap_locale_t loc) { (void)loc; }
gap_locale_t uselocale(gap_locale_t loc) {
(void)loc;
return &gap_locale_obj;
}
int isdigit_l(int c, gap_locale_t loc) {
(void)loc;
return c >= '0' && c <= '9';
}
int isxdigit_l(int c, gap_locale_t loc) {
(void)loc;
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
}
double strtod_l(const char* s, char** end, gap_locale_t loc) {
(void)loc;
return strtod(s, end);
}
float strtof_l(const char* s, char** end, gap_locale_t loc) {
(void)loc;
return strtof(s, end);
}
long double strtold_l(const char* s, char** end, gap_locale_t loc) {
(void)loc;
return strtold(s, end);
}
size_t strftime_l(char* s, size_t max, const char* fmt, const void* tm, gap_locale_t loc) {
(void)max;
(void)fmt;
(void)tm;
(void)loc;
if (s && max)
s[0] = 0;
return 0;
}
int __cxa_atexit(void (*func)(void*), void* arg, void* dso) {
(void)func;
(void)arg;
(void)dso;
return 0;
}
int dlclose(void* handle) {
(void)handle;
return 0;
}
void* dlsym(void* handle, const char* sym) {
(void)handle;
(void)sym;
return NULL;
}
int mlockall(int flags) {
(void)flags;
return -1;
}
void* mmap(void* addr, size_t len, int prot, int flags, int fd, long off) {
(void)addr;
(void)len;
(void)prot;
(void)flags;
(void)fd;
(void)off;
return (void*)-1; }
int munmap(void* addr, size_t len) {
(void)addr;
(void)len;
return 0;
}
int shm_open(const char* name, int oflag, unsigned mode) {
(void)name;
(void)oflag;
(void)mode;
return -1;
}
int shm_unlink(const char* name) {
(void)name;
return -1;
}
void* shmat(int id, const void* addr, int flag) {
(void)id;
(void)addr;
(void)flag;
return (void*)-1;
}
int shmdt(const void* addr) {
(void)addr;
return -1;
}
int shmctl(int id, int cmd, void* buf) {
(void)id;
(void)cmd;
(void)buf;
return -1;
}
int getrlimit(int resource, void* rlim) {
(void)resource;
(void)rlim;
return -1;
}
long sysconf(int name) {
(void)name;
return -1;
}
int close(int fd) {
(void)fd;
return 0;
}
int fstat(int fd, void* st) {
(void)fd;
(void)st;
return -1;
}
int stat(const char* path, void* st) {
(void)path;
(void)st;
return -1;
}
int fchmod(int fd, unsigned mode) {
(void)fd;
(void)mode;
return -1;
}
int ftruncate(int fd, long length) {
(void)fd;
(void)length;
return -1;
}
int sem_init(void* sem, int pshared, unsigned value) {
(void)sem;
(void)pshared;
(void)value;
return 0;
}
int sem_destroy(void* sem) {
(void)sem;
return 0;
}
int sem_post(void* sem) {
(void)sem;
return 0;
}
int pthread_key_create(unsigned* key, void (*destructor)(void*)) {
(void)destructor;
if (key)
*key = 0;
return 0;
}
int pthread_setspecific(unsigned key, const void* value) {
(void)key;
(void)value;
return 0;
}
int pthread_mutexattr_init(void* attr) {
(void)attr;
return 0;
}
int pthread_mutexattr_destroy(void* attr) {
(void)attr;
return 0;
}
int pthread_mutexattr_settype(void* attr, int type) {
(void)attr;
(void)type;
return 0;
}
int pthread_mutexattr_setpshared(void* attr, int pshared) {
(void)attr;
(void)pshared;
return 0;
}
int pthread_setschedparam(gap_pthread_t thread, int policy, const void* param) {
(void)thread;
(void)policy;
(void)param;
return 0;
}
int sched_yield(void) { return 0; }
int sched_get_priority_max(int policy) {
(void)policy;
return 0;
}
int sched_get_priority_min(int policy) {
(void)policy;
return 0;
}