blob: 1ed7d0321e7df1f21700bc54bf183abd9c7358d3 [file] [log] [blame]
//------------------------------------------------------------------
//
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you 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
//
// http://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.
//
// @@@ END COPYRIGHT @@@
#ifndef JSONREADER_H
#define JSONREADER_H
#include <stdlib.h>
#include <stdio.h>
#define JSON_PARSER_BUF_LEN 1024
#define JSON_PARSER_ERROR_MESSAGE_LEN 512
#define JSON_PARSER_MAX_NESTED_NUM 100
#ifndef bool
#define bool unsigned char
#endif // !_Bool
#ifndef true
#define true 1
#endif // !true
#ifndef false
#define false 0
#endif // !false
enum JsonReaderState_
{
JSON_STATE_START,
JSON_STATE_OBJECT_INITIAL,
JSON_STATE_ARRAY_INITIAL,
JSON_STATE_MEMBER_KEY,
JSON_STATE_ELEMENT,
JSON_STATE_KEY_VALUE_DELIMITER,
JSON_STATE_ELEMENT_DELIMITER,
JSON_STATE_ARRAY_FINISH,
JSON_STATE_MEMBER_VALUE,
JSON_STATE_MEMBER_DELIMITER,
JSON_STATE_OBJECT_FINISH,
JSON_STATE_FINISH
};
typedef enum JsonReaderState_ JsonReaderState;
enum JsonReaderError_
{
JSON_SUCCESS,
JSON_ERROR_DEPTH,
JSON_ERROR_PARSE_EOF,
JSON_ERROR_STATE,
JSON_ERROR_BAD_FORMAT
};
typedef enum JsonReaderError_ JsonReaderError;
#define IS_NOT_WHITE_SPACE(c) (((c)!=' ') && ((c)!='\t') && ((c)!='\n') && ((c)!='\r'))
// 1 <= len <= 3
#define IN_CHARS(c, cs, len) (((c) == (cs)[0]) || ((len) > 1 && (c) == (cs)[1]) || ((len) > 2 && (c) == (cs)[2]))
#define CASE_VALUE case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':case '-':case 'f':case 't':case 'n':case '"'
struct JsonReader_
{
bool isBufReady;
FILE *jsonFile;
char *tmpSaveBuf; // save parsed contents.
size_t bufLen;
size_t nestDepth;
JsonReaderState state;
JsonReaderError errorCode;
char buf[JSON_PARSER_BUF_LEN];
char errorMessage[JSON_PARSER_ERROR_MESSAGE_LEN];
char *currentCharPtr;
char *jsonFileName;
size_t numberReadBuf;
size_t lineNum;
size_t linePos;
JsonReaderState statesSave[JSON_PARSER_MAX_NESTED_NUM];
};
typedef struct JsonReader_ JsonReader;
/* jsonReaderNew: create a json reader
*
* path: path of json file
* return: pointer to json reader
*/
JsonReader *jsonReaderNew(const char *path);
/* jsonReaderErrorMessage: get json reader error message
* pJsonReader: pointer to json reader
* return: pointer to json reader
*/
const char *jsonReaderErrorMessage(JsonReader *pJsonReader);
/* jsonMoveCurrentCharPtr: move current char pointer forward.
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonMoveCurrentCharPtr(JsonReader *pJsonReader);
/* jsonSaveAndToState: save and change parser state
*
* pJsonReader: pointer of json reader
* JsonReaderState : parser state
* return: json reader error code
*/
JsonReaderError jsonSaveAndToState(JsonReader *pJsonReader, JsonReaderState state);
/* jsonReaderSetTmpbuf: set temp buffer to save parsed contents
*
* pJsonReader: pointer of json reader
* buf: the buf to save contents
* len: length of buf
* return: json reader error code
*/
JsonReaderError jsonReaderSetTmpbuf(JsonReader *pJsonReader, char *buf, size_t len);
/* jsonReaderUnsetTmpbuf: unset tempbuf to save parsed contents.
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonReaderUnsetTmpbuf(JsonReader *pJsonReader);
/* jsonParseStateStart: parse json file start
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseStateStart(JsonReader *pJsonReader);
/* jsonParseObjectInitial: encuntered '{'
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseObjectInitial(JsonReader *pJsonReader);
/* jsonGetStringValue: parse string value
*
* pJsonReader: pointer of json reader
* strValue: pointer to buf to save string
* len: length of strValue
* return: strValue
*/
char *jsonGetStringValue(JsonReader *pJsonReader, char *strValue, size_t len);
/* jsonParseMemberKey: parse member key
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseMemberKey(JsonReader *pJsonReader);
/* jsonParseKeyValueDelimiter: encountered key value delimiter
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseKeyValueDelimiter(JsonReader *pJsonReader);
/* jsonInternalGetValue: common function to get string value
*
* pJsonReader: pointer of json reader
* endChars: encounter these chars function end
* len: length of end chars
* return: json reader error code
*/
JsonReaderError jsonInternalGetValue(JsonReader *pJsonReader, char *endChars, size_t len);
/* jsonParseMemberValueEnd: parse member value end
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseMemberValueEnd(JsonReader *pJsonReader);
/* jsonParseElementEnd: parse element value end
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseElementEnd(JsonReader *pJsonReader);
/* jsonParseMemberValue: parse member value
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseMemberValue(JsonReader *pJsonReader);
/* jsonParseMemberDelimiter: parse contents after member delimiter
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseMemberDelimiter(JsonReader *pJsonReader);
/* jsonParseObjectFinish: parse contents after object finish
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseObjectFinish(JsonReader *pJsonReader);
/* jsonParseArrayInitial: encounter '['
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseArrayInitial(JsonReader *pJsonReader);
/* jsonParseElement: parse array element
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseElement(JsonReader *pJsonReader);
/* jsonParseElementDelimiter: parse contents after array elements delimiter
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseElementDelimiter(JsonReader *pJsonReader);
/* jsonParseArrayFinish: parse contents after array finish
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParseArrayFinish(JsonReader *pJsonReader);
/* jsonReadKey: parse key
*
* pJsonReader: pointer of json reader
* keyBuf: buf to save key
* len: keyBuf length
* return: json reader error code
*/
JsonReaderError jsonReadKey(JsonReader *pJsonReader, char *keyBuf, size_t len);
/* jsonReadMemberValue: parse member value
*
* pJsonReader: pointer of json reader
* memberValbuf: buf to save member value
* len: memberValbuf length
* return: json reader error code
*/
JsonReaderError jsonReadMemberValue(JsonReader *pJsonReader, char *memberValbuf, size_t len);
/* jsonReadArrayValue: parse array value
*
* pJsonReader: pointer of json reader
* arrayValbuf: buf to save array value
* len: arrayValbuf length
* return: json reader error code
*/
JsonReaderError jsonReadArrayValue(JsonReader *pJsonReader, char *arrayValBuf, size_t len);
/* jsonRead: parse stream to next state
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonRead(JsonReader *pJsonReader);
/* jsonParse: parse stream to end if no error
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
JsonReaderError jsonParse(JsonReader *pJsonReader);
/* jsonReaderFree: free json reader
*
* pJsonReader: pointer of json reader
* return: json reader error code
*/
void jsonReaderFree(JsonReader *pJsonReader);
#endif //JSONREADER_H