Artifact Content

Not logged in

Artifact db7b4a9cec9be918c149ed5885b08ebf86cfb9e0


//--- K.I.LIB ---
// kl_str.h : string classes for K.I.LIB

#ifndef AFX_KISTR_H__1932CA2C_ACA6_4606_B57A_ACD0B7D1D35B__INCLUDED_
#define AFX_KISTR_H__1932CA2C_ACA6_4606_B57A_ACD0B7D1D35B__INCLUDED_

/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
// kiStr : 単純文字列

class kiStr
{
friend void kilib_startUp();

private: //-- グローバルな初期化処理など ---------------------

	static void init();

public: //-- 外向きインターフェイス --------------------------

	// 2byte文字の処理を高速化(したような気分)
	static char* next( char* p )
		{ return p+st_lb[(*p)&0xff]; }
	static const char* next( const char* p )
		{ return p+st_lb[(*p)&0xff]; }
	static bool isLeadByte( char c )
		{ return st_lb[c&0xff]==2; }

	// 初期化
	kiStr( int start_size = 100 );
	kiStr( const char* s, int min_size = 100 );
	explicit kiStr( const kiStr& s );

	// 演算子
	kiStr& operator = ( const kiStr& );
	kiStr& operator = ( const char* s );
	kiStr& operator += ( const char* s );
	kiStr& operator += ( char c );
	bool operator == ( const char* s ) const;
	bool isSame( const char* s )       const;
	operator const char*()             const;
	int len()                          const;
	void lower()
		{ ::CharLower(m_pBuf); }
	void upper()
		{ ::CharUpper(m_pBuf); }
	kiStr& setInt( int n, bool cm=false );
	void replaceToSlash() {
		for(char* p=m_pBuf; *p; p=next(p))
			if(*p=='\\')
				*p='/';
	}

	// リソースからロード
	kiStr& loadRsrc( UINT id );

	kiStr& removeTrailWS();

protected: //-- 派生クラス向け -----------------------------

	char* m_pBuf;
	int   m_ALen;

private: //-- 内部処理 -------------------------------------

	static char st_lb[256];

public:

	virtual ~kiStr();
};

inline const kiStr operator+(const kiStr& x, const kiStr& y)
	{ return kiStr(x) += y; }
inline const kiStr operator+(const char* x, const kiStr& y)
	{ return kiStr(x) += y; }
inline const kiStr operator+(const kiStr& x, const char* y)
	{ return kiStr(x) += y; }

/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
// kiPath : パス特有の処理用関数付き文字列

class kiPath : public kiStr
{
public: //-- 外向きインターフェイス --------------------------

	// 初期化
	kiPath() : kiStr( MAX_PATH ){}
	explicit kiPath( const char* s ) : kiStr( s, MAX_PATH ){}
	explicit kiPath( const kiStr& s ) : kiStr( s, MAX_PATH ){}
	explicit kiPath( const kiPath& s ) : kiStr( s, MAX_PATH ){}
	kiPath( int nPATH, bool bs = true ) : kiStr( MAX_PATH )
		{
			beSpecialPath( nPATH );
			if( nPATH != Exe_name )
				beBackSlash( bs );
		}

	// operator
	void operator = ( const char* s ){ kiStr::operator =(s); }

	// 特殊パス取得
	void beSpecialPath( int nPATH );
	enum { Win=0x1787, Sys, Tmp, Prg, Exe, Cur, Exe_name,
			Snd=CSIDL_SENDTO, Dsk=CSIDL_DESKTOP, Doc=CSIDL_PERSONAL };

	// 短いパス
	void beShortPath();

	// 最後のバックスラッシュ制御
	void beBackSlash( bool add );

	// ディレクトリ名のみ
	bool beDirOnly();
	// ファイル名except拡張子全部
	void getBody( kiStr& str ) const;
	// ファイル名except拡張子一つ
	void getBody_all( kiStr& str ) const;

	// 複数階層mkdir
	void mkdir();
	// 複数階層rmdir
	void remove();

	// ドライブタイプ
	UINT getDriveType() const;
	// 同じディレクトリにあるかどうか
	bool isInSameDir(const char* r) const;

	// [static] ディレクトリ情報を含まない、ファイル名のみ抽出
	static const char* name( const char* str );
	// [static] 最後の拡張子。無ければNULL
	static const char* ext( const char* str );
	// [static] 拡張子全部。無ければNULL
	static const char* ext_all( const char* str );
	// [static] \ / で終わるか否か
	static bool endwithyen( const char* str );

	// non-static-ver
	const char* name() const
		{ return name(m_pBuf); }
	const char* ext() const
		{ return ext(m_pBuf); }
	const char* ext_all() const
		{ return ext_all(m_pBuf); }
};

#endif