#if 0
/*─────────────────────────────────────────────────────────────────╗
│ To the extent possible under law, Justine Tunney has waived      │
│ all copyright and related or neighboring rights to this file,    │
│ as it is written in the following disclaimers:                   │
│   • http://unlicense.org/                                        │
│   • http://creativecommons.org/publicdomain/zero/1.0/            │
╚─────────────────────────────────────────────────────────────────*/
#endif
#include "libc/bits/bits.h"
#include "libc/calls/calls.h"
#include "libc/calls/struct/itimerval.h"
#include "libc/conv/conv.h"
#include "libc/limits.h"
#include "libc/log/check.h"
#include "libc/log/log.h"
#include "libc/math.h"
#include "libc/runtime/runtime.h"
#include "libc/stdio/stdio.h"
#include "libc/sysv/consts/itimer.h"
#include "libc/sysv/consts/sig.h"
#include "libc/time/time.h"

static const struct itimerval kTimer = {{0, 10000}, {0, 10000}}; /* 10ms */
static volatile bool32 showprogress_;
static const char *magic_;

void OnInterrupt(int sig) {
  showprogress_ = true;
}
void ShowProgress(uintmax_t i, uintmax_t j, uintmax_t n) {
  fprintf(stderr, "%s%,40jd%,40jd%,40jd\r\n", magic_, i, j, n);
  showprogress_ = false;
}

static bool IsPrime(uintmax_t i) {
  uintmax_t j, n;
  for (j = 3, n = (unsigned long)floorl(sqrtl(i)); j <= n; j += 2) {
    if (showprogress_) ShowProgress(i, j, n);
    if (i % j == 0) return false;
  }
  return true;
}

static void TryNumber(uintmax_t x, uintmax_t i) {
  if (IsPrime(i)) {
    printf("%s%,jd%s%,jd\n", "the prime nearest ", x, " is ", i);
    exit(0);
  }
}

int main(int argc, char **argv) {
  uintmax_t x, i, j;
  CHECK_EQ(2, argc);
  signal(SIGALRM, OnInterrupt);
  setitimer(ITIMER_REAL, &kTimer, NULL);
  magic_ = cancolor() ? "\e[F\e[K" : "";
  if ((x = strtoumax(argv[1], NULL, 0)) % 2 == 0) ++x;
  TryNumber(x, x);
  for (i = x, j = x;;) {
    if (i < UINTMAX_MAX) TryNumber(x, i), i += 2;
    if (j > 1) TryNumber(x, j), j -= 2;
  }
}