/* Simple library for printing JSON data.
   Copyright (C) 2014-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <string.h>

#include "json-lib.h"

void
json_init (json_ctx_t *ctx, unsigned int indent_level, FILE *fp)
{
  ctx->indent_level = indent_level;
  ctx->fp = fp;
  ctx->first_element = true;
}

static void
do_indent (json_ctx_t *ctx)
{
  char indent_buf[ctx->indent_level + 1];

  memset (indent_buf, ' ', ctx->indent_level + 1);
  indent_buf[ctx->indent_level] = '\0';

  fputs (indent_buf, ctx->fp);
}

void
json_document_begin (json_ctx_t *ctx)
{
  do_indent (ctx);

  fputs ("{\n", ctx->fp);

  ctx->indent_level++;
  ctx->first_element = true;
}

void
json_document_end (json_ctx_t *ctx)
{
  ctx->indent_level--;

  do_indent (ctx);

  fputs ("\n}", ctx->fp);
}

void
json_attr_object_begin (json_ctx_t *ctx, const char *name)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ",\n");

  do_indent (ctx);

  fprintf (ctx->fp, "\"%s\": {\n", name);

  ctx->indent_level++;
  ctx->first_element = true;
}

void
json_attr_object_end (json_ctx_t *ctx)
{
  ctx->indent_level--;
  ctx->first_element = false;

  fputs ("\n", ctx->fp);

  do_indent (ctx);

  fputs ("}", ctx->fp);
}

void
json_attr_string (json_ctx_t *ctx, const char *name, const char *s)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ",\n");
  else
    ctx->first_element = false;

  do_indent (ctx);

  fprintf (ctx->fp, "\"%s\": \"%s\"", name, s);
}

void
json_attr_uint (json_ctx_t *ctx, const char *name, uint64_t d)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ",\n");
  else
    ctx->first_element = false;

  do_indent (ctx);

  fprintf (ctx->fp, "\"%s\": %" PRIu64 , name, d);
}

void
json_attr_int (json_ctx_t *ctx, const char *name, int64_t d)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ",\n");
  else
    ctx->first_element = false;

  do_indent (ctx);

  fprintf (ctx->fp, "\"%s\": %" PRId64 , name, d);
}

void
json_attr_double (json_ctx_t *ctx, const char *name, double d)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ",\n");
  else
    ctx->first_element = false;

  do_indent (ctx);

  fprintf (ctx->fp, "\"%s\": %g", name, d);
}

void
json_array_begin (json_ctx_t *ctx, const char *name)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ",\n");

  do_indent (ctx);

  fprintf (ctx->fp, "\"%s\": [", name);

  ctx->indent_level++;
  ctx->first_element = true;
}

void
json_array_end (json_ctx_t *ctx)
{
  ctx->indent_level--;
  ctx->first_element = false;

  fputs ("]", ctx->fp);
}

void
json_element_string (json_ctx_t *ctx, const char *s)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ", \"%s\"", s);
  else
    {
      fprintf (ctx->fp, "\"%s\"", s);
      ctx->first_element = false;
    }
}

void
json_element_uint (json_ctx_t *ctx, uint64_t d)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ", %" PRIu64, d);
  else
    {
      fprintf (ctx->fp, "%" PRIu64, d);
      ctx->first_element = false;
    }
}

void
json_element_int (json_ctx_t *ctx, int64_t d)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ", %" PRId64, d);
  else
    {
      fprintf (ctx->fp, "%" PRId64, d);
      ctx->first_element = false;
    }
}

void
json_element_double (json_ctx_t *ctx, double d)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ", %g", d);
  else
    {
      fprintf (ctx->fp, "%g", d);
      ctx->first_element = false;
    }
}

void
json_element_object_begin (json_ctx_t *ctx)
{
  if (!ctx->first_element)
    fprintf (ctx->fp, ",");

  fputs ("\n", ctx->fp);

  do_indent (ctx);

  fputs ("{\n", ctx->fp);

  ctx->indent_level++;
  ctx->first_element = true;
}

void
json_element_object_end (json_ctx_t *ctx)
{
  ctx->indent_level--;
  ctx->first_element = false;

  fputs ("\n", ctx->fp);

  do_indent (ctx);

  fputs ("}", ctx->fp);
}
