プログラミング工房 > HSP > サンプルアプリケーション > downloader > 

gm_record_str.hsp

/***********************************************************

	任意の区切り文字で区切られた文字列を操作するモジュール

		(シフトJIS専用)

		【2006/10/3 更新】

***********************************************************/
#ifndef	__GM_RECORD_AND_FIELDS__
	#define	global	__GM_RECORD_AND_FIELDS__


#module record_and_fields

#const	TRUE		1
#const	FALSE		0

#define	global	RECORD_STR_ALL	"-1"

/*--------------------------------------------*/
/* 指定された区切り文字で区切られた文字列から */
/* 任意の(あるいはすべての)位置の項目を取り */
/* 出す。引用符の間の区切り文字は無視。       */
/*                                            */
/* p1.0 : 処理対象文字列                      */
/* p1.1 : 区切り文字(1byte文字のみ。複数可。 */
/*                    複数の場合連結して格納)*/
/* p1.2 : 引用符文字(1byte文字のみ。複数可。 */
/*                    複数の場合連結して格納)*/
/* p1.3 : 取得する項目番号を表す文字列        */
/*                  (0~ または -1(すべて))*/
/* p2   : 項目内容を入れる戻り値用文字列配列  */
/*--------------------------------------------*/
#deffunc split	array prms, array items
	repeat length(items)
		items(cnt) = ""
	loop
	
	/* 引用符フラグ初期化(指定された引用符の数だけ) */
	len = strlen(prms(2))
	repeat len
		quotFlags(cnt) = FALSE
	loop
	quotFlags(len) = -1
	
	/* フィールド取得 */
	byte		= 0	// 処理対象文字列から取得した1byte
	char		= ""	// byteを文字にもどしたもの
	idxInRec		= 0	// 処理対象文字列内の処理中インデックス
	fldItemIdx	= 0	// 処理中の項目番号
	item		= ""	// 取得中の項目
	repeat
		byte = peek(prms(0),idxInRec)	// 処理対象文字列から1byte取得
		idxInRec ++
		/* レコード文字列の末尾の場合 */
		if byte=NULL {
			if item!"" {					// 取得中の項目が空でなければ
				if prms(3)=RECORD_STR_ALL {			// 全項目取得の場合
					items(fldItemIdx) = item		// 取得した項目を戻り値用配列に追加
					fldItemIdx ++
				}
				else {					// 特定項目取得の場合
					if fldItemIdx=int(prms(3)) {	// 指定項目を取得し終わった
						items(0) = item		// 取得した項目を戻り値用配列に追加
					}
				}
			}
			break						// 処理終了
		}
		
		poke char,0,byte						// byteを文字にもどしたものを取得
		/* 2byte文字の1byte目の場合 */
		if byte>=127 {
			item += char
			byte = peek(prms(0),idxInRec)			// 処理対象文字列から2byte目を取得
			idxInRec ++
			poke char,0,byte					// byteを文字にもどしたものを取得
			goto *@f
		}
		/* (その他の場合) */
		/* 引用符かどうかチェック */
		i = instr(prms(2),,char)
		if i!-1 {							// ヒット
			//----- 該当する引用符フラグを反転
			if quotFlags(i)=TRUE {
				quotFlags(i) = FALSE
			}
			else {
				quotFlags(i) = TRUE
			}
			//-----
			goto *@f
		}
		/* 区切り文字かどうかチェック */
		i = instr(prms(1),,char)
		if i!-1 {							// ヒット
			/* 引用符内かどうかチェック */
			flag = FALSE
			repeat
				if quotFlags(cnt)=-1 {
					break
				}
				if quotFlags(cnt)=TRUE {
					flag = TRUE
					break
				}
			loop
			/* 引用符内ではなかった */
			if flag=FALSE {
				/* 次の項目を取得するために処理を継続 */
				if item!"" {					// 取得中の項目が空でなければ
					if int(prms(3))=-1 {			// 全項目取得の場合
						items(fldItemIdx) = item		// 取得した項目を戻り値用配列に追加
						fldItemIdx ++
					}
					else {					// 特定項目取得の場合
						if fldItemIdx=(int(prms(3))) {	// 指定項目を取得し終わった
							items(0) = item		// 取得した項目を戻り値用配列に追加
							break			// 処理終了
						}
					}
					item = ""
				}
				continue
			}
		}
*@
		item += char
	loop
return

#global


#endif