strx.h

C:\home\SVGCats_src\src\strx.h

[目次 | 型・クラス・構造体 | マクロ]

目次

型・クラス・構造体一覧

マクロ一覧


   1|/**************************************************************************
   2|*  1. <<< 文字列の拡張 (StrX) >>> 
   3|*【補足】
   4|*・StrX では、文字列を格納する領域のサイズを指定するときは、
   5|*  格納できる最大の文字列数+1、つまりメモリサイズを指定します。
   6|***************************************************************************/
   7|
   8|#ifndef __STRX_H
   9|#define __STRX_H
  10|
  11|/*----------------------------------------------------------------------
  12|[Module Property]
  13|name = StrX
  14|title = 文字列
  15|category = 基本型
  16|src = strx.c
  17|depend = Types, Errors
  18|priority =
  19|accord =
  20|----------------------------------------------------------------------*/
  21|
  22|
  23|
  24| 
  25|/**************************************************************************
  26|*  2. <<< 優先ヘッダ >>> 
  27|***************************************************************************/
  28|#ifndef USES_PRIORITY_HEADER
  29|/*[START_OF_PRIORITY_HEADER]*/
  30|
  31|#ifndef  USES_STRX
  32|#define  USES_STRX
  33|
  34|typedef struct _StrX_ListElem   StrX_ListElem;
  35|typedef struct _StrX_ListElem2  StrX_ListElem2;
  36|typedef struct _StrX_Mem   StrX_Mem;
  37|typedef struct _StrX_Set   StrX_Set;
  38|typedef struct _StrX_MemV   StrX_MemV;
  39|typedef struct _StrX_MemV2  StrX_MemV2;
  40|typedef struct _StrX_MemV2E StrX_MemV2E;
  41|typedef struct _StrX_SetV   StrX_SetV;
  42|typedef struct _StrX_MemVE  StrX_MemVE;
  43|typedef struct _StrX_Pathes StrX_Pathes;
  44|typedef void  StrX_ConvFunc( void* obj, char* s, int s_size );
  45|typedef  char  StrX_Path[260];
  46|
  47|typedef  int (*StrX_HashFunc)( const char* s, int width );
  48|
  49|#endif
  50|
  51|/*[END_OF_PRIORITY_HEADER]*/
  52|#endif /* USES_PRIORITY_HEADER */
  53|
  54|#define  StrX_Err_MemEmpty     3180    /* StrX_Mem empty */
  55|#define  StrX_Err_MallocEmpty  3181
  56|#define  StrX_Err_NoMoreParentDir   3182
  57| 
  58|/**************************************************************************
  59|*  3. <<< モジュール設定 >>> 
  60|***************************************************************************/
  61|#ifndef  STDX_SETTING
  62|
  63|  /*#define  STRX_USES_MALLOC*/  /* malloc を使用する関数を有効にする */
  64|
  65|#endif
  66|
  67|
  68|#if _MAX_PATH > 260   /* StrX_Path のサイズチェック */
  69|  #error
  70|#endif
  71|
  72|#ifdef _STDLIB
  73|#include "stdlib.h"
  74|#endif
  75|
  76| 
  77|/*------------------------------------------------------------------------*/
  78|/* 4. <<< Interface Area ----------------------------------------------- >>> */ 
  79|/*------------------------------------------------------------------------*/
  80|
  81|#ifdef __cplusplus
  82|extern "C" {
  83|#endif
  84|
  85|
  86| 
  87|/***********************************************************
  88|*  5. <<< 文字★ >>> 
  89|*【一覧】
  90|*・制御文字 [StrX_SI, StrX_SO, StrX_ESC]
  91|*・ディレクトリ区切り文字 [StrX_DirMark_char, StrX_DirMark_str]
  92|*・漢字コードの種類
  93|*  [StrX_CodeT, StrX_Ascii, StrX_Jis, StrX_ShiftJis, StrX_Euc]
  94|*  [StrX_JisIn, StrX_JisOut]
  95|*
  96|*  6. <<< [改行文字] >>>
  97|*・Windows の改行は、0x0D '\r' + 0x0A '\n'
  98|*・UNIX の改行は、0x0A '\n' のみ
  99|************************************************************/
 100|/*bool  StrX_isMBBLeadNotTerm( char s ) */
 101|
 102| 
 103|/***********************************************************
 104|*  7. <<< 制御文字 [StrX_SI, StrX_SO, StrX_ESC] >>> 
 105|************************************************************/
 106|#define  StrX_SI   14
 107|#define  StrX_SO   15
 108|#define  StrX_ESC  0x1B
 109|
 110|
 111| 
 112|/**************************************************************************
 113|*  8. <<< ディレクトリ区切り文字 [StrX_DirMark_char, StrX_DirMark_str] >>> 
 114|***************************************************************************/
 115|#define  StrX_DirMark_char  '\\'
 116|#define  StrX_DirMark_str   "\\"
 117|
 118|
 119| 
 120|/***********************************************************************
 121|*  9. <<< [StrX_CodeT] 漢字コードの種類 >>> 
 122|*  10. <<< [StrX_Ascii, StrX_Jis, StrX_ShiftJis, StrX_Euc] >>>
 123|*  11. <<< [StrX_JisIn, StrX_JisOut] >>>
 124|************************************************************************/
 125|typedef enum _StrX_CodeT {
 126|  StrX_Ascii =0, StrX_Jis, StrX_ShiftJis, StrX_Euc,
 127|  StrX_JisIn, StrX_JisOut
 128|} StrX_CodeT;
 129|
 130|
 131| 
 132|/***********************************************************
 133|*  12. <<< [StrX] char* 型の文字列 ★>>> 
 134|************************************************************/
 135|extern const char* StrX_argv0; /* main() で argv[0] 引数をポイントすること */
 136|
 137| 
 138|/***********************************************************
 139|*  13. <<< (StrX) char* 型の文字列(コピー・一部コピー・連結) >>> 
 140|************************************************************/
 141|int    StrX_getNLine( const char* s );
 142|char*  StrX_cpy( char* dst, const char* src, int dst_size );
 143|char*  StrX_ncpy( char* dst, char* src, int n, int dst_maxLen );
 144|char*  StrX_cpy1Line( char* dst, int dst_size, const char* src, int iLine );
 145|void   StrX_wordCpy( char* dec, int dec_len, const char* src, char term );
 146|char*  StrX_toCSV( char* dst, const char* src, int dst_maxLen );
 147|char*  StrX_meltCSV( char* t, const char* s );
 148|char*  StrX_cpyToCSymbol( char* dst, const char* src );
 149|char*  StrX_getCmdWord( char* t, const char* s );
 150|char*  StrX_cat( char* rcv, const char* add, int rcv_maxLen );
 151|char*  StrX_catR( const char* s1, char* s2, int s2_maxLen );
 152|char*  StrX_cpyWild( char* dst, const char* dst_wild, const char* src,
 153|  const char* src_wild );
 154|char*  StrX_ins( char* dst, const char* src );
 155|char*  StrX_setLast( char* s, char c );
 156|
 157| 
 158|/***********************************************************
 159|*  14. <<< (StrX) char* 型の文字列(削除) >>> 
 160|************************************************************/
 161|char*  StrX_bs( char* );
 162|char*  StrX_bs2( char*, int n );
 163|void   StrX_del( char* s, int n );
 164|char*  StrX_trim( char* s );
 165|char*  StrX_trim2( char* s );
 166|void   StrX_cutHtmlTag( char* );
 167|char*  StrX_cutRet( char* s );
 168|char*  StrX_cutLastOf( char* s, char c );
 169|char*  StrX_cutLastOf2( char* s, char c );
 170|char*  StrX_cutLastOf_2byteFirst( char* s );
 171|
 172| 
 173|/***********************************************************
 174|*  15. <<< (StrX) char* 型の文字列(検索・参照) >>> 
 175|************************************************************/
 176|char   StrX_getLast( const char* s );
 177|char*  StrX_strchrs( const char* s, const char* key );
 178|char*  StrX_strchr2( const char* s, int k );
 179|char*  StrX_strchrs2( const char* s, const char* key );
 180|char*  StrX_strchrs_not( const char* s, const char* key );
 181|char*  StrX_RSearchC( const char* s, char key );
 182|char*  StrX_RSearchC2( const char* s, int key );
 183|char*  StrX_RSearch( char* s, char* key );
 184|char*  StrX_stristr( const char* s, const char* key );
 185|char*  StrX_stristr3( const char* s, const char* key, bool bCase,
 186|  int* hitCount );
 187|char*  StrX_stristr3r( const char* s, int startOffset,
 188|  const char* key, bool bCase, int* hitCount );
 189|char*  StrX_searchWord( const char* s, const char* k );
 190|char*  StrX_getWordTop( char* s, char* p, char term );
 191|char*  StrX_getCmdParam( const char* cmdline, char* param, int param_size );
 192|char*  StrX_getCSV( const char* s, int iColumn, char* out, int out_size );
 193|int    StrX_findInCSV( const char* s, const char* key, bool bCase );
 194|int    StrX_getCSVColumn( const char* s, const char* pos );
 195|int    StrX_getCSVNColumn( const char* s, bool bCountSpace );
 196|char*  StrX_refTopOfLine( const char* s, int iLine );
 197|int    StrX_getILine( const char* s, const char* p );
 198|char*  StrX_getCIdent( const char* src, char* ident, int ident_sizeof );
 199|char*  StrX_getCIdent2( const char* src, char* ident, int ident_sizeof );
 200|char*  StrX_getToken( const char* src, char* token, int token_sizeof );
 201|bool   StrX_isTokenFirst( const char* s );
 202|bool   StrX_getCSSValueOfInt( const char* css, const char* attr_name,
 203|  int* pValue );
 204|bool   StrX_getCSSValueOfDouble( const char* css, const char* attr_name,
 205|  double* pValue );
 206|bool   StrX_getCSSValueOfStr( const char* css, const char* attr_name,
 207|  char* str, int str_size );
 208|#ifdef  USES_COLOR
 209|bool   StrX_getCSSValueOfColor( const char* css, const char* attr_name,
 210|  Color_WinRGB* pColor );
 211|#endif
 212|int    StrX_getNumOfKWord( const char* s, const char* kword, bool bCase );
 213|int    StrX_getSVGPoints( const char* points, int* xs, int* ys, int n );
 214|char*  StrX_getIdiom2( const char* src, int mWord, int* nWord,
 215|  char* idiom, int idiom_size );
 216|char** StrX_searchInArr( const char* s, char** arr, int arr_n );
 217|char**  StrX_searchInArr2( const char* s, const char** arr, int arr_size );
 218|/*char** StrX_searchInArrX( const char* s, ArrX* arrx, type );*/
 219|
 220| 
 221|/***********************************************************
 222|*  16. <<< (StrX) char* 型の文字列(置換・文字コード変換) >>> 
 223|************************************************************/
 224|char*  StrX_rep1( char* s, char f, char t );
 225|char*  StrX_rep1b( char* s, char f, char t );
 226|char*  StrX_rep( char* s, int s_sizeof, const char* f, const char* t );
 227|char*  StrX_repi( char* s, int s_sizeof, const char* f, int t );
 228|char*  StrX_repEx( char* s, int s_sizeof, const char* f, const char* t,
 229|  StrX_ConvFunc term_conv_func, void* obj, char* work, int work_size );
 230|char*  StrX_repSharp( char* s, int s_sizeof, int n );
 231|
 232|#if !defined(_ismbblead) && !defined(_MBLEADTRAIL_DEFINED)
 233|int _ismbblead( unsigned int c );
 234|#define _MBLEADTRAIL_DEFINED
 235|#endif
 236|unsigned short  StrX_mbc2sjis( char* str );
 237|unsigned short  StrX_sjis2jis( unsigned short code );
 238|int  StrX_getCodeT( const unsigned char* s );
 239|char*  StrX_toSJIS( char* out, const char* in );
 240|int  StrX_jis2sjis( unsigned char* out, const unsigned char* in,
 241|  bool* bSISO, bool* bKanji );
 242|int  StrX_euc2sjis( unsigned char* out, const unsigned char* in,
 243|  bool* bSISO );
 244|int  StrX_getJisIOType( const char* s );
 245|void StrX_sjis2unicode( unsigned short* unicodeStr, const char* shiftJisStr,
 246|  int unicodeStr_size );
 247|void  StrX_unicode2sjis( unsigned char* shiftJisStr, const unsigned short* unicodeStr,
 248|  int shiftJisStr_size );
 249|int  StrX_convIdxEdit2SJis( const char* sjis_str, int uniIdx, unsigned short* work,
 250|  int work_size );
 251|int  StrX_convSJis2IdxEdit( const char* sjis_str, int sjisIdx );
 252|int  StrX_getHash( const char* s, int width );
 253|int  StrX_getHashI( const char* s, int width );
 254|char*  StrX_toHtmlTxt( const char* src, char* dst, int dst_size );
 255|char*  StrX_resumeFromHtmlTxt( const char* src, char* dst, int dst_size );
 256|void   StrX_cpyLower( char* dst, const char* src );
 257|void   StrX_cpyUpper( char* dst, const char* src );
 258|void   StrX_getTableXY( const char* xy, int* x, int* y );
 259|void  StrX_separateByByteInLine( char* s, int s_size, int mByteInLine,
 260|  const char* retStr );
 261|
 262|void  StrX_encodeBase64( char* base64, void* bin, int bin_size, const char* retCh );
 263|int   StrX_decodeBase64( const char* base64, void* bin );
 264|int   StrX_getEncodedSizeOfBase64( int bin_size, const char* retCh );
 265|int   StrX_getDecodedSizeOfBase64( int base64_strlen );
 266|
 267|#define  StrX_unitOfBase64  57
 268|
 269|
 270|
 271| 
 272|/***********************************************************
 273|*  17. <<< (StrX) char* 型の文字列(判断・正規化) >>> 
 274|************************************************************/
 275|int    StrX_isSJis1byte( const char* char_top, const char* pChar );
 276|int    StrX_isSJis2byte( const char* char_top, const char* pChar );
 277|int    StrX_isExist2byte( const char* s );
 278|bool   StrX_isSpace( int c );
 279|bool   StrX_isSpcTabRet( int c );
 280|bool   StrX_isAlpha( int c );
 281|bool   StrX_isDigit( int c );
 282|int    StrX_isSpaceStr( const char* c );
 283|int    StrX_isTerm( char c );
 284|bool   StrX_isFName( const char* name );
 285|int    StrX_cmpHead( const char* str, const char* head );
 286|int    StrX_cmpWild( const char* wild, const char* str );
 287|int    StrX_cmpWildI( const char* wild, const char* str );
 288|bool   StrX_isMatchMask( const char* target, const char* wildcard );
 289|
 290| 
 291|/***********************************************************
 292|*  18. <<< (StrX) char* 型の文字列(ファイル名、ファイルパス) >>> 
 293|************************************************************/
 294|#if  ( defined(_MSC_VER) || defined(__BORLANDC__) ) && !defined(FOR_WINCE)
 295|char*  StrX_getRunFullPath( char* absPath, const char* stepPath,
 296|  int absPath_len );
 297|#endif
 298|
 299|char*  StrX_getExeFullPath( char* absPath, char* stepPath,
 300|  int absPath_len );
 301|bool   StrX_isAbsPath( const char* path );
 302|bool   StrX_isUrl( const char* url );
 303|char*  StrX_chgPathToUrl( char* url, const char* path );
 304|char*  StrX_toRegularPath( char* s );
 305|char*  StrX_toAbsPath( char* path, int path_maxlen, const char* base );
 306|char*  StrX_toAbsPath2( char* path, int path_maxlen, const char* base );
 307|char*  StrX_cpyAbsPath( char* absp, const char* stepp, int absp_maxlen, const char* base );
 308|char*  StrX_cpyAbsPath2( char* absp, const char* stepp, int absp_maxlen, const char* base );
 309|char*  StrX_cpyAbsPath2CSV( char* absp, const char* stepp, int absp_size,
 310|  const char* base );
 311|char*  StrX_toStepPath( char* path, int path_maxlen, const char* base );
 312|char*  StrX_toStepPath2( char* path, int path_maxlen, const char* file );
 313|char*  StrX_cpyStepPath( char* stepp, const char* absp, int stepp_maxlen, const char* base );
 314|char*  StrX_cpyStepPath2( char* stepp, const char* absp, int stepp_maxlen, const char* base );
 315|char*  StrX_cpyStepPath2CSV( char* stepp, const char* absp, int stepp_size,
 316|  const char* base );
 317|
 318|char*  StrX_toStepURL( char* url, int url_maxlen, const char* base );
 319|
 320|void  StrX_movePath( const char* src,
 321|  const char* from_folder, const char* to_folder,
 322|  char* dst, int dst_size );
 323|char*  StrX_toLongPath( char* longPath, const char* shortPath );
 324|#ifdef  USES_FILEX
 325| void  StrX_getSpacedPath( const char* str, char* path, char** param );
 326|#endif
 327|char*  StrX_refFName( const char* path );
 328|char*  StrX_cpyFName( char* fname, const char* path );
 329|char*  StrX_cpyFolder( char* fname, const char* path );
 330|char*  StrX_cutFName( char* path );
 331|char*  StrX_addFName( char* path, const char* fname );
 332|char*  StrX_insLastOfFName( char* path, char* ins );
 333|char*  StrX_cdFName( char* path, const char* cd );
 334|char*  StrX_refExt( const char* path );
 335|char*  StrX_chgExt( char* path, const char* ext );
 336|char*  StrX_setExt( char* path, const char* ext );
 337|char*  StrX_addNumInFName( char* path, const char* src_path, int num );
 338|int    StrX_cmpNoExt( const char* path1, const char* path2 );
 339|
 340|char*  StrX_cpyWithoutURLSubName( char* path, const char* url );
 341|char*  StrX_refURLSubName( const char* url );
 342|
 343| 
 344|/***********************************************************
 345|*  19. <<< (StrX) char* 型の文字列(変換・n進数) >>> 
 346|************************************************************/
 347|void  StrX_initByInt16s( char* str, unsigned int n );
 348|void  StrX_initByInt16s_2( char* str, unsigned int n );
 349|void  StrX_initByInt( char* str, int str_len, int n );
 350|char* StrX_scanInt( const char* str, int* n );
 351|void  StrX_initByLong16s( char* str, unsigned long n );
 352|char* StrX_get2s_fromLong( char* s, unsigned long n, char term );
 353|long  StrX_getLong_from2s( char* s );
 354|
 355|#ifdef  USES_COLOR
 356|Color_WinRGB  StrX_getColorValue( const char* color_str );
 357|void          StrX_getColorStr( char* color_str, Color_WinRGB value );
 358|#endif
 359|
 360|void  StrX_getFontValue( const char* font_str, char* face, int* size,
 361|  bool* bBold, bool* bItalic );
 362|void  StrX_getFontStr( char* font_str, const char* face, int size,
 363|  bool bBold, bool bItalic );
 364|
 365| 
 366|/***********************************************************
 367|*  20. <<< [StrX_ListElem] リストの要素になる文字列 >>> 
 368|*  21. <<< [StrX_ListElem2] リストの要素になる文字列(補助番号付き) >>>
 369|*【補足】
 370|*・文字列 str をヒープにとっている場合、StrX_ListElem_finish2
 371|*  を呼び出す必要があります。
 372|************************************************************/
 373|#ifdef  USES_LISTX
 374|
 375|struct _StrX_ListElem {
 376|  ListX_Elem  inherit_ListX_Elem;
 377|  char*  p;
 378|};
 379|void  StrX_ListElem_finish2( StrX_ListElem* );
 380|
 381|struct _StrX_ListElem2 {
 382|  ListX_Elem  inherit_ListX_Elem;
 383|  char*  p;
 384|  void*  data;
 385|};
 386|void  StrX_ListElem2_finish2( StrX_ListElem2* );
 387|
 388|#ifdef  USES_SYM
 389|extern  Sym_Struct*   StrX_ListElem_registSymStruct( Sym* );
 390|extern  Sym_Struct    StrX_ListElem_symStruct;
 391|#endif
 392|
 393|#endif
 394| 
 395|/**************************************************************************
 396|*  22. <<< [StrX_Mem] 文字列の記憶領域 >>> 
 397|*【役割】
 398|*・大量の文字列定数を扱う場合、最も効率よく詰めて格納するようにメモリを
 399|*  割り振ります。
 400|*・格納した文字列の長さを後で変えることはできません。
 401|**************************************************************************/
 402|struct _StrX_Mem {
 403|  char*  buf;          /* 記憶領域の先頭アドレス */
 404|  char*  buf_over;     /* 記憶領域の最終アドレスの次 */
 405|  char*  pBuf;         /* 認識している空き領域の先頭アドレス */
 406|  bool   checked;      /* pBuf が適当な位置にあるかチェックしたかどうか */
 407|};
 408|void   StrX_Mem_init( StrX_Mem*, char* buf, size_t buf_sizeof );
 409|void*  StrX_Mem_getTopAdr( StrX_Mem* );
 410|void   StrX_Mem_toEmpty( StrX_Mem* );
 411|char*  StrX_Mem_alloc( StrX_Mem* );
 412|char*  StrX_Mem_alloc2( StrX_Mem*, const char* str );
 413|char*  StrX_Mem_alloc3( StrX_Mem*, const char* str );
 414|char*  StrX_Mem_copyAlloc( StrX_Mem*, const char* str );
 415|void   StrX_Mem_free( StrX_Mem*, const char* adr );
 416|size_t StrX_Mem_getLeftSize( StrX_Mem* );
 417|char*  StrX_Mem_getFirst( StrX_Mem* );
 418|char*  StrX_Mem_getNext( StrX_Mem*, char* cur );
 419|/* StrX_Mem_forEach( StrX_Mem*, char** ); */
 420|
 421|#ifndef  ERRORS_CUT_DEBUG_TOOL
 422|void  StrX_Mem_print( StrX_Mem*, const char* title );
 423|void  StrX_Mem_printAll( StrX_Mem* );
 424|#endif
 425|
 426|
 427|
 428| 
 429|/**************************************************************************
 430|*  23. <<< [StrX_Set] 文字列の記憶領域の部分集合 >>> 
 431|*【役割】
 432|*・StrX_Mem に格納した文字列の部分集合です。
 433|*・1つの StrX_Mem 領域に対して、複数の集合を表現できます。
 434|*・参照した文字列の長さを変えることはできません。
 435|**************************************************************************/
 436|#ifdef  USES_STDLIBS
 437|
 438|struct _StrX_Set {
 439|  char*  first;    /* 最初の文字列の先頭アドレス */
 440|  char*  last;     /* 最後の次の文字列の先頭アドレス */
 441|};
 442|void   StrX_Set_init1( StrX_Set*, StrX_Mem* );
 443|void   StrX_Set_init2( StrX_Set*, StrX_Mem* );
 444|void   StrX_Set_initEmpty( StrX_Set* );
 445|/* StrX_Set_forEach( StrX_Set*, char** ); */
 446|int  StrX_Set_searchWild( StrX_Set*, const char* wildkey );
 447|int  StrX_Set_searchWild2( StrX_Set* wilds, const char* key );
 448|
 449|#ifndef  ERRORS_CUT_DEBUG_TOOL
 450|void  StrX_Set_printAll( StrX_Set* );
 451|#endif
 452|
 453|#endif  /* USES_STDLIBS */
 454|
 455| 
 456|/**************************************************************************
 457|*  24. <<< [StrX_MemV] 文字列の記憶領域(malloc 使用) >>> 
 458|*【補足】
 459|*・malloc を使用するので、ヒープメモリ領域が許す限り無限に領域を確保する
 460|*  ことができます。
 461|*・格納した文字列の長さを後で変えることはできません。
 462|*・StrX_MemV_alloc で確保した領域は、char* 型か StrX_SetV 型で管理します。
 463|**************************************************************************/
 464|#ifdef  STRX_USES_MALLOC
 465|#ifdef  USES_LISTX
 466|
 467|#define  StrX_MemV_unitSize   2048   /* 増加する単位(バイト) */
 468|#define  StrX_MemV_maxLen      256   /* 一度に確保できる文字列領域(\0含む)サイズ */
 469|
 470|void   StrX_MemV_init( StrX_MemV* );
 471|void   StrX_MemV_finish( StrX_MemV* );
 472|void   StrX_MemV_setMax( StrX_MemV*, int x );
 473|char*  StrX_MemV_alloc( StrX_MemV* );
 474|
 475|
 476|struct _StrX_MemV {
 477|  ListX         mems;     /* StrX_MemVE 型リスト */
 478|  StrX_MemVE*   mem_last;
 479|  int    maxLen;  /* →StrX_MemV_maxLen */
 480|};
 481|
 482|struct _StrX_MemVE {  /* リスト要素:StrX_Mem のリスト */
 483|  StrX_Mem    mem;
 484|  ListX_Elem  ListX_Elem_extend;
 485|};
 486|
 487|#endif
 488|#endif
 489|
 490| 
 491|/***********************************************************************
 492|*  25. <<< [StrX_MemV2] 文字列の記憶領域(malloc & ハッシュ 使用) >>> 
 493|*【補足】
 494|*・同じ内容の文字列は同じ領域を使うように検索を行う文字列領域管理です。
 495|************************************************************************/
 496|#if defined(USES_INF) && defined(USES_ARRX) && defined(USES_LISTX) && defined(USES_STDPLUS)
 497|struct _StrX_MemV2 {
 498|  ListX_Dic   dic;
 499|  Offset_Key  key;
 500|  ListX       symbols;  /* StrX_MemV2E 型、→StrX_MemV2_setSymbol() */
 501|  ERRORS_INITCHK_VAR
 502|};
 503|
 504|void  StrX_MemV2_init( StrX_MemV2*, int width, StrX_HashFunc hash,
 505|  bool bCase );
 506|void  StrX_MemV2_finish( StrX_MemV2* );
 507|void  StrX_MemV2_toEmpty( StrX_MemV2* );
 508|void  StrX_MemV2_setSymbol( StrX_MemV2*, const char* setStr );
 509|char* StrX_MemV2_alloc( StrX_MemV2*, const char* str );
 510|int   StrX_MemV2_getN( StrX_MemV2* );
 511|void  StrX_MemV2_print( StrX_MemV2*, const char* title );
 512|
 513|
 514|/* 以下は内部用です */
 515|struct _StrX_MemV2E {
 516|  ListX_Elem  inherit_ListX_Elem;
 517|  char*  p;
 518|};
 519|
 520|void  StrX_MemV2E_init( StrX_MemV2E*, const char* str );
 521|void  StrX_MemV2E_finish( StrX_MemV2E* );
 522|
 523|#endif
 524| 
 525|/**************************************************************************
 526|*  26. <<< [StrX_SetV] 文字列の記憶領域の部分集合(StrX_MemV用) >>> 
 527|*【役割】
 528|*・StrX_MemV に格納した文字列の部分集合です。
 529|*・1つの StrX_Mem 領域に対して、複数の集合を表現できます。
 530|*・参照した文字列の長さを変えることはできません。
 531|**************************************************************************/
 532|#ifdef  STRX_USES_MALLOC
 533|#ifdef  USES_LISTX
 534|
 535|struct _StrX_SetV {
 536|  char*  first;     /* 最初の文字列の先頭アドレス */
 537|  char*  last;      /* 最後の次の文字列の先頭アドレス */
 538|  StrX_MemVE*  firstVE;  /* first の StrX_MemVE 型リストの参照 */
 539|  StrX_MemVE*  pVE;    /* StrX_SetV_forEach 用ポインタ */
 540|};
 541|void   StrX_SetV_init1( StrX_Set*, StrX_MemV* );
 542|void   StrX_SetV_init2( StrX_Set*, StrX_MemV* );
 543|/* StrX_SetV_forEach( StrX_Set*, char** ); */
 544|
 545|#endif
 546|#endif
 547|
 548| 
 549|/***********************************************************************
 550|*  27. <<< [StrX_Pathes] 右クリック『送る』のファイルパス >>> 
 551|*【補足】
 552|*・スペースによる区切りの短いファイル名をそれぞれ長いファイル名で参照します。
 553|*・.exe ファイルにドラッグ&ドロップしたときも同じ AfxGetApp()->m_lpCmdLine
 554|*  からファイルパスを取得できます。
 555|************************************************************************/
 556|#ifdef  USES_STDLIBS
 557|struct  _StrX_Pathes {
 558|  char*  pathes;     /* 先頭のファイルパス(短いファイル名の列挙) */
 559|  char*  curPath;    /* 現在のファイルパス(pathes の中へのアドレス) */
 560|  char   longPath[_MAX_PATH];   /* 現在のファイルパス(長いファイル名) */
 561|};
 562|
 563|void   StrX_Pathes_init( StrX_Pathes*, const char* );
 564|void   StrX_Pathes_reset( StrX_Pathes* );
 565|char*  StrX_Pathes_getCurPath( StrX_Pathes* );
 566|bool   StrX_Pathes_next( StrX_Pathes* );
 567|int    StrX_Pathes_getN( StrX_Pathes* );
 568|#endif
 569| 
 570|/***********************************************************************
 571|*  28. <<< [StrX_ConvFunc] 文字列を変換するコールバック関数の型 >>> 
 572|*【引数】
 573|*  ・void*  obj;    オブジェクト(任意アドレス)
 574|*  ・char*  s;      変換する文字列のアドレス
 575|*  ・int  s_size;   s のメモリサイズ
 576|*【補足】
 577|*・定義は優先ヘッダにあります
 578|*************************************************************************/
 579| 
 580|/**************************************************************************
 581|  29. <<< [STRX_DECLARE_ID_CONV_FUNC_START] 番号と文字列の変換関数の定義をする >>> 
 582|  30. <<< [STRX_DECLARE_ID_CONV_FUNC_END](同) >>>
 583|【補足】
 584|・IDS 型の enum を定義したとき、ヘッダファイルには、次のように記述します。
 585|  typedef enum { IDS_A, IDS_B, IDS_C, IDS_over } IDS;
 586|  char*  IDS_getStr( IDS );
 587|  IDS    IDS_getID( const char* str );
 588|
 589|・〜_over は、「非」正規の番号(番兵)です。名前は _over にする必要はありませんが、
 590|  必ず定義してください。
 591|
 592|・ソースファイル(.c)には、次のように記述します。
 593|  //-------------------------------------------------------------
 594|  //  [IDS_getStr, IDS_getID] IDS 型の番号と文字列を変換する
 595|  //【補足】
 596|  //・STRX_... マクロは、IDS_getStr, IDS_getID 関数を実装しています。
 597|  //-------------------------------------------------------------
 598|  STRX_DECLARE_ID_CONV_FUNC_START( IDS )
 599|   "String-A", "String-B", "String-C"
 600|  STRX_DECLARE_ID_CONV_FUNC_END( IDS, IDS_over, "NotFound" )
 601|
 602|・〜END の第2第3引数は、番兵の番号(兼 IDS_getID で見つからなかったときの番号)と、
 603|  IDS_getStr で見つからなかったときの文字列です。
 604|***************************************************************************/
 605|#define  STRX_DECLARE_ID_CONV_FUNC_START( ID ) \
 606|  char*  ID##_getStr( ID self ) \
 607|  { \
 608|    static  char*  s[] = {
 609|
 610|
 611|#define  STRX_DECLARE_ID_CONV_FUNC_END( ID, overID, overString ) \
 612|    }; \
 613|    if ( self < 0 || self >= overID )  return  overString; \
 614|    else  return  s[self]; \
 615|  } \
 616| \
 617|  ID  ID##_getID( const char* str ) \
 618|  { \
 619|    int  i; \
 620| \
 621|    for ( i = 0; i < ID##_over; i++ ) { \
 622|      if ( strcmp( ID##_getStr( i ), str ) == 0 ) \
 623|        return  i; \
 624|    } \
 625|    return  overID; \
 626|  }
 627|
 628| 
 629|/*------------------------------------------------------------------------*/
 630|/* 31. <<< Mapping Area ------------------------------------------------- >>> */ 
 631|/*------------------------------------------------------------------------*/
 632|
 633| 
 634|/*-------------------------------------------------------------------------*/
 635|/* ◆32. <<<< (StrX) char* 型の文字列 >>>> */ 
 636|/*-------------------------------------------------------------------------*/
 637| 
 638|/**************************************************************************
 639|  32-1. <<< [_ismbblead] 1byte 文字コード c が、2 byte 文字コードの1 byte 目か判断する >>> 
 640|  Microsoft #include <mbctype.h> と互換
 641|***************************************************************************/
 642|#ifndef _ismbblead
 643|#ifndef _MSC_VER
 644|#define  _ismbblead( c ) \
 645|  ( ( (unsigned char)(c) >= 0x81 && (unsigned char)(c) <= 0x9F ) || \
 646|    ( (unsigned char)(c) >= 0xE0 && (unsigned char)(c) <= 0xFC ) )
 647|#endif
 648|#endif
 649|
 650| 
 651|/***********************************************************
 652|  32-2. <<< [StrX_isMBBLeadNotTerm] 区切り文字以外の全角文字か判断する >>> 
 653|************************************************************/
 654|#define  StrX_isMBBLeadNotTerm( c ) \
 655|   (_ismbblead(c) && ((char)(c)) != (char)0x81)
 656|
 657|
 658| 
 659|/**************************************************************************
 660|  32-3. <<< [StrX_mbc2jsis] マルチバイト文字から Shift JIS コードを得る >>> 
 661|  ・str : マルチバイト文字へのポインタ
 662|  ・返り値 : Shift JIS コードの値
 663|***************************************************************************/
 664|#define  StrX_mbc2sjis( str ) \
 665|  ( *((unsigned char*)(str)+1) | (*(unsigned char*)(str)<<8) )
 666|
 667|
 668| 
 669|/**************************************************************************
 670|  32-4. <<< [StrX_isTokenFirst] 指定文字列の先頭がトークンの先頭かどうかを返す >>> 
 671|【引数】
 672|  ・char*   s;       トークンの先頭かどうかを調べる文字列
 673|  ・bool   返り値;   判定結果
 674|【補足】
 675|・トークンについては、StrX_getToken を参照。
 676|**************************************************************************/
 677|#define   StrX_isTokenFirst( s ) \
 678|  ( (unsigned char)*(s) > ' ' )
 679| 
 680|/**************************************************************************
 681|  32-5. <<< [StrX_searchInArrX] 文字列配列の中から検索する >>> 
 682|【引数】
 683|  ・ArrX*  arrx;  文字列配列(char* 型の配列)
 684|  ・char** 返り値; 見つかった文字列へのアドレス(arr 配列内), NULL=ない
 685|***************************************************************************/
 686|#define  StrX_searchInArrX( s, arrx ) \
 687|  StrX_searchInArr( s, (char**)(arrx)->first, ArrX_getN( arrx, char* ) )
 688|
 689| 
 690|/**************************************************************************
 691|  32-6. <<< [StrX_cmpHead] 頭文字列を比較する >>> 
 692|【機能】
 693|・str のうち、先頭の n バイトが head と同じか比較する。
 694|  ただし、n は head のバイト数とする。
 695|【引数】
 696|  ・char*  str;   比較対象の文字列
 697|  ・char*  head;  頭文字列
 698|  ・int  返り値;  標準関数の strncmp と同じ
 699|***************************************************************************/
 700|#define  StrX_cmpHead( str, head ) \
 701|  strncmp( str, head, strlen(head) )
 702|
 703| 
 704|/**************************************************************************
 705|  32-7. <<< [StrX_cpyAbsPath] StrX_toAbsPath のコピー版 >>> 
 706|***************************************************************************/
 707|#define  StrX_cpyAbsPath( absp, stepp, absp_maxlen, base ) \
 708|  ( strcpy( absp, stepp ),  StrX_toAbsPath( absp, absp_maxlen, base ) )
 709|
 710| 
 711|/**************************************************************************
 712|  32-8. <<< [StrX_cpyAbsPath2] StrX_toAbsPath2 のコピー版 >>> 
 713|***************************************************************************/
 714|#define  StrX_cpyAbsPath2( absp, stepp, absp_maxlen, base ) \
 715|  ( strcpy( absp, stepp ),  StrX_toAbsPath2( absp, absp_maxlen, base ) )
 716|
 717| 
 718|/**************************************************************************
 719|  32-9. <<< [StrX_cpyStepPath] StrX_toStepPath のコピー版 >>> 
 720|***************************************************************************/
 721|#define  StrX_cpyStepPath( stepp, absp, stepp_maxlen, base ) \
 722|  ( strcpy( stepp, absp ),  StrX_toStepPath( stepp, stepp_maxlen, base ) )
 723|
 724| 
 725|/**************************************************************************
 726|  32-10. <<< [StrX_cpyStepPath2] StrX_toStepPath2 のコピー版 >>> 
 727|***************************************************************************/
 728|#define  StrX_cpyStepPath2( stepp, absp, stepp_maxlen, base ) \
 729|  ( strcpy( stepp, absp ),  StrX_toStepPath2( stepp, stepp_maxlen, base ) )
 730|
 731| 
 732|/*-------------------------------------------------------------------------*/
 733|/* ◆33. <<<< (StrX_ListElem2) リストの要素になる文字列(補助番号付き) >>>> */ 
 734|/*-------------------------------------------------------------------------*/
 735| 
 736|/***********************************************************************
 737|  33-1. <<< [StrX_ListElem2_finish2] リスト要素の文字列を後始末する >>> 
 738|************************************************************************/
 739|#define  StrX_ListElem2_finish2( this ) \
 740|    StrX_ListElem_finish2( (StrX_ListElem*)(this) )
 741| 
 742|/*-------------------------------------------------------------------------*/
 743|/* ◆34. <<<< (StrX_Mem) 文字列の記憶領域 >>>> */ 
 744|/*-------------------------------------------------------------------------*/
 745|
 746| 
 747|/**************************************************************************
 748|  34-1. <<< [StrX_Mem_getTopAdr] メモリ領域の先頭アドレスを取得する >>> 
 749|【引数】
 750|  ・StrX_Mem*  this;  文字列の記憶領域
 751|  ・void*  返り値;    メモリ領域の先頭アドレス
 752|【補足】
 753|・buf に malloc したアドレスを指定した場合、本関数で取得したアドレスを
 754|  free することを忘れないでください。
 755|**************************************************************************/
 756|#define  StrX_Mem_getTopAdr( this ) \
 757|  ((void*)(this)->buf)
 758|
 759|
 760| 
 761|/**************************************************************************
 762|  34-2. <<< [StrX_Mem_getFirst] 最初の文字列を返す >>> 
 763|【引数】
 764|  ・StrX_Mem*  this;  文字列の記憶領域
 765|  ・char**  返り値;   最初の文字列
 766|**************************************************************************/
 767|#define  StrX_Mem_getFirst( this ) \
 768|  ( (this)->buf + 1 )
 769| 
 770|/**************************************************************************
 771|  34-3. <<< [StrX_Mem_forEach] 先頭から文字列を列挙しながらループする >>> 
 772|【引数】
 773|  ・char**  pp;       要素文字列(char*ポインタ)を格納するアドレス
 774|  ・StrX_Mem*  this;  文字列の記憶領域
 775|【補足】
 776|・for 文の中で使用します。
 777|     for ( StrX_Mem_forEach( &mem, &p ) );
 778|***************************************************************************/
 779|#if 0
 780|
 781|#define  StrX_Mem_forEach( this, pp ) \
 782|  *(pp) = StrX_Mem_getNext( this, NULL ); \
 783|  *(pp) != NULL; *(pp) = StrX_Mem_getNext( this, *(pp) )
 784|
 785|#else
 786|
 787|#define  StrX_Mem_forEach( this, pp ) \
 788|  *(pp) = ( (this)->pBuf == (this)->buf  ? NULL : (this)->buf + 1 ); \
 789|  *(pp) != NULL; \
 790|  *(pp) = ( *(pp) >= (this)->pBuf  ? NULL : strchr( *(pp), '\0' ) + 1 )
 791|
 792|#endif
 793| 
 794|/*-------------------------------------------------------------------------*/
 795|/* ◆35. <<<< (StrX_Set) 文字列の記憶領域の部分集合 >>>> */ 
 796|/*-------------------------------------------------------------------------*/
 797|
 798| 
 799|/**************************************************************************
 800|  35-1. <<< [StrX_Set_init1] 集合を定義する(step-1) >>> 
 801|  35-2. <<< [StrX_Set_init2] 集合を定義する(step-2) >>>
 802|【補足】
 803|・StrX_Set_init1 から StrX_Set_init2 の間に
 804|  mem に StrX_Mem_alloc した文字列の集合に初期化します。
 805|・StrX_Set_init2 を呼び出す前に、集合の最後の要素に相当する
 806|  文字列を格納しておいてください。
 807|***************************************************************************/
 808|#ifdef  USES_STDLIBS
 809|
 810|#define  StrX_Set_init1( this, mem ) \
 811|  ( (this)->first = strchr( (mem)->pBuf, '\0' ) + 1 )
 812|
 813|#define  StrX_Set_init2( this, mem ) \
 814|  ( (this)->last = strchr( (mem)->pBuf, '\0' ) + 1 )
 815|
 816|#endif  /* USES_STDLIBS */
 817|
 818| 
 819|/**************************************************************************
 820|  35-3. <<< [StrX_Set_initEmpty] 空の集合に初期化する >>> 
 821|***************************************************************************/
 822|#ifdef  USES_STDLIBS
 823|
 824|#define  StrX_Set_initEmpty( this ) \
 825|  ( (this)->first = NULL, (this)->last = NULL )
 826|
 827|#endif
 828| 
 829|/**************************************************************************
 830|  35-4. <<< [StrX_Set_forEach] 集合に含まれる文字列を列挙しながらループする >>> 
 831|【引数】
 832|  ・char**  pp;         要素文字列(char*ポインタ)を格納するアドレス
 833|  ・StrX_Set*  set;     文字列の記憶領域
 834|【補足】
 835|・for 文の中で使用します。
 836|     for ( StrX_Set_forEach( &set, &p ) );
 837|***************************************************************************/
 838|#ifdef  USES_STDLIBS
 839|
 840|#define  StrX_Set_forEach( set, pp ) \
 841|  *(pp) = (set)->first;  \
 842|  *(pp) < (set)->last;  \
 843|  *(pp) = strchr( *(pp), '\0' ) + 1
 844|
 845|#endif
 846| 
 847|/*-------------------------------------------------------------------------*/
 848|/* ◆36. <<<< (StrX_MemV) 文字列の記憶領域(malloc 使用) >>>> */ 
 849|/*-------------------------------------------------------------------------*/
 850|
 851| 
 852|/***********************************************************************
 853|  36-1. <<< [StrX_MemV_setMax] 一度に確保できる文字列領域のサイズを設定する >>> 
 854|【補足】
 855|・StrX_MemV_alloc 関数で得られたアドレスから文字列を格納することが
 856|  できると保証する長さ('\0'文字含む)を設定します。
 857|************************************************************************/
 858|#ifdef  USES_LISTX
 859|
 860|#define  StrX_MemV_setMax( this, x ) \
 861|  (this)->maxLen = (x)
 862|
 863|#endif
 864|
 865| 
 866|/***********************************************************************
 867|  36-2. <<< [StrX_MemV2_finish] 後始末する >>> 
 868|************************************************************************/
 869|#define  StrX_MemV2_finish( this ) \
 870|  ListX_Dic_finish( &(this)->dic, StrX_MemV2E, (Inf_FinishFunc)StrX_MemV2E_finish ), \
 871|  ListX_finish2( &(this)->symbols, StrX_MemV2E, NULL )
 872| 
 873|/***********************************************************************
 874|  36-3. <<< [StrX_MemV2_toEmpty] 領域をすべて開放する >>> 
 875|************************************************************************/
 876|#define  StrX_MemV2_toEmpty( this ) \
 877|  ListX_Dic_toEmpty( &(this)->dic, StrX_MemV2E, (Inf_FinishFunc)StrX_MemV2E_finish )
 878| 
 879|/***********************************************************************
 880|  36-4. <<< [StrX_MemV2_getN] 確保している文字列の要素数を返す >>> 
 881|************************************************************************/
 882|#define   StrX_MemV2_getN( this ) \
 883|  ListX_Dic_getN( &(this)->dic )
 884| 
 885|/***********************************************************************
 886|  36-5. <<< [StrX_MemV2E_init] 文字列領域をヒープから確保する >>> 
 887|************************************************************************/
 888|#define  StrX_MemV2E_init( this, str ) \
 889|  strcpy( (char*)( (this)->p = malloc( strlen( str ) + 1 ) ), str )
 890|
 891| 
 892|/*-------------------------------------------------------------------------*/
 893|/* ◆37. <<<< (StrX_SetV) 文字列の記憶領域の部分集合(StrX_MemV用) >>>> */ 
 894|/*-------------------------------------------------------------------------*/
 895|
 896| 
 897|/**************************************************************************
 898|  37-1. <<< [StrX_SetV_init1] 集合を定義する(step-1) >>> 
 899|  37-2. <<< [StrX_SetV_init2] 集合を定義する(step-2) >>>
 900|【補足】
 901|・StrX_SetV_init1 から StrX_SetV_init2 の間に
 902|  mem に StrX_MemV_alloc した文字列の集合に初期化します。
 903|・StrX_SetV_init2 を呼び出す前に、集合の最後の要素に相当する
 904|  文字列を格納しておいてください。
 905|***************************************************************************/
 906|#ifdef  USES_STDLIBS
 907|#ifdef  USES_LISTX
 908|
 909|#define  StrX_SetV_init1( this, _mem ) \
 910|( \
 911|  ( (this)->first = strchr( (_mem)->mem_last->mem.pBuf, '\0' ) + 1 ), \
 912|  (this)->firstVE = (_mem)->mem_last \
 913|)
 914|
 915|#define  StrX_SetV_init2( this, _mem ) \
 916|  ( (this)->last = strchr( (_mem)->mem_last->mem.pBuf, '\0' ) + 1 )
 917|
 918|
 919|#endif
 920|#endif  /* USES_STDLIBS */
 921|
 922| 
 923|/**************************************************************************
 924|  37-3. <<< [StrX_SetV_forEach] 集合に含まれる文字列を列挙しながらループする >>> 
 925|【引数】
 926|  ・char**  pp;         要素文字列(char*ポインタ)を格納するアドレス
 927|  ・StrX_SetV*  set;    文字列の記憶領域
 928|【補足】
 929|・for 文の中で使用します。
 930|     for ( StrX_SetV_forEach( &set, &p ) );
 931|***************************************************************************/
 932|#ifdef  USES_STDLIBS
 933|#ifdef  USES_LISTX
 934|
 935|#define  StrX_SetV_forEach( set, pp ) \
 936|  *(pp) = ((set)->first==(set)->last ? NULL : (set)->first), \
 937|    (set)->pVE = (set)->firstVE; \
 938|  *(pp) != NULL ; \
 939|  *(pp) = StrX_SetV_forEach_imp( set, *(pp) )
 940|
 941|/* 内部用 */
 942|char*  StrX_SetV_forEach_imp( StrX_SetV*, char* p );
 943|
 944|
 945|#endif
 946|#endif  /* USES_STDLIBS */
 947| 
 948|#ifdef __cplusplus 
 949|}
 950|#endif
 951|
 952|#endif
 953| 
 954|