#pragma once

//
//インクルード
/////////////////////////////////////////////////////////////

#include <stdlib.h>
#include <stdint.h>

//
//型定義
/////////////////////////////////////////////////////////////


///
///json解析オブジェクトポインタ
///
typedef struct jsonparser_t *JSONParser_P;


///
///json文字型
///
typedef wchar_t JSONChar;

///
///json文字列ポインタ
///
typedef JSONChar *JSONChar_P;





///
///整数型
///
typedef intptr_t JSONInt;
typedef uintptr_t JSONUInt;

///
///少数型
///
typedef double JSONDouble;

///
///真偽型
///
typedef JSONUInt JSONBool;



///
///json void型
///
typedef void JSONVoid;


///
///コールバックパラーメータ型
///
typedef JSONUInt JSONParameter;


///
///戻り値
///
typedef JSONUInt JSONResult;


///
///構造体解析時コールバック
///
typedef JSONVoid (*JSONStructEventHandler)(JSONVoid *,JSONUInt,JSONUInt,JSONChar_P);


///
///構造体データ解析時コールバック
///
typedef JSONVoid (*JSONDataEventHandler)(JSONVoid *,JSONUInt,JSONUInt,JSONChar_P,JSONParameter);

///
///構造体終端解析時コールバック
///
typedef JSONVoid (*JSONStructEndEventHandler)(JSONVoid *,JSONUInt,JSONUInt,JSONChar_P);






//
//define
/////////////////////////////////////////////////////////////////////////

//
//エラー
//

///正常終了
#define JSON_ERR_OK										((JSONResult)0)

///指定したエンコードタイプが定義されていない
#define JSON_ERR_ENCODE_UNKNOWN							((JSONResult)1)

///json構文エラー
#define JSON_ERR_SYNTAX									((JSONResult)2)

///変換エラー
#define JSON_ERR_CONVERT								((JSONResult)3)									



///rsltが初期化されていない
#define JSON_ERR_NOTINIT								((JSONResult)UINTPTR_MAX)











//
//エンコードモード
//現在はUTF8のみ
//

#define JSON_ENCODE_UTF8		((JSONParameter)0)




//
//真偽値
//

///true
#define JSONTrue				((JSONBool)1)


///false
#define JSONFalse				((JSONBool)0)




//
//値タイプ
//
#define JSONTypeRoot			((JSONUInt)0)

///オブジェクト
#define JSONTypeObject			((JSONUInt)1)

///配列
#define JSONTypeArray			((JSONUInt)2)

///真偽値
#define JSONTypeBool			((JSONUInt)3)

///文字列
#define JSONTypeString			((JSONUInt)4)

///10進数
#define JSONTypeDecimal			((JSONUInt)5)

///null
#define JSONNull				((JSONUInt)6)








//
//関数
//////////////////////////////////////////////////////////////////////////


#ifdef __cplusplus
extern "C" {
#endif


	///
	///パーサオブジェクト生成
	///
	extern JSONParser_P JSONParser_new();

	///
	///パーサオブジェクト破棄
	///
	extern JSONVoid JSONParser_delete(JSONParser_P *parser);

	///
	///構造体イベントハンドラ
	///
	extern JSONVoid JSONParser_setStructHandler(JSONParser_P parser,JSONStructEventHandler handler);

	///
	///オブジェクトイベントハンドラをセット
	///
	extern JSONVoid JSONParser_setDataEventHandler(JSONParser_P parser,JSONDataEventHandler handler);



	///
	///オブジェクト終端イベントハンドラをセット
	///
	extern JSONVoid JSONParser_setDataEndEventHandler(JSONParser_P parser,JSONStructEndEventHandler handler);


	///
	///オブジェクト開始・終端ハンドラをセット
	///
	extern JSONVoid JSONParser_setEventHandler(JSONParser_P parser,JSONStructEventHandler structHandler,JSONDataEventHandler dataHandler,JSONStructEndEventHandler endHandler);


	///
	///解析開始
	///
	extern JSONResult JSONParser_Parse(JSONParser_P parser,const JSONVoid *jsontext,JSONParameter encode,JSONVoid *option);










#ifdef __cplusplus
}
#endif