JunkBox_Lib  1.10.2
txml.c File Reference

Tiny XML ライブラリ More...

#include "txml.h"
#include "jbxl_state.h"
Include dependency graph for txml.c:

Go to the source code of this file.

Functions

tXMLxml_parse (char *pp)
 文字列のXMLデータを解釈して,tXMLのツリーを生成する. More...
 
tXMLxml_parse_file (const char *fn)
 ファイルから読み込んでパースする. More...
 
tXMLxml_parse_seq (tXML *xml, char *pp)
 部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.断片的にXMLデータを入力する場合に使用する. More...
 
tXMLxml_main_parse (tXML *xml, char *pp, int skip)
 部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.パーサの内部的なメイン関数. More...
 
int xml_parse_start_node (char *pp, char **node_name, char **node_attr, int *node_end)
 XMLの開始ノードを処理する. More...
 
int xml_parse_end_node (char *pp, char **node_name)
 XMLの終了ノードを処理する. More...
 
int xml_parse_content (char *pp, char **content)
 XMLのコンテントを処理する. More...
 
tListxml_parse_attr (char *pp)
 XMLのノード属性を解釈して,リスト(tList)にする. More...
 
int xml_parse_processing_node (char *pp, char **node_name, char **node_attr)
 XMLのプロセッシングノードを処理する More...
 
int xml_parse_comment_node (char *pp, char **comment)
 XMLのコメントノードを処理する. More...
 
int xml_parse_data_node (char *pp, char **data)
 XMLのデータノード(その他エレメントノードなど)を処理する. More...
 
int isnot_xml_name (unsigned char *pp)
 XML名として不適切かどうかを大まかに判断する. More...
 
void close_xml (tXML *pp)
 パースエラーを起こしたツリーを強制的に正常化する. More...
 
Buffer xml_inverse_parse (tXML *pp, int mode)
 ppに格納された XMLデータを元の書式に戻して Bufferに格納する.xml_parse() の逆. More...
 
void _xml_to_Buffer (tXML *pp, Buffer *buf, int mode, int indent)
 xml_inverse_parse()用の補助関数. More...
 
void xml_open_node_Buffer (tXML *pp, Buffer *buf, int mode, int indent)
 ツリー中のXMLのオープンノードのデータを元の書式に戻して Bufferに格納する. More...
 
void xml_close_node_Buffer (tXML *pp, Buffer *buf, int mode, int indent)
 ツリー中のXMLのクローズノードのデータを元の書式に戻して Bufferに格納する. More...
 
void xml_attr_to_Buffer (tList *pp, Buffer *buf)
 リストに保存されたノードの属性をテキストへ戻す. More...
 
tXMLinit_xml_doc ()
 XML のドキュメントヘッダを作成する. More...
 
tXMLadd_xml_node (tXML *xml, const char *name)
 XMLツリーのxml の直下(姉妹の一番下:末っ子)にノード(属性は指定しない)を挿入する. More...
 
tXMLinsert_xml_node (tXML *xml, const char *name)
 XMLツリーのxml の直下(姉妹の一番上:長子)にノード(属性は指定しない)を挿入する. More...
 
tXMLadd_xml_content_node (tXML *xml, const char *content)
 XMLツリーのxml の直下にコンテントを挿入する. More...
 
tXMLappend_xml_content_node (tXML *xml, const char *content)
 XMLツリーのxml の直下のコンテントノードにコンテンツを追加する. More...
 
tXMLset_xml_content_node (tXML *xml, const char *content)
 XMLツリーのxml の直下のコンテントノードの値を置き換える. More...
 
int add_xml_content_area (tXML *xml, int len)
 xml に空のコンテントノードを追加する. More...
 
tXMLadd_xml_attr (tXML *xml, const char *attr)
 xml に属性(attr)を追加する. More...
 
tXMLadd_xml_attr_str (tXML *xml, const char *name, const char *value)
 xml に属性名 name, 文字列の属性値 value を持つノードを追加する. More...
 
tXMLadd_xml_attr_int (tXML *xml, const char *name, int value)
 xml に属性名 name, 整数の属性値 value を持つノードを追加する. More...
 
tXMLadd_xml_attr_float (tXML *xml, const char *name, float value)
 xml に属性名 name, float型実数の属性値 value を持つノードを追加する. More...
 
tXMLadd_xml_attr_double (tXML *xml, const char *name, double value)
 xml に属性名 name, double型実数の属性値 value を持つノードを追加する. More...
 
char * get_first_xml_nodename (tXML *xml)
 XMLツリーの最初のノードの名前を返す. More...
 
Buffer make_xml_attr_bystr (const char *name, const char *value)
 属性名 name, 文字列の属性値 value を持つ Buffer型変数を作成する. More...
 
Buffer make_xml_attr_byint (const char *name, int value)
 属性名 name, 整数の属性値 value を持つ Buffer型変数を作成する. More...
 
Buffer make_xml_attr_byfloat (const char *name, float value)
 属性名 name, float型実数の属性値 value を持つ Buffer型変数を作成する. More...
 
Buffer make_xml_attr_bydouble (const char *name, double value)
 属性名 name, double型実数の属性値 value を持つ Buffer型変数を作成する. More...
 
char * xml_get_node_content (tXML *node)
 コンテントへのポインタを返す.free() してはいけない. More...
 
char * xml_get_node_attr (tXML *node, const char *attr)
 属性値を持つノードのポインタから,指定された属性値へのポインタを返す.free() してはいけない. More...
 
tXMLdup_merge_xml (tXML *pp, tXML *tp)
 XMLツリー ppの直下にXMLツリー tpを複製する. More...
 
void print_xml (FILE *fp, tXML *pp, int mode)
 XMLの表示(出力). More...
 
void print_xml_node (FILE *fp, tXML *pp)
 MLのノード情報を表示する.デバッグ用. More...
 
void print_xml_tree (FILE *fp, tXML *pp, const char *space)
 XMLツリーをそのままツリー表示する.デバッグ用. More...
 
void print_sister_xml_tree (FILE *fp, tXML *pp, const char *space)
 XMLツリーの表示.ppの姉妹ノードも出力する. More...
 
tXMLget_xml_node (tXML *pp, tXML *pt)
 同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す. More...
 
int set_xml_node (tXML *pp, tXML *pt, const char *name)
 同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノード対応したノードにノード名をコピーする. More...
 
int set_xml_end_node (tXML *pp, tXML *pt)
 同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す. More...
 
tXMLget_xml_attr_node (tXML *pp, const char *key, const char *val)
 属性 key=val のノードを探し,最初に見つけたノードを返す. More...
 
tXMLget_xml_content (tXML *pp, tXML *pt)
 同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのコンテントへのポインタを altp に入れて返す. More...
 
int set_xml_content (tXML *pp, tXML *pt, const char *content)
 同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後ノードに対応したのノードのコンテントを contentで置き換える. More...
 
int get_xml_int_content (tXML *pp, tXML *pt)
 get_xml_content() を使用し,XML コンテンツの内容を int型で返す. More...
 
float get_xml_float_content (tXML *pp, tXML *pt)
 get_xml_content() を使用し,XML コンテンツの内容を float型で返す. More...
 
double get_xml_double_content (tXML *pp, tXML *pt)
 get_xml_content() を使用し,XML コンテンツの内容を double型で返す. More...
 
char * get_xml_char_content (tXML *pp, tXML *pt)
 get_xml_content() を使用し,XML コンテンツの内容を char*型で返す.free() してはいけない. More...
 
tListget_xml_attr (tXML *pp, tXML *pt)
 同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノード属性値へのリストを altp に入れて返す. More...
 
char * get_xml_char_attr (tXML *pp, tXML *pt, const char *attr)
 get_xml_node() で検索したノードから,属性値 attrの値を char*型で取り出す.free() してはいけない. More...
 
int get_xml_int_attr (tXML *pp, tXML *pt, const char *attr)
 get_xml_node() で検索したノードから,属性値 attrの値を int型で取り出す. More...
 
double get_xml_double_attr (tXML *pp, tXML *pt, const char *attr)
 get_xml_node() で検索したノードから,属性値 attrの値を double型で取り出す. More...
 
int set_xml_attr (tXML *pp, tXML *pt, tList *at)
 同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノードの属性としてatの値をコピーする. More...
 
int replace_xml_content (tXML *pp, tXML *pt, const char *src, const char *dst)
 get_xml_content() を使用し,XMLキーの src部分を dstで書き換える. More...
 
tXMLget_xml_node_bystr (tXML *pp, const char *str)
 get_xml_node(tXML* pp, tXML* pt) の _bystr バージョン More...
 
int set_xml_node_bystr (tXML *pp, const char *str, const char *val)
 set_xml_node(tXML* pp, tXML* pt, const char* val) の _bystr バージョン More...
 
int set_xml_end_node_bystr (tXML *pp, const char *str)
 set_xml_end_node(tXML* pp, tXML* pt) の _bystr バージョン More...
 
tXMLget_xml_content_bystr (tXML *pp, const char *str)
 get_xml_content(tXML* pp, tXML* pt) の _bystr バージョン More...
 
int get_xml_int_content_bystr (tXML *pp, const char *str)
 get_xml_int_content(tXML* pp, tXML* pt) の _bystr バージョン More...
 
float get_xml_float_content_bystr (tXML *pp, const char *str)
 get_xml_float_content(tXML* pp, tXML* pt) の _bystr バージョン. More...
 
double get_xml_double_content_bystr (tXML *pp, const char *str)
 get_xml_double_content(tXML* pp, tXML* pt) の _bystr バージョン. More...
 
char * get_xml_char_content_bystr (tXML *pp, const char *str)
 get_xml_char_content(tXML* pp, tXML* pt) の _bystr バージョン.free() してはいけない. More...
 
int set_xml_content_bystr (tXML *pp, const char *str, const char *val)
 set_xml_content(tXML* pp, tXML* pt, char* val) の _bystr バージョン More...
 
tListget_xml_attr_bystr (tXML *pp, const char *str)
 get_xml_attr(tXML* pp, tXML* pt, tList* at) の _bystr バージョン. More...
 
char * get_xml_char_attr_bystr (tXML *pp, const char *str, const char *attr)
 get_xml_char_attr() の _bystr バージョン.free() してはいけない. More...
 
int get_xml_int_attr_bystr (tXML *pp, const char *str, const char *attr)
 get_xml_int_attr() の _bystr バージョン. More...
 
double get_xml_double_attr_bystr (tXML *pp, const char *str, const char *attr)
 get_xml_double_attr() の _bystr バージョン. More...
 
int set_xml_attr_bystr (tXML *pp, const char *str, tList *at)
 set_xml_attr(tXML* pp, tXML* pt, tList* at) の _bystr バージョン. More...
 
int replace_xml_content_bystr (tXML *pp, const char *str, const char *src, const char *dst)
 replace_xml_content(tXML*pp, tXML* pt, char* src, char* dst) の _bystr バージョン. More...
 
tListget_xml_node_list (tXML *pp, tXML *pt)
 XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードへのポインタをリストに格納して返す. More...
 
tListget_xml_content_list (tXML *pp, tXML *pt)
 XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードのコンテントへのポインタをリストに格納して返す. More...
 
int set_xml_content_list (tXML *pp, tXML *pt, const char *content)
 get_xml_content_list() で検出したコンテントを, content で置き換える. More...
 
tListget_xml_node_list_bystr (tXML *pp, const char *str)
 get_xml_node_list() の _bystr バージョン. More...
 
tListget_xml_content_list_bystr (tXML *pp, const char *str)
 get_xml_conetnt_list_bystr() の _bystr バージョン. More...
 
int set_xml_content_list_bystr (tXML *pp, const char *str, const char *content)
 set_xml_content_list_bystr() の _bystr バージョン. More...
 
int find_match_xml (tXML *pp, tXML *pt)
 ツリー pp内で ツリー ptと同じパターンの枝を探す.姉妹ツリーも検索するので注意. More...
 
tXMLfind_match_xml_endlist (tXML *pp, tXML *pt)
 ツリー pp内で ツリー ptと同じパターンの枝を全て探して,その枝のptの最後のノードに対応するノードの情報をリストにして返す. More...
 
tList_find_match_xml_endlist_rcsv (tXML *pp, tXML *pt, tXML *te)
 find_match_xml_endlist() の補助関数 More...
 
tXMLfind_match_xml_end_node (tXML *pp, tXML *pt)
 XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptの最後のノードに対応する pp内のノードへのポインタを返す. More...
 
int check_match_xml (tXML *tp, tXML *tr)
 XMLツリー tpが XMLツリー trと同じかどうかを検査する. More...
 
tXMLcmp_sisters_xml (tXML *tp, tXML *tr)
 XMLノード tpの姉妹ノードが trの姉妹ノードと同じ XMLノードまたはコンテントであるかを比較する. More...
 
Buffer get_node_content (tXML *tp, const char *name, int no)
 tp中のXMLデータから no番目のノード '<name>node_content</name>' のnode_contentのコピーを得る. More...
 
int get_node_integer (tXML *tp, const char *name, int no)
 tp中のXMLデータから no番目のノード '<node_name>node_content(整数)</node_name>' の node_content(整数)を得る. More...
 
int return_exist_node (tXML *tp, const char *name, int no, Buffer *content)
 bufの中に ノード '<name>content</name>' が存在するかどうかチェックする. More...
 
int replace_all_node_integer (tXML *tp, const char *name, int src, int dst)
 XMLツリー pp内で ノード名が nameである全てのノードのコンテント(整数)を,srcから dstに書き換える. More...
 
int replace_all_node_contents (tXML *pp, const char *name, const char *src, const char *dst)
 XMLツリー pp内で ノード名が nameである全てのノードのコンテントを,srcから dstに書き換える. More...
 
int _replace_all_node_contents_rcsv (tXML *pp, const char *name, const char *src, const char *dst)
 replace_all_node_content() の補助関数 More...
 
int replace_all_node_byid (tXML *pp, const char *src, const char *dst, int id)
 XMLツリー pp内で ノードの種別が idである全てのノードの内容を srcから dstに書き換える. More...
 
int _replace_all_node_byid_rcsv (tXML *pp, const char *src, const char *dst, int id)
 replace_all_node_byid() の補助関数 More...
 
Buffer xml_rpc_request_pack (const char *name, tXML *xml)
 XML-RPC用のデータを生成する. More...
 
tXMLxml_rpc_add_member (tXML *xml, char *name, char *value, char *kind)
 XML-RPC の <member> データを作って,繋げていく. More...
 
tXMLxml_rpc_end_member (tXML *xml)
 <struct><member> データを閉じて,<value> データを作り出す. More...
 
tXMLxml_rpc_add_array (tXML *xml, tXML *array)
 <value><struct> データから 配列データ <data>...</data> を作って繋げていく. More...
 
tXMLxml_rpc_end_array (tXML *xml)
 配列データを閉じて,送信用データを生成する. More...
 

Detailed Description

Version
1.0
Author
Fumi.Iseki (C)
Date
2009 2/10
タイトル
サブセット版 整形式XML 簡易パーサ
Attention
全てのパターンのパース可能性は保障しない.
複雑な XMLはパースできない.
<?xml ... ?> 以外の <? ..... ?> と <! ..... > は処理しない(読み込みは行う)
エンティティは処理しない.
See also
tXML

Definition in file txml.c.

Function Documentation

◆ _find_match_xml_endlist_rcsv()

tList* _find_match_xml_endlist_rcsv ( tXML pp,
tXML pt,
tXML te 
)

tList* _find_match_xml_endlist_rcsv(tXML* pp, tXML* pt, tXML* te)

find_match_xml_endlist() の補助関数

Definition at line 2907 of file txml.c.

2908 {
2909  tList* lt = NULL;
2910  tList* lp = NULL;
2911 
2912  while(pp!=NULL) {
2913  int ret = check_match_xml(pp, pt);
2914  if (ret && te->altp!=NULL) {
2915  tList* lm = new_tList_node();
2916  lm->altp = te->altp;
2917  lt = insert_tList(lt, lm);
2918  if (lp==NULL) lp = lt;
2919  te->altp = NULL;
2920  }
2921 
2922  if (pp->next!=NULL) {
2923  tList* lm = _find_match_xml_endlist_rcsv(pp->next, pt, te);
2924  if (lm!=NULL) {
2925  lt = insert_tList(lt, lm);
2926  if (lp==NULL) lp = lt;
2927  _clear_tTree_ctrl(pp->next);
2928  }
2929  }
2930 
2931  if (!ret) pp = pp->ysis; // 見つかった場合はもう一度.見つからなかった場合へ次へ.
2932  }
2933 
2934  return lp;
2935 }
tList * new_tList_node(void)
リスト用の空ノードを動的に生成する.
Definition: tlist.c:198
tList * insert_tList(tList *pp, tList *pt)
ノードppの直ぐ後ろに ptを挿入する.
Definition: tlist.c:903
void _clear_tTree_ctrl(tTree *pp)
ppツリーの ctrlをクリアする.
Definition: ttree.c:1420
tList * _find_match_xml_endlist_rcsv(tXML *pp, tXML *pt, tXML *te)
find_match_xml_endlist() の補助関数
Definition: txml.c:2907
int check_match_xml(tXML *tp, tXML *tr)
XMLツリー tpが XMLツリー trと同じかどうかを検査する.
Definition: txml.c:2991

References _clear_tTree_ctrl(), check_match_xml(), insert_tList(), and new_tList_node().

Referenced by find_match_xml_endlist().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _replace_all_node_byid_rcsv()

int _replace_all_node_byid_rcsv ( tXML pp,
const char *  src,
const char *  dst,
int  id 
)

int _replace_all_node_byid_rcsv(tXML* pp, const char* src, const char* dst, int id)

replace_all_node_byid() の補助関数

Definition at line 3314 of file txml.c.

3315 {
3316  int n = 0;
3317 
3318  while(pp!=NULL) {
3319  if (id<0 || pp->ldat.id==id) {
3320  if (src==NULL) {
3321  copy_s2Buffer(dst, &(pp->ldat.key));
3322  n++;
3323  }
3324  else if (pp->ldat.key.buf!=NULL && strstr((const char*)pp->ldat.key.buf, src)!=NULL) {
3325  Buffer buf = replace_sBuffer_bystr(pp->ldat.key, src, dst);
3326  free_Buffer(&(pp->ldat.key));
3327  pp->ldat.key = buf;
3328  n++;
3329  }
3330  }
3331 
3332  if (pp->next!=NULL) n += _replace_all_node_byid_rcsv(pp->next, src, dst, id);
3333 
3334  pp = pp->ysis;
3335  }
3336 
3337  return n;
3338 }
Buffer replace_sBuffer_bystr(Buffer buf, const char *frm, const char *tos)
buf.buf中の文字列 frmを tosで置き換えた 新しい Bufferを返す
Definition: buffer.c:1603
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Definition: buffer.c:128
#define copy_s2Buffer(src, dst)
copy_b2Buffer()
Definition: buffer.h:108
unsigned char ** buf
Definition: jpeg_tool.h:96
Definition: buffer.h:35
int _replace_all_node_byid_rcsv(tXML *pp, const char *src, const char *dst, int id)
replace_all_node_byid() の補助関数
Definition: txml.c:3314

References buf, copy_s2Buffer, free_Buffer(), and replace_sBuffer_bystr().

Referenced by replace_all_node_byid().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _replace_all_node_contents_rcsv()

int _replace_all_node_contents_rcsv ( tXML pp,
const char *  name,
const char *  src,
const char *  dst 
)

int _replace_all_node_contents_rcsv(tXML* pp, const char* name, const char* src, const char* dst)

replace_all_node_content() の補助関数

Definition at line 3242 of file txml.c.

3243 {
3244  int n = 0;
3245 
3246  while(pp!=NULL) {
3247  if (pp->ldat.key.buf!=NULL && pp->ldat.id==XML_NAME_NODE && pp->ldat.lv>0) {
3248  if (name==NULL || !strcmp(name, (const char*)(pp->ldat.key.buf))) {
3249  tXML* tt = pp->next;
3250 
3251  // 複数のコンテント
3252  while (tt!=NULL) {
3253  if (tt->ldat.id==XML_CONTENT_NODE) {
3254  if (src==NULL) {
3255  copy_s2Buffer(dst, &(tt->ldat.key));
3256  n++;
3257  }
3258  else if (tt->ldat.key.buf!=NULL && strstr((const char*)tt->ldat.key.buf, src)!=NULL) {
3259  Buffer buf = replace_sBuffer_bystr(tt->ldat.key, src, dst);
3260  free_Buffer(&(tt->ldat.key));
3261  tt->ldat.key = buf;
3262  n++;
3263  }
3264  }
3265  tt = tt->ysis;
3266  }
3267  }
3268  }
3269 
3270  if (pp->next!=NULL) n += _replace_all_node_contents_rcsv(pp->next, name, src, dst);
3271 
3272  pp = pp->ysis;
3273  }
3274 
3275  return n;
3276 }
int _replace_all_node_contents_rcsv(tXML *pp, const char *name, const char *src, const char *dst)
replace_all_node_content() の補助関数
Definition: txml.c:3242
#define XML_CONTENT_NODE
内容(コンテント)ノード
Definition: txml.h:110
#define XML_NAME_NODE
ネームノード
Definition: txml.h:109

References buf, copy_s2Buffer, free_Buffer(), replace_sBuffer_bystr(), XML_CONTENT_NODE, and XML_NAME_NODE.

Referenced by replace_all_node_contents().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ _xml_to_Buffer()

void _xml_to_Buffer ( tXML pp,
Buffer buf,
int  mode,
int  indent 
)

void _xml_to_Buffer(tXML* pp, Buffer* buf, int mode, int indent)

xml_inverse_parse()用の補助関数. ppに格納された XMLデータを元の書式に戻して Bufferに格納する.

Parameters
ppXMLデータの格納されたツリーへのポインタ
buf変換したXMLデータを格納する Buffer変数.データ格納領域は予め確保しておく.
mode元のXMLへ戻す時の書式
modeXML_ONELINE_FORMAT 改行なしの一行にする.
modeXML_CRLF_FORMAT ノードの終わりを CR(0x0d), LF(0x0a)で改行する.
modeXML_TAB_FORMAT 先頭にインデント(TAB)をつけ,ノードごとに改行する.
modeXML_SPACE_FORMAT 先頭に空白2つをつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
modeXML_SPACE4_FORMAT 先頭に空白4つをつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
indentインデントを付け始める深さ.modeが XML_INDENT_MODE のときのみ有効.

Definition at line 928 of file txml.c.

929 {
930  do {
931  xml_open_node_Buffer(pp, buf, mode, indent);
932  if (pp->next!=NULL) {
933  _xml_to_Buffer(pp->next, buf, mode, indent);
934  xml_close_node_Buffer(pp, buf, mode, indent);
935  }
936 
937  pp = pp->ysis;
938  } while(pp!=NULL);
939  return;
940 }
void _xml_to_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
xml_inverse_parse()用の補助関数.
Definition: txml.c:928
void xml_close_node_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
ツリー中のXMLのクローズノードのデータを元の書式に戻して Bufferに格納する.
Definition: txml.c:1144
void xml_open_node_Buffer(tXML *pp, Buffer *buf, int mode, int indent)
ツリー中のXMLのオープンノードのデータを元の書式に戻して Bufferに格納する.
Definition: txml.c:958

References buf, xml_close_node_Buffer(), and xml_open_node_Buffer().

Referenced by xml_inverse_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_xml_attr()

tXML* add_xml_attr ( tXML xml,
const char *  attr 
)

tXML* add_xml_attr(tXML* xml, const char* attr)

xml に属性ノード(attr)を追加する.

Definition at line 1401 of file txml.c.

1402 {
1403  if (xml==NULL || attr==NULL) return NULL;
1404  if (xml->ldat.id!=XML_NAME_NODE) return NULL;
1405 
1406  tList* lp = xml_parse_attr((char*)attr);
1407 
1408  if (xml->ldat.lst==NULL) xml->ldat.lst = lp;
1409  else add_tList_end(xml->ldat.lst, lp);
1410 
1411  return xml;
1412 }
tList * add_tList_end(tList *pp, tList *pt)
リストppの最後に リストptを追加する.
Definition: tlist.c:877
tList * xml_parse_attr(char *pp)
XMLのノード属性を解釈して,リスト(tList)にする.
Definition: txml.c:559

References add_tList_end(), XML_NAME_NODE, and xml_parse_attr().

Referenced by add_xml_attr_double(), add_xml_attr_float(), add_xml_attr_int(), and add_xml_attr_str().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_xml_attr_double()

tXML* add_xml_attr_double ( tXML xml,
const char *  name,
double  value 
)

tXML* add_xml_attr_double(tXML* xml, const char* name, double value)

xml に属性名 name, double型実数の属性値 value を持つノードを追加する.

Definition at line 1471 of file txml.c.

1472 {
1473  if (xml==NULL || name==NULL) return NULL;
1474  //
1475  Buffer attr = make_xml_attr_double(name, value);
1476  add_xml_attr(xml, (char*)attr.buf);
1477  free_Buffer(&attr);
1478 
1479  return xml;
1480 }
unsigned char * buf
バッファの先頭へのポインタ.str[bufsz]は必ず 0x00となる.
Definition: buffer.h:39
tXML * add_xml_attr(tXML *xml, const char *attr)
xml に属性(attr)を追加する.
Definition: txml.c:1401
#define make_xml_attr_double(n, v)
make_xml_attr_bydouble()
Definition: txml.h:195

References add_xml_attr(), Buffer::buf, free_Buffer(), and make_xml_attr_double.

Here is the call graph for this function:

◆ add_xml_attr_float()

tXML* add_xml_attr_float ( tXML xml,
const char *  name,
float  value 
)

tXML* add_xml_attr_float(tXML* xml, const char* name, float value)

xml に属性名 name, float型実数の属性値 value を持つノードを追加する.

Definition at line 1454 of file txml.c.

1455 {
1456  if (xml==NULL || name==NULL) return NULL;
1457  //
1458  Buffer attr = make_xml_attr_float(name, value);
1459  add_xml_attr(xml, (char*)attr.buf);
1460  free_Buffer(&attr);
1461 
1462  return xml;
1463 }
#define make_xml_attr_float(n, v)
make_xml_attr_byfloat()
Definition: txml.h:194

References add_xml_attr(), Buffer::buf, free_Buffer(), and make_xml_attr_float.

Here is the call graph for this function:

◆ add_xml_attr_int()

tXML* add_xml_attr_int ( tXML xml,
const char *  name,
int  value 
)

tXML* add_xml_attr_int(tXML* xml, const char* name, int value)

xml に属性名 name, 整数の属性値 value を持つノードを追加する.

Definition at line 1437 of file txml.c.

1438 {
1439  if (xml==NULL || name==NULL) return NULL;
1440  //
1441  Buffer attr = make_xml_attr_int(name, value);
1442  add_xml_attr(xml, (char*)attr.buf);
1443  free_Buffer(&attr);
1444 
1445  return xml;
1446 }
#define make_xml_attr_int(n, v)
make_xml_attr_byint()
Definition: txml.h:193

References add_xml_attr(), Buffer::buf, free_Buffer(), and make_xml_attr_int.

Here is the call graph for this function:

◆ add_xml_attr_str()

tXML* add_xml_attr_str ( tXML xml,
const char *  name,
const char *  value 
)

tXML* add_xml_attr_str(tXML* xml, const char* name, const char* value)

xml に属性名 name, 文字列の属性値 value を持つノードを追加する.

Definition at line 1420 of file txml.c.

1421 {
1422  if (xml==NULL || name==NULL) return NULL;
1423 
1424  Buffer attr = make_xml_attr_str(name, value);
1425  add_xml_attr(xml, (char*)attr.buf);
1426  free_Buffer(&attr);
1427 
1428  return xml;
1429 }
#define make_xml_attr_str(n, v)
make_xml_attr_bystr()
Definition: txml.h:192

References add_xml_attr(), Buffer::buf, free_Buffer(), and make_xml_attr_str.

Here is the call graph for this function:

◆ add_xml_content_area()

int add_xml_content_area ( tXML xml,
int  len 
)

int add_xml_content_area(tXML* xml, int len)

xml に空のコンテントノードを追加する.

Parameters
xmlコンテントノードを追加するノード.
lenコンテンツノードの大きさ(バイト)
Returns
TRUE: 成功,FALSE: 失敗

Definition at line 1376 of file txml.c.

1377 {
1378  if (xml==NULL || len<=0) return FALSE;
1379 
1380  char* area = (char*)malloc(len);
1381  if (area==NULL) return FALSE;
1382  memset(area, (int)' ', len-1);
1383  area[len-1] = '\0';
1384 
1385  tXML* pp = add_xml_content_node(xml, area);
1386  if (pp!=NULL) {
1387  pp->ldat.key.buf[0] = '\0';
1388  pp->ldat.key.vldsz = 0;
1389  }
1390  free(area);
1391 
1392  return TRUE;
1393 }
#define TRUE
Definition: common.h:226
#define FALSE
Definition: common.h:223
unsigned char unsigned long * len
Definition: jpeg_tool.h:96
tXML * add_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下にコンテントを挿入する.
Definition: txml.c:1287

References add_xml_content_node(), FALSE, len, and TRUE.

Here is the call graph for this function:

◆ add_xml_content_node()

tXML* add_xml_content_node ( tXML xml,
const char *  content 
)

tXML* add_xml_content_node(tXML* xml, const char* content)

xml が指すノード名ノードに コンテンツノードを追加する.
コンテントノードが既に存在する場合は,妹ノードとしてコンテントノードが追加される. (逆パースした場合は,コンテンツが改行と共に追加されたように見える)
xml はノード名ノードでなければエラー(NULLが返る) .
コンテント xxxx が存在する状態で,1111を add した場合.

-> 7: 1 [703] matrix (1) attr --> sid="transform"
-> 8: 2 [703] xxxx (0)
-> 8: 2 [703] 1111 (0)
Definition: matrix.h:68

これを逆パースした場合

<matrix sid="transform">
xxxx
1111

ちょっと変. 既にコンテントノードが存在するなら,append_xml_content_node() か set_xml_content_node() を使用することを推奨.

Parameters
xmlコンテントを設定する ノード名ノード.
content設定する コンテント.
Return values
追加したコンテントノードへのポインタ.

Definition at line 1287 of file txml.c.

1288 {
1289  tList* pp;
1290 
1291  if (xml==NULL || content==NULL) return NULL;
1292  if (xml->ldat.id!=XML_NAME_NODE) return NULL;
1293 
1294  pp = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, content, NULL, NULL, 0);
1295  pp->state = JBXL_XML_NODE_CLOSED;
1296  if (pp->prev!=NULL) pp->prev->ldat.lv++;
1297 
1298  return pp;
1299 }
#define JBXL_XML_NODE_CLOSED
XMLノードは閉じている
Definition: jbxl_state.h:95
tTree * add_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを末っ子としてリストに追加.
Definition: ttree.c:202

References add_tTree_node_bystr(), JBXL_XML_NODE_CLOSED, XML_CONTENT_NODE, and XML_NAME_NODE.

Referenced by add_xml_content_area(), append_xml_content_node(), get_xml_content(), get_xml_content_list(), set_xml_content_node(), xml_rpc_add_member(), and xml_rpc_request_pack().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_xml_node()

tXML* add_xml_node ( tXML xml,
const char *  name 
)

tXML* add_xml_node(tXML* xml, const char* name)

XMLツリーのxml の直下(姉妹の一番下:末っ子)にノード(属性は指定しない)を挿入する.

Parameters
xml挿入するポイント
name挿入するノードの名前
Returns
挿入したノードへのポインタ

Definition at line 1219 of file txml.c.

1220 {
1221  tXML* pp;
1222 
1223  if (name==NULL) return NULL;
1224 
1225  pp = add_tTree_node_bystr(xml, XML_NAME_NODE, 0, name, NULL, NULL, 0);
1226  pp->state = JBXL_XML_NODE_EMPTY;
1227  if (pp->prev!=NULL) pp->prev->ldat.lv++;
1228 
1229  return pp;
1230 }
#define JBXL_XML_NODE_EMPTY
XMLの空のノード
Definition: jbxl_state.h:96

References add_tTree_node_bystr(), JBXL_XML_NODE_EMPTY, and XML_NAME_NODE.

Referenced by xml_rpc_add_array(), xml_rpc_add_member(), xml_rpc_end_array(), xml_rpc_end_member(), and xml_rpc_request_pack().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_xml_content_node()

tXML* append_xml_content_node ( tXML xml,
const char *  content 
)

tXML* append_xml_content_node(tXML* xml, const char* content)

XMLツリーのxml の直下のコンテントノードのコンテントにコンテンツを追加する.
コンテントノードが無ければ,add_xml_content_node() でコンテントノードを追加する.
xmlがノード名ノードでなければエラー(NULLが返る) .

Parameters
xmlコンテントを設定する コンテントノード.このノードはノード名ノードでなければならない.
content設定する コンテント.
Return values
追加したコンテントノードへのポインタ.

Definition at line 1313 of file txml.c.

1314 {
1315  tList* pp;
1316 
1317  if (xml==NULL || content==NULL) return NULL;
1318  if (xml->ldat.id!=XML_NAME_NODE) return NULL;
1319 
1320  pp = xml->next;
1321  while (pp!=NULL && pp->ldat.id!=XML_CONTENT_NODE) pp = pp->ysis;
1322 
1323  if (pp==NULL) {
1324  pp = add_xml_content_node(xml, content);
1325  }
1326  else {
1327  if (pp->ldat.key.vldsz!=0) cat_s2Buffer(" ", &(pp->ldat.key));
1328  cat_s2Buffer(content, &(pp->ldat.key));
1329  }
1330 
1331  return pp;
1332 }
#define cat_s2Buffer(src, dst)
cat_b2Buffer()
Definition: buffer.h:122

References add_xml_content_node(), cat_s2Buffer, XML_CONTENT_NODE, and XML_NAME_NODE.

Here is the call graph for this function:

◆ check_match_xml()

int check_match_xml ( tXML tp,
tXML tr 
)

int check_match_xml(tXML* tp, tXML* tr)

XMLツリー tpが XMLツリー trと同じかどうかを検査する.

tp のトップと tr のトップはキー値が一致している必要がある.一致していなければ,同じパターンは無しとする.
ただし,tr->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).

一度見つけた tpの枝の最後のノードに対しては ctrlを TREE_ALREADY_FOUND_NODE を設定するので,続けてチェックする 場合などは ctrl をクリアする必要がある.

もし同じツリーパターンがある場合,trの各ノードの altpには,一番最初に見つかった対応する tpの各ノードへのポインタが格納される.

Parameters
tp検索対象のツリー
tr検索パターンのツリー
Return values
TRUEtp中に trと同じいツリーパターンが存在する.
TRUEtrの各ノードの altpには,一番最初に見つかった対応する tpの各ノードへのポインタが格納される.
FALSEtpに同じツリーパターンは無い.この場合,trの altpの値は不定となる.

Definition at line 2991 of file txml.c.

2992 {
2993  int ret;
2994  tXML* te;
2995  tXML* ts;
2996 
2997  tXML* tt;
2998  tXML* ta;
2999  tXML* tb;
3000 
3001  if (tp==NULL || tr==NULL) return FALSE;
3002 
3003  te = find_tList_end(tr);
3004 
3005  ts = tp;
3006  while (ts!=NULL) {
3007  tt = cmp_sisters_xml(ts, tr); // その階層で trと全て一致している部分があるかを確認
3008  if (tt==NULL) return FALSE; // 一致していなければ,FALSE
3009 
3010  ta = tt; // 比べられるツリー
3011  tb = tr; // 比べるパターン
3012  ret = TRUE;
3013  while (tb!=NULL && ret) {
3014  if (tb->next==NULL) ret = TRUE;
3015  // ->ta, ->tb->tx: FALSE
3016  else if (tb->next!=NULL && ta->next==NULL) ret = FALSE;
3017  // ->ta->xa, ->tb->xb: xaとxbをチェック
3018  else ret = check_match_xml(ta->next, tb->next);
3019 
3020  ta = ta->ysis;
3021  tb = tb->ysis;
3022  }
3023 
3024  if (ret) {
3025  if (tr==te) tt->ctrl = TREE_ALREADY_FOUND_NODE;
3026  return TRUE;
3027  }
3028 
3029  ts = tt->ysis;
3030  }
3031 
3032  return FALSE;
3033 }
tList * find_tList_end(tList *pl)
リストの最後のノードを探す.
Definition: tlist.c:1023
#define TREE_ALREADY_FOUND_NODE
検索などにおいて既に見つけたノード.見つけたことを確定したノード.
Definition: ttree.h:59
tXML * cmp_sisters_xml(tXML *tp, tXML *tr)
XMLノード tpの姉妹ノードが trの姉妹ノードと同じ XMLノードまたはコンテントであるかを比較する.
Definition: txml.c:3068

References cmp_sisters_xml(), FALSE, find_tList_end(), TREE_ALREADY_FOUND_NODE, and TRUE.

Referenced by _find_match_xml_endlist_rcsv(), and find_match_xml().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ close_xml()

void close_xml ( tXML pp)

void close_xml(tXML* pp)

パースエラーを起こしたツリーを強制的に正常化する.

Parameters
pp正常化するツリーへのポインタ.

Definition at line 836 of file txml.c.

837 {
838  if (pp!=NULL) {
839 
840  // アンカー
841  if (pp->ldat.id==XML_ANCHOR_NODE) {
842  pp->state = JBXL_XML_PARSED;
843  pp->depth = -1;
844  if (pp->next!=NULL) {
845  pp->next->depth = 0;
846  adjust_tTree_depth(pp->next);
847  close_xml(pp->next);
848  }
849  return;
850  }
851 
852  while(pp->esis!=NULL) pp = pp->esis;
853  do {
854  if (pp->next==NULL) pp->state = JBXL_XML_NODE_EMPTY;
855  //
856  if (pp->state!=JBXL_XML_NODE_EMPTY) pp->state = JBXL_XML_NODE_CLOSED;
857  //if (pp->ldat.lst!=NULL) {
858  // if ((pp->ldat.lst)->state!=JBXL_XML_NODE_EMPTY) (pp->ldat.lst)->state = JBXL_XML_NODE_CLOSED;
859  //}
860  //
861  if (pp->next!=NULL) close_xml(pp->next);
862 
863  pp = pp->ysis;
864  } while(pp!=NULL);
865  }
866  return;
867 }
#define JBXL_XML_PARSED
XMLパース済み
Definition: jbxl_state.h:92
void adjust_tTree_depth(tTree *pp)
指定したノード ppを基準にして,木の深さを測り直す
Definition: ttree.c:1016
void close_xml(tXML *pp)
パースエラーを起こしたツリーを強制的に正常化する.
Definition: txml.c:836
#define XML_ANCHOR_NODE
アンカーノード
Definition: txml.h:108

References adjust_tTree_depth(), JBXL_XML_NODE_CLOSED, JBXL_XML_NODE_EMPTY, JBXL_XML_PARSED, and XML_ANCHOR_NODE.

Here is the call graph for this function:

◆ cmp_sisters_xml()

tXML* cmp_sisters_xml ( tXML tp,
tXML tr 
)

tXML* cmp_sisters_xml(tXML* tp, tXML* tr)

XMLノード tpの姉妹ノードが trの姉妹ノードと同じ XMLノードまたはコンテントであるかを比較する.

ただし,tr->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).
また tp->ctrl が TREE_ALREADY_FOUND_NODE の場合は,常に一致しない.

もし同じノードパターンがある場合,trの各ノードの altpには対応する tpの各ノードへのポインタが格納される.
また tpの各ノードの ctrlには TREE_ALREADY_FOUND_NODE が設定される.

Parameters
tp比べる姉妹ノードの長女ノード
tr探す姉妹ノードパターンの長女ノード
Returns
tp中で trと同じパターンが始まるノードへのポインタ. trの各ノードの altpには対応する tpの各ノードへのポインタが格納される.
Return values
NULLtpに同じ姉妹パターンは無い.
以下の場合,cmp_sisters_xml(tp, tr) は (3)へのポインタを返す.
また trの Aノードの altp には (3) へのポインタが,trの Xノードのaltpには(4)へのポインタが格納される.
最初に見つかったパターンのみ評価される.
tp tr
--> A (1) --> A A, B, X は キー値(ldat.key.buf)
--> B (2) --> X
--> A (3)
--> X (4)
--> A (5)
--> X (6)

Definition at line 3068 of file txml.c.

3069 {
3070  tXML* ta;
3071  tXML* tb = NULL;
3072  tXML* ts;
3073 
3074  ts = tp;
3075  while (ts!=NULL){
3076  ta = ts;
3077  tb = tr;
3078  while (ta!=NULL && tb!=NULL) {
3079  // 一致しない場合 break
3080  if (ta->ctrl==TREE_ALREADY_FOUND_NODE) break;
3081  if (tb->ctrl!=TREE_NOCMP_NODE && tb->ctrl!=TREE_NOCMP_COPY_NODE) {
3082  if ((ta->ldat).key.buf!=NULL && (tb->ldat).key.buf!=NULL) {
3083  if (ta->ldat.id!=tb->ldat.id || strcmp((char*)((ta->ldat).key.buf), (char*)((tb->ldat).key.buf))) break;
3084  }
3085  else break;
3086  }
3087 
3088  // ta と tb は一致
3089  tb->altp = ta;
3090  ta = ta->ysis;
3091  tb = tb->ysis;
3092  }
3093 
3094  // ts と tr は完全に一致
3095  if (tb==NULL) return ts;
3096 
3097  ts = ts->ysis;
3098  }
3099 
3100  return NULL;
3101 }
#define TREE_NOCMP_NODE
比較対照から外すノード.通常は無条件で一致させる.
Definition: ttree.h:53
#define TREE_NOCMP_COPY_NODE
比較対照から外し,最後にコピー処理を行うノード.通常は無条件で一致させる.
Definition: ttree.h:54

References TREE_ALREADY_FOUND_NODE, TREE_NOCMP_COPY_NODE, and TREE_NOCMP_NODE.

Referenced by check_match_xml().

Here is the caller graph for this function:

◆ dup_merge_xml()

tXML* dup_merge_xml ( tXML pp,
tXML tp 
)

tXML* dup_merge_xml(tXML* pp, tXML* tp)

XMLツリー ppの直下に(Yunger Sister として)XMLツリー tpを複製する.

Parameters
pp複製されたツリーのトップとなるノード
tp複製するツリー
Returns
複製された XMLツリーへのポインタ.
pp がNULLでない場合は pp.pp がNULLの場合は,tpを複製したツリーのトップ.

Definition at line 1632 of file txml.c.

1633 {
1634  if (tp==NULL) return pp;
1635 
1636  if (tp->ldat.id==XML_ANCHOR_NODE) {
1637  if (tp->next!=NULL) tp = tp->next;
1638  else return pp;
1639  }
1640 
1641  pp = dup_merge_tTree(pp, tp);
1642 
1643 /*
1644  tXML* pt;
1645  if (pp->ldat.id!=XML_ANCHOR_NODE) {
1646  pt = new_tTree_node();
1647  pt->ldat.id = XML_ANCHOR_NODE;
1648  pt->depth = -1;
1649  add_tTree(pt, pp);
1650  close_xml(pt);
1651  return pt;
1652  }
1653 */
1654  return pp;
1655 }
tTree * dup_merge_tTree(tTree *pp, tTree *tp)
ツリー ppの直下にツリー tpを複製する.
Definition: ttree.c:858

References dup_merge_tTree(), and XML_ANCHOR_NODE.

Here is the call graph for this function:

◆ find_match_xml()

int find_match_xml ( tXML pp,
tXML pt 
)

int find_match_xml(tXML* pp, tXML* pt)

ツリー pp内で ツリー ptと同じパターンの枝を探す.姉妹ツリーも検索する.

同じパターンの探索では キー値のみを比較し,ノード値は比較しない.
ただし,pt->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).

もし同じツリーパターンがある場合,trの各ノードの altpには,一番最初に見つかった対応する ppの各ノードへ のポインタが格納される.

get_xml_node() との違い.

check_match_xml() との違い.

Parameters
pp検索対象のツリー.姉妹ツリーも検索する.
pt検索パターンのツリー
Return values
TRUEpp中に pt同じいツリーパターンが存在する. ptの各ノードの altpには,一番最初に見つかった対応する ppの各ノードへのポインタが格納される.
FALSEppに同じツリーパターンは無い.この場合,ptのaltpの値は不定となる.

Definition at line 2848 of file txml.c.

2849 {
2850  int ret;
2851  tXML* pm;
2852 
2853  pm = pp;
2854  while(pp!=NULL) {
2855  ret = check_match_xml(pp, pt);
2856  if (ret) return TRUE;
2857 
2858  if (pp->next!=NULL) {
2859  ret = find_match_xml(pp->next, pt);
2860  if (ret) {
2861  _clear_tTree_ctrl(pm);
2862  return TRUE;
2863  }
2864  }
2865  pp = pp->ysis;
2866  }
2867 
2868  return FALSE;
2869 }
int find_match_xml(tXML *pp, tXML *pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.姉妹ツリーも検索するので注意.
Definition: txml.c:2848

References _clear_tTree_ctrl(), check_match_xml(), FALSE, and TRUE.

Referenced by get_xml_content(), get_xml_node(), and set_xml_end_node().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_match_xml_end_node()

tXML* find_match_xml_end_node ( tXML pp,
tXML pt 
)

tXML* find_match_xml_end_node(tXML* pp, tXML* pt)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptの最後のノードに対応する pp内のノードへのポインタを返す.
ノードは ノード名,コンテントのどちらでも可.

Parameters
pp検索対象のXML
pt検索パターンの文字列.
Returns
strの最後のノードに対応する pp内のノード.

Definition at line 2948 of file txml.c.

2949 {
2950  int ret;
2951  tXML* tt = NULL;
2952  tXML* pm;
2953 
2954  if (pp==NULL || pt==NULL) return NULL;
2955 
2956  pm = pp;
2957  ret = find_match_tTree(pp, pt);
2958  if (ret) {
2959  tt = find_xml_end(pt);
2960  if (tt!=NULL) {
2961  tt = tt->altp;
2962  }
2963  }
2964 
2965  _clear_tTree_ctrl(pm);
2966 
2967  return tt;
2968 }
int find_match_tTree(tTree *pp, tTree *pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.
Definition: ttree.c:1390
#define find_xml_end(p)
find_tTree_end()
Definition: txml.h:159

References _clear_tTree_ctrl(), find_match_tTree(), and find_xml_end.

Here is the call graph for this function:

◆ find_match_xml_endlist()

tXML* find_match_xml_endlist ( tXML pp,
tXML pt 
)

tXML* find_match_xml_endlist(tXML* pp, tXML* pt)

ツリー pp内で ツリー ptと同じパターンの枝を全て探して,その枝のptの最後のノードに対応するノードの情報をリストにして返す.
該当ノードへのポインタは 返された各リストのaltp が保持している.

比較では キー値のみを比較し,ノード値は比較しない.
また,pt->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).

Parameters
pp検索対象のツリー.姉妹ツリーも検索する.
pt検索パターンのツリー
Returns
該当ノードへのポインタを保持するリスト.

Definition at line 2886 of file txml.c.

2887 {
2888  tXML* te;
2889  tList* lp;
2890 
2891  te = find_xml_end(pt);
2892  while(pp->esis!=NULL) pp = pp->esis;
2893 
2894  lp = _find_match_xml_endlist_rcsv(pp, pt, te);
2895  if (lp!=NULL) _clear_tTree_ctrl(pp);
2896 
2897  return lp;
2898 }

References _clear_tTree_ctrl(), _find_match_xml_endlist_rcsv(), and find_xml_end.

Referenced by get_xml_content_list(), and get_xml_node_list().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_first_xml_nodename()

char* get_first_xml_nodename ( tXML xml)

char* get_first_xml_nodename(tXML* xml)

XMLツリーの最初のノードの名前を返す.

Parameters
xmlXMLツリー
Returns
XMLツリーの最初のノードの名前.free() してはいけない.

Definition at line 1491 of file txml.c.

1492 {
1493  char* nodename = NULL;
1494 
1495  if (xml==NULL) return NULL;
1496  tList* lp = xml;
1497  if (lp->ldat.id==XML_ANCHOR_NODE) lp = lp->next;
1498 
1499  while (lp!=NULL) {
1500  if (lp->ldat.id==XML_NAME_NODE) {
1501  if (lp->ldat.key.buf!=NULL) {
1502  nodename = (char*)lp->ldat.key.buf;
1503  break;
1504  }
1505  }
1506  lp = lp->ysis;
1507  }
1508  return nodename;
1509 }

References XML_ANCHOR_NODE, and XML_NAME_NODE.

◆ get_node_content()

Buffer get_node_content ( tXML tp,
const char *  name,
int  no 
)

Buffer get_node_content(tXML* tp, const char* name, int no)

tp 中のXMLデータから no番目のノード '<name>node_content</name>' のnode_contentのコピーを得る.
ノードが複数のコンテントを持つ場合は,最初のコンテントのみを返す.

Parameters
tp探索を行う XMLデータ
nameノード名
no一致した物の中で何番目の物を返すか指定する.1から数える.

Definition at line 3119 of file txml.c.

3120 {
3121  Buffer content;
3122  tXML* tt;
3123 
3124  content = init_Buffer();
3125  if (tp==NULL || name==NULL) return content;
3126 
3127  if (no<=0) no = 1;
3128  tt = strncmp_tTree(tp, name, 0, no);
3129  if (tt!=NULL) {
3130  if (tt->next!=NULL) {
3131  tt = tt->next;
3132  while (tt!=NULL && tt->ldat.id!=XML_CONTENT_NODE) tt = tt->ysis;
3133  if (tt==NULL) return content;
3134  content = dup_Buffer(tt->ldat.key);
3135  }
3136  }
3137 
3138  return content;
3139 }
Buffer init_Buffer()
初期化したBuffer型変数を返す.
Definition: buffer.c:47
Buffer dup_Buffer(Buffer buf)
Buffer型変数のコピーをつくる.
Definition: buffer.c:211
tTree * strncmp_tTree(tTree *pp, const char *key, int len, int no)
ツリーノードのキー値のサーチ
Definition: ttree.c:1190

References dup_Buffer(), init_Buffer(), strncmp_tTree(), and XML_CONTENT_NODE.

Referenced by get_node_integer(), and return_exist_node().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_node_integer()

int get_node_integer ( tXML tp,
const char *  name,
int  no 
)

int get_node_integer(tXML* tp, const char* name, int no)

tp中のXMLデータから no番目のノード '<node_name>node_content(整数)</node_name>' の node_content(整数)を得る.

Definition at line 3147 of file txml.c.

3148 {
3149  int ret;
3150  Buffer content;
3151 
3152  content = get_node_content(tp, name, no);
3153 
3154  if (content.buf==NULL) ret = 0;
3155  else ret = atoi((const char*)content.buf);
3156  free_Buffer(&content);
3157 
3158  return ret;
3159 }
Buffer get_node_content(tXML *tp, const char *name, int no)
tp中のXMLデータから no番目のノード '<name>node_content</name>' のnode_contentのコピーを得る.
Definition: txml.c:3119

References Buffer::buf, free_Buffer(), and get_node_content().

Here is the call graph for this function:

◆ get_xml_attr()

tList* get_xml_attr ( tXML pp,
tXML pt 
)

tList* get_xml_attr(tXML* pp, tXML* pt)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後のノードに対応したノードのノード属性値へのリストを返す.
pp の姉妹ツリーも検索する.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは 比較されない.これらのノードは必ず一致する.

Parameters
pp検索対象のツリー.姉妹ツリーも検索する.
pt検索するパターン
Returns
ptの最後のノード対応にする,ppのノードの属性値(リスト)

Definition at line 2207 of file txml.c.

2208 {
2209  tList* lp = NULL;
2210  tXML* tt;
2211 
2212  if (pp==NULL || pt==NULL) return NULL;
2213 
2214  tt = get_xml_node(pp, pt);
2215  if (tt!=NULL) lp = tt->ldat.lst;
2216  return lp;
2217 }
tXML * get_xml_node(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す.
Definition: txml.c:1874

References get_xml_node().

Referenced by get_xml_attr_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_attr_bystr()

tList* get_xml_attr_bystr ( tXML pp,
const char *  str 
)

tList* get_xml_attr_bystr(tXML* pp, const char* str)

get_xml_attr(tXML* pp, tXML* pt) の _bystr バージョン

Definition at line 2513 of file txml.c.

2514 {
2515  tXML* tx;
2516  tList* tt;
2517 
2518  if (pp==NULL || str==NULL) return NULL;
2519 
2520  tx = xml_parse((char*)str);
2521  tt = get_xml_attr(pp, tx);
2522  del_all_xml(&tx);
2523  return tt;
2524 }
tList * get_xml_attr(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノード属性値へのリストを altp に入れて返す.
Definition: txml.c:2207
tXML * xml_parse(char *pp)
文字列のXMLデータを解釈して,tXMLのツリーを生成する.
Definition: txml.c:48
#define del_all_xml(p)
XMLツリーの全ノードの削除.ポインタ ppのノードを含むXMLツリー全体を削除する.
Definition: txml.h:205

References del_all_xml, get_xml_attr(), and xml_parse().

Here is the call graph for this function:

◆ get_xml_attr_node()

tXML* get_xml_attr_node ( tXML pp,
const char *  key,
const char *  val 
)

tXML* get_xml_attr_node(tXML* pp, char* key, char* val)

XMLツリー pp内で 属性が key = val であるのノードを探し,最初に見つけたノードへのポインタを返す.
pp の姉妹ツリーも検索する.
また,pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは比較されない.
返ってきた tXML* は free() してはいけない.

Parameters
pp検索対象のXMLツリー.姉妹ツリーも検索する.
key検索する属性値のキー.
val検索する属性値の値.
Returns
ノードへのポインタ.free() してはいけない.

Definition at line 2007 of file txml.c.

2008 {
2009  if (pp==NULL || (key==NULL && val==NULL) ) return NULL;
2010 
2011  if (pp->ldat.id==XML_ANCHOR_NODE) {
2012  if (pp->next!=NULL) pp = pp->next;
2013  else return NULL;
2014  }
2015  while(pp->esis!=NULL) pp = pp->esis;
2016 
2017  while(pp!=NULL) {
2018  if (pp->ldat.lst!=NULL) {
2019  tList* lst = pp->ldat.lst;
2020  while (lst!=NULL) {
2021  if (ex_strncasecmp(key, (const char*)lst->ldat.key.buf, 0)) {
2022  if (ex_strncasecmp(val, (const char*)lst->ldat.val.buf, 0)) return pp;
2023  }
2024  lst = lst->next;
2025  }
2026  }
2027  //
2028  if (pp->next!=NULL) {
2029  tXML* pm = get_xml_attr_node(pp->next, key, val);
2030  if (pm!=NULL) return pm;
2031  }
2032  pp = pp->ysis;
2033  }
2034  return NULL;
2035 }
int ex_strncasecmp(const char *dat, const char *key, int len)
文字列 s1とs2を拡張比較する.大文字小文字を区別しない.一致するなら TRUE
Definition: tools.c:820
tXML * get_xml_attr_node(tXML *pp, const char *key, const char *val)
属性 key=val のノードを探し,最初に見つけたノードを返す.
Definition: txml.c:2007

References ex_strncasecmp(), and XML_ANCHOR_NODE.

Here is the call graph for this function:

◆ get_xml_char_attr()

char* get_xml_char_attr ( tXML pp,
tXML pt,
const char *  attr 
)

char* get_xml_char_attr(tXML* pp, tXML* pt, const char* attr)

get_xml_node() で検索したノードから,属性値 attrの値を char*型で取り出す.free() してはいけない.

Definition at line 2225 of file txml.c.

2226 {
2227  char* ret = NULL;
2228  if (pp==NULL || pt==NULL || attr==NULL) return ret;
2229 
2230  tXML* node = get_xml_node(pp, pt);
2231  if (node!=NULL) ret = xml_get_node_attr(node, attr);
2232  return ret;
2233 }
char * xml_get_node_attr(tXML *node, const char *attr)
属性値を持つノードのポインタから,指定された属性値へのポインタを返す.free() してはいけない.
Definition: txml.c:1606

References get_xml_node(), and xml_get_node_attr().

Here is the call graph for this function:

◆ get_xml_char_attr_bystr()

char* get_xml_char_attr_bystr ( tXML pp,
const char *  str,
const char *  attr 
)

char* get_xml_char_attr_bystr(tXML* pp, const char* str, const char* attr)

get_xml_char_attr() の _bystr バージョン.
get_xml_node_bystr() で検索したノードから,属性値 attrの値を char*型で取り出す.free() してはいけない.

Definition at line 2533 of file txml.c.

2534 {
2535  char* ret = NULL;
2536  if (pp==NULL || str==NULL || attr==NULL) return ret;
2537 
2538  tXML* node = get_xml_node_bystr(pp, str);
2539  if (node!=NULL) ret = xml_get_node_attr(node, attr);
2540  return ret;
2541 }
tXML * get_xml_node_bystr(tXML *pp, const char *str)
get_xml_node(tXML* pp, tXML* pt) の _bystr バージョン
Definition: txml.c:2353

References get_xml_node_bystr(), and xml_get_node_attr().

Here is the call graph for this function:

◆ get_xml_char_content()

char* get_xml_char_content ( tXML pp,
tXML pt 
)

int get_xml_char_content(tXML* pp, tXML* pt)

get_xml_content() を使用し,XML コンテンツの内容を char*型で返す.free() してはいけない

Definition at line 2183 of file txml.c.

2184 {
2185  char* ret = NULL;
2186 
2187  tXML* node = get_xml_content(pp, pt);
2188  if (node!=NULL) ret = (char*)(node->ldat.key.buf);
2189  return ret;
2190 }
tXML * get_xml_content(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのコンテントへのポインタを altp に入れて返す.
Definition: txml.c:2064

References get_xml_content().

Here is the call graph for this function:

◆ get_xml_char_content_bystr()

char* get_xml_char_content_bystr ( tXML pp,
const char *  str 
)

char* get_xml_char_content_bystr(tXML* pp, const char* str);

get_xml_char_content(tXML* pp, tXML* pt) の _bystr バージョン.
get_xml_content_bystr() を使用し,XML コンテンツの内容を char*型で返す.
free() してはいけない.

Definition at line 2479 of file txml.c.

2480 {
2481  char* ret = NULL;
2482 
2483  tXML* node = get_xml_content_bystr(pp, str);
2484  if (node!=NULL) ret = (char*)(node->ldat.key.buf);
2485  return ret;
2486 }
tXML * get_xml_content_bystr(tXML *pp, const char *str)
get_xml_content(tXML* pp, tXML* pt) の _bystr バージョン
Definition: txml.c:2410

References get_xml_content_bystr().

Referenced by llsd_xml_get_content_bin(), and llsd_xml_get_content_str().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_content()

tXML* get_xml_content ( tXML pp,
tXML pt 
)

tXML* get_xml_content(tXML* pp, tXML* pt)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後のノードに対応したノードのコンテントへのポインタを返す.
pp の姉妹ツリーも検索する.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは比較されない.
これらのノードは必ず一致する.

返ってきた tXML* は free() してはいけない.

Parameters
pp検索対象のXMLツリー.姉妹ツリーも検索する.
pt検索するパターン
Returns
ptの最後のノードの次のノードに対応するコンテントへのポインタ.free() してはいけない.
以下の場合,Z へのポインタが返る.
pp pt
A --> B --> M C --> M --> Y
--> C --> M --> X
--> Y --> Z
--> N

Definition at line 2064 of file txml.c.

2065 {
2066  int fnd;
2067  tXML* tt = NULL;
2068  tXML* pm;
2069  tXML* dm;
2070 
2071  if (pp==NULL || pt==NULL) return NULL;
2072 
2073  pm = pp;
2074  if (pp->ldat.id==XML_ANCHOR_NODE) {
2075  if (pp->next!=NULL) pp = pp->next;
2076  else return NULL;
2077  }
2078  if (pt->ldat.id==XML_ANCHOR_NODE) {
2079  if (pt->next!=NULL) pt = pt->next;
2080  else return NULL;
2081  }
2082 
2083  tt = find_xml_end(pt);
2084  if (tt==NULL) return NULL;
2085  dm = add_xml_content_node(tt, (char*)"DUMMY");
2086  if (dm==NULL) return NULL;
2087  dm->ctrl = TREE_NOCMP_NODE;
2088 
2089  while(pp->esis!=NULL) pp = pp->esis;
2090 
2091  fnd = find_match_xml(pp, pt);
2092  if (fnd) tt = dm->altp;
2093  else tt = NULL;
2094 
2095  del_xml(&dm);
2096  _clear_tTree_ctrl(pm);
2097 
2098  return tt;
2099 }
#define del_xml(p)
指定したノード以下のXMLツリー(ppの姉妹は含まない)を削除する.
Definition: txml.h:203

References _clear_tTree_ctrl(), add_xml_content_node(), del_xml, find_match_xml(), find_xml_end, TREE_NOCMP_NODE, and XML_ANCHOR_NODE.

Referenced by get_xml_char_content(), get_xml_content_bystr(), get_xml_double_content(), get_xml_float_content(), get_xml_int_content(), replace_xml_content(), and set_xml_content().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_content_bystr()

tXML* get_xml_content_bystr ( tXML pp,
const char *  str 
)

tXML* get_xml_content_bystr(tXML* pp, const char* str)

get_xml_content(tXML* pp, tXML* pt) の _bystr バージョン

Definition at line 2410 of file txml.c.

2411 {
2412  tXML* tx;
2413  tXML* tt;
2414 
2415  if (pp==NULL || str==NULL) return FALSE;
2416 
2417  tx = xml_parse((char*)str);
2418  tt = get_xml_content(pp, tx);
2419  del_all_xml(&tx);
2420  return tt;
2421 }

References del_all_xml, FALSE, get_xml_content(), and xml_parse().

Referenced by get_xml_char_content_bystr(), get_xml_double_content_bystr(), get_xml_float_content_bystr(), and get_xml_int_content_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_content_list()

tList* get_xml_content_list ( tXML pp,
tXML pt 
)

tList* get_xml_content_list(tXML* pp, tXML* pt)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードの コンテントへのポインタをリストの altp に格納して返す.コンテンツはリストの altp->ldat.key に格納される.

pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは比較されない.
これらのノードは必ず一致する.

Parameters
pp検索対象のツリー
pt検索するパターン
Returns
該当ノードへのポインタ情報(altp)を含んだリストへのポインタ

Definition at line 2691 of file txml.c.

2692 {
2693  tList* lp;
2694  tList* dm;
2695 
2696  if (pp==NULL || pt==NULL) return NULL;
2697 
2698  if (pp->ldat.id==XML_ANCHOR_NODE) {
2699  if (pp->next!=NULL) pp = pp->next;
2700  else return NULL;
2701  }
2702  if (pt->ldat.id==XML_ANCHOR_NODE) {
2703  if (pt->next!=NULL) pt = pt->next;
2704  else return NULL;
2705  }
2706 
2707  dm = find_xml_end(pt);
2708  if (dm==NULL) return NULL;
2709  dm = add_xml_content_node(dm, (char*)"DUMMY");
2710  if (dm==NULL) return NULL;
2711  dm->ctrl = TREE_NOCMP_NODE;
2712 
2713  lp = find_match_xml_endlist(pp, pt);
2714  del_xml(&dm);
2715 
2716  return lp;
2717 }
tXML * find_match_xml_endlist(tXML *pp, tXML *pt)
ツリー pp内で ツリー ptと同じパターンの枝を全て探して,その枝のptの最後のノードに対応するノードの情報をリストにして返す.
Definition: txml.c:2886

References add_xml_content_node(), del_xml, find_match_xml_endlist(), find_xml_end, TREE_NOCMP_NODE, and XML_ANCHOR_NODE.

Referenced by get_xml_content_list_bystr(), and set_xml_content_list().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_content_list_bystr()

tList* get_xml_content_list_bystr ( tXML pp,
const char *  str 
)

tList* get_xml_conetnt_list_bystr(tXML* pp, const char* str)

get_xml_conetnt_list_bystr() の _bystr バージョン.

Definition at line 2780 of file txml.c.

2781 {
2782  tXML* tx;
2783  tList* tt;
2784 
2785  if (pp==NULL || str==NULL) return NULL;
2786 
2787  tx = xml_parse((char*)str);
2788  tt = get_xml_content_list(pp, tx);
2789  del_all_xml(&tx);
2790 
2791  return tt;
2792 }
tList * get_xml_content_list(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードのコンテントへのポインタをリストに格納して返す.
Definition: txml.c:2691

References del_all_xml, get_xml_content_list(), and xml_parse().

Here is the call graph for this function:

◆ get_xml_double_attr()

double get_xml_double_attr ( tXML pp,
tXML pt,
const char *  attr 
)

double get_xml_double_attr(tXML* pp, tXML* pt, const char* attr)

get_xml_node() で検索したノードから,属性値 attrの値を double型で取り出す.
値は " " で括られていても良い.

Definition at line 2269 of file txml.c.

2270 {
2271  double ret = 0.0;
2272  if (pp==NULL || pt==NULL || attr==NULL) return ret;
2273 
2274  tXML* node = get_xml_node(pp, pt);
2275  if (node!=NULL) {
2276  char* val = xml_get_node_attr(node, attr);
2277  if (val!=NULL) {
2278  Buffer buf = make_Buffer_bystr(val);
2279  char* ptr = (char*)buf.buf;
2280  if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
2281  if (ptr[0]=='"') ptr++;
2282  ret = atof(ptr);
2283  free_Buffer(&buf);
2284  }
2285  }
2286  return ret;
2287 }
#define make_Buffer_bystr(str)
set_Buffer()
Definition: buffer.h:57

References buf, free_Buffer(), get_xml_node(), make_Buffer_bystr, and xml_get_node_attr().

Here is the call graph for this function:

◆ get_xml_double_attr_bystr()

double get_xml_double_attr_bystr ( tXML pp,
const char *  str,
const char *  attr 
)

double get_xml_double_attr_bystr(tXML* pp, const char* str, const char* attr)

get_xml_double_attr() の _bystr バージョン.
get_xml_node_bystr() で検索したノードから,属性値 attrの値を double型で取り出す.
値は クォーテーションで括られていても良い.

Definition at line 2579 of file txml.c.

2580 {
2581  double ret = 0.0;
2582  if (pp==NULL || str==NULL || attr==NULL) return ret;
2583 
2584  tXML* node = get_xml_node_bystr(pp, str);
2585  if (node!=NULL) {
2586  char* val = xml_get_node_attr(node, attr);
2587  if (val!=NULL) {
2588  Buffer buf = make_Buffer_bystr(val);
2589  char* ptr = (char*)buf.buf;
2590  if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
2591  if (ptr[0]=='"') ptr++;
2592  ret = atof(ptr);
2593  free_Buffer(&buf);
2594  }
2595  }
2596  return ret;
2597 }

References buf, free_Buffer(), get_xml_node_bystr(), make_Buffer_bystr, and xml_get_node_attr().

Here is the call graph for this function:

◆ get_xml_double_content()

double get_xml_double_content ( tXML pp,
tXML pt 
)

double get_xml_double_content(tXML* pp, tXML* pt)

get_xml_content() を使用し,XML コンテンツの内容を double型で返す.

Definition at line 2168 of file txml.c.

2169 {
2170  double ret = 0.0;
2171 
2172  tXML* node = get_xml_content(pp, pt);
2173  if (node!=NULL) ret = atof((char*)(node->ldat.key.buf));
2174  return ret;
2175 }

References get_xml_content().

Here is the call graph for this function:

◆ get_xml_double_content_bystr()

double get_xml_double_content_bystr ( tXML pp,
const char *  str 
)

double get_xml_double_content_bystr(tXML* pp, const char* str);

get_xml_double_content(tXML* pp, tXML* pt) の _bystr バージョン.
get_xml_content_bystr() を使用し,XML コンテンツの内容を double型で返す.

Definition at line 2462 of file txml.c.

2463 {
2464  double ret = 0.0;
2465 
2466  tXML* node = get_xml_content_bystr(pp, str);
2467  if (node!=NULL) ret = atof((char*)(node->ldat.key.buf));
2468  return ret;
2469 }

References get_xml_content_bystr().

Referenced by llsd_xml_get_content_real().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_float_content()

float get_xml_float_content ( tXML pp,
tXML pt 
)

float get_xml_float_content(tXML* pp, tXML* pt)

get_xml_content() を使用し,XML コンテンツの内容を float型で返す.

Definition at line 2153 of file txml.c.

2154 {
2155  float ret = 0.0;
2156 
2157  tXML* node = get_xml_content(pp, pt);
2158  if (node!=NULL) ret = (float)atof((char*)(node->ldat.key.buf));
2159  return ret;
2160 }

References get_xml_content().

Here is the call graph for this function:

◆ get_xml_float_content_bystr()

float get_xml_float_content_bystr ( tXML pp,
const char *  str 
)

float get_xml_float_content_bystr(tXML* pp, const char* str)

get_xml_float_content(tXML* pp, tXML* pt) の _bystr バージョン.
get_xml_content_bystr() を使用し,XML コンテンツの内容を float型で返す.

Definition at line 2446 of file txml.c.

2447 {
2448  float ret = 0.0;
2449 
2450  tXML* node = get_xml_content_bystr(pp, str);
2451  if (node!=NULL) ret = (float)atof((char*)(node->ldat.key.buf));
2452  return ret;
2453 }

References get_xml_content_bystr().

Here is the call graph for this function:

◆ get_xml_int_attr()

int get_xml_int_attr ( tXML pp,
tXML pt,
const char *  attr 
)

int get_xml_int_attr(tXML* pp, tXML* pt, const char* attr)

get_xml_node() で検索したノードから,属性値 attrの値を int型で取り出す.
値は " " で括られていても良い.

Definition at line 2242 of file txml.c.

2243 {
2244  int ret = 0;
2245  if (pp==NULL || pt==NULL || attr==NULL) return ret;
2246 
2247  tXML* node = get_xml_node(pp, pt);
2248  if (node!=NULL) {
2249  char* val = xml_get_node_attr(node, attr);
2250  if (val!=NULL) {
2251  Buffer buf = make_Buffer_bystr(val);
2252  char* ptr = (char*)buf.buf;
2253  if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
2254  if (ptr[0]=='"') ptr++;
2255  ret = atoi(ptr);
2256  free_Buffer(&buf);
2257  }
2258  }
2259  return ret;
2260 }

References buf, free_Buffer(), get_xml_node(), make_Buffer_bystr, and xml_get_node_attr().

Here is the call graph for this function:

◆ get_xml_int_attr_bystr()

int get_xml_int_attr_bystr ( tXML pp,
const char *  str,
const char *  attr 
)

int get_xml_int_attr_bystr(tXML* pp, const char* str, const char* attr)

get_xml_int_attr() の _bystr バージョン.
get_xml_node_bystr() で検索したノードから,属性値 attrの値を int型で取り出す.
値は " " で括られていても良い.

Definition at line 2551 of file txml.c.

2552 {
2553  int ret = 0;
2554  if (pp==NULL || str==NULL || attr==NULL) return ret;
2555 
2556  tXML* node = get_xml_node_bystr(pp, str);
2557  if (node!=NULL) {
2558  char* val = xml_get_node_attr(node, attr);
2559  if (val!=NULL) {
2560  Buffer buf = make_Buffer_bystr(val);
2561  char* ptr = (char*)buf.buf;
2562  if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0';
2563  if (ptr[0]=='"') ptr++;
2564  ret = atoi(ptr);
2565  free_Buffer(&buf);
2566  }
2567  }
2568  return ret;
2569 }

References buf, free_Buffer(), get_xml_node_bystr(), make_Buffer_bystr, and xml_get_node_attr().

Here is the call graph for this function:

◆ get_xml_int_content()

int get_xml_int_content ( tXML pp,
tXML pt 
)

int get_xml_int_content(tXML* pp, tXML* pt)

get_xml_content() を使用し,XML コンテンツの内容を int型で返す.

Definition at line 2138 of file txml.c.

2139 {
2140  int ret = 0;
2141 
2142  tXML* node = get_xml_content(pp, pt);
2143  if (node!=NULL) ret = atoi((char*)(node->ldat.key.buf));
2144  return ret;
2145 }

References get_xml_content().

Here is the call graph for this function:

◆ get_xml_int_content_bystr()

int get_xml_int_content_bystr ( tXML pp,
const char *  str 
)

int get_xml_int_content_bystr(tXML* pp, const char* str)

get_xml_int_content(tXML* pp, tXML* pt) の _bystr バージョン.
get_xml_content_bystr() を使用し,XML コンテンツの内容を int型で返す.

Definition at line 2430 of file txml.c.

2431 {
2432  int ret = 0;
2433 
2434  tXML* node = get_xml_content_bystr(pp, str);
2435  if (node!=NULL) ret = atoi((char*)(node->ldat.key.buf));
2436  return ret;
2437 }

References get_xml_content_bystr().

Referenced by llsd_xml_get_content_int().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_node()

tXML* get_xml_node ( tXML pp,
tXML pt 
)

tXML* get_xml_node(tXML* pp, tXML* pt)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す.
pp の姉妹ツリーも検索する.
また,pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは比較されない.
返ってきた tXML* は free() してはいけない.

Parameters
pp検索対象のXMLツリー.姉妹ツリーも検索する.
pt検索するパターン
Returns
ptの最後のノードに対応するノードへのポインタ.free() してはいけない.
以下の場合,pp の A->C->M->X の Xへのポインタが返る.
pp pt
A --> B --> M C --> M --> X
--> C --> M --> X
--> Y --> Z
--> N

Definition at line 1874 of file txml.c.

1875 {
1876  int fnd;
1877  tXML* tt;
1878  tXML* pm;
1879 
1880  if (pp==NULL || pt==NULL) return NULL;
1881 
1882  pm = pp;
1883  if (pp->ldat.id==XML_ANCHOR_NODE) {
1884  if (pp->next!=NULL) pp = pp->next;
1885  else return NULL;
1886  }
1887  if (pt->ldat.id==XML_ANCHOR_NODE) {
1888  if (pt->next!=NULL) pt = pt->next;
1889  else return NULL;
1890  }
1891 
1892  tt = find_xml_end(pt);
1893  if (tt==NULL) return FALSE;
1894 
1895  while(pp->esis!=NULL) pp = pp->esis;
1896  fnd = find_match_xml(pp, pt);
1897  if (fnd) tt = tt->altp;
1898  else tt = NULL;
1899 
1900  _clear_tTree_ctrl(pm);
1901 
1902  return tt;
1903 }

References _clear_tTree_ctrl(), FALSE, find_match_xml(), find_xml_end, and XML_ANCHOR_NODE.

Referenced by get_xml_attr(), get_xml_char_attr(), get_xml_double_attr(), get_xml_int_attr(), get_xml_node_bystr(), set_xml_attr(), and set_xml_node().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_node_bystr()

tXML* get_xml_node_bystr ( tXML pp,
const char *  str 
)

tXML* get_xml_node_bystr(tXML* pp, const char* str)

get_xml_node(tXML* pp, tXML* pt) の _bystr バージョン

Definition at line 2353 of file txml.c.

2354 {
2355  tXML* tx;
2356  tXML* tt;
2357 
2358  if (pp==NULL || str==NULL) return FALSE;
2359 
2360  tx = xml_parse((char*)str);
2361  tt = get_xml_node(pp, tx);
2362  del_all_xml(&tx);
2363  return tt;
2364 }

References del_all_xml, FALSE, get_xml_node(), and xml_parse().

Referenced by get_xml_char_attr_bystr(), get_xml_double_attr_bystr(), get_xml_int_attr_bystr(), and llsd_xml_contain_key().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_node_list()

tList* get_xml_node_list ( tXML pp,
tXML pt 
)

tList* get_xml_node_list(tXML* pp, tXML* pt)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードへの ポインタをリストの altp に格納して返す.

pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは 比較されない.これらのノードは必ず一致する.

Parameters
pp検索対象のツリー
pt検索するパターン
Returns
該当ノードへのポインタ情報(altp)を含んだリストへのポインタ

Definition at line 2656 of file txml.c.

2657 {
2658  tList* lp;
2659 
2660  if (pp==NULL || pt==NULL) return NULL;
2661 
2662  if (pp->ldat.id==XML_ANCHOR_NODE) {
2663  if (pp->next!=NULL) pp = pp->next;
2664  else return NULL;
2665  }
2666  if (pt->ldat.id==XML_ANCHOR_NODE) {
2667  if (pt->next!=NULL) pt = pt->next;
2668  else return NULL;
2669  }
2670 
2671  lp = find_match_xml_endlist(pp, pt);
2672 
2673  return lp;
2674 }

References find_match_xml_endlist(), and XML_ANCHOR_NODE.

Referenced by get_xml_node_list_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_xml_node_list_bystr()

tList* get_xml_node_list_bystr ( tXML pp,
const char *  str 
)

tList* get_xml_node_list_bystr(tXML* pp, const char* str)

get_xml_node_list() の _bystr バージョン.

Definition at line 2760 of file txml.c.

2761 {
2762  tXML* tx;
2763  tList* tt;
2764 
2765  if (pp==NULL || str==NULL) return NULL;
2766 
2767  tx = xml_parse((char*)str);
2768  tt = get_xml_node_list(pp, tx);
2769  del_all_xml(&tx);
2770 
2771  return tt;
2772 }
tList * get_xml_node_list(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードへのポインタをリストに格納して返す.
Definition: txml.c:2656

References del_all_xml, get_xml_node_list(), and xml_parse().

Here is the call graph for this function:

◆ init_xml_doc()

tXML* init_xml_doc ( void  )

tXML* init_xml_doc()

XML のドキュメントヘッダを作成する

Definition at line 1203 of file txml.c.

1204 {
1205  tXML* xml = xml_parse((char*)"<?xml version=\"1.0\" encoding=\"utf-8\"?>");
1206  return xml;
1207 }

References xml_parse().

Referenced by xml_rpc_request_pack().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ insert_xml_node()

tXML* insert_xml_node ( tXML xml,
const char *  name 
)

tXML* insert_xml_node(tXML* xml, const char* name)

XMLツリーのxml の直下(姉妹の一番上:長子)にノード(属性は指定しない)を挿入する.

Parameters
xml挿入するポイント
name挿入するノードの名前
Returns
挿入したノードへのポインタ

Definition at line 1242 of file txml.c.

1243 {
1244  tList* pp;
1245 
1246  if (xml==NULL || name==NULL) return NULL;
1247 
1248  pp = insert_tTree_node_bystr(xml, XML_NAME_NODE, 0, name, NULL, NULL, 0);
1249  pp->state = JBXL_XML_NODE_EMPTY;
1250  if (pp->prev!=NULL) pp->prev->ldat.lv++;
1251 
1252  return pp;
1253 }
tTree * insert_tTree_node_bystr(tTree *pp, int id, int lv, const char *key, const char *val, void *ptr, int sz)
ノードを長子としてリストに追加.
Definition: ttree.c:325

References insert_tTree_node_bystr(), JBXL_XML_NODE_EMPTY, and XML_NAME_NODE.

Here is the call graph for this function:

◆ isnot_xml_name()

int isnot_xml_name ( unsigned char *  pp)

int isnot_xml_name(unsigned char* pp)

XML名として不適切かどうかを大まかに判断する.
かなりいい加減なので,FALSEだからといって,厳密にXML名として適切であるとは限らない.

Parameters
pp検査する XML名へのポインタ
Return values
TRUEXML名として不適切
FALSEXML名として適切かもしれない

Definition at line 810 of file txml.c.

811 {
812  if (pp==NULL) return TRUE;
813  if (*pp=='\0') return TRUE;
814 
815  while (*pp!='\0') {
816  if (*pp<=0x2c) return TRUE; // !"#$%&'()*+,
817  if (*pp==0x2f) return TRUE; // /
818  if (*pp>=0x3b && *pp<=0x40) return TRUE; // ;<=>?@
819  if (*pp>=0x5b && *pp<=0x5e) return TRUE; // [\]^
820  if (*pp==0x60) return TRUE; // `
821  if (*pp>=0x7b && *pp<=0x7f) return TRUE; // {|}~DEL
822  pp++;
823  }
824 
825  return FALSE;
826 }

References FALSE, and TRUE.

Referenced by xml_parse_processing_node(), and xml_parse_start_node().

Here is the caller graph for this function:

◆ make_xml_attr_bydouble()

Buffer make_xml_attr_bydouble ( const char *  name,
double  value 
)

Buffer make_xml_attr_bydouble(const char* name, double value)

属性名 name, double型実数の属性値 value を持つ Buffer型変数を作成する.

Definition at line 1571 of file txml.c.

1572 {
1573  char* str = dtostr_ts(value);
1574 
1575  Buffer buf = make_Buffer_bystr(name);
1576  cat_s2Buffer("=\"", &buf);
1577  cat_s2Buffer(str, &buf);
1578  cat_s2Buffer("\"", &buf);
1579 
1580  freeNull(str);
1581  return buf;
1582 }
char * dtostr_ts(double n)
double を文字に変換する.要 free()
Definition: tools.c:1652
#define freeNull(p)
Definition: tools.h:201

References buf, cat_s2Buffer, dtostr_ts(), freeNull, and make_Buffer_bystr.

Here is the call graph for this function:

◆ make_xml_attr_byfloat()

Buffer make_xml_attr_byfloat ( const char *  name,
float  value 
)

Buffer make_xml_attr_byfloat(const char* name, float value)

属性名 name, float型実数の属性値 value を持つ Buffer型変数を作成する.

Definition at line 1552 of file txml.c.

1553 {
1554  char* str = ftostr_ts(value);
1555 
1556  Buffer buf = make_Buffer_bystr(name);
1557  cat_s2Buffer("=\"", &buf);
1558  cat_s2Buffer(str, &buf);
1559  cat_s2Buffer("\"", &buf);
1560 
1561  freeNull(str);
1562  return buf;
1563 }
char * ftostr_ts(float n)
float を文字に変換する.要 free()
Definition: tools.c:1632

References buf, cat_s2Buffer, freeNull, ftostr_ts(), and make_Buffer_bystr.

Here is the call graph for this function:

◆ make_xml_attr_byint()

Buffer make_xml_attr_byint ( const char *  name,
int  value 
)

Buffer make_xml_attr_byint(const char* name, int value)

属性名 name, 整数の属性値 value を持つ Buffer型変数を作成する.

Definition at line 1533 of file txml.c.

1534 {
1535  char* str = itostr_ts(value);
1536 
1537  Buffer buf = make_Buffer_bystr(name);
1538  cat_s2Buffer("=\"", &buf);
1539  cat_s2Buffer(str, &buf);
1540  cat_s2Buffer("\"", &buf);
1541 
1542  freeNull(str);
1543  return buf;
1544 }
char * itostr_ts(int n)
int を文字に変換する.要 free()
Definition: tools.c:1532

References buf, cat_s2Buffer, freeNull, itostr_ts(), and make_Buffer_bystr.

Here is the call graph for this function:

◆ make_xml_attr_bystr()

Buffer make_xml_attr_bystr ( const char *  name,
const char *  value 
)

Buffer make_xml_attr_bystr(const char* name, const char* value)

属性名 name, 文字列の属性値 value を持つ Buffer型変数を作成する.

Definition at line 1517 of file txml.c.

1518 {
1519  Buffer buf = make_Buffer_bystr(name);
1520  cat_s2Buffer("=\"", &buf);
1521  cat_s2Buffer(value, &buf);
1522  cat_s2Buffer("\"", &buf);
1523 
1524  return buf;
1525 }

References buf, cat_s2Buffer, and make_Buffer_bystr.

◆ print_sister_xml_tree()

void print_sister_xml_tree ( FILE *  fp,
tXML pp,
const char *  space 
)

void print_sister_xml_tree(FILE* fp, tXML* pp, const char* space)

XMLツリーの表示.ppの姉妹ノードも出力する.
ポインタ pp以降の全てのノードのキー部のバッファを標準エラー出力に表示する.
表示:入れ子の深さ,ID, ノード状態, ノード名(ノード値),ノード属性の個数

Parameters
fp出力するファイルへのポインタ.NULLの場合は stderr
pp表示を開始するノードへのポインタ.(姉妹ノードも出力する)
space出力の書式を揃えるための空白(インデント)を指定する.例 " "

Definition at line 1798 of file txml.c.

1799 {
1800  if (fp==NULL) fp = stderr;
1801 
1802  if (pp!=NULL) {
1803  if (pp->ldat.id==XML_ANCHOR_NODE) {
1804  if (pp->next!=NULL) pp = pp->next;
1805  }
1806 
1807  while(pp->esis!=NULL) pp = pp->esis;
1808  //
1809  while(pp!=NULL) {
1810  int i;
1811  tList_data ld = pp->ldat;
1812 
1813  if (pp->depth>=0) {
1814  if (pp->esis!=NULL || pp->depth>=0) fprintf(fp, "\n");
1815  if (pp->depth>0) {
1816  for(i=0; i<pp->depth; i++) fprintf(fp, "%s", space);
1817  //for(i=0; i<pp->depth-1; i++) fprintf(fp, "%s", " ");
1818  fprintf(fp, "-> ");
1819  }
1820  }
1821  int num = count_tList((tList*)ld.lst);
1822  fprintf(fp, "%d: %d [%d] %s (%d)", pp->depth, ld.id, pp->state, ld.key.buf, num);
1823  if (ld.lst!=NULL) {
1824  tList* lst = ld.lst;
1825  fprintf(fp, " attr -->");
1826  while (lst!=NULL) {
1827  fprintf(fp, " %s=%s", lst->ldat.key.buf, lst->ldat.val.buf);
1828  lst = lst->next;
1829  }
1830  }
1831 
1832  if (pp->next!=NULL) print_sister_xml_tree(fp, pp->next, space);
1833 
1834  pp = pp->ysis;
1835  };
1836  }
1837  else {
1838  fprintf(fp, "(XML is NULL)\n");
1839  }
1840  fflush(fp);
1841 
1842  return;
1843 }
int count_tList(tList *pp)
リストの ppノード以降のノードの数を数える.
Definition: tlist.c:979
void print_sister_xml_tree(FILE *fp, tXML *pp, const char *space)
XMLツリーの表示.ppの姉妹ノードも出力する.
Definition: txml.c:1798

References count_tList(), and XML_ANCHOR_NODE.

Referenced by print_xml_tree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ print_xml()

void print_xml ( FILE *  fp,
tXML pp,
int  mode 
)

void print_xml(FILE* fp, tXML* pp, int mode)

XMLの表示(出力).

Parameters
fp出力するファイルへのポインタ.NULLの場合は stderr
pp表示を開始するXMLノードへのポインタ.
modeXML_ONELINE_FORMAT, XML_CRLF_FORMAT, XML_TAB_FORMAT, XML_SPACE_FORMAT, XML_SPACE4_FORMAT

Definition at line 1691 of file txml.c.

1692 {
1693  if (fp==NULL) fp = stderr;
1694 
1695  if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
1696 
1697  if (pp!=NULL) {
1698  Buffer buf = xml_inverse_parse(pp, mode);
1699  if (buf.buf!=NULL) {
1700  fprintf(fp, "%s", buf.buf);
1701  free_Buffer(&buf);
1702  }
1703  else fprintf(fp, "(XML is NULL)\n");
1704  }
1705  else {
1706  fprintf(fp, "(XML is NULL)\n");
1707  }
1708  fflush(fp);
1709 
1710  return;
1711 }
Buffer xml_inverse_parse(tXML *pp, int mode)
ppに格納された XMLデータを元の書式に戻して Bufferに格納する.xml_parse() の逆.
Definition: txml.c:891

References buf, free_Buffer(), XML_ANCHOR_NODE, and xml_inverse_parse().

Here is the call graph for this function:

◆ print_xml_node()

void print_xml_node ( FILE *  fp,
tXML pp 
)

void print_xml_node(FILE* fp, tXML* pp)

XMLのノード情報を表示する.デバッグ用.

Definition at line 1719 of file txml.c.

1720 {
1721  if (fp==NULL) fp = stderr;
1722 
1723  //fprintf(fp, "深さ: ノード種別 [状態] ノード名 (属性数)\n");
1724 
1725  if (pp!=NULL) {
1726  if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
1727  if (pp!=NULL) {
1728  int num = count_tList((tList*)pp->ldat.lst);
1729  fprintf(fp, "%d: %d [%d] %s (%d)\n", pp->depth, pp->ldat.id, pp->state, pp->ldat.key.buf, num);
1730  if (pp->altp!=NULL) {
1731  fprintf(fp, " altp -> %s, %s\n", pp->altp->ldat.key.buf, pp->altp->ldat.val.buf);
1732  }
1733  }
1734  else {
1735  fprintf(fp, "(XML is ANCHOR only)\n");
1736  }
1737  }
1738  else {
1739  fprintf(fp, "(XML is NULL)\n");
1740  }
1741  fflush(fp);
1742 
1743  return;
1744 }

References count_tList(), and XML_ANCHOR_NODE.

Here is the call graph for this function:

◆ print_xml_tree()

void print_xml_tree ( FILE *  fp,
tXML pp,
const char *  space 
)

void print_xml_tree(FILE* fp, tXML* pp, const char* space)

XMLツリーをそのままツリー表示する.デバッグ用.
ポインタ pp以降の全てのノードのキー部のバッファを標準エラー出力に表示する.
表示:入れ子の深さ: ノード種別 [ノード状態] ノード名 (属性の個数)

Parameters
fp出力するファイルへのポインタ.NULLの場合は stderr
pp表示を開始するノードへのポインタ.
space出力の書式を揃えるための空白(インデント)を指定する.例 " "

Definition at line 1759 of file txml.c.

1760 {
1761  int i;
1762  if (fp==NULL) fp = stderr;
1763 
1764  //fprintf(fp, "深さ: ノード種別 [状態] ノード名 (属性数)\n");
1765 
1766  if (pp!=NULL) {
1767  if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
1768  if (pp!=NULL) {
1769  for(i=0; i<pp->depth; i++) fprintf(fp, "%s", space);
1770  for(i=0; i<pp->depth-1; i++) fprintf(fp, "%s", " "); // for "-> "
1771  print_sister_xml_tree(fp, pp, space);
1772  fprintf(fp, "\n");
1773  }
1774  else {
1775  fprintf(fp, "(XML is ANCHOR only)\n");
1776  }
1777  }
1778  else {
1779  fprintf(fp, "(XML is NULL)\n");
1780  }
1781  fflush(fp);
1782 
1783  return;
1784 }

References print_sister_xml_tree(), and XML_ANCHOR_NODE.

Here is the call graph for this function:

◆ replace_all_node_byid()

int replace_all_node_byid ( tXML pp,
const char *  src,
const char *  dst,
int  id 
)

int replace_all_node_byid(tXML* pp, const char* src, const char* dst, int id)

XMLツリー pp内で ノードの種別が idである全てのノードの内容を srcから dstに書き換える.

Parameters
pp置換対象のツリー
src置換対象のノードのコンテント(の一部でも可). NULL の場合は全ての文字列
dst置換後のノードのコンテント
id置き換え対象のノードのID.id<0 なら全てのノード
Returns
置き換えたノードの数

Definition at line 3291 of file txml.c.

3292 {
3293  int n;
3294 
3295  if (pp==NULL || dst==NULL) return 0;
3296 
3297  if (pp->ldat.id==XML_ANCHOR_NODE) {
3298  if (pp->next!=NULL) pp = pp->next;
3299  else return 0;
3300  }
3301  while(pp->esis!=NULL) pp = pp->esis;
3302 
3303  n = _replace_all_node_byid_rcsv(pp, src, dst, id);
3304 
3305  return n;
3306 }

References _replace_all_node_byid_rcsv(), and XML_ANCHOR_NODE.

Here is the call graph for this function:

◆ replace_all_node_contents()

int replace_all_node_contents ( tXML pp,
const char *  name,
const char *  src,
const char *  dst 
)

int replace_all_node_contents(tXML* pp, const char* name, const char* src, const char* dst)

XMLツリー pp内で ノード名が nameである全てのノードのコンテントを,srcから dstに書き換える.
一つのノードに複数のコンテントがある場合にも対応.

Parameters
pp置換対象のツリー
name置き換えを行うノードのノード名.NULLの場合は全ての文字列.
src置換対象のノードのコンテント(の一部でも可). NULL の場合は全ての文字列
dst置換後のノードのコンテント
Returns
置き換えたノードの数

Definition at line 3219 of file txml.c.

3220 {
3221  int n;
3222 
3223  if (pp==NULL || dst==NULL) return 0;
3224 
3225  if (pp->ldat.id==XML_ANCHOR_NODE) {
3226  if (pp->next!=NULL) pp = pp->next;
3227  else return 0;
3228  }
3229  while(pp->esis!=NULL) pp = pp->esis;
3230 
3231  n = _replace_all_node_contents_rcsv(pp, name, src, dst);
3232 
3233  return n;
3234 }

References _replace_all_node_contents_rcsv(), and XML_ANCHOR_NODE.

Referenced by replace_all_node_integer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ replace_all_node_integer()

int replace_all_node_integer ( tXML tp,
const char *  name,
int  src,
int  dst 
)

int replace_all_node_integer(tXML* tp, const char* name, int src, int dst)

XMLツリー pp内で ノード名が nameである全てのノードのコンテント(整数)を,srcから dstに書き換える.

Parameters
tp置換対象のツリー
name置き換えを行うノードのノード名
src置換対象のノードのコンテント(整数)
dst置換後のノードのコンテント(整数)
Returns
置き換えたノードの数

Definition at line 3192 of file txml.c.

3193 {
3194  int n;
3195  char nums[20], numd[20];
3196 
3197  snprintf(nums, 10, "%d", src);
3198  snprintf(numd, 10, "%d", dst);
3199 
3200  n = replace_all_node_contents(tp, name, nums, numd);
3201 
3202  return n;
3203 }
int replace_all_node_contents(tXML *pp, const char *name, const char *src, const char *dst)
XMLツリー pp内で ノード名が nameである全てのノードのコンテントを,srcから dstに書き換える.
Definition: txml.c:3219

References replace_all_node_contents().

Here is the call graph for this function:

◆ replace_xml_content()

int replace_xml_content ( tXML pp,
tXML pt,
const char *  src,
const char *  dst 
)

int replace_xml_content(tXML* pp, tXML* pt, const char* src, const char* dst)

get_xml_content() を使用し,XMLキーの src部分を dstで書き換える.

Definition at line 2328 of file txml.c.

2329 {
2330  tXML* tt;
2331  Buffer tg;
2332 
2333  if (pp==NULL || pt==NULL || src==NULL || dst==NULL) return FALSE;
2334 
2335  tt = get_xml_content(pp, pt);
2336  if (tt==NULL) return FALSE;
2337 
2338  tg = replace_sBuffer_bystr(tt->ldat.key, src, dst);
2339  if (tg.buf==NULL) return FALSE;
2340 
2341  free_Buffer(&(tt->ldat.key));
2342  tt->ldat.key = tg;
2343 
2344  return TRUE;
2345 }

References Buffer::buf, FALSE, free_Buffer(), get_xml_content(), replace_sBuffer_bystr(), and TRUE.

Referenced by replace_xml_content_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ replace_xml_content_bystr()

int replace_xml_content_bystr ( tXML pp,
const char *  str,
const char *  src,
const char *  dst 
)

int replace_xml_content_bystr(tXML*pp, const char* str, const char* src, const char* dst)

replace_xml_content() の _bystr バージョン.

Definition at line 2624 of file txml.c.

2625 {
2626  tXML* tx;
2627  int rt;
2628 
2629  if (pp==NULL || src==NULL || src==NULL || dst==NULL) return FALSE;
2630 
2631  tx = xml_parse((char*)str);
2632  rt = replace_xml_content(pp, tx, src, dst);
2633  del_all_xml(&tx);
2634  return rt;
2635 }
int replace_xml_content(tXML *pp, tXML *pt, const char *src, const char *dst)
get_xml_content() を使用し,XMLキーの src部分を dstで書き換える.
Definition: txml.c:2328

References del_all_xml, FALSE, replace_xml_content(), and xml_parse().

Here is the call graph for this function:

◆ return_exist_node()

int return_exist_node ( tXML tp,
const char *  name,
int  no,
Buffer content 
)

int return_exist_node(tXML* tp, const char* name, int no, Buffer* content)

bufの中に ノード '<name>content</name>' が存在するかどうかチェックする.
存在する場合はそのノードのコンテントのコピーを content に格納し,TRUE を返す.

Definition at line 3168 of file txml.c.

3169 {
3170  Buffer buf;
3171 
3172  buf = get_node_content(tp, name, no);
3173  if (buf.buf==NULL) return FALSE;
3174 
3175  if (content!=NULL) *content = buf;
3176  return TRUE;
3177 }

References buf, FALSE, get_node_content(), and TRUE.

Here is the call graph for this function:

◆ set_xml_attr()

int set_xml_attr ( tXML pp,
tXML pt,
tList at 
)

int set_xml_attr(tXML* pp, tXML* pt, tList* at)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後のノードに対応したノードのノードの属性として atの値をコピーする.
pp の姉妹ツリーも検索する.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは 比較されない.これらのノードは必ず一致する.

Parameters
pp検索対象のツリー.姉妹ツリーも検索する.
pt検索パターン
at設定する属性の格納されたリスト.ldat.key に属性名,ldat.val に属性値("",''付き)
Return values
TRUE設定する枝を見つけた.正常に設置されたかどうかは不明.
FALSE設定する枝を見つけられなかった.

Definition at line 2307 of file txml.c.

2308 {
2309  tXML* tt;
2310 
2311  if (pp==NULL || pt==NULL || at==NULL) return FALSE;
2312 
2313  tt = get_xml_node(pp, pt);
2314  if (tt!=NULL) {
2315  del_all_tList(&(tt->ldat.lst));
2316  tt->ldat.lst = dup_tList(at);
2317  }
2318  else return FALSE;
2319  return TRUE;
2320 }
tList * dup_tList(tList *pp)
リストを複製する.
Definition: tlist.c:843
void del_all_tList(tList **pp)
リストの全ノードの削除.ポインタ ppのノードを含むリスト全体を削除する.
Definition: tlist.c:769

References del_all_tList(), dup_tList(), FALSE, get_xml_node(), and TRUE.

Referenced by set_xml_attr_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_xml_attr_bystr()

int set_xml_attr_bystr ( tXML pp,
const char *  str,
tList at 
)

int set_xml_attr_bystr(tXML* pp, const char* str, tList* at)

set_xml_attr() の _bystr バージョン.

Definition at line 2605 of file txml.c.

2606 {
2607  tXML* tx;
2608  int rt;
2609 
2610  if (pp==NULL || str==NULL || at==NULL) return FALSE;
2611 
2612  tx = xml_parse((char*)str);
2613  rt = set_xml_attr(pp, tx, at);
2614  del_all_xml(&tx);
2615  return rt;
2616 }
int set_xml_attr(tXML *pp, tXML *pt, tList *at)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノードの属性としてatの値をコピーする.
Definition: txml.c:2307

References del_all_xml, FALSE, set_xml_attr(), and xml_parse().

Here is the call graph for this function:

◆ set_xml_content()

int set_xml_content ( tXML pp,
tXML pt,
const char *  content 
)

int set_xml_content(tXML* pp, tXML* pt, const char* content)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後ノードに対応したのノードのコンテントを contentで置き換える.
pp の姉妹ツリーも検索する.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは 比較されない.これらのノードは必ず一致する.

Parameters
pp検索対象のツリー.姉妹ツリーも検索する.
pt検索パターン
contentptの最後のノードに対応するノードにコピーするノード値.
Return values
TRUE設定する枝を見つけた.正常に設定れたかどうかは不明.
FALSE設定する枝を見つけられなかった.

Definition at line 2119 of file txml.c.

2120 {
2121  tXML* tt;
2122 
2123  if (pp==NULL || pt==NULL || content==NULL) return FALSE;
2124 
2125  tt = get_xml_content(pp, pt);
2126  if (tt==NULL) return FALSE;
2127 
2128  copy_s2Buffer(content, &(tt->ldat.key));
2129  return TRUE;
2130 }

References copy_s2Buffer, FALSE, get_xml_content(), and TRUE.

Referenced by set_xml_content_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_xml_content_bystr()

int set_xml_content_bystr ( tXML pp,
const char *  str,
const char *  val 
)

int set_xml_content_bystr(tXML* pp, const char* str, const char* val)

set_xml_content(tXML* pp, tXML* pt, char* val) の _bystr バージョン

Definition at line 2494 of file txml.c.

2495 {
2496  tXML* tx;
2497  int rt;
2498 
2499  if (pp==NULL || str==NULL || val==NULL) return FALSE;
2500 
2501  tx = xml_parse((char*)str);
2502  rt = set_xml_content(pp, tx, val);
2503  del_all_xml(&tx);
2504  return rt;
2505 }
int set_xml_content(tXML *pp, tXML *pt, const char *content)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後ノードに対応したのノードのコンテントを contentで置き換える.
Definition: txml.c:2119

References del_all_xml, FALSE, set_xml_content(), and xml_parse().

Here is the call graph for this function:

◆ set_xml_content_list()

int set_xml_content_list ( tXML pp,
tXML pt,
const char *  content 
)

int set_xml_content_list(tXML* pp, tXML* pt, const char* content)

get_xml_content_list() で検出したコンテントを, content で置き換える.

Parameters
pp対象のXMLツリー
pt検索パターン
content書き換えのノード値
Returns
書き換えたノードの個数

Definition at line 2731 of file txml.c.

2732 {
2733  int num = 0;
2734  tList* lt;
2735  tList* lp;
2736 
2737  if (pp==NULL || pt==NULL || content==NULL) return 0;
2738 
2739  lp = lt = get_xml_content_list(pp, pt);
2740  if (lt==NULL) return 0;
2741 
2742  while (lt!=NULL) {
2743  if (lt->altp!=NULL) {
2744  copy_s2Buffer(content, &(lt->altp->ldat.key));
2745  num++;
2746  }
2747  lt = lt->next;
2748  }
2749  del_tList(&lp);
2750 
2751  return num;
2752 }
tList * del_tList(tList **pp)
指定したリストノード以降のリストを削除.
Definition: tlist.c:735

References copy_s2Buffer, del_tList(), and get_xml_content_list().

Referenced by set_xml_content_list_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_xml_content_list_bystr()

int set_xml_content_list_bystr ( tXML pp,
const char *  str,
const char *  content 
)

int set_xml_content_list_bystr(tXML* pp, const char* str, const char* content)

set_xml_content_list_bystr() の _bystr バージョン.

Definition at line 2800 of file txml.c.

2801 {
2802  tXML* tx;
2803  int rt;
2804 
2805  if (pp==NULL || str==NULL || content==NULL) return 0;
2806 
2807  tx = xml_parse((char*)str);
2808  rt = set_xml_content_list(pp, tx, content);
2809  del_all_xml(&tx);
2810 
2811  return rt;
2812 }
int set_xml_content_list(tXML *pp, tXML *pt, const char *content)
get_xml_content_list() で検出したコンテントを, content で置き換える.
Definition: txml.c:2731

References del_all_xml, set_xml_content_list(), and xml_parse().

Here is the call graph for this function:

◆ set_xml_content_node()

tXML* set_xml_content_node ( tXML xml,
const char *  content 
)

tXML* set_xml_content_node(tXML* xml, const char* content)

XMLツリーのxml の直下のコンテントノードの値を置き換える.
コンテントノードが無ければ,add_xml_content_node() でコンテントノードを追加する.
xmlがノード名ノードでなければエラー(NULLが返る) .

Parameters
xmlコンテントを設定する コンテントノード.このノードはノード名ノードでなければならない.
content設定する コンテント.
Return values
追加したコンテントノードへのポインタ.

Definition at line 1346 of file txml.c.

1347 {
1348  tList* pp;
1349 
1350  if (xml==NULL || content==NULL) return NULL;
1351  if (xml->ldat.id!=XML_NAME_NODE) return NULL;
1352 
1353  pp = xml->next;
1354  while (pp!=NULL && pp->ldat.id!=XML_CONTENT_NODE) pp = pp->ysis;
1355 
1356  if (pp==NULL) {
1357  pp = add_xml_content_node(xml, content);
1358  }
1359  else {
1360  copy_s2Buffer(content, &(pp->ldat.key));
1361  }
1362 
1363  return pp;
1364 }

References add_xml_content_node(), copy_s2Buffer, XML_CONTENT_NODE, and XML_NAME_NODE.

Here is the call graph for this function:

◆ set_xml_end_node()

int set_xml_end_node ( tXML pp,
tXML pt 
)

int set_xml_end_node(tXML* pp, tXML* pt)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後のノードに対応したノードに ptの最後のノードの値(含む属性)をコピーする.
pp の姉妹ツリーも検索する.
ただし,ptの最後のノードに関しては比較されない(コピー用だから).
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは比較されない.
これらのノードは必ず一致する.コピーを行うのは ptの最後のノードのみである.

コピーする属性は ldat.id, ldat.lv, ldat.sz, ldat.key, ldat.val, ldat.ptr, ldat.lst
ldat.val, ldat.ptr, ldat.lst については,ptで値が設定されていなければ,置き換えを行わない.

Parameters
pp検索対象のXMLツリー.姉妹ツリーも検索する.
pt検索パターン
Return values
TRUE設定する枝を見つけた.正常に設定れたかどうかは不明.
FALSE設定する枝を見つけられなかった.

Definition at line 1956 of file txml.c.

1957 {
1958  int ret;
1959  tXML* tt;
1960  tXML* pm;
1961 
1962 
1963  if (pp==NULL || pt==NULL) return FALSE;
1964 
1965  pm = pp;
1966  if (pp->ldat.id==XML_ANCHOR_NODE) {
1967  if (pp->next!=NULL) pp = pp->next;
1968  else return FALSE;
1969  }
1970  if (pt->ldat.id==XML_ANCHOR_NODE) {
1971  if (pt->next!=NULL) pt = pt->next;
1972  else return FALSE;
1973  }
1974 
1975  tt = find_xml_end(pt);
1976  if (tt==NULL) return FALSE;
1977  tt->ctrl = TREE_NOCMP_COPY_NODE; // 比べない.最後にコピー.
1978 
1979  while(pp->esis!=NULL) pp = pp->esis;
1980  ret = find_match_xml(pp, pt);
1981  if (ret) {
1982  _copy_tTree_byctrl(pt);
1983  adjust_tTree_depth(pp);
1984  }
1985 
1986  _clear_tTree_ctrl(pm);
1987 
1988  return ret;
1989 }
void _copy_tTree_byctrl(tTree *pt)
同じパターンの枝を検索し,ptのノードの属性をコピーする.
Definition: ttree.c:1541

References _clear_tTree_ctrl(), _copy_tTree_byctrl(), adjust_tTree_depth(), FALSE, find_match_xml(), find_xml_end, TREE_NOCMP_COPY_NODE, and XML_ANCHOR_NODE.

Referenced by set_xml_end_node_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_xml_end_node_bystr()

int set_xml_end_node_bystr ( tXML pp,
const char *  str 
)

int set_xml_end_node_bystr(tXML* pp, const char* str)

set_xml_end_node(tXML* pp, tXML* pt) の _bystr バージョン

Definition at line 2391 of file txml.c.

2392 {
2393  tXML* tx;
2394  int rt;
2395 
2396  if (pp==NULL || str==NULL) return FALSE;
2397 
2398  tx = xml_parse((char*)str);
2399  rt = set_xml_end_node(pp, tx);
2400  del_all_xml(&tx);
2401  return rt;
2402 }
int set_xml_end_node(tXML *pp, tXML *pt)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す.
Definition: txml.c:1956

References del_all_xml, FALSE, set_xml_end_node(), and xml_parse().

Here is the call graph for this function:

◆ set_xml_node()

int set_xml_node ( tXML pp,
tXML pt,
const char *  name 
)

int set_xml_node(tXML* pp, tXML* pt, const char* name)

XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノード対応したノードにノード名をコピーする.
pp の姉妹ツリーも検索する.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっている ノードは比較されない.

Parameters
pp検索対象のXMLツリー.姉妹ツリーも検索する.
pt検索パターン
nameptの最後のノードに対応するノードにコピーするノード名.
Return values
TRUE設定するノードノードを見つけた.正常に設定れたかどうかは不明.
FALSE設定するノードノードを見つけられなかった.

Definition at line 1921 of file txml.c.

1922 {
1923  tXML* tt;
1924 
1925  if (pp==NULL || pt==NULL || name==NULL) return FALSE;
1926 
1927  tt = get_xml_node(pp, pt);
1928  if (tt==NULL) return FALSE;
1929 
1930  copy_s2Buffer(name, &(tt->ldat.key));
1931 
1932  return TRUE;
1933 }

References copy_s2Buffer, FALSE, get_xml_node(), and TRUE.

Referenced by set_xml_node_bystr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_xml_node_bystr()

int set_xml_node_bystr ( tXML pp,
const char *  str,
const char *  val 
)

int set_xml_node_bystr(tXML* pp, const char* str, const char* val)

set_xml_node(tXML* pp, tXML* pt, const char* val) の _bystr バージョン

Definition at line 2372 of file txml.c.

2373 {
2374  tXML* tx;
2375  int rt;
2376 
2377  if (pp==NULL || str==NULL || val==NULL) return FALSE;
2378 
2379  tx = xml_parse((char*)str);
2380  rt = set_xml_node(pp, tx, val);
2381  del_all_xml(&tx);
2382  return rt;
2383 }
int set_xml_node(tXML *pp, tXML *pt, const char *name)
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノード対応したノードにノード名をコピーする.
Definition: txml.c:1921

References del_all_xml, FALSE, set_xml_node(), and xml_parse().

Here is the call graph for this function:

◆ xml_attr_to_Buffer()

void xml_attr_to_Buffer ( tList pp,
Buffer buf 
)

void xml_attr_to_Buffer(tList* pp, Buffer* buf)

リストに保存されたノードの属性をテキストへ戻す.

Parameters
pp属性データが格納されたリストへのポインタ.
buf変換した属性データを格納する Buffer変数.

Definition at line 1178 of file txml.c.

1179 {
1180  while (pp!=NULL) {
1181  cat_s2Buffer(" ", buf);
1182  cat_Buffer(&(pp->ldat.key), buf);
1183 
1184  if (pp->ldat.val.buf!=NULL) {
1185  cat_s2Buffer("=", buf);
1186  cat_Buffer(&(pp->ldat.val), buf);
1187  }
1188  pp = pp->next;
1189  }
1190 }
int cat_Buffer(Buffer *src, Buffer *dst)
Buffer変数 srcから dstへバッファを catする.
Definition: buffer.c:384

References buf, cat_Buffer(), and cat_s2Buffer.

Referenced by xml_open_node_Buffer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_close_node_Buffer()

void xml_close_node_Buffer ( tXML pp,
Buffer buf,
int  mode,
int  indent 
)

void xml_close_node_Buffer(tXML* pp, Buffer* buf, int mode, int indent)

ツリー中のXMLのクローズノードのデータを元の書式に戻して Bufferに格納する.

Parameters
ppXMLデータの格納されたツリーのノードへのポインタ
buf変換したXMLデータを格納した Buffer変数.
mode元のXMLへ戻す時の書式
modeXML_ONELINE_FORMAT 改行なしの一行にする.
modeXML_CRLF_FORMAT ノードの終わりを CR(0x0d), LF(0x0a)で改行する.
modeXML_TAB_FORMAT 先頭にインデント(TAB)をつけ,ノードごとに改行する.
modeXML_SPACE_FORMAT 先頭に空白2つをつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
modeXML_SPACE4_FORMAT 先頭に空白4つをつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
indentインデントを付け始める深さ.modeが XML_INDENT_MODE のときのみ有効.

Definition at line 1144 of file txml.c.

1145 {
1146  if (pp->ldat.id==XML_NAME_NODE) {
1147  if (pp->next!=NULL) {
1148  if (pp->next->ldat.id!=XML_CONTENT_NODE || pp->next->ysis!=NULL) {
1149  if (mode==XML_TAB_FORMAT) {
1150  add_indent_Buffer(buf, '\t', pp->depth - indent);
1151  }
1152  else if (mode==XML_SPACE_FORMAT) {
1153  add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1154  }
1155  else if (mode==XML_SPACE4_FORMAT) {
1156  add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1157  }
1158  }
1159  cat_s2Buffer("</", buf);
1160  cat_Buffer(&(pp->ldat.key), buf);
1161  cat_s2Buffer(">", buf);
1162 
1163  if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1164  }
1165  }
1166  return;
1167 }
void add_indent_Buffer(Buffer *buf, char cc, int len)
インデント(cc x num) を付加する.
Definition: buffer.c:1327
#define CRLF
Definition: common.h:241
#define XML_SPACE4_FORMAT
先頭に空白4つ " " をつけ,ノードごとに改行する.
Definition: txml.h:122
#define XML_TAB_FORMAT
先頭にインデント(TAB)をつけ,ノードごとに改行する.
Definition: txml.h:119
#define XML_ONELINE_FORMAT
改行なしの一行にする.
Definition: txml.h:117
#define XML_SPACE_FORMAT
先頭に空白2つ " " をつけ,ノードごとに改行する.
Definition: txml.h:120

References add_indent_Buffer(), buf, cat_Buffer(), cat_s2Buffer, CRLF, XML_CONTENT_NODE, XML_NAME_NODE, XML_ONELINE_FORMAT, XML_SPACE4_FORMAT, XML_SPACE_FORMAT, and XML_TAB_FORMAT.

Referenced by _xml_to_Buffer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_get_node_attr()

char* xml_get_node_attr ( tXML node,
const char *  attr 
)

char* xml_get_node_attr(tXML* node, const char* attr)

属性値を持つノードのポインタから,指定された属性値へのポインタを返す.free() してはいけない.

Definition at line 1606 of file txml.c.

1607 {
1608  if (node==NULL) return NULL;
1609 
1610  if (node->ldat.id==XML_NAME_NODE) {
1611  tList* lt = node->ldat.lst;
1612  while (lt!=NULL) {
1613  if (!strcmp((const char*)lt->ldat.key.buf, attr)) return (char*)(lt->ldat.val.buf);
1614  lt = lt->next;
1615  }
1616  }
1617  return NULL;
1618 }

References XML_NAME_NODE.

Referenced by get_xml_char_attr(), get_xml_char_attr_bystr(), get_xml_double_attr(), get_xml_double_attr_bystr(), get_xml_int_attr(), and get_xml_int_attr_bystr().

Here is the caller graph for this function:

◆ xml_get_node_content()

char* xml_get_node_content ( tXML node)

char* xml_get_node_content(tXML* node)

コンテントへのポインタを返す.free() してはいけない.

Definition at line 1590 of file txml.c.

1591 {
1592  if (node==NULL || node->next==NULL) return NULL;
1593 
1594  if (node->ldat.id==XML_NAME_NODE) {
1595  if (node->next->ldat.id==XML_CONTENT_NODE) return (char*)(node->next->ldat.key.buf);
1596  }
1597  return NULL;
1598 }

References XML_CONTENT_NODE, and XML_NAME_NODE.

◆ xml_inverse_parse()

Buffer xml_inverse_parse ( tXML pp,
int  mode 
)

Buffer xml_inverse_parse(tXML* pp, int mode)

ppに格納された XMLデータを元の書式に戻して Bufferに格納する.xml_parse() の逆.
XML_CRLF_FORMAT, XML_TAB_FORMAT XML_SPACE_FORMAT XML_SPACE4_FORMAT でノード値がある場合は,値を囲むノードは改行しない.

Parameters
ppXMLデータの格納されたツリーへのポインタ
mode元のXMLへ戻す時の書式
modeXML_ONELINE_FORMAT 改行なしの一行にする.
modeXML_CRLF_FORMAT ノードの終わりを CR(0x0d), LF(0x0a)で改行する.
modeXML_TAB_FORMAT 先頭にインデント(TAB)をつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
modeXML_SPACE_FORMAT 先頭に空白2つをつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
modeXML_SPACE4_FORMAT 先頭に空白4つをつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
Returns
変換したXMLデータを格納した Buffer変数.

Definition at line 891 of file txml.c.

892 {
893  int cnt;
894  Buffer buf;
895 
896  buf = init_Buffer();
897  if (pp==NULL) return buf;
898  if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next;
899  if (pp==NULL) return buf;
900 
901  cnt = count_tTree(pp);
902  buf = make_Buffer(cnt*LMDATA);
903  if (buf.buf==NULL) return buf;
904 
905  while (pp->esis!=NULL) pp = pp->esis;
906  _xml_to_Buffer(pp, &buf, mode, pp->depth);
907 
908  return buf;
909 }
Buffer make_Buffer(int sz)
Buffer型変数のバッファ部をつくり出す.
Definition: buffer.c:71
#define LMDATA
Definition: common.h:154
int count_tTree(tTree *pp)
ツリーの ppノード以降のノードの数を数える.
Definition: ttree.c:1151

References _xml_to_Buffer(), buf, count_tTree(), init_Buffer(), LMDATA, make_Buffer(), and XML_ANCHOR_NODE.

Referenced by print_xml(), and xml_rpc_request_pack().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_main_parse()

tXML* xml_main_parse ( tXML xml,
char *  pp,
int  skip 
)

tXML* xml_main_parse(tXML* xml, char* pp, int skip)

部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.
完全な XMLデータでなくても解釈できるところまでは解釈する.
パーサの内部的なメイン関数.ただし,ユーザが直接この関数を使用することは多分無い.

Parameters
xmlXMLデータを格納するツリー構造体の先頭へのポインタ.
ppXMLデータへのポインタ.
skip最初のデータ(タイトルなど)をスキップするか? TRUE or FLASE
Returns
最後に処理したノードノードへのポインタ.ppがNULLの場合は xml, xmlが NULLの場合は NULLが返る.
Return values
負数state エラーの場合は stateに 負数の値が入る.

Definition at line 189 of file txml.c.

190 {
191  int n, node_end;
192  char* node_name = NULL;
193  char* node_attr = NULL;
194  char* value = NULL;
195 
196  if (pp ==NULL) return xml;
197  if (xml==NULL) return NULL;
198 
199  if (skip) while (*pp!='\0' && *pp!='<') pp++;
200 
201  while (*pp!='\0') {
202  n = 1;
203 
204  if (*pp=='<') {
205  // End TAG </ >
206  if (*(pp+1)=='/') {
207  if (xml->state==JBXL_XML_NODE_OPENED) {
208  n = xml_parse_end_node(pp, &node_name);
209  if (n>0) {
210  if (node_name!=NULL && xml->ldat.key.buf!=NULL) {
211  if (!strcmp((const char*)node_name, (const char*)(xml->ldat.key.buf))) {
212  if (xml->next!=NULL) {
213  xml->state = JBXL_XML_NODE_CLOSED;
214  }
215  else {
216  xml->state = JBXL_XML_NODE_EMPTY;
217  }
218  //
219  if (xml->prev!=NULL) xml = xml->prev;
220  else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
221  }
222  else n = xml->state = JBXL_XML_PARSE_ERROR;
223  }
224  else n = xml->state = JBXL_XML_PARSE_ERROR;
225  }
226  else xml->state = n; // エラー
227  }
228  else n = xml->state = JBXL_XML_PARSE_ERROR;
229  }
230 
231  // Comment TAG <!-- -->
232  else if (!strncmp(pp+1, "!--", 3)) {
233  n = xml_parse_comment_node(pp, &value);
234  if (n>0) {
235  xml = add_tTree_node_bystr(xml, XML_COMMENT_NODE, 0, (char*)XML_COMMENT_NODE_KEY, value, NULL, 0);
236  xml->state = JBXL_XML_NODE_EMPTY;
237  if (xml->prev!=NULL) xml = xml->prev;
238  else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
239  }
240  }
241 
242  // Data TAG <! >
243  else if (*(pp+1)=='!') {
244  n = xml_parse_data_node(pp, &value);
245  if (n>0) {
246  xml = add_tTree_node_bystr(xml, XML_DATA_NODE, 0, (char*)XML_DATA_NODE_KEY, value, NULL, 0);
247  xml->state = JBXL_XML_NODE_EMPTY;
248  if (xml->prev!=NULL) xml = xml->prev;
249  else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
250  }
251  }
252 
253  // Processing TAG <? ?>
254  else if (*(pp+1)=='?') {
255  n = xml_parse_processing_node(pp, &node_name, &node_attr);
256  if (n>0) {
257  if (!strncasecmp("xml", node_name, 3)) {
258  tList* lp = xml_parse_attr(node_attr);
259  xml = add_tTree_node_bystr(xml, XML_DOC_NODE, 0, node_name, NULL, NULL, 0);
260  xml->ldat.lst = lp;
261  }
262  else {
263  xml = add_tTree_node_bystr(xml, XML_PROCESS_NODE, 0, node_name, node_attr, NULL, 0);
264  }
265  xml->state = JBXL_XML_NODE_EMPTY;
266  if (xml->prev!=NULL) xml = xml->prev;
267  else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
268  }
269  }
270 
271  // Start TAG < >
272  else {
273  n = xml_parse_start_node(pp, &node_name, &node_attr, &node_end);
274 
275  if (n>0) {
276  tList* lp = xml_parse_attr(node_attr);
277  xml = add_tTree_node_bystr(xml, XML_NAME_NODE, 0, node_name, NULL, NULL, 0);
278  xml->ldat.lst = lp;
279 
280  if (node_end) {
281  xml->state = JBXL_XML_NODE_EMPTY;
282  if (xml->prev!=NULL) xml = xml->prev;
283  else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
284  }
285  else {
286  int m;
287  xml->state = JBXL_XML_NODE_OPENED;
288  // ノード値
289  m = xml_parse_content(pp+n, &value); // 0 が返る可能性がある
290  if (m>=0) {
291  n += m;
292  if (value!=NULL) {
293  xml = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, value, NULL, NULL, 0);
294  xml->state = JBXL_XML_NODE_CLOSED;
295  if (xml->prev!=NULL) {
296  xml = xml->prev;
297  xml->ldat.lv++;
298  }
299  else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
300  }
301  }
302  else n = xml->state = m; // エラー
303  }
304  }
305  }
306 
307  freeNull(node_name);
308  freeNull(node_attr);
309  freeNull(value);
310  }
311 
312  // Content (断片的に入力したXMLが content の途中で終わっている場合など)
313  else {
314  if (xml->state==JBXL_XML_NODE_OPENED) {
315  n = xml_parse_content(pp, &value);
316  if (n>0) {
317  if (value!=NULL) {
318  xml = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, value, NULL, NULL, 0);
319  xml->state = JBXL_XML_NODE_CLOSED;
320  if (xml->prev!=NULL) {
321  xml = xml->prev;
322  xml->ldat.lv++;
323  }
324  else n = xml->state = JBXL_XML_SEQUENCE_ERROR;
325  }
326  }
327  else n = xml->state = JBXL_XML_PARSE_ERROR;
328  freeNull(value);
329  }
330  else n = xml->state = JBXL_XML_PARSE_ERROR;
331  }
332 
333  // エラー
334  if (n<=0) return xml;
335 
336  pp += n;
337  while (*pp==' ' || *pp==CHAR_TAB || *pp==CHAR_LF || *pp==CHAR_CR) pp++;
338  }
339 
340  return xml;
341 }
#define JBXL_XML_NODE_OPENED
XMLノードは開いている
Definition: jbxl_state.h:94
#define JBXL_XML_PARSE_ERROR
XML の解釈エラー
Definition: jbxl_state.h:88
#define JBXL_XML_SEQUENCE_ERROR
XMLノードのリンクエラー
Definition: jbxl_state.h:89
#define CHAR_TAB
タブ
Definition: tools.h:80
#define CHAR_CR
改行
Definition: tools.h:78
#define CHAR_LF
ラインフィード
Definition: tools.h:79
int xml_parse_comment_node(char *pp, char **comment)
XMLのコメントノードを処理する.
Definition: txml.c:730
int xml_parse_start_node(char *pp, char **node_name, char **node_attr, int *node_end)
XMLの開始ノードを処理する.
Definition: txml.c:371
int xml_parse_processing_node(char *pp, char **node_name, char **node_attr)
XMLのプロセッシングノードを処理する
Definition: txml.c:654
int xml_parse_data_node(char *pp, char **data)
XMLのデータノード(その他エレメントノードなど)を処理する.
Definition: txml.c:773
int xml_parse_end_node(char *pp, char **node_name)
XMLの終了ノードを処理する.
Definition: txml.c:468
int xml_parse_content(char *pp, char **content)
XMLのコンテントを処理する.
Definition: txml.c:513
#define XML_COMMENT_NODE
コメントノード
Definition: txml.h:112
#define XML_PROCESS_NODE
XML_DOC_NODE 以外の <? ... ?>ノード
Definition: txml.h:114
#define XML_DATA_NODE
<! ... > ノード
Definition: txml.h:113
#define XML_DOC_NODE
<? xml... ?> ノード
Definition: txml.h:111
#define XML_DATA_NODE_KEY
Definition: txml.h:126
#define XML_COMMENT_NODE_KEY
Definition: txml.h:125

References add_tTree_node_bystr(), CHAR_CR, CHAR_LF, CHAR_TAB, freeNull, JBXL_XML_NODE_CLOSED, JBXL_XML_NODE_EMPTY, JBXL_XML_NODE_OPENED, JBXL_XML_PARSE_ERROR, JBXL_XML_SEQUENCE_ERROR, XML_COMMENT_NODE, XML_COMMENT_NODE_KEY, XML_CONTENT_NODE, XML_DATA_NODE, XML_DATA_NODE_KEY, XML_DOC_NODE, XML_NAME_NODE, xml_parse_attr(), xml_parse_comment_node(), xml_parse_content(), xml_parse_data_node(), xml_parse_end_node(), xml_parse_processing_node(), xml_parse_start_node(), and XML_PROCESS_NODE.

Referenced by xml_parse(), and xml_parse_seq().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_open_node_Buffer()

void xml_open_node_Buffer ( tXML pp,
Buffer buf,
int  mode,
int  indent 
)

void xml_open_node_Buffer(tXML* pp, Buffer* buf, int mode, int indent)

ツリー中のXMLのオープンノードのデータを元の書式に戻して Bufferに格納する.

Parameters
ppXMLデータの格納されたツリーのノードへのポインタ
buf変換したXMLデータを格納した Buffer変数.
mode元のXMLへ戻す時の書式
modeXML_ONELINE_FORMAT 改行なしの一行にする.
modeXML_CRLF_FORMAT ノードの終わりを CR(0x0d), LF(0x0a)で改行する.
modeXML_TAB_FORMAT 先頭にインデント(TAB)をつけ,ノードごとに改行する.
modeXML_SPACE_FORMAT 先頭に空白2つをつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
modeXML_SPACE4_FORMAT 先頭に空白4つをつけ,ノードごとに改行 CR LF (0x0d,0x0a)する.
indentインデントを付け始める深さ.modeが XML_TAB_FORMAT, XML_SPACE_FORMAT, ML_SPACE4_FORMAT のときのみ有効.

Definition at line 958 of file txml.c.

959 {
960  int i;
961 
962  // Name TAG
963  if (pp->ldat.id==XML_NAME_NODE) {
964  if (mode!=XML_ONELINE_FORMAT) {
965  if (buf->vldsz>0 && buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer(CRLF, buf);
966  }
967  //
968  if (mode==XML_TAB_FORMAT) {
969  add_indent_Buffer(buf, '\t', pp->depth - indent);
970  }
971  else if (mode==XML_SPACE_FORMAT) {
972  add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
973  }
974  else if (mode==XML_SPACE4_FORMAT) {
975  add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
976  }
977 
978  cat_s2Buffer("<", buf);
979  cat_Buffer(&(pp->ldat.key), buf);
980  if (pp->ldat.lst!=NULL) {
981  xml_attr_to_Buffer(pp->ldat.lst, buf);
982  }
983  if (pp->next==NULL) {
984  if (pp->state==JBXL_XML_NODE_EMPTY) {
985  cat_s2Buffer(" />", buf);
986  }
987  else {
988  cat_s2Buffer("></", buf);
989  cat_Buffer(&(pp->ldat.key), buf);
990  cat_s2Buffer(">", buf);
991  }
992  if (mode!=XML_ONELINE_FORMAT) {
994  }
995  }
996  else {
997  cat_s2Buffer(">", buf);
998  }
999  }
1000 
1001  // Content
1002  else if (pp->ldat.id==XML_CONTENT_NODE) {
1003  if (buf->buf[buf->vldsz-1]=='\n') {
1004  buf->buf[buf->vldsz-2] = '\0';
1005  buf->vldsz -= 2;
1006  }
1007  //
1008  if (pp->esis!=NULL || pp->ysis!=NULL) {
1009  cat_s2Buffer(CRLF, buf);
1010  char* tabs = (char*)malloc(pp->depth-indent+1);
1011  if (tabs!=NULL) {
1012  for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t';
1013  tabs[pp->depth-indent] = '\0';
1014  cat_s2Buffer(tabs, buf);
1015  free(tabs);
1016  }
1017  }
1018  //
1019  cat_Buffer(&(pp->ldat.key), buf);
1020  //
1021  if (pp->esis!=NULL) cat_s2Buffer(CRLF, buf);
1022  }
1023 
1024  // xml TAG
1025  else if (pp->ldat.id==XML_DOC_NODE) {
1026  if (mode==XML_TAB_FORMAT) {
1027  add_indent_Buffer(buf, '\t', pp->depth - indent);
1028  }
1029  else if (mode==XML_SPACE_FORMAT) {
1030  add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1031  }
1032  else if (mode==XML_SPACE4_FORMAT) {
1033  add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1034  }
1035 
1036  cat_s2Buffer("<?", buf);
1037  if (pp->ldat.key.buf!=NULL) {
1038  cat_Buffer(&(pp->ldat.key), buf);
1039  }
1040  if (pp->ldat.lst!=NULL) {
1041  xml_attr_to_Buffer(pp->ldat.lst, buf);
1042  }
1043  cat_s2Buffer("?>", buf);
1044 
1045  if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1046  }
1047 
1048  // Comment TAG
1049  else if (pp->ldat.id==XML_COMMENT_NODE) {
1050  if (mode!=XML_ONELINE_FORMAT) {
1051  if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer(CRLF, buf);
1052  }
1053 
1054  if (mode==XML_TAB_FORMAT) {
1055  add_indent_Buffer(buf, '\t', pp->depth - indent);
1056  }
1057  else if (mode==XML_SPACE_FORMAT) {
1058  add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1059  }
1060  else if (mode==XML_SPACE4_FORMAT) {
1061  add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1062  }
1063 
1064  cat_s2Buffer("<!--", buf);
1065  if (pp->ldat.val.buf!=NULL) {
1066  cat_Buffer(&(pp->ldat.val), buf);
1067  }
1068  cat_s2Buffer("-->", buf);
1069 
1070  if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1071  }
1072 
1073  // Data TAG
1074  else if (pp->ldat.id==XML_DATA_NODE) {
1075  if (mode!=XML_ONELINE_FORMAT) {
1076  if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer(CRLF, buf);
1077  }
1078  //
1079  if (mode==XML_TAB_FORMAT) {
1080  add_indent_Buffer(buf, '\t', pp->depth - indent);
1081  }
1082  else if (mode==XML_SPACE_FORMAT) {
1083  add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1084  }
1085  else if (mode==XML_SPACE4_FORMAT) {
1086  add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1087  }
1088 
1089  cat_s2Buffer("<!", buf);
1090  if (pp->ldat.val.buf!=NULL) {
1091  cat_Buffer(&(pp->ldat.val), buf);
1092  }
1093  cat_s2Buffer(">", buf);
1094 
1095  if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1096  }
1097 
1098  // Processing TAG
1099  else if (pp->ldat.id==XML_PROCESS_NODE) {
1100  if (mode!=XML_ONELINE_FORMAT) {
1101  if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer(CRLF, buf);
1102  }
1103  //
1104  if (mode==XML_TAB_FORMAT) {
1105  add_indent_Buffer(buf, '\t', pp->depth - indent);
1106  }
1107  else if (mode==XML_SPACE_FORMAT) {
1108  add_indent_Buffer(buf, ' ', pp->depth*2 - indent);
1109  }
1110  else if (mode==XML_SPACE4_FORMAT) {
1111  add_indent_Buffer(buf, ' ', pp->depth*4 - indent);
1112  }
1113 
1114  cat_s2Buffer("<?", buf);
1115  if (pp->ldat.key.buf!=NULL) {
1116  cat_Buffer(&(pp->ldat.key), buf);
1117  }
1118  if (pp->ldat.lst!=NULL) {
1119  xml_attr_to_Buffer(pp->ldat.lst, buf);
1120  }
1121  cat_s2Buffer(" ?>", buf);
1122 
1123  if (mode!=XML_ONELINE_FORMAT) cat_s2Buffer(CRLF, buf);
1124  }
1125  return;
1126 }
void xml_attr_to_Buffer(tList *pp, Buffer *buf)
リストに保存されたノードの属性をテキストへ戻す.
Definition: txml.c:1178

References add_indent_Buffer(), buf, cat_Buffer(), cat_s2Buffer, CRLF, JBXL_XML_NODE_EMPTY, xml_attr_to_Buffer(), XML_COMMENT_NODE, XML_CONTENT_NODE, XML_DATA_NODE, XML_DOC_NODE, XML_NAME_NODE, XML_ONELINE_FORMAT, XML_PROCESS_NODE, XML_SPACE4_FORMAT, XML_SPACE_FORMAT, and XML_TAB_FORMAT.

Referenced by _xml_to_Buffer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_parse()

tXML* xml_parse ( char *  pp)

tXML* xml_parse(char* pp)

文字列のXMLデータを解釈して,tXMLのツリーを生成する.

Parameters
pp文字列の XMLデータへのポインタ.
Returns
XMLデータを格納した tXMLのアンカーへのポインタ.
エラーの場合,next以下のノードにはエラーを起こす直前までの内容が保存される
Return values
負数エラーを起こした場合 stateに JBXL_XML_PARSED以外の値(0以下)が入る.
tXML* xml = xml_parse("<a t=\"x\"><b>aaaa<d>bbbb</d>cccc<xxxi/>ddddd</b><c><e></e></c></a>");

Definition at line 48 of file txml.c.

49 {
50  tXML* xml;
51  tXML* node;
52 
53  xml = new_xml_node(); // アンカー
54  xml->ldat.id = XML_ANCHOR_NODE;
55  xml->state = JBXL_STATE_ANCHOR;
56  xml->depth = -1;
57 
58  // パース
59  node = xml_main_parse(xml, pp, TRUE);
60  if (node->state<0) return xml;
61 
62  // 元に戻ったか?
63  if (xml==node) {
64  xml->state = JBXL_XML_PARSED;
65  }
66  else {
67  xml->state = JBXL_XML_NOT_CLOSED;
68  }
69 
70  // XML rootの数
71  if (xml->next!=NULL) {
72  int n = 0;
73  node = xml->next;
74  while(node!=NULL) {
75  if (node->ldat.id==XML_NAME_NODE) n++;
76  node = node->ysis;
77  }
78  if (n!=1) xml->state = JBXL_XML_MULTI_ROOT;
79  }
80  else xml->state = JBXL_XML_DEFAULT_STATE;
81 
82  return xml;
83 }
#define JBXL_STATE_ANCHOR
アンカーノード
Definition: jbxl_state.h:30
#define JBXL_XML_DEFAULT_STATE
XMLデータの初期状態
Definition: jbxl_state.h:98
#define JBXL_XML_NOT_CLOSED
XMLデータが閉じていない
Definition: jbxl_state.h:97
#define JBXL_XML_MULTI_ROOT
XMLは複数のルート(TOP)を持っている.(パース済み)
Definition: jbxl_state.h:93
tXML * xml_main_parse(tXML *xml, char *pp, int skip)
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.パーサの内部的なメイン関数.
Definition: txml.c:189
#define new_xml_node()
new_tTree_node()
Definition: txml.h:133

References JBXL_STATE_ANCHOR, JBXL_XML_DEFAULT_STATE, JBXL_XML_MULTI_ROOT, JBXL_XML_NOT_CLOSED, JBXL_XML_PARSED, new_xml_node, TRUE, XML_ANCHOR_NODE, xml_main_parse(), and XML_NAME_NODE.

Referenced by get_xml_attr_bystr(), get_xml_content_bystr(), get_xml_content_list_bystr(), get_xml_node_bystr(), get_xml_node_list_bystr(), init_xml_doc(), replace_xml_content_bystr(), set_xml_attr_bystr(), set_xml_content_bystr(), set_xml_content_list_bystr(), set_xml_end_node_bystr(), set_xml_node_bystr(), and xml_parse_file().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_parse_attr()

tList* xml_parse_attr ( char *  pp)

tList* xml_parse_attr(char* pp)

XMLのノード属性を解釈して,リスト(tList)にする. 解釈する形式は AAA="GGG" xxxx="1234"

Parameters
ppテキストで保存されている属性へのポインタ.
Returns
生成したリストの先頭へのポインタ.
Return values
JBXL_XML_PARSE_ERRstate パースエラーの場合は state に JBXL_XML_PARSE_ERROR が設定される.
JBXL_XML_NODE_CLOSEDstate 正常に終了した場合は JBXL_XML_NODE_CLOSED が設定される.

Definition at line 559 of file txml.c.

560 {
561  int sz;
562  char* nm;
563  char* vl;
564  char* pt;
565  char qt;
566  tList* lp = NULL;
567  tList* lt = NULL;
568 
569  // 作業メモリの確保
570  if (pp==NULL) return NULL;
571  sz = (int)strlen((const char*)pp) + 1;
572  nm = (char*)malloc(sz);
573  if (nm==NULL) return NULL;
574  memset(nm, 0, sz);
575 
576  vl = (char*)malloc(sz);
577  if (vl==NULL) {
578  free(nm);
579  return NULL;
580  }
581  memset(vl, 0, sz);
582 
583  // Parse for AAA="BBB" CCC="DDDD"
584  while (*pp==' ' && *pp!='\0') pp++;
585  while (*pp!='\0') {
586  pt = pp;
587  while (*pt!='=' && *pt!='\0') pt++;
588  if (*pt=='\0') {
589  if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
590  break;
591  }
592 
593  sz = (int)(pt - pp);
594  memcpy(nm, pp, (size_t)sz);
595  nm[sz] = '\0';
596 
597  pt++;
598  if (*pt!='"' && *pt!='\'') {
599  if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
600  break;
601  }
602  else qt = *pt;
603 
604  pt++;
605  pp = pt;
606  while(*pt!=qt && *pt!='\0') pt++;
607  if (*pt=='\0') {
608  if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR;
609  break;
610  }
611 
612  sz = (int)(pt - pp);
613  memcpy(vl+1, pp, (size_t)sz);
614  vl[0] = qt;
615  vl[sz+1] = qt;
616  vl[sz+2] = '\0';
617 
618  lp = add_tList_node_str(lp, nm, vl);
619  if (lt==NULL) lt = lp;
620  pp = pt + 1;
621 
622  if (*pp!=' ' && *pp!='\0') {
623  lt->state = JBXL_XML_PARSE_ERROR;
624  break;
625  }
626  while (*pp==' ' && *pp!='\0') pp++;
627  }
628 
629  //
630  free(nm);
631  free(vl);
632 
633  if (lt!=NULL) {
634  if (lt->state!=JBXL_XML_PARSE_ERROR) lt->state = JBXL_XML_NODE_CLOSED;
635  }
636  return lt;
637 }
#define add_tList_node_str(p, k, v)
add_tList_node_bystr()
Definition: tlist.h:142

References add_tList_node_str, JBXL_XML_NODE_CLOSED, and JBXL_XML_PARSE_ERROR.

Referenced by add_xml_attr(), and xml_main_parse().

Here is the caller graph for this function:

◆ xml_parse_comment_node()

int xml_parse_comment_node ( char *  pp,
char **  comment 
)

int xml_parse_comment_node(char* pp, char** comment)

XMLのコメントノードを処理する.処理できるノードの型は ''
xml_parse_data_node() に先立って適用させる必要がある.

Parameters
ppノードへのポインタ.'<' を指すポインタ.
[out]*commentコメント部分がそのまま格納される.要 free
Return values
1以上ノード全体の長さ.0 が返ることは無い.
JBXL_XML_PARSE_ERRORパースエラー
JBXL_MALLOC_ERRORメモリエラー

Definition at line 730 of file txml.c.

731 {
732  int nn, mm;
733  char* pt;
734 
735  *comment = NULL;
736  if (pp==NULL) return JBXL_XML_PARSE_ERROR;
737  if (strncmp(pp, "<!--", 4)) return JBXL_XML_PARSE_ERROR;
738 
739  pt = pp = pp + 4;
740  pt = skip_chars(pt, ">");
741  if (pt==NULL) return JBXL_XML_PARSE_ERROR;
742 
743  pt -= 2;
744  if (strncmp(pt, "-->", 3)) return JBXL_XML_PARSE_ERROR;
745 
746  nn = mm = (int)(pt - pp);
747  if (mm==0) return JBXL_XML_PARSE_ERROR;
748 
749  nn += 4;
750  *comment = (char*)malloc((size_t)(mm+1));
751  if (*comment==NULL) return JBXL_MALLOC_ERROR;
752  memcpy(*comment, pp, mm);
753  (*comment)[mm] = '\0';
754  //PRINT_MESG("COMMENT-> %s %d\n", *comment, (int)strlen(*comment));
755 
756  return nn + 3;
757 }
#define JBXL_MALLOC_ERROR
メモリ確保エラー
Definition: jbxl_state.h:41
char * skip_chars(char *pp, const char *check)
check[]中の何れかの文字までポインタをスキップさせる.ただし クォーテーション内は完全スキップ
Definition: tools.c:948

References JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, and skip_chars().

Referenced by xml_main_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_parse_content()

int xml_parse_content ( char *  pp,
char **  content 
)

int xml_parse_content(char* pp, char** content)

XMLのコンテントを処理する. <node_name attr="node_attr">content</node_name>
値の前後の空白,TAB, LF, CRは削除される.

Parameters
ppコンテントの先頭へのポインタ.Start Tagの '>' の次を指すポインタ.
[in]*contentコンテントを格納するポインタ.コンテントがない場合は NULLでも可.
[out]*contentコンテントが格納される.前後の 空白, TAB, LF, CRは削除されている.要 free
Return values
0以上ノード値部の全体の長さ.0 が返る可能性もある(<x></x>の場合)
JBXL_XML_PARSE_ERRORパースエラー
JBXL_MALLOC_ERRORメモリエラー

Definition at line 513 of file txml.c.

514 {
515  int nn=0, mm;
516  char* pt;
517  char* work;
518 
519  if (pp==NULL || content==NULL) return JBXL_XML_PARSE_ERROR;
520  *content = NULL;
521 
522  while (*pp==' ' || *pp==CHAR_TAB || *pp==CHAR_LF || *pp==CHAR_CR) {
523  pp++;
524  nn++;
525  }
526  if (*pp=='<') return nn; // <node><
527 
528  pt = pp;
529  while (*pt!='<' && *pt!='\0') pt++;
530 
531  mm = (int)(pt - pp);
532  if (mm==0) return nn;
533  nn += mm;
534 
535  work = (char*)malloc((size_t)(mm+1));
536  if (work==NULL) return JBXL_MALLOC_ERROR;
537  memcpy(work, pp, mm);
538  work[mm] = '\0';
539 
540  *content = pack_head_tail_char(work, ' ');
541  free(work);
542  //PRINT_MESG("VALUE --> %s %d\n", *content, (int)strlen(*content));
543 
544  return nn;
545 }
char * pack_head_tail_char(char *mesg, char cc)
文字の先頭のcc(複数),TAB, CR, LF.終わりのcc(複数),TAB, CR, LF を削除.要 free()
Definition: tools.c:1092

References CHAR_CR, CHAR_LF, CHAR_TAB, JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, and pack_head_tail_char().

Referenced by xml_main_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_parse_data_node()

int xml_parse_data_node ( char *  pp,
char **  data 
)

int xml_parse_data_node(char* pp, char** data)

XMLのデータノード(その他エレメントノードなど)を処理する.処理できるノードの型は <!data>
データ部分は解釈せずに,そのまま dataに格納される.

Parameters
ppノードへのポインタ.'<' を指すポインタ.
[out]*dataデータ部分がそのまま格納される.要 free
Return values
1以上ノード全体の長さ.0 が返ることは無い.
JBXL_XML_PARSE_ERRORパースエラー
JBXL_MALLOC_ERRORメモリエラー

Definition at line 773 of file txml.c.

774 {
775  int nn, mm;
776  char* pt;
777 
778  *data = NULL;
779  if (pp==NULL) return JBXL_XML_PARSE_ERROR;
780  if (strncmp(pp, "<!", 2)) return JBXL_XML_PARSE_ERROR;
781 
782  pt = pp = pp + 2;
783  pt = skip_chars(pt, ">");
784  if (pt==NULL) return JBXL_XML_PARSE_ERROR;
785 
786  nn = mm = (int)(pt - pp);
787  if (mm==0) return JBXL_XML_PARSE_ERROR;
788 
789  nn += 2;
790  *data = (char*)malloc((size_t)(mm+1));
791  if (*data==NULL) return JBXL_MALLOC_ERROR;
792  memcpy(*data, pp, mm);
793  (*data)[mm] = '\0';
794  //PRINT_MESG("DATA ---> %s %d\n", *data, (int)strlen(*data));
795 
796  return nn + 1;
797 }

References JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, and skip_chars().

Referenced by xml_main_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_parse_end_node()

int xml_parse_end_node ( char *  pp,
char **  node_name 
)

int xml_parse_end_node(char* pp, char** node_name)

XMLの終了ノードを処理する.処理できるノードの型は </node_name>

Parameters
ppノードへのポインタ.'<' を指すポインタ.
[out]*node_nameノードの名前を格納するポインタ.要 free
Return values
1以上ノード全体の長さ.0 が返ることは無い.
JBXL_XML_PARSE_ERRORパースエラー
JBXL_MALLOC_ERRORメモリエラー

Definition at line 468 of file txml.c.

469 {
470  int nn, mm;
471  char* pt;
472  char* work;
473 
474  if (pp==NULL) return JBXL_XML_PARSE_ERROR;
475  *node_name = NULL;
476 
477  if (strncmp(pp ,"</", 2)) return JBXL_XML_PARSE_ERROR;
478 
479  pt = pp = pp + 2;
480  pt = skip_chars(pt, ">");
481  if (pt==NULL) return JBXL_XML_PARSE_ERROR;
482 
483  nn = mm = (int)(pt - pp);
484  if (mm==0) return JBXL_XML_PARSE_ERROR;
485 
486  nn += 2;
487  work = (char*)malloc((size_t)(mm+1));
488  if (work==NULL) return JBXL_MALLOC_ERROR;
489  memcpy(work, pp, mm);
490  work[mm] = '\0';
491  *node_name = pack_head_tail_char(work, ' ');
492  free(work);
493  //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name));
494 
495  return nn + 1;
496 }

References JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, pack_head_tail_char(), and skip_chars().

Referenced by xml_main_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_parse_file()

tXML* xml_parse_file ( const char *  fn)

tXML* xml_parse_file(const char* fn)

ファイルから読み込んでパースする.

Parameters
fn読み込むファイル名
Returns
XMLデータを格納した tXMLのアンカーへのポインタ

Definition at line 94 of file txml.c.

95 {
96  tXML* xml = NULL;
97  Buffer buf;
98 
99  buf = read_Buffer_file(fn);
100  if (buf.buf!=NULL) {
101  xml = xml_parse((char*)(buf.buf));
102  free_Buffer(&buf);
103  }
104 
105  return xml;
106 }
Buffer read_Buffer_file(const char *fn)
ファイル fn の内容を Buffer型変数に読み込む.
Definition: buffer.c:1467

References buf, free_Buffer(), read_Buffer_file(), and xml_parse().

Referenced by save_http_xml().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_parse_processing_node()

int xml_parse_processing_node ( char *  pp,
char **  node_name,
char **  node_attr 
)

int xml_parse_processing_node(char* pp, char** node_name, char** node_attr)

XMLのプロセッシングノードを処理する.処理できるノードの型は <?processing?>
プロセッシング部分は解釈せずに,そのまま node_name, node_attrに格納される.

Parameters
ppノードへのポインタ.'<' を指すポインタ.
[out]*node_nameプロセッシングの名前部分が格納される.要free
[out]*node_attrプロセッシングの属性部分が格納される.要free
Return values
1以上ノード全体の長さ.0 が返ることは無い.
JBXL_XML_PARSE_ERRORパースエラー
JBXL_MALLOC_ERRORメモリエラー

Definition at line 654 of file txml.c.

655 {
656  int nn, mm;
657  char* pt;
658 
659  *node_name = NULL;
660  *node_attr = NULL;
661 
662  if (pp==NULL) return JBXL_XML_PARSE_ERROR;
663  if (strncmp(pp, "<?", 2)) return JBXL_XML_PARSE_ERROR;
664 
665  pt = pp = pp + 2;
666  pt = skip_chars(pt, " ?");
667  if (pt==NULL) return JBXL_XML_PARSE_ERROR;
668 
669  nn = mm = (int)(pt - pp);
670  if (mm==0) return JBXL_XML_PARSE_ERROR;
671 
672  nn += 2;
673  *node_name = (char*)malloc((size_t)(mm + 1));
674  if (*node_name==NULL) return JBXL_MALLOC_ERROR;
675  memcpy(*node_name, pp, mm);
676  (*node_name)[mm] = '\0';
677 
678  if (isnot_xml_name((unsigned char*)*node_name)) return JBXL_XML_PARSE_ERROR;
679 
680  // for attribute
681  if (*pt==' ') {
682  pp = pt = pt + 1;
683  while (*pt==' ' || *pt==CHAR_TAB || *pt==CHAR_LF || *pt==CHAR_CR) pt++;
684  nn += (int)(pt - pp) + 1;
685 
686  pp = pt;
687  pt = skip_chars(pt, "?");
688  if (pt==NULL) {
689  freeNull(*node_name);
690  return JBXL_XML_PARSE_ERROR;
691  }
692 
693  mm = (int)(pt - pp);
694  if (mm>0) {
695  *node_attr = (char*)malloc((size_t)(mm + 1));
696  if (*node_attr==NULL) {
697  freeNull(*node_name);
698  return JBXL_MALLOC_ERROR;
699  }
700  memcpy(*node_attr, pp, mm);
701  (*node_attr)[mm] = '\0';
702  nn += mm;
703  //PRINT_MESG("ATTR --> %s %d\n", *node_attr, (int)strlen(*node_attr));
704  }
705  }
706 
707  if (strncmp(pt, "?>", 2)) {
708  freeNull(*node_name);
709  freeNull(*node_attr);
710  return JBXL_XML_PARSE_ERROR;
711  }
712 
713  return nn + 2;
714 }
int isnot_xml_name(unsigned char *pp)
XML名として不適切かどうかを大まかに判断する.
Definition: txml.c:810

References CHAR_CR, CHAR_LF, CHAR_TAB, freeNull, isnot_xml_name(), JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, and skip_chars().

Referenced by xml_main_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_parse_seq()

tXML* xml_parse_seq ( tXML xml,
char *  pp 
)

tXML* xml_parse_seq(tXML* xml, char* pp)

部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.
完全な XMLデータでなくても解釈できるところまでは解釈する.
xmlが NULLの場合は自動的にツリーを作る.
断片的に XMLデータを入力する場合に使用する.

Parameters
xmlXMLデータを格納するツリー構造体の先頭へのポインタ.ツリーの途中のノードでも可
ppXMLデータへのポインタ.
Returns
XMLツリーデータのアンカーへのポインタ
altp に最後に処理したノードへのポインタが格納される.
解釈が不完全の場合は state に状態の値が入る.
tXML* xml;
xml = xml_parse_seq(NULL, "<A aaa=\"YYY\"><B>");
xml = xml_parse_seq(xml->altp, "<Z zzz=\"99 9\"/><M>MM</M></B><C><M><X>XX</X><YY yyy=\"888\">XX");
xml = xml_parse_seq(xml->altp, "YY</YY>MM</M><C bbb=\"777\" xxx=\"000i\" xxxx=\"000\" >");
xml = xml_parse_seq(xml->altp, "<X></X><M><X></X>YY<Y>oooo");
xml = xml_parse_seq(xml->altp, "</Y></M></C></C></A>");
xml = xml_parse_seq(xml->altp, "<M>");
close_xml(xml);
tXML * xml_parse_seq(tXML *xml, char *pp)
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.断片的にXMLデータを入力する場合に使用する.
Definition: txml.c:135

Definition at line 135 of file txml.c.

136 {
137  int skip = FALSE;
138  tXML* node;
139 
140  if (xml==NULL) {
141  xml = new_tTree_anchor_node();
142  //xml->ldat.id = XML_ANCHOR_NODE;
143  //xml->depth = -1;
144  skip = TRUE;
145  }
146  else {
147  tXML* top = find_xml_top(xml);
148  if (top==xml) top->state = JBXL_XML_DEFAULT_STATE;
149  }
150 
151  node = xml_main_parse(xml, pp, skip);
152  xml = find_xml_top(xml);
153  xml->altp = node;
154 
155  if (xml!=node) return xml;
156 
157  if (node->state==JBXL_NORMAL) xml->state = JBXL_XML_PARSED;
158  else xml->state = node->state;
159 
160  if (xml->next!=NULL) {
161  int n = 0;
162  node = xml->next;
163  while(node!=NULL) {
164  if (node->ldat.id==XML_NAME_NODE) n++;
165  node = node->ysis;
166  }
167  if (n!=1) xml->state = JBXL_XML_MULTI_ROOT;
168  }
169  else xml->state = JBXL_XML_DEFAULT_STATE;
170 
171  return xml;
172 }
#define JBXL_NORMAL
正常
Definition: jbxl_state.h:32
tTree * new_tTree_anchor_node(void)
ツリー用の ANCHORノードを動的に生成.
Definition: ttree.c:37
#define find_xml_top(p)
find_tList_top()
Definition: txml.h:158

References FALSE, find_xml_top, JBXL_NORMAL, JBXL_XML_DEFAULT_STATE, JBXL_XML_MULTI_ROOT, JBXL_XML_PARSED, new_tTree_anchor_node(), TRUE, xml_main_parse(), and XML_NAME_NODE.

Here is the call graph for this function:

◆ xml_parse_start_node()

int xml_parse_start_node ( char *  pp,
char **  node_name,
char **  node_attr,
int *  node_end 
)

int xml_parse_start_node(char* pp, char** node_name, char** node_attr, int* node_end)

XMLの開始ノードを処理する.処理できるノードの型は

<node_name attr1="value1" attr2="value2">
<node_name attr1="value1" attr2="value2" />
Attention
注)この関数では,属性部分(*node_attr)の解釈は行われないので,それは xml_parse_attr() で行う必要がある.
Parameters
ppノードへのポインタ.'<' を指すポインタ.
[out]*node_nameノードの名前を格納するポインタ.要 free
[out]*node_attrノードの属性部分を格納するポインタ.処理(解釈)は行われない.要 free
[out]*node_endノードが単独で閉じている場合(Empty Tag)は TRUE, そうでない場合は FALSEが格納される.要 free
Return values
1以上ノード全体の長さ.0 が返ることは無い.
JBXL_XML_PARSE_ERRORパースエラー
JBXL_MALLOC_ERRORメモリエラー
JBXL_ARGS_ERROR引数エラー

Definition at line 371 of file txml.c.

372 {
373  int nn, mm;
374  char* pt;
375 
376  if (node_name==NULL || node_attr==NULL || node_end==NULL) return JBXL_ARGS_ERROR;
377  *node_end = FALSE;
378  *node_name = NULL;
379  *node_attr = NULL;
380 
381  if (*pp!='<') return JBXL_XML_PARSE_ERROR;
382  pt = pp = pp + 1;
383  pt = skip_chars(pt, " />");
384  if (pt==NULL) return JBXL_XML_PARSE_ERROR;
385 
386  nn = mm = (int)(pt - pp);
387  if (mm==0) return JBXL_XML_PARSE_ERROR;
388 
389  nn = nn + 1;
390  *node_name = (char*)malloc((size_t)(mm + 1));
391  if (*node_name==NULL) return JBXL_MALLOC_ERROR;
392  memcpy(*node_name, pp, mm);
393  (*node_name)[mm] = '\0';
394  //PRINT_MESG("START --> %s %d\n", *node_name, (int)strlen(*node_name));
395 
396  if (isnot_xml_name((unsigned char*)*node_name)) {
397  freeNull(*node_name);
398  return JBXL_XML_PARSE_ERROR;
399  }
400 
401  // Empty TAG
402  if (*pt=='/') {
403  if (*(pt+1)!='>') {
404  freeNull(*node_name);
405  return JBXL_XML_PARSE_ERROR;
406  }
407  nn += 1;
408  *node_end = TRUE;
409  //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name));
410  }
411 
412  // Attribute
413  else if (*pt==' ') {
414  pp = pt = pt + 1;
415  while (*pt==' ' || *pt==CHAR_TAB || *pt==CHAR_LF || *pt==CHAR_CR) pt++;
416  nn += (int)(pt - pp) + 1;
417 
418  pp = pt;
419  pt = skip_chars(pt, "/>");
420  if (pt==NULL) {
421  freeNull(*node_name);
422  return JBXL_XML_PARSE_ERROR;
423  }
424 
425  mm = (int)(pt - pp);
426  if (mm>0) {
427  *node_attr = (char*)malloc((size_t)(mm + 1));
428  if (*node_attr==NULL) {
429  freeNull(*node_name);
430  return JBXL_MALLOC_ERROR;
431  }
432  memcpy(*node_attr, pp, mm);
433  (*node_attr)[mm] = '\0';
434  nn += mm;
435  //PRINT_MESG("ATTR --> %s %d\n", *node_attr, (int)strlen(*node_attr));
436  }
437 
438  if (*pt=='/') {
439  if (*(pt+1)!='>') {
440  freeNull(*node_name);
441  freeNull(*node_attr);
442  return JBXL_XML_PARSE_ERROR;
443  }
444  nn += 1;
445  *node_end = TRUE;
446  //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name));
447  }
448  }
449 
450  //else {} *pt=='>'
451 
452  return nn + 1;
453 }
#define JBXL_ARGS_ERROR
不正な引数(NULLなど)
Definition: jbxl_state.h:42

References CHAR_CR, CHAR_LF, CHAR_TAB, FALSE, freeNull, isnot_xml_name(), JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, skip_chars(), and TRUE.

Referenced by xml_main_parse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ xml_rpc_add_array()

tXML* xml_rpc_add_array ( tXML xml,
tXML array 
)

tXML* xml_rpc_add_array(tXML* xml, tXML* array)

Parameters
xmlデータを繋げるためのポインタ.
array<value> データ
Returns
<data> データ

<value><struct> データから 配列データ <data>...</data> を作って繋げていく.

Definition at line 3469 of file txml.c.

3470 {
3471  if (xml==NULL) xml = add_xml_node(NULL, "data");
3472  join_xml(xml, array);
3473 
3474  return xml;
3475 }
tXML * add_xml_node(tXML *xml, const char *name)
XMLツリーのxml の直下(姉妹の一番下:末っ子)にノード(属性は指定しない)を挿入する.
Definition: txml.c:1219
#define join_xml(a, b)
ツリー aへノード bを末っ子として追加.
Definition: txml.h:185

References add_xml_node(), and join_xml.

Here is the call graph for this function:

◆ xml_rpc_add_member()

tXML* xml_rpc_add_member ( tXML xml,
char *  name,
char *  value,
char *  kind 
)

tXML* xml_rpc_add_member(tXML* xml, char* name, char* value, char* kind)

XML-RPC の <member> データを作って,繋げていく.先頭には <struct> ノードが付く.

Parameters
xmlデータを繋げるためのポインタ.
name<name> ノードの値
value<value><...> ノードの値
kindvalue のデータの種類.NULL または "" の場合は "string" になる.
Returns
<member> データ
<struct><member><name>name</name><value><kind>value</kind></value></member><member>....</member>

Definition at line 3408 of file txml.c.

3409 {
3410  if (name==NULL) return xml;
3411 
3412  if (xml==NULL) xml = add_xml_node(NULL, "struct");
3413 
3414  tXML* mem = add_xml_node(xml, "member");
3415  tXML* mnm = add_xml_node(mem, "name");
3416  tXML* val = add_xml_node(mem, "value");
3417  tXML* knd;
3418  if (kind==NULL) knd = add_xml_node(val, "string");
3419  else if (kind[0]=='\0') knd = add_xml_node(val, "string");
3420  else knd = add_xml_node(val, kind);
3421 
3422  add_xml_content_node(mnm, name);
3423  add_xml_content_node(knd, value);
3424 
3425  return xml;
3426 }

References add_xml_content_node(), and add_xml_node().

Here is the call graph for this function:

◆ xml_rpc_end_array()

tXML* xml_rpc_end_array ( tXML xml)

tXML* xml_rpc_end_array(tXML* xml)

配列データを閉じて,送信用データを生成する.

Parameters
xml<data> ノードのポンタ
Returns
<value><arrau> データ
<value><array><data>...</data><data>...</data>....</array></value>

Definition at line 3490 of file txml.c.

3491 {
3492  tXML* ptr = add_xml_node(NULL, "value");
3493  tXML* val = add_xml_node(ptr, "array");
3494  join_xml(val, xml);
3495 
3496  return ptr;
3497 }

References add_xml_node(), and join_xml.

Here is the call graph for this function:

◆ xml_rpc_end_member()

tXML* xml_rpc_end_member ( tXML xml)

tXML* xml_rpc_end_member(tXML* xml)

<struct><member> データを閉じて,<value> データを作り出す.
配列データにしない場合は,このデータを xml_rpc_request_pack() に渡して,送信用データを生成することも可能.

Parameters
xml<struct> データ
Returns
<vlue> データ
<value><strcut><member>...</member><member>...</member>...</struct></value>
tXML* xml = NULL;
xml = xml_rpc_add_member(xml, "session", info->session, "");
xml = xml_rpc_add_member(xml, "message", info->message, "");
......
xml = xml_rpc_end_member(xml);
Buffer buf = xml_rpc_request_pack(Moodle_Service, xml);
tXML * xml_rpc_add_member(tXML *xml, char *name, char *value, char *kind)
XML-RPC の <member> データを作って,繋げていく.
Definition: txml.c:3408
Buffer xml_rpc_request_pack(const char *name, tXML *xml)
XML-RPC用のデータを生成する.
Definition: txml.c:3376
tXML * xml_rpc_end_member(tXML *xml)
<struct><member> データを閉じて,<value> データを作り出す.
Definition: txml.c:3451

Definition at line 3451 of file txml.c.

3452 {
3453  tXML* ptr = add_xml_node(NULL, "value");
3454  join_xml(ptr, xml);
3455 
3456  return ptr;
3457 }

References add_xml_node(), and join_xml.

Here is the call graph for this function:

◆ xml_rpc_request_pack()

Buffer xml_rpc_request_pack ( const char *  name,
tXML xml 
)

XML-RPC用のデータを生成する.

Parameters
nameXML-RPC のメソッド名
xml送信用データが格納された XMLデータ.
Returns
XML-RPC の送信用データ.
tXML* xml = NULL;
tXML* array = NULL;
xml = xml_rpc_add_member(NULL, "host", "server", "string");
xml = xml_rpc_add_member(xml, "id", "xyb12265092", "string");
xml = xml_rpc_end_member(xml);
array = xml_rpc_add_array(NULL, xml);
xml = xml_rpc_add_member(NULL, "host", "client", "string");
xml = xml_rpc_add_member(xml, "id", "abc162aa890", "string");
xml = xml_rpc_end_member(xml);
array = xml_rpc_add_array(array, xml);
xml = xml_rpc_add_member(NULL, "host", "localhost", "string");
xml = xml_rpc_add_member(xml, "id", "shbR1222201", "string");
xml = xml_rpc_end_member(xml);
array = xml_rpc_add_array(array, xml);
array = xml_rpc_end_array(array);
Buffer buf = xml_rpc_request_pack("mod_mdlds_write_nbdata", array);
tXML * xml_rpc_end_array(tXML *xml)
配列データを閉じて,送信用データを生成する.
Definition: txml.c:3490
tXML * xml_rpc_add_array(tXML *xml, tXML *array)
<value><struct> データから 配列データ <data>...</data> を作って繋げていく.
Definition: txml.c:3469

Definition at line 3376 of file txml.c.

3377 {
3378  tXML* ptr = init_xml_doc();
3379  tXML* top = add_xml_node(ptr, "methodCall");
3380  tXML* mnm = add_xml_node(top, "methodName");
3381  tXML* prs = add_xml_node(top, "params");
3382  tXML* prm = add_xml_node(prs, "param");
3383  add_xml_content_node(mnm, name);
3384 
3385  join_xml(prm, xml);
3387 
3388  return buf;
3389 }
tXML * init_xml_doc()
XML のドキュメントヘッダを作成する.
Definition: txml.c:1203

References add_xml_content_node(), add_xml_node(), buf, init_xml_doc(), join_xml, xml_inverse_parse(), and XML_ONELINE_FORMAT.

Here is the call graph for this function: