/********************************************************************************
*	ファイル名：Csv.cpp															*
*	用　　　途：ＣＳＶ書式の展開												*
*	備　　　考：																*
*	履　　　歴：																*
********************************************************************************/
/****************************
*	 コンパイル環境設定		*
****************************/
#pragma once
/****************************
*	インクルードファイル	*
****************************/
#include <afxtempl.h>
/****************************
*		 マクロ定数			*
****************************/
/****************************
*		 構造体定義			*
****************************/
typedef CArray<CString, CString&> CTokenArray;

class CCsv
{
public:
							CCsv(TCHAR nSep = _T(','));
							CCsv(CCsv &csv);
	virtual				   ~CCsv();

			INT32			SetLine(LPCTSTR szLineBuf);
			INT32			GetCol() const;
			BOOL			GetField(CString *str, INT32 n);
			BOOL			GetField(INT32 nCol, PVOID vpDst, INT32 nAttr); 

			INT32			GetLine(CString *pStr, BOOL bAddCrLf = FALSE);
			INT32			SetCol(INT32 n);
			BOOL			SetField(CString *str, INT32 n);
			BOOL			SetField(INT32 nCol, PVOID vpSrc, INT32 nAttr);

	const	CCsv&			operator=(const CCsv &csv);

			TCHAR			GetSeparator() const;
			CString			GetLineBuf() const;
			CString			GetField(INT32 n) const;

			BYTE			GetByte(INT32 nCol);
			BOOL			GetBool(INT32 nCol);
			INT32			GetInt32(INT32 nCol);
			UINT32			GetUInt32(INT32 nCol);
			INT64			GetInt64(INT32 nCol);
			UINT64			GetUInt64(INT32 nCol);
			float			GetFloat(INT32 nCol);
			double			GetDouble(INT32 nCol);
			CString			GetString(INT32 nCol);

			/*
				以下のGet系は互換性のためだけに存在。
				使用は推奨しません。
			*/
			INT32			GetInt(INT32 nCol);
			UINT32			GetUInt(INT32 nCol);
			LONG			GetLong(INT32 nCol);
			ULONG			GetULong(INT32 nCol);
			LONGLONG		GetLongLong(INT32 nCol);
			ULONGLONG		GetULongLong(INT32 nCol);


			BOOL			SetByte(INT32 nCol, BYTE &uVal);
			BOOL			SetBool(INT32 nCol, BOOL &nVal);
			BOOL			SetInt32(INT32 nCol, INT32 &nVal);
			BOOL			SetUInt32(INT32 nCol, UINT32 &uVal);
			BOOL			SetInt64(INT32 nCol, INT64 &nVal);
			BOOL			SetUInt64(INT32 nCol, UINT64 &uVal);
			BOOL			SetFloat(int nCol, float &fVal);
			BOOL			SetDouble(int nCol, double &dVal);
			BOOL			SetString(int nCol, LPCTSTR szstr);


			/*
				以下のSet系は互換性のためだけに存在。
				使用は推奨しません。
			*/
			BOOL			SetInt(INT32 nCol, INT32 &nVal);
			BOOL			SetUInt(INT32 nCol, UINT32 &uVal);
			BOOL			SetLong(INT32 nCol, LONG &nVal);
			BOOL			SetULong(INT32 nCol, ULONG &uVal);
			BOOL			SetLongLong(INT32 nCol, LONGLONG &nVal);
			BOOL			SetULongLong(INT32 nCol, ULONGLONG &uVal);

protected:
			INT32			Split();
			INT32			AddPlain(INT32 nStart, INT32 nLen);
			INT32			AddQuoted(INT32 nStart, INT32 nLen);
			void			Copy(const CCsv &csv);

protected:
			CString			m_strLine;		/* ラインバッファ		*/
			CTokenArray		m_aToken;		/* トークン配列			*/
			TCHAR			m_nSeparator;	/* 区切り文字テーブル	*/
			INT32			m_nMethod;		/* 切り出しモード		*/
};

/****************************
*		 クラス定義			*
****************************/
/****************************
*		 関数　宣言			*
****************************/
/****************************
*		 変数　宣言			*
****************************/
