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|