RXML.H
[目次 | 型・クラス・構造体 | マクロ]
1|/***********************************************************************
2|* 1. <<< Replacing teXt Markup Language (RXML) >>>
3|************************************************************************/
4|
5|#ifndef __RXML_H
6|#define __RXML_H
7|
8|
9|/***********************************************************************
10|* 2. <<< 優先ヘッダ >>>
11|************************************************************************/
12|
13|#ifndef USES_PRIORITY_HEADER
14|/*[START_OF_PRIORITY_HEADER]*/
15|
16|#ifdef __cplusplus
17|extern "C" {
18|#endif
19|
20|#ifndef USES_RXML
21|#define USES_RXML
22|
23|#ifdef USES_BLEX3
24| #define USES_RXML_ACTOR
25|#endif
26|
27|typedef struct _RXML RXML;
28|typedef struct _RXML_File RXML_File;
29|typedef struct _RXML_Tag RXML_Tag;
30|
31|typedef struct _RXML_TagInf RXML_TagInf;
32|typedef struct _RXML_TagInf_Sc RXML_TagInf_Sc;
33|typedef struct _RXML_AttrInf RXML_AttrInf;
34|typedef struct _RXML_AttrInf_Sc RXML_AttrInf_Sc;
35|
36|typedef struct _RXML_DB RXML_DB;
37|typedef struct _RXML_Out RXML_Out;
38|
39|typedef struct _RXML_DCGet RXML_DCGet;
40|typedef struct _RXML_TagGet RXML_TagGet;
41|
42|#endif
43|
44|#ifdef __cplusplus
45|}
46|#endif
47|
48|/*[END_OF_PRIORITY_HEADER]*/
49|#endif /* USES_COMPONE */
50|
51|
52|/***********************************************************************
53|* 3. <<< エラーコード >>>
54|************************************************************************/
55|#define RXML_Err_Many_EndOfTemplate 1911
56|#define RXML_Err_Few_EndOfTemplate 1912
57|#define RXML_Err_Many_EndOfRXMLTag 1913
58|#define RXML_Err_Few_EndOfRXMLTag 1914
59|#define RXML_Err_FileNotFound 1915
60|
61|/*----------------------------------------------------------------------*/
62|/* 4. <<< Interface Area --------------------------------------------- >>> */
63|/*----------------------------------------------------------------------*/
64|
65|#ifdef __cplusplus
66|extern "C" {
67|#endif
68|
69|struct _RXML_TagInf {
70| void* obj;
71| RXML_TagInf_Sc* sc;
72|};
73|
74|struct _RXML_AttrInf {
75| void* obj;
76| RXML_AttrInf_Sc* sc;
77|};
78|
79|
80|/***********************************************************************
81|* 5. <<< [RXMLクラス] RXML プロジェクト >>>
82|*【補足】
83|*・仕様書の『RXML の処理概要』を参照
84|************************************************************************/
85|typedef struct _Log Log;
86|struct _RXML {
87| ListX tags; /* グローバル・タグ・リスト、RXML_Tag 型のリスト */
88| ListX files; /* ファイル・リスト、RXML_File 型のリスト */
89| ListX dataClasses; /* RXML データ・クラス、RXML_Tag 型のリスト */
90| Log* log;
91|};
92|
93|#define RXML_NameSize 256
94|#define RXML_HrefSize 512
95|
96|void RXML_init( RXML*, Log* log );
97|void RXML_finish( RXML* );
98|void RXML_print( RXML*, const char* title );
99|RXML_File* RXML_addFile( RXML*, const char* path );
100|void RXML_toEmpty( RXML* );
101|void RXML_pickupDC( RXML* );
102|void RXML_pickupTags( RXML* );
103|void RXML_out( RXML* );
104|void RXML_getFullHref( const char* href, ArrX_Buf* tmps, char* fullHref,
105| int fullHref_size );
106|RXML_File* RXML_getHrefFile( RXML*, const char* href,
107| const char* basePath, bool bAdd );
108|RXML_Tag* RXML_getHrefTag( RXML*, const char* href,
109| const char* basePath, ArrX_Buf* tmps );
110|#ifdef USES_SYM
111| bool RXML_getHrefRef( const char* href, ArrX_Buf* tmps, Sym_Ref* ref );
112|#endif
113|RXML_Tag* RXML_getLoopTmp( const char* loopName, ArrX_Buf* tmps );
114|
115|RXML_Tag* RXML_getTagInAllFile( RXML*, const char* tagName );
116|RXML_Tag* RXML_getDataClass( RXML*, const char* tagName );
117|
118|
119|/***********************************************************************
120|* 6. <<< [RXML_File] RXML ファイル >>>
121|************************************************************************/
122|struct _RXML_File {
123| ListX_Elem inherit_ListX_Elem;
124| RXML* top;
125|
126| char* path; /* ファイルパス、RXML_DB::dic 使用 */
127| bool bExist;
128| ListX tags; /* ツリーの子、RXML_Tag 型のリスト(→RXML_Tag::tags) */
129| ListX dataClasses; /* RXML データ・クラス、RXML_Tag 型のリスト */
130| ListX progDataRef; /* プログラムデータの参照一覧、RXML_Tag 型のリスト */
131|
132| /* RXML_TagInf ex; /* 拡張操作 */
133|};
134|
135|void RXML_File_init( RXML_File*, const char* path, RXML* top );
136|void RXML_File_finish( RXML_File* );
137|void RXML_File_print( RXML_File*, const char* title );
138|void RXML_File_pickupDC( RXML_File* );
139|void RXML_File_pickupTags( RXML_File* );
140|void RXML_File_out( RXML_File*, FILE* out );
141|RXML_Tag* RXML_File_getTag( RXML_File*, const char* tagName );
142|RXML_Tag* RXML_File_getDataClass( RXML_File*, const char* tagName );
143|RXML_Tag* RXML_File_getProgDataRef( RXML_File*, const char* tagName );
144|
145|
146|
147|/***********************************************************************
148|* 7. <<< [RXML_Tag] RXML タグ >>>
149|*【補足】
150|*・attrs の要素の StrX_ListElem2::p は、属性の名前で、RXML_DB::dic の
151|* 文字列領域を使用します。StrX_ListElem2::data は、属性の値で、malloc
152|* 文字列領域を使用します。所有です。参考:RXML_Tag_addAttr 関数
153|************************************************************************/
154|struct _RXML_Tag {
155| ListX_Elem inherit_ListX_Elem;
156| char* tagName; /* タグ名(すべて小文字)、RXML_DB::dic 領域 */
157| char* name; /* シンボル名(name 属性)、RXML_DB::dic 領域 */
158| #if defined( USES_BLEX2 )
159| long start; /* 開始タグの先頭のファイルアドレス */
160| long end; /* 終了タグの次のファイルアドレス */
161| #elif defined( USES_BLEX3 )
162| BLex3_Pos start; /* 開始タグの先頭のファイルアドレス */
163| BLex3_Pos end; /* 終了タグの次のファイルアドレス */
164| #endif
165| ListX attrs; /* その他の属性、StrX_ListElem2 型のリスト(→補足) */
166| ListX tags; /* ツリーの子、RXML_Tag 型のリスト */
167|
168| RXML_Tag* loopTag; /* ループ変数の値 */
169| #ifdef USES_SYM
170| Sym_Ref container; /* ループする要素を持つ集合 */
171| Sym_Ref loopRef; /* ループ変数が参照している変数 */
172| #endif
173|
174| RXML_Tag* parent; /* すぐ上のタグ(RXML データ・オブジェクト)NULL=上は無い */
175| RXML_File* file; /* 所属しているファイル */
176| int line; /* タグのある行番号 */
177|};
178|
179|void RXML_Tag_init( RXML_Tag*, const char* tagName, RXML_Tag* parent,
180| RXML_File* file, int line );
181|void RXML_Tag_finish( RXML_Tag* );
182|void RXML_Tag_print( RXML_Tag*, const char* title );
183|void RXML_Tag_setName( RXML_Tag*, const char* name );
184|void RXML_Tag_addAttr( RXML_Tag*, const char* name, const char* value );
185|#ifdef USES_BLEX2
186| void RXML_Tag_addAttrFromBLex2( RXML_Tag*, BLex2_HTMLTags* tags );
187|#endif
188|#ifdef USES_HTMLPARS
189| void RXML_Tag_addAttrFromHtmlPars( RXML_Tag*, HtmlPars* htmlp );
190|#endif
191|char* RXML_Tag_getAttrValue( RXML_Tag*, const char* attr_name );
192|RXML_Tag* RXML_Tag_getSubTag( RXML_Tag*, const char* tagName );
193|RXML_Tag* RXML_Tag_getSubTag2( RXML_Tag*, const char* tagName );
194|RXML_Tag* RXML_Tag_getNextSameTag( RXML_Tag* );
195|long RXML_Tag_out( RXML_Tag*, RXML_Out* out );
196|long RXML_Tag_outThrough( RXML_Tag*, RXML_Out* out );
197|long RXML_Tag_outVar( RXML_Tag*, RXML_Out* out );
198|long RXML_Tag_outTemplate( RXML_Tag*, RXML_Out* out );
199|long RXML_Tag_outText( RXML_Tag*, RXML_Out* out );
200|
201|RXML_Tag* RXML_Tag_initNewTag( RXML_Tag*, const char* tagName );
202|int RXML_Tag_count( ListX*, const char* name );
203|int RXML_Tag_sum( ListX*, const char* name );
204|int RXML_Tag_ave( ListX*, const char* name );
205|int RXML_Tag_max( ListX*, const char* name );
206|int RXML_Tag_min( ListX*, const char* name );
207|
208|/***********************************************************************
209|* 8. <<< [RXML_TagInf] RXML データ・オブジェクト・インターフェイス >>>
210|************************************************************************/
211|/* RXML_TagInf の定義は、 Interface Area の先頭にあります */
212|
213|void RXML_TagInf_finish( RXML_TagInf );
214|void RXML_TagInf_print( RXML_TagInf, const char* title );
215|char* RXML_TagInf_getAttrVar( RXML_TagInf );
216|RXML_AttrInf RXML_TagInf_getFirstAttrInf( RXML_TagInf );
217|
218|struct _RXML_TagInf_Sc {
219| void (*finish)( void* );
220| void (*print)( void*, const char* title );
221| char* (*getAttrVar)( void* );
222| RXML_AttrInf (*getFirstAttrInf)( void* );
223|};
224|
225|
226|/***********************************************************************
227|* 9. <<< [RXML_AttrInf] 属性・インターフェイス >>>
228|************************************************************************/
229|/* RXML_AttrInf の定義は、 Interface Area の先頭にあります */
230|
231|void RXML_AttrInf_print( RXML_AttrInf, const char* title );
232|char* RXML_AttrInf_getVar( RXML_AttrInf );
233|RXML_AttrInf RXML_AttrInf_getNextAttrInf( RXML_AttrInf );
234|
235|
236|struct _RXML_AttrInf_Sc {
237| char* (*print)( void*, const char* title );
238| char* (*getVar)( void* );
239| RXML_AttrInf (*getNextAttrInf)( void* );
240|};
241|
242|
243|/***********************************************************************
244|* 10. <<< [RXML_DB] RXML データベース >>>
245|************************************************************************/
246|struct _RXML_DB {
247| StrX_MemV2 dic; /* 文字列領域、RXML_Tag::name メンバ変数などに使用 */
248|};
249|extern RXML_DB RXML_db;
250|#define RXML_DB_width 255
251|
252|void RXML_DB_init( RXML_DB* );
253|void RXML_DB_finish( RXML_DB* );
254|
255|/***********************************************************************
256|* 11. <<< [RXML_Out] ドキュメント変換ステップ >>>
257|************************************************************************/
258|struct _RXML_Out {
259| RXML* top;
260| char* basePath;
261| FILE* in;
262| FILE* out;
263| ArrX_Buf* tmps; /* タグ・スタック */
264|
265| bool bTopSpcs;
266| bool bStrongOut; /* 取っておいた空白は強制的に出力するかどうか */
267| char topSpcs[256];
268|};
269|
270|long RXML_Out_outPart( RXML_Out*, long in_pos, long endPos );
271|void RXML_Out_outStrong( RXML_Out* );
272|
273|/***********************************************************************
274|* 12. <<< [RXML_DCGet] RXML データ・クラス取得・アクター >>>
275|************************************************************************/
276|#ifdef USES_RXML_ACTOR
277|
278|struct _RXML_DCGet {
279| BLex3_EngineU* engU;
280| HtmlPars* htmlp;
281| LineCnt* linep;
282|
283| RXML_File* rxmlFile;
284| RXML* rxmlTop;
285| ArrX_Buf tmpStack;
286| RXML_Tag* tmpStackX[32];
287|
288| ERRORS_INITCHK_VAR
289|};
290|
291|void RXML_DCGet_init( RXML_DCGet*, HtmlPars* htmlp, LineCnt* linep,
292| RXML_File* rxmlFile );
293|
294|void RXML_DCGet_act( RXML_DCGet* );
295|
296|#endif
297|
298|/***********************************************************************
299|* 13. <<< [RXML_TagGet] RXML タグ抽出・アクター >>>
300|************************************************************************/
301|#ifdef USES_RXML_ACTOR
302|
303|struct _RXML_TagGet {
304| BLex3_EngineU* engU;
305| HtmlPars* htmlp;
306| LineCnt* linep;
307|
308| RXML_File* rxmlFile;
309| RXML* rxmlTop;
310|
311| ArrX_Buf tagStack;
312| RXML_Tag* tagStackX[32];
313| ListX* childTags; /* 最内側の TEMPLATE タグの RXML_Tag::tags または RXML_File::tags */
314|
315| RXML_Tag* dcTag; /* 現在解析中のデータクラス、NULL=トップ */
316| ListX* dcChildTags; /* dcTag->dataClasses または RXML_File::dataClasses */
317| RXML_Tag* gdcTag;
318| ListX* gdcChildTags;
319|
320| ERRORS_INITCHK_VAR
321|};
322|
323|void RXML_TagGet_init( RXML_TagGet*, HtmlPars* htmlp, LineCnt* linep,
324| RXML_File* rxmlFile );
325|
326|void RXML_TagGet_act( RXML_TagGet* );
327|
328|#endif
329|
330|#ifdef __cplusplus
331|}
332|#endif
333|
334|/*----------------------------------------------------------------------*/
335|/* 14. <<< Mapping Area ----------------------------------------------- >>> */
336|/*----------------------------------------------------------------------*/
337|
338|/***********************************************************************
339|* 15. <<< RXML_TagInf インターフェイス・マクロ定義 >>>
340|************************************************************************/
341|#ifdef NDEBUG
342|#define RXML_TagInf_finish(t) INF_MACRO_0( RXML_TagInf, finish, void, RXML_TagInf_finish, RXML_TagInf, t )
343|#define RXML_TagInf_print(t,a) INF_MACRO_1( RXML_TagInf, print, void, RXML_TagInf_print, RXML_TagInf, const char*, t,a )
344|#define RXML_TagInf_getAttrVar(t) INF_MACRO_R0( RXML_TagInf, getAttrVar, char*, RXML_TagInf_getAttrVar, RXML_TagInf,t )
345|#define RXML_TagInf_getFirstAttrInf(t) INF_MACRO_R0( RXML_TagInf, getFirstAttrInf, RXML_AttrInf, RXML_TagInf_getFirstAttrInf, RXML_TagInf, t )
346|#endif
347|
348|/***********************************************************************
349|* 16. <<< RXML_AttrInf インターフェイス・マクロ定義 >>>
350|************************************************************************/
351|#ifdef NDEBUG
352|#define RXML_AttrInf_print(t,a) INF_MACRO_1( RXML_AttrInf, print, void, RXML_AttrInf_print, RXML_AttrInf, const char*, t,a )
353|#define RXML_AttrInf_getVar(t) INF_MACRO_R0( RXML_AttrInf, getVar, char*, RXML_AttrInf_getVar, RXML_AttrInf,t )
354|#define RXML_AttrInf_getNextAttrInf(t) INF_MACRO_R0( RXML_AttrInf, getNextAttrInf, RXML_AttrInf, RXML_TagInf_getNextAttrInf, RXML_AttrInf, t )
355|#endif
356|
357|#endif
358|
359|