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
このノードの姉妹ノードは処理しない.一部の関数のみ有効.