#ifdef _COSMO_SOURCE
#ifndef COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_
#define COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_

#define klog         __klog
#define kprintf      __kprintf
#define ksnprintf    __ksnprintf
#define kvprintf     __kvprintf
#define kvsnprintf   __kvsnprintf
#define kloghandle   __kloghandle
#define kisdangerous __kisdangerous
#define uprintf      __uprintf
#define uvprintf     __uvprintf

#if !(__ASSEMBLER__ + __LINKER__ + 0)

COSMOPOLITAN_C_START_

void kprintf(const char *, ...) libcesque;
size_t ksnprintf(char *, size_t, const char *, ...) libcesque;
void kvprintf(const char *, va_list) libcesque;
size_t kvsnprintf(char *, size_t, const char *, va_list) libcesque;

bool32 kisdangerous(const void *) libcesque;

void klog(const char *, size_t) libcesque;
void _klog_serial(const char *, size_t) libcesque;
long kloghandle(void) libcesque;

void uprintf(const char *, ...) libcesque;
void uvprintf(const char *, va_list) libcesque;

#ifndef TINY
#define KINFOF(FMT, ...)                                         \
  do {                                                           \
    uprintf("\r\e[35m%s:%d: " FMT "\e[0m\n", __FILE__, __LINE__, \
            ##__VA_ARGS__);                                      \
  } while (0)
#define KWARNF(FMT, ...)                                                  \
  do {                                                                    \
    uprintf("\r\e[94;49mwarn: %s:%d: " FMT "\e[0m\n", __FILE__, __LINE__, \
            ##__VA_ARGS__);                                               \
  } while (0)
#else
#define KINFOF(FMT, ...) ((void)0)
#define KWARNF(FMT, ...) ((void)0)
#endif
#define KDIEF(FMT, ...)                                                     \
  do {                                                                      \
    kprintf("\r\e[30;101mfatal: %s:%d: " FMT "\e[0m\n", __FILE__, __LINE__, \
            ##__VA_ARGS__);                                                 \
    for (;;)                                                                \
      asm volatile("cli\n\thlt");                                           \
  } while (0)

COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_INTRIN_KPRINTF_H_ */
#endif /* _COSMO_SOURCE */