// 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;
}
