54 char* pp = (
char*)str;
56 while(*pp!=
'{' && *pp!=
'[' && *pp!=
'\0') pp++;
57 if (*pp==
'\0')
return NULL;
64 if (node->state<0)
return node;
85 else json->state = state;
109 char* pp = (
char*)str;
126 if (valflg==
OFF || json->depth<0) {
144 while(*pt==
'\\') pt += 2;
146 if (*pt==
'\'' || *pt==
'\"' || *pt==
'{' || *pt==
'}')
break;
157 if (*pp==
'\"' || *pp==
'\'') {
159 if (*pp==
'\'') ch =
'\'';
163 while(*pt==
'\\') pt += 2;
175 int len = (int)(pt - pp) - 1 ;
183 while(*pt!=
',' && *pt!=
':' && *pt!=
'}' && *pt!=
'\0') pt++;
200 if (valflg==
OFF || json->depth<0) {
206 if (json->yngr!=NULL) {
207 int len = (int)(pt - pp) + 1;
218 while(*pt!=
',' && *pt!=
'}' && *pt!=
'{' && *pt!=
'[' && *pt!=
'\0') pt++;
234 while(*pt==
'\\') pt += 2;
236 if (*pt==
'\'' || *pt==
'\"' || *pt==
'{' || *pt==
'}' || *pt==
'[')
break;
246 if (*pp==
'\"' || *pp==
'\'') {
248 if (*pt==
'\'') ch =
'\'';
252 while(*pt==
'\\') pt += 2;
263 int len = (int)(pt - pp) - 1 ;
271 while(*pt!=
',' && *pt!=
':' && *pt!=
'}' && *pt!=
'\0') pt++;
284 while (*pt==
' ') pt++;
291 if (*pp!=
'{' && *pp!=
'[') {
292 while(*pt==
' ') pt++;
293 if (*pt!=
'\0')
while (*pt==
'\\') pt += 2;
295 if (*pp==
'\'' || *pp==
'\"') {
299 while (*pt!=
',' && *pt!=
'{' && *pt!=
'}' && *pt!=
'\0') pt++;
306 while (*pt==
' ' || *pt==0x0a || *pt==0x0d) pt--;
308 int len = (int)(pt - pp) + 1 ;
310 if (trgt==NULL) trgt = json->yngr;
316 char* val = (
char*)trgt->ldat.val.buf;
319 int num =
is_number((
unsigned char*)val);
327 while (*pt==
' ') pt++;
338 if (json->prev!=NULL) json = json->prev;
341 while (*pt!=
',' && *pt!=
'}' && *pt!=
'{' && *pt!=
'\0') pt++;
342 if (*pt==
'\0' && json->depth>0) {
356 tJson* temp = json->next;
377 char* pp = (
char*)(json->ldat.val.buf);
403 char* pp = (
char*)str;
405 if (*pp!=
'[')
return json;
421 while (*pp==
' ') pp++;
422 if (*pp!=
'\0')
while (*pp==
'\\') pp += 2;
433 if (json->yngr!=NULL) {
434 int len = (int)(pt - pp) + 1;
443 while(*pt!=
',' && *pt!=
'}' && *pt!=
'{' && *pt!=
'[' && *pt!=
'\0') pt++;
457 else if (*pp==
'\'' || *pp==
'\"') {
461 while (*pt==
'\\') pt += 2;
469 int len = (int)(pt - pp) + 1 ;
487 int len = (int)(pt - pp) + 1 ;
517 int len = (int)(pt - pp);
526 const char* val = (
const char*)node->ldat.val.buf;
529 int num =
is_number((
unsigned char*)val);
553 if (json==NULL)
return NULL;
558 if (st!=NULL && ed!=NULL) {
559 int len = (int)(ed - st) + 1;
561 json->ldat.val.vldsz = (int)strlen((
char*)json->ldat.val.buf);
622 if (pp==NULL)
return buf;
624 if (pp==NULL)
return buf;
628 if (buf.
buf==NULL)
return buf;
662 if (pp==NULL)
return buf;
664 if (pp==NULL)
return buf;
668 if (buf.
buf==NULL)
return buf;
690 if (pp==NULL)
return;
691 if (buf==NULL || buf->
buf==NULL)
return;
699 if (space[0]!=
'\0')
for(i=0; i<pp->depth; i++)
cat_s2Buffer(space, buf);
704 if (pp->next!=NULL) {
707 if (space[0]!=
'\0')
for(i=0; i<pp->depth; i++)
cat_s2Buffer(space, buf);
722 if (pp->next!=NULL) {
725 if (space[0]!=
'\0')
for(i=0; i<pp->depth; i++)
cat_s2Buffer(space, buf);
746 if (pp->ldat.key.buf!=NULL) {
752 if (pp->ldat.val.buf!=NULL) {
757 if (pp->next!=NULL) {
760 if (space[0]!=
'\0')
for(i=0; i<pp->depth; i++)
cat_s2Buffer(space, buf);
770 if (pp->ldat.val.buf==NULL) {
772 if (pp->next!=NULL) {
775 if (space[0]!=
'\0')
for(i=0; i<pp->depth; i++)
cat_s2Buffer(space, buf);
822 fprintf(fp,
"%s", buf.
buf);
844 fprintf(fp,
"%s", buf.
buf);
890 if (json==NULL || val==NULL)
return;
893 if (json==NULL)
return;
924 if (json==NULL)
return;
927 if (json==NULL)
return;
943 if (json==NULL)
return;
946 if (json==NULL)
return;
962 if (f_json==NULL || t_json==NULL)
return;
964 f_json = f_json->next;
965 if (f_json==NULL)
return;
968 t_json = t_json->next;
969 if (t_json==NULL)
return;
972 t_json->ldat.lv = f_json->ldat.lv;
973 copy_Buffer(&(f_json->ldat.val), &(t_json->ldat.val));
986 if (f_json==NULL || t_json==NULL)
return;
988 f_json = f_json->next;
989 if (f_json==NULL)
return;
992 t_json = t_json->next;
993 if (t_json==NULL)
return;
996 t_json->ldat.id = f_json->ldat.id;
997 t_json->ldat.lv = f_json->ldat.lv;
998 copy_Buffer(&(f_json->ldat.key), &(t_json->ldat.key));
999 copy_Buffer(&(f_json->ldat.val), &(t_json->ldat.val));
1023 if (parent==NULL || child ==NULL)
return NULL;
1030 tJson* cp = child->next;
1055 if (str==NULL || json==NULL)
return NULL;
1057 if (json==NULL)
return NULL;
1080 if (key==NULL || json==NULL)
return NULL;
1082 if (json==NULL)
return NULL;
1117 if (key==NULL || json==NULL)
return NULL;
1119 if (json==NULL)
return NULL;
1152 if (json==NULL)
return;
1155 if (json!=NULL)
return;
1160 int len = (int)strlen(val);
1183 if (json==NULL)
return;
1186 if (json!=NULL)
return;
1206 if (json==NULL)
return;
1209 if (json!=NULL)
return;
1229 if (json==NULL)
return;
1232 if (json==NULL)
return;
1237 int len = (int)strlen(val);
1259 if (json==NULL)
return;
1262 if (json==NULL)
return;
1282 if (json==NULL)
return;
1285 if (json==NULL)
return;
1311 if (*child==NULL)
return parent;
1312 if (parent==NULL)
return *child;
1315 tJson* jtmp = (*child)->next;
1340 if (pp==NULL)
return NULL;
1343 while (pp->prev!=NULL) pp = pp->prev;
1349 while(pp->esis!=NULL) pp = pp->esis;
1356 while (i<nn && pp!=NULL) {
1380 if (pp==NULL || key==NULL)
return NULL;
1388 if (nn>0 && pp->next!=NULL) {
1409 if (pp==NULL)
return NULL;
1413 while (pp!=NULL && i<nn) {
1421 while (pp!=NULL && i<nn) {
1445 if (pp==NULL || pp->next==NULL)
return NULL;
1467 if (pp==NULL || key==NULL)
return NULL;
1468 while(pp->esis!=NULL) pp = pp->esis;
1472 if (nn==0)
return pp;
1494 if (pp==NULL || key==NULL)
return NULL;
1501 if (nn==0)
return pp;
1504 if (pp->next!=NULL) {
1526 if (pp==NULL || key1==NULL || key2==NULL)
return NULL;
1529 if (pp==NULL)
return NULL;
1531 if (pp->next!=NULL) {
1556 while(pp->esis!=NULL) pp = pp->esis;
1561 if ((*nn)<=0)
return pp;
1568 if (pp->next!=NULL) {
1570 if (json!=NULL)
return json;
1595 if (pp==NULL)
return NULL;
1596 while(pp->esis!=NULL) pp = pp->esis;
1603 if ((*nn)<=0)
return pp;
1610 if (pp->next!=NULL) {
1612 if (json!=NULL)
return json;
1629 if (pp->ldat.key.buf!=NULL) {
1630 if (!strcmp(key, (
char*)pp->ldat.key.buf)) {
1632 unsigned char* pm = pp->ldat.val.buf;
1634 if (!((pm[0]==
'\'' && pm[1]==
'\'') || (pm[0]==
'"' && pm[1]==
'"')) && pm[0]!=
'\0') nn--;
1660 if (pp==NULL)
return NULL;
1671 while (pp->esis!=NULL) pp = pp->esis;
1674 if (!
strncasecmp(name, (
char*)pp->ldat.key.buf, strlen(name))) {
1676 if (!
strncasecmp(val, (
char*)(pp->ldat.val.buf+1), strlen(val))) {
1679 temp->ldat.id = list->ldat.id + 1;
1686 if (pp->next!=NULL) {
1692 if (pp->next!=NULL) {
1708 char* pp = (
char*)json->ldat.val.buf;
1709 if ((*pp==
'\"') || (*pp==
'\'')) {
1712 val.
vldsz = (int)strlen((
const char*)val.
buf);
1794 if (json==NULL)
return buf;
1796 char* pp = (
char*)json->ldat.val.buf;
1799 if (*pp==
'\"' || *pp==
'\'') {
1800 char* pt = (
char*)&(json->ldat.val.buf[json->ldat.val.vldsz-1]);
1827 if (json==NULL)
return NULL;
1830 char* pp = (
char*)json->ldat.val.buf;
1834 if (*pp==
'\"' || *pp==
'\'') {
1835 char* pt = (
char*)&(json->ldat.val.buf[json->ldat.val.vldsz-1]);
1845 if (str==NULL) str =
dup_str(pp);
Buffer make_Buffer(int sz)
Buffer型変数のバッファ部をつくり出す.
Buffer set_Buffer(void *dat, int len)
Buffer型変数のバッファ部を新しく作り, そのバッファに bufをコピーする.
int cat_b2Buffer(void *src, Buffer *dst, int len)
任意のバイナリデータsrcを Buffer型変数dstへ lenバイト catする.
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Buffer read_Buffer_file(const char *fn)
ファイル fn の内容を Buffer型変数に読み込む.
Buffer init_Buffer()
初期化したBuffer型変数を返す.
Buffer dup_Buffer(Buffer buf)
Buffer型変数のコピーをつくる.
int copy_r2Buffer(float src, Buffer *dst)
実数 srcを文字列に変換して,dstへ copyする.
Buffer pack_Buffer(Buffer buf, char cc)
文字列の先頭のcc(複数),終わりのcc(複数),TAB, CR, LF を削除
int copy_i2Buffer(int src, Buffer *dst)
整数 srcを文字列に変換して,dstへ copyする.
int cat_Buffer(Buffer *src, Buffer *dst)
Buffer変数 srcから dstへバッファを catする.
int copy_Buffer(Buffer *src, Buffer *dst)
Buffer型変数 srcから dstへバッファをコピーする.
#define copy_s2Buffer(src, dst)
copy_b2Buffer()
#define make_Buffer_str(str)
set_Buffer()
#define cat_s2Buffer(src, dst)
cat_b2Buffer()
#define make_Buffer_bystr(str)
set_Buffer()
#define LEN_INT
log 2^64 + '\0' + 1(予備)
#define LEN_REAL
15*2 + '\0' + 1(予備)
#define JBXL_JSON_NOT_CLOSED
JSONデータが閉じていない.原因不明.パースアルゴリズムのミス?
#define JBXL_JSON_NODE_OPENED
JSONノードは開いている
#define JBXL_JSON_ARRAY
JSONの配列
#define JBXL_JSON_MULTI_ROOT
JSONは複数のルート(TOP)を持っている.(パース済み)
#define JBXL_JSON_PARSED
JSONパース済み
#define JBXL_JSON_PARSE_TERM
JSON のパースが途中で終了した.入力データが不完全.
#define JBXL_JSON_DEFAULT_STATE
JSONデータの初期状態
int vldsz
データの長さ.バイナリデータの場合も使用可能.文字列の場合は 0x00 を含まない.
unsigned char * buf
バッファの先頭へのポインタ.str[bufsz]は必ず 0x00となる.
tJson * json_append_array_key(tJson *json, const char *key)
値(value)なしの配列 "key":[] を追加する.
void json_append_array_str_val(tJson *json, const char *val)
配列 [] の要素として 文字列 val を追加する.
tList * search_all_node_strval_json(tJson *pp, const char *name, const char *val)
指定した条件に合う全てのノードへのポインタを,リストに格納して返す.
tJson * json_parse_file(const char *fn, int num)
JSONデータをファイルから読み込んで,パースする.
Buffer get_Buffer_from_json(tJson *json)
tJson * search_key_json_obj(tJson *pp, const char *key, int nn)
名前(属性名)が key である nn番目のオブジェクトノード(JSON_VALUE_OBJ)へのポインタを返す.ex.) "key":{}
void print_json(FILE *fp, tJson *json, int mode)
tJsonデータをmodeに従って fp に出力する.
void json_append_obj_str_val(tJson *json, const char *key, const char *val)
{} の要素として "key":val(val は文字列)を追加する.
tJson * json_insert_child(tJson *parent, tJson *child)
parent に dict または array の child を繋げる.
tJson * search_key_json(tJson *pp, const char *key, int needval, int nn)
名前(属性名)が key である nn番目のノードへのポインタを返す
tJson * search_key_sister_json(tJson *pp, const char *key, int needval)
姉妹ノードで名前(属性名)が key である nn番目のノードへのポインタを返す.
Buffer json_inverse_parse(tJson *pp, int mode)
tJsonデータをmodeに従って元の書式に戻して Bufferに格納する.
tJson * search_double_key_json(tJson *pp, const char *key1, const char *key2, int needval)
属性名が key1 -> key2 の親子関係を持つ,key2ノードのポインタを返す.
tJson * json_parse_seq(tJson *json, const char *str, int num)
断片化した JSONデータを読み込んで処理する.
tJson * _search_key_json(tJson *pp, const char *key, int needval, int *nn)
search_key_json() の補助関数
tJson * json_append_obj_key(tJson *json, const char *key)
属性値(value)なしのリストデータ "key":{} を追加する.
tJson * join_json(tJson *parent, tJson **child)
parent の子として child そのものを 直接繋げる.
Buffer get_key_sister_json_val(tJson *pp, const char *key)
姉妹ノードで名前(属性名)が key である nn番目のノードの属性値を返す.
tJson * _json_parse_term(tJson *json, const char *st, const char *ed, const char *com)
json_parse_prop() の補助関数.断片的な入力データ用.
char * get_string_from_json(tJson *json)
要 free()
tJson * search_key_child_json(tJson *pp, const char *key, int needval)
子の姉妹ノードで名前(属性名)が key である nn番目のノードへのポインタを返す.
int _json_check_node_bykey(tJson *pp, const char *key, int needval, int nn)
search 系関数の補助関数
void json_copy_data(tJson *f_json, tJson *t_json)
f_json から t_json へ属性名(key)と属性値(value)をコピーする.
Buffer get_json_val(tJson *json)
void _json_to_Buffer(tJson *pp, Buffer *buf, const char *crlf, const char *space)
tJsonデータを元の書式に戻して Bufferに格納する.補助関数.
tJson * json_insert_parse(tJson *json, const char *str)
str をパースして繋げる.str は { または [ で始まる必要がある.
void json_append_array_real_val(tJson *json, float val)
配列 [] の要素として 実数 val を追加する.
tJson * _json_array_parse(tJson *json, int num)
json_parse_prop() の補助関数.配列処理用.
tJson * search_top_bracket_json(tJson *pp, int nn)
ツリーが複数のルート(TOP)を持つ場合(JBXL_JSON_MULTI_ROOT),指定されたTOPへのポインタを返す.
void json_append_obj_int_val(tJson *json, const char *key, int val)
{} の要素として "key":val(val は整数)を追加する.
void json_append_obj_real_val(tJson *json, const char *key, float val)
{} の要素として "key":val(va lは実数)を追加する.
tJson * search_sister_json(tJson *pp, int nn)
nn個先の sister ノードを返す.正数の場合は younger sister. 負数の場合は elder sister.
void json_append_array_int_val(tJson *json, int val)
配列 [] の要素として 整数 val を追加する.
void json_set_real_val(tJson *json, float val)
json ノード "key":val に実数の属性値(value)を設定する.
void json_copy_val(tJson *f_json, tJson *t_json)
f_json から t_json へ属性値(value)をコピーする.
void json_set_str_val(tJson *json, const char *val)
json ノード "key":val に文字列の属性値(value)を設定する.
tJson * json_parse_prop(tJson *json, const char *str, int num)
JSON Main Parser.json が NULL の場合は ANCHOR付き.
Buffer json_inverse_parse_opt(tJson *pp, const char *crlf, const char *space)
tJsonデータを指定に従って元の書式に戻して Bufferに格納する.
void print_json_opt(FILE *fp, tJson *json, const char *crlf, const char *space)
tJsonデータを指定に従って fp に出力する.
Buffer get_double_key_json_val(tJson *pp, const char *key1, const char *key2)
key1 -> key2 の親子関係を持つ,key2ノードの属性値を返す.
tList * _search_all_node_strval_json(tList *list, tJson *pp, const char *name, const char *val)
search_all_node_strval_json() の補助関数
Buffer get_key_json_val(tJson *pp, const char *key, int nn)
名前(属性名)が key である nn番目のノードの属性値を返す.
tJson * json_array_parse(tJson *json, const char *str, int num)
JSONデータの 配列ノードの値(配列データ)を処理する.
void json_set_int_val(tJson *json, int val)
json ノード "key":val に整数の属性値(value)を設定する.
tJson * _search_key_json_obj(tJson *pp, const char *key, int *nn)
search_key_json_obj() の補助関数
tJson * json_parse(const char *str, int num)
文字列のJSONデータを解釈して,tJsonのツリーを生成する.ANCHOR付き.
#define JSON_ARRAY_VALUE_NODE
配列の要素データのノード.
#define new_json_node()
JSONデータのノードを生成 new_tTree_node()
#define JSON_CRLF_FORMAT
ノードの終わりを CR(0x0d), LF(0x0a)で改行する.
#define JSON_DATA_NODE
key:val の形の通常のノード
#define JSON_TEMP_NODE
一時的なノード.削除対象.
#define JSON_INDENT_FORMAT
先頭にインデント(TAB)をつけ,ノードごとに改行する.
#define JSON_BRACKET_NODE
'{' を格納したノード.key は持たない.
#define JSON_VALUE_ARRAY
属性値:配列
#define JSON_VALUE_UNRESOLV
属性値の種類は未確定.
#define JSON_ANCHOR_NODE
アンカーノード
#define JSON_VALUE_NULL
属性値なし.
#define JSON_VALUE_STR
属性値:文字列
#define JSON_VALUE_OBJ
属性値:オブジェクト
#define new_json_anchor_node()
JSONデータの ANCHORノードを生成 new_tTree_anchor_node()
#define del_json_anchor_node(t)
JSONデータの ANCHORノードを削除 del_tTree_anchor_node()
#define del_json_node(j)
JSONデータのノード削除 del_tTree_node()
#define JSON_VALUE_REAL
属性値:実数 未サポート
#define JSON_VALUE_BOOL
属性値:論理値 未サポート
#define JSON_VALUE_INT
属性値:整数 未サポート
#define JSON_ARRAY_NODE
配列ノード.処理された場合,JSON_ARRAY_VALUE_NODE を子ノードとして持つ.
void clear_tList_data(tList_data *ldat)
ノードデータのバッファ部をクリアする.データ自身は削除しない.
tList * new_tList_node(void)
リスト用の空ノードを動的に生成する.
#define add_tList_node(p, t)
insert_tList()
tTree * add_tTree_node(tTree *pp, tTree *node)
ツリー ppへノード nodeを末っ子として追加.
tTree * add_tTree(tTree *tp, tTree *tt)
ツリー tpへ ツリー ttを追加.
int count_tTree(tTree *pp)
ツリーの ppノード以降のノードの数を数える.
tTree * add_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを末っ子としてリストに追加.
#define TREE_NOSIS_NODE
このノードの姉妹ノードは処理しない.一部の関数のみ有効.