/* vi:set ts=8 sts=4 sw=4:
 *
 * VIM - Vi IMproved	by Bram Moolenaar
 *
 * Do ":help uganda"  in Vim to read copying and usage conditions.
 * Do ":help credits" in Vim to see a list of people who contributed.
 * See README.txt for an overview of the Vim source code.
 */

/*
 * json.c: Encoding and decoding JSON.
 *
 * Follows this standard: http://www.ietf.org/rfc/rfc4627.txt
 */

#include "vim.h"

#if defined(FEAT_EVAL) || defined(PROTO)
static void json_decode_item(js_read_T *reader, typval_T *res);

/*
 * Encode "val" into a JSON format string.
 */
    char_u *
json_encode(typval_T *val)
{
    garray_T ga;

    /* Store bytes in the growarray. */
    ga_init2(&ga, 1, 4000);
    json_encode_item(&ga, val, get_copyID());
    return ga.ga_data;
}

    static void
write_string(garray_T *gap, char_u *str)
{
    char_u	*res = str;
    char_u	numbuf[NUMBUFLEN];

    if (res == NULL)
	ga_concat(gap, (char_u *)"null");
    else
    {
	ga_append(gap, '"');
	while (*res != NUL)
	{
	    int c = PTR2CHAR(res);

	    switch (c)
	    {
		case 0x08:
		    ga_append(gap, '\\'); ga_append(gap, 'b'); break;
		case 0x09:
		    ga_append(gap, '\\'); ga_append(gap, 't'); break;
		case 0x0a:
		    ga_append(gap, '\\'); ga_append(gap, 'n'); break;
		case 0x0c:
		    ga_append(gap, '\\'); ga_append(gap, 'f'); break;
		case 0x0d:
		    ga_append(gap, '\\'); ga_append(gap, 'r'); break;
		case 0x22: /* " */
		case 0x5c: /* \ */
		    ga_append(gap, '\\');
		    ga_append(gap, c);
		    break;
		default:
		    if (c >= 0x20)
		    {
			numbuf[mb_char2bytes(c, numbuf)] = NUL;
			ga_concat(gap, numbuf);
		    }
		    else
		    {
			vim_snprintf((char *)numbuf, NUMBUFLEN,
							 "\\u%04lx", (long)c);
			ga_concat(gap, numbuf);
		    }
	    }
	    mb_cptr_adv(res);
	}
	ga_append(gap, '"');
    }
}

    void
json_encode_item(garray_T *gap, typval_T *val, int copyID)
{
    char_u	numbuf[NUMBUFLEN];
    char_u	*res;
    list_T	*l;
    dict_T	*d;

    switch (val->v_type)
    {
	case VAR_SPECIAL:
	    switch(val->vval.v_number)
	    {
		case VVAL_FALSE: ga_concat(gap, (char_u *)"false"); break;
		case VVAL_TRUE: ga_concat(gap, (char_u *)"true"); break;
		case VVAL_NONE: break;
		case VVAL_NULL: ga_concat(gap, (char_u *)"null"); break;
	    }
	    break;

	case VAR_NUMBER:
	    vim_snprintf((char *)numbuf, NUMBUFLEN, "%ld",
						    (long)val->vval.v_number);
	    ga_concat(gap, numbuf);
	    break;

	case VAR_STRING:
	    res = val->vval.v_string;
	    write_string(gap, res);
	    break;

	case VAR_FUNC:
	    /* no JSON equivalent, skip */
	    break;

	case VAR_LIST:
	    l = val->vval.v_list;
	    if (l == NULL)
		ga_concat(gap, (char_u *)"null");
	    else
	    {
		if (l->lv_copyID == copyID)
		    ga_concat(gap, (char_u *)"[]");
		else
		{
		    listitem_T	*li;

		    l->lv_copyID = copyID;
		    ga_append(gap, '[');
		    for (li = l->lv_first; li != NULL && !got_int; )
		    {
			json_encode_item(gap, &li->li_tv, copyID);
			li = li->li_next;
			if (li != NULL)
			    ga_append(gap, ',');
		    }
		    ga_append(gap, ']');
		}
	    }
	    break;

	case VAR_DICT:
	    d = val->vval.v_dict;
	    if (d == NULL)
		ga_concat(gap, (char_u *)"null");
	    else
	    {
		if (d->dv_copyID == copyID)
		    ga_concat(gap, (char_u *)"{}");
		else
		{
		    int		first = TRUE;
		    int		todo = (int)d->dv_hashtab.ht_used;
		    hashitem_T	*hi;

		    d->dv_copyID = copyID;
		    ga_append(gap, '{');

		    for (hi = d->dv_hashtab.ht_array; todo > 0 && !got_int;
									 ++hi)
			if (!HASHITEM_EMPTY(hi))
			{
			    --todo;
			    if (first)
				first = FALSE;
			    else
				ga_append(gap, ',');
			    write_string(gap, hi->hi_key);
			    ga_append(gap, ':');
			    json_encode_item(gap, &dict_lookup(hi)->di_tv,
								      copyID);
			}
		    ga_append(gap, '}');
		}
	    }
	    break;

#ifdef FEAT_FLOAT
	case VAR_FLOAT:
	    vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", val->vval.v_float);
	    ga_concat(gap, numbuf);
	    break;
#endif
	default: EMSG2(_(e_intern2), "json_encode_item()"); break;
    }
}

/*
 * Skip white space in "reader".
 */
    static void
json_skip_white(js_read_T *reader)
{
    int c;

    while ((c = reader->js_buf[reader->js_used]) == ' '
					   || c == TAB || c == NL || c == CAR)
	++reader->js_used;
}

/*
 * Make sure there are at least enough characters buffered to read a number.
 */
    static void
json_fill_buffer(js_read_T *reader UNUSED)
{
    /* TODO */
}

    static void
json_decode_array(js_read_T *reader, typval_T *res)
{
    char_u	*p;
    typval_T	item;
    listitem_T	*li;

    if (rettv_list_alloc(res) == FAIL)
	goto failsilent;
    ++reader->js_used; /* consume the '[' */

    while (TRUE)
    {
	json_skip_white(reader);
	p = reader->js_buf + reader->js_used;
	if (*p == NUL)
	    goto fail;
	if (*p == ']')
	{
	    ++reader->js_used; /* consume the ']' */
	    return;
	}

	if (!reader->js_eof && (int)(reader->js_end - p) < NUMBUFLEN)
	    json_fill_buffer(reader);

	json_decode_item(reader, &item);
	li = listitem_alloc();
	if (li == NULL)
	    return;
	li->li_tv = item;
	list_append(res->vval.v_list, li);

	json_skip_white(reader);
	p = reader->js_buf + reader->js_used;
	if (*p == ',')
	    ++reader->js_used;
	else if (*p != ']')
	    goto fail;
    }
fail:
    EMSG(_(e_invarg));
failsilent:
    res->v_type = VAR_SPECIAL;
    res->vval.v_number = VVAL_NONE;
}

    static void
json_decode_object(js_read_T *reader, typval_T *res)
{
    char_u	*p;
    typval_T	tvkey;
    typval_T	item;
    dictitem_T	*di;
    char_u	buf[NUMBUFLEN];
    char_u	*key;

    if (rettv_dict_alloc(res) == FAIL)
	goto failsilent;
    ++reader->js_used; /* consume the '{' */

    while (TRUE)
    {
	json_skip_white(reader);
	p = reader->js_buf + reader->js_used;
	if (*p == NUL)
	    goto fail;
	if (*p == '}')
	{
	    ++reader->js_used; /* consume the '}' */
	    return;
	}

	if (!reader->js_eof && (int)(reader->js_end - p) < NUMBUFLEN)
	    json_fill_buffer(reader);
	json_decode_item(reader, &tvkey);
	key = get_tv_string_buf_chk(&tvkey, buf);
	if (key == NULL || *key == NUL)
	{
	    /* "key" is NULL when get_tv_string_buf_chk() gave an errmsg */
	    if (key != NULL)
		EMSG(_(e_emptykey));
	    clear_tv(&tvkey);
	    goto failsilent;
	}

	json_skip_white(reader);
	p = reader->js_buf + reader->js_used;
	if (*p != ':')
	{
	    clear_tv(&tvkey);
	    goto fail;
	}
	++reader->js_used;
	json_skip_white(reader);

	if (!reader->js_eof && (int)(reader->js_end - p) < NUMBUFLEN)
	    json_fill_buffer(reader);
	json_decode_item(reader, &item);

	di = dictitem_alloc(key);
	clear_tv(&tvkey);
	if (di == NULL)
	{
	    clear_tv(&item);
	    goto fail;
	}
	di->di_tv = item;
	if (dict_add(res->vval.v_dict, di) == FAIL)
	    dictitem_free(di);

	json_skip_white(reader);
	p = reader->js_buf + reader->js_used;
	if (*p == ',')
	    ++reader->js_used;
	else if (*p != '}')
	    goto fail;
    }
fail:
    EMSG(_(e_invarg));
failsilent:
    res->v_type = VAR_SPECIAL;
    res->vval.v_number = VVAL_NONE;
}

    static void
json_decode_string(js_read_T *reader, typval_T *res)
{
    garray_T    ga;
    int		len;
    char_u	*p = reader->js_buf + reader->js_used + 1;
    int		c;
    long	nr;
    char_u	buf[NUMBUFLEN];

    ga_init2(&ga, 1, 200);

    /* TODO: fill buffer when needed. */
    while (*p != NUL && *p != '"')
    {
	if (*p == '\\')
	{
	    c = -1;
	    switch (p[1])
	    {
		case 'b': c = BS; break;
		case 't': c = TAB; break;
		case 'n': c = NL; break;
		case 'f': c = FF; break;
		case 'r': c = CAR; break;
		case 'u':
		    vim_str2nr(p + 2, NULL, &len,
				     STR2NR_HEX + STR2NR_FORCE, &nr, NULL, 4);
		    p += len + 2;
#ifdef FEAT_MBYTE
		    buf[(*mb_char2bytes)((int)nr, buf)] = NUL;
		    ga_concat(&ga, buf);
#else
		    ga_append(&ga, nr);
#endif
		    break;
		default: c = p[1]; break;
	    }
	    if (c > 0)
	    {
		p += 2;
		ga_append(&ga, c);
	    }
	}
	else
	{
	    len = MB_PTR2LEN(p);
	    if (ga_grow(&ga, len) == OK)
	    {
		mch_memmove((char *)ga.ga_data + ga.ga_len, p, (size_t)len);
		ga.ga_len += len;
	    }
	    p += len;
	}
	if (!reader->js_eof && (int)(reader->js_end - p) < NUMBUFLEN)
	{
	    reader->js_used = (int)(p - reader->js_buf);
	    json_fill_buffer(reader);
	    p = reader->js_buf + reader->js_used;
	}
    }
    reader->js_used = (int)(p - reader->js_buf);
    if (*p == '"')
    {
	++reader->js_used;
	res->v_type = VAR_STRING;
	if (ga.ga_data == NULL)
	    res->vval.v_string = NULL;
	else
	    res->vval.v_string = vim_strsave(ga.ga_data);
    }
    else
    {
	EMSG(_(e_invarg));
	res->v_type = VAR_SPECIAL;
	res->vval.v_number = VVAL_NONE;
    }
    ga_clear(&ga);
}

/*
 * Decode one item and put it in "result".
 * Must already have skipped white space.
 */
    static void
json_decode_item(js_read_T *reader, typval_T *res)
{
    char_u	*p = reader->js_buf + reader->js_used;

    switch (*p)
    {
	case '[': /* array */
	    json_decode_array(reader, res);
	    return;

	case '{': /* object */
	    json_decode_object(reader, res);
	    return;

	case '"': /* string */
	    json_decode_string(reader, res);
	    return;

	case ',': /* comma: empty item */
	case NUL: /* empty */
	    res->v_type = VAR_SPECIAL;
	    res->vval.v_number = VVAL_NONE;
	    return;

	default:
	    if (VIM_ISDIGIT(*p) || *p == '-')
	    {
		int	len;
		char_u  *sp = p;
#ifdef FEAT_FLOAT
		if (*sp == '-')
		    ++sp;
		sp = skipdigits(sp);
		if (*sp == '.' || *sp == 'e' || *sp == 'E')
		{
		    res->v_type = VAR_FLOAT;
		    len = string2float(p, &res->vval.v_float);
		}
		else
#endif
		{
		    long nr;

		    res->v_type = VAR_NUMBER;
		    vim_str2nr(reader->js_buf + reader->js_used,
			    NULL, &len, 0, /* what */
			    &nr, NULL, 0);
		    res->vval.v_number = nr;
		}
		reader->js_used += len;
		return;
	    }
	    if (STRNICMP((char *)p, "false", 5) == 0)
	    {
		reader->js_used += 5;
		res->v_type = VAR_SPECIAL;
		res->vval.v_number = VVAL_FALSE;
		return;
	    }
	    if (STRNICMP((char *)p, "true", 4) == 0)
	    {
		reader->js_used += 4;
		res->v_type = VAR_SPECIAL;
		res->vval.v_number = VVAL_TRUE;
		return;
	    }
	    if (STRNICMP((char *)p, "null", 4) == 0)
	    {
		reader->js_used += 4;
		res->v_type = VAR_SPECIAL;
		res->vval.v_number = VVAL_NULL;
		return;
	    }
	    break;
    }

    EMSG(_(e_invarg));
    res->v_type = VAR_SPECIAL;
    res->vval.v_number = VVAL_NONE;
}

/*
 * Decode the JSON from "reader" and store the result in "res".
 */
    void
json_decode(js_read_T *reader, typval_T *res)
{
    json_skip_white(reader);
    json_decode_item(reader, res);
    json_skip_white(reader);
    if (reader->js_buf[reader->js_used] != NUL)
	EMSG(_(e_invarg));
}
#endif
