// Copyright 2020 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// ----------------

// process-json-numbers.c processes all the numbers in the JSON-formatted data
// read from stdin. It succeeds (with exit code 0) if the input is valid JSON
// and all of the numbers within were processed without error.
//
// Without further flags, processing is a no-op and the program only verifies
// the JSON structure.
//
// Pass -e (--emit-number-str) to emit each number (as a string) on its own
// line.
//
// Pass -p (--parse-number-f64) to call wuffs_base__parse_number_f64 on each
// number. Timing this program with and without this flag gives a rough measure
// of how much time is spent solely in wuffs_base__parse_number_f64.
//
// Pass -r (--render-number-f64) to call wuffs_base__render_number_f64 (with
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) on each number. Timing
// this program with and without this flag gives a rough measure of how much
// time is spent solely in wuffs_base__render_number_f64.
//
// The -r flag is ignored unless -p is also passed.
//
// This program's purpose is to benchmark the wuffs_base__etc_f64 functions.
// It's not about JSON per se, but JSON files are a source of realistic
// floating point numbers.

#include <inttypes.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

// Wuffs ships as a "single file C library" or "header file library" as per
// https://github.com/nothings/stb/blob/master/docs/stb_howto.txt
//
// To use that single file as a "foo.c"-like implementation, instead of a
// "foo.h"-like header, #define WUFFS_IMPLEMENTATION before #include'ing or
// compiling it.
#define WUFFS_IMPLEMENTATION

// Defining the WUFFS_CONFIG__MODULE* macros are optional, but it lets users of
// release/c/etc.c whitelist which parts of Wuffs to build. That file contains
// the entire Wuffs standard library, implementing a variety of codecs and file
// formats. Without this macro definition, an optimizing compiler or linker may
// very well discard Wuffs code for unused codecs, but listing the Wuffs
// modules we use makes that process explicit. Preprocessing means that such
// code simply isn't compiled.
#define WUFFS_CONFIG__MODULES
#define WUFFS_CONFIG__MODULE__BASE
#define WUFFS_CONFIG__MODULE__JSON

// If building this program in an environment that doesn't easily accommodate
// relative includes, you can use the script/inline-c-relative-includes.go
// program to generate a stand-alone C++ file.
#include "../release/c/wuffs-unsupported-snapshot.c"

// Uncomment this to use the github.com/lemire/fast_double_parser library. This
// header-only library is C++, not C.
// #define USE_FAST_DOUBLE_PARSER

#ifdef USE_FAST_DOUBLE_PARSER
#include "/the/path/to/fast_double_parser/include/fast_double_parser.h"
#endif

// Wuffs allows either statically or dynamically allocated work buffers. This
// program exercises static allocation.
#define WORK_BUFFER_ARRAY_SIZE \
  WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE
#if WORK_BUFFER_ARRAY_SIZE > 0
uint8_t g_work_buffer_array[WORK_BUFFER_ARRAY_SIZE];
#else
// Not all C/C++ compilers support 0-length arrays.
uint8_t g_work_buffer_array[1];
#endif

#ifndef SRC_BUFFER_ARRAY_SIZE
#define SRC_BUFFER_ARRAY_SIZE (64 * 1024 * 1024)
#endif
#ifndef TOKEN_BUFFER_ARRAY_SIZE
#define TOKEN_BUFFER_ARRAY_SIZE (128 * 1024)
#endif

uint8_t g_src_buffer_array[SRC_BUFFER_ARRAY_SIZE];
wuffs_base__token g_tok_buffer_array[TOKEN_BUFFER_ARRAY_SIZE];

wuffs_base__io_buffer g_src;
wuffs_base__token_buffer g_tok;

wuffs_json__decoder g_dec;

#define TRY(error_msg)         \
  do {                         \
    const char* z = error_msg; \
    if (z) {                   \
      return z;                \
    }                          \
  } while (false)

// ignore_return_value suppresses errors from -Wall -Werror.
static void  //
ignore_return_value(int ignored) {}

const char*  //
read_src() {
  if (g_src.meta.closed) {
    return "main: internal error: read requested on a closed source";
  }
  wuffs_base__io_buffer__compact(&g_src);
  if (g_src.meta.wi >= g_src.data.len) {
    return "main: g_src buffer is full";
  }
  size_t n = fread(g_src.data.ptr + g_src.meta.wi, sizeof(uint8_t),
                   g_src.data.len - g_src.meta.wi, stdin);
  g_src.meta.wi += n;
  g_src.meta.closed = feof(stdin);
  if ((n == 0) && !g_src.meta.closed) {
    return "main: read error";
  }
  return NULL;
}

// ----

struct {
  int remaining_argc;
  char** remaining_argv;

  bool emit_number_str;
  bool parse_number_f64;
  bool render_number_f64;
} g_flags = {0};

const char*  //
parse_flags(int argc, char** argv) {
  int c = (argc > 0) ? 1 : 0;  // Skip argv[0], the program name.
  for (; c < argc; c++) {
    char* arg = argv[c];
    if (*arg++ != '-') {
      break;
    }

    // A double-dash "--foo" is equivalent to a single-dash "-foo". As special
    // cases, a bare "-" is not a flag (some programs may interpret it as
    // stdin) and a bare "--" means to stop parsing flags.
    if (*arg == '\x00') {
      break;
    } else if (*arg == '-') {
      arg++;
      if (*arg == '\x00') {
        c++;
        break;
      }
    }

    if (!strcmp(arg, "e") || !strcmp(arg, "emit-number-str")) {
      g_flags.emit_number_str = true;
      continue;
    }
    if (!strcmp(arg, "p") || !strcmp(arg, "parse-number-f64")) {
      g_flags.parse_number_f64 = true;
      continue;
    }
    if (!strcmp(arg, "r") || !strcmp(arg, "render-number-f64")) {
      g_flags.render_number_f64 = true;
      continue;
    }

    return "main: unrecognized flag argument";
  }

  g_flags.remaining_argc = argc - c;
  g_flags.remaining_argv = argv + c;
  return NULL;
}

const char*  //
main1(int argc, char** argv) {
  TRY(parse_flags(argc, argv));
  if (g_flags.remaining_argc > 0) {
    return "main: bad argument: use \"program < input\", not \"program input\"";
  }

  uint8_t new_line[1];
  new_line[0] = '\n';

  g_src = wuffs_base__make_io_buffer(
      wuffs_base__make_slice_u8(g_src_buffer_array, SRC_BUFFER_ARRAY_SIZE),
      wuffs_base__empty_io_buffer_meta());

  g_tok = wuffs_base__make_token_buffer(
      wuffs_base__make_slice_token(g_tok_buffer_array, TOKEN_BUFFER_ARRAY_SIZE),
      wuffs_base__empty_token_buffer_meta());

  wuffs_base__status init_status = wuffs_json__decoder__initialize(
      &g_dec, sizeof__wuffs_json__decoder(), WUFFS_VERSION, 0);
  if (!wuffs_base__status__is_ok(&init_status)) {
    return wuffs_base__status__message(&init_status);
  }

  uint64_t pos = 0;
  while (true) {
    wuffs_base__status status = wuffs_json__decoder__decode_tokens(
        &g_dec, &g_tok, &g_src,
        wuffs_base__make_slice_u8(g_work_buffer_array, WORK_BUFFER_ARRAY_SIZE));

    while (g_tok.meta.ri < g_tok.meta.wi) {
      wuffs_base__token* t = &g_tok.data.ptr[g_tok.meta.ri++];
      uint64_t len = wuffs_base__token__length(t);

      if (wuffs_base__token__value_base_category(t) ==
          WUFFS_BASE__TOKEN__VBC__NUMBER) {
        uint64_t buf_pos = pos - g_src.meta.pos;
        uint64_t buf_len = g_src.data.len;
        if ((buf_len < buf_pos) || ((buf_len - buf_pos) < len)) {
          return "main: internal error: inconsistent token position/length";
        }

        if (g_flags.emit_number_str) {
          const int stdout_fd = 1;
          ignore_return_value(write(stdout_fd, &g_src.data.ptr[buf_pos], len));
          ignore_return_value(write(stdout_fd, &new_line[0], 1));
        }

        if (g_flags.parse_number_f64) {
          wuffs_base__result_f64 r;

#ifdef USE_FAST_DOUBLE_PARSER
          // Wuffs (and its JSON parser) works with slices (pointer-length
          // pairs) but fast_double_parser works with NUL-terminated strings.
          char buf[1024];
          if (len > 1023) {
            return "main: number-as-string is too long";
          }
          memcpy(&buf[0], &g_src.data.ptr[buf_pos], len);
          buf[len] = 0;
          if (!fast_double_parser::decimal_separator_dot::parse_number(
                  &buf[0], &r.value)) {
            return "main: could not parse number";
          }
          r.status = wuffs_base__make_status(NULL);
#else
          r = wuffs_base__parse_number_f64(
              wuffs_base__make_slice_u8(&g_src.data.ptr[buf_pos], len),
              WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
          if (!wuffs_base__status__is_ok(&r.status)) {
            return wuffs_base__status__message(&r.status);
          }
#endif

          if (g_flags.render_number_f64) {
            uint8_t render_buffer[2048];
            size_t n = wuffs_base__render_number_f64(
                wuffs_base__make_slice_u8(&render_buffer[0], 2048), r.value, 0,
                WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION);
            if (n == 0) {
              return "main: internal error: couldn't render_number_f64";
            }
          }
        }
      }

      pos += len;
      if (0 > ((int64_t)pos)) {
        return "main: input is too long";
      }
    }

    if (status.repr == NULL) {
      return NULL;
    } else if (status.repr == wuffs_base__suspension__short_read) {
      TRY(read_src());
    } else if (status.repr == wuffs_base__suspension__short_write) {
      wuffs_base__token_buffer__compact(&g_tok);
    } else {
      return wuffs_base__status__message(&status);
    }
  }
}

// ----

int  //
compute_exit_code(const char* status_msg) {
  if (!status_msg) {
    return 0;
  }
  size_t n = strnlen(status_msg, 2047);
  if (n >= 2047) {
    status_msg = "main: internal error: error message is too long";
    n = strnlen(status_msg, 2047);
  }
  fprintf(stderr, "%s\n", status_msg);
  // Return an exit code of 1 for regular (forseen) errors, e.g. badly
  // formatted or unsupported input.
  //
  // Return an exit code of 2 for internal (exceptional) errors, e.g. defensive
  // run-time checks found that an internal invariant did not hold.
  //
  // Automated testing, including badly formatted inputs, can therefore
  // discriminate between expected failure (exit code 1) and unexpected failure
  // (other non-zero exit codes). Specifically, exit code 2 for internal
  // invariant violation, exit code 139 (which is 128 + SIGSEGV on x86_64
  // linux) for a segmentation fault (e.g. null pointer dereference).
  return strstr(status_msg, "internal error:") ? 2 : 1;
}

int  //
main(int argc, char** argv) {
  const char* z = main1(argc, argv);
  int exit_code = compute_exit_code(z);
  return exit_code;
}
