/*<Header>==============================================================
*
*	WIZME / "WIZ_MEM.C"	WIZリンクソフト / メモリ管理ブロック
*
*		[ EIN(tm) project : サンプルプログラム ]
*
*	COPYRIGHT  Nam  1995, All rights reserved.
*
*	配付・組込・改変・商利用すべて自由。ただし無保証っす
*
*-----------------------------------------------------------------------
*	V1.0L01α	95.08.04/Nam	プロトタイプ(『鉄鍋のジャン』2巻発売記念)
*	V1.0L02α	95.08.08/Nam	CSVメモ→テキスト変換
*	V1.0L02β	95.08.10/Nam	Zaurus特殊文字(2バイト半角)コンバート
*	V1.0L02γ	95.08.17/Nam	Zaurus特殊文字コンバートのdebug(ひえ〜)
*</Header>==============================================================*/
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<snd.h>
#include	<winb.h>
#include	<te.h>
#include	<fntb.h>
#include	<gui.h>
#include	<egb.h>
//#include	<file_dlg.h>
//#include	<tifflib.h>
#include	<msdos.cf>
#include	<loader.h>
#include	<math.h>
#include	<io.h>
//#include	<guidbg.h>
//#include	<wgb.h>
// ※ ここまでが平均的に使用されるヘッダ

#include	"..\ein\eintm.h"	// EIN(TM)関連ライブラリのヘッダ

#include	<pocket.h>			// このサンプルでのみ必要

#define	ERROR	(-1)
#ifndef NOERR
	#define	NOERR	(0)
#endif

extern int	GV_apliLot;			// malloc用

extern char	fname[];			// 送受信ファイル名

extern char	irBuf[];			// IR送受信用バッファ
extern char	repBuf[];			// IR送受信用リピートバッファ


char	*termBuf = NULL;		// 送受信元データバッファ
int		termBufSize = 0;		// 元データバッファサイズ(bytes)
int		termSize = 0;			// 元データバッファ内データサイズ(bytes)

// バッファをpurge
int		WL_purgeBuf()
{
	if ( termBuf != NULL ){
		TL_freeMemory(termBuf, termBufSize);
	}
	termBuf = NULL;
	termBufSize = 0;
	termSize = 0;
	return NOERR;
}

// 元バッファをmalloc
int		WL_mallocBuf( int size )
{
	if ( termSize > 0 ){
		WL_purgeBuf();
	}
	if ( size < 1 ){
		return ERROR;
	}
	size = ((size / 1024)+1) * 1024;
	if ( (termBuf=TL_mallocMemory(GV_apliLot, size)) == NULL ){
		#ifdef DEBUG
		printf("WL_mallocBuf(%s): Can't malloc!\n", size);
		#endif
		return ERROR;
	}
	termBufSize = size;

	return NOERR;
}

// 元バッファをshrink
int		WL_shrinkBuf()
{
	int		osize, nsize;
	char	*tbuf;

	if ( (termSize < 1) || (termBufSize < 1) ){
		return ERROR;
	}
	osize = ((termBufSize / 1024)+1) * 1024;
	nsize = ((termSize / 1024)+1) * 1024;
	// 違いが1024byte未満なら縮めてもメリットが無い
	if ( osize == nsize ){
		return NOERR;
	}
	// ワークのメモリを取れなかった
	if ( (tbuf=TL_mallocMemory(GV_apliLot, nsize)) == NULL ){
		return NOERR;
	}
	#ifdef DEBUG
	printf("WL_shrinkBuf() %d->%d\n", osize, nsize);
	#endif
	// ワークにバッファ内容を転送
	memcpy( tbuf, termBuf, termSize );
	// 古いバッファをpurge
	TL_freeMemory(termBuf, termBufSize);
	termBufSize = nsize;
	termBuf = tbuf;

	return NOERR;
}

// バッファ末尾に0x1aが無ければ追加する
int		WL_putEOF()
{
	char	*dst;

	if ( termBuf == NULL ){
		return ERROR;
	}
	dst = (char *)termBuf + termSize -1;
	if ( dst[0] == 0x1a ){
		#ifdef DEBUG
		printf("WL_putEOF(): 0x1a already exist.\n");
		#endif
		return NOERR;
	}
	if ( termSize >= termBufSize ){
		#ifdef DEBUG
		printf("WL_putEOF(): Buffer size over.\n");
		#endif
		return ERROR;
	}
	// バッファ末尾に0x1aを追加
	dst[1] = 0x1a;
	termSize++;
	return NOERR;
}

// 元バッファに指定サイズ分のデータをIRバッファから追加転送
int		WL_recBuf( int size )
{
	char		*dst, *src;
	if ( termBuf == NULL ){
		#ifdef DEBUG
		printf("WL_recBuf(%s): No buf!\n", size);
		#endif
		return ERROR;
	}
	if ( size < 17 ){
		#ifdef DEBUG
		printf("WL_recBuf(%s): too short!\n", size);
		#endif
		return ERROR;
	}
	// ヘッダ(15byte)と末尾のチェックサム(2byte)を除いて転送
	size -= 17;
	// バッファを越える転送はしないように
	if ( (termSize + size) > termBufSize ){
		size = termBufSize - termSize;
	}
	if ( size < 1 ){
		#ifdef DEBUG
		printf("WL_recBuf(): overflow!\n");
		#endif
		return ERROR;
	}
	src = (char *)irBuf + 15;	// ヘッダ分をとばす
	dst = (char *)termBuf + termSize;
	memcpy( dst, src, size );
	termSize += size;

	#ifdef DEBUG
	printf("WL_recBuf(%x,%d)\n", dst,termSize);
	#endif

	return NOERR;
}

// 元バッファに指定サイズ分のデータをIRバッファから追加転送
int		WL_recRBuf( int size )
{
	char		*dst, *src;
	if ( termBuf == NULL ){
		#ifdef DEBUG
		printf("WL_recBuf(%s): No buf!\n", size);
		#endif
		return ERROR;
	}
	if ( size < 17 ){
		#ifdef DEBUG
		printf("WL_recBuf(%s): too short!\n", size);
		#endif
		return ERROR;
	}
	// ヘッダ(15byte)と末尾のチェックサム(2byte)を除いて転送
	size -= 17;
	// バッファを越える転送はしないように
	if ( (termSize + size) > termBufSize ){
		size = termBufSize - termSize;
	}
	if ( size < 1 ){
		#ifdef DEBUG
		printf("WL_recBuf(): overflow!\n");
		#endif
		return ERROR;
	}
	src = (char *)repBuf + 15;	// ヘッダ分をとばす
	dst = (char *)termBuf + termSize;
	memcpy( dst, src, size );
	termSize += size;

	#ifdef DEBUG
	printf("WL_recBuf(%x,%d)\n", dst,termSize);
	#endif

	return NOERR;
}

// IRバッファ送信準備
int		WL_mkSendBuf( int flag )
{
	#define	IR_head_Len		(15)
	#define	IR_head_BlNo	(8)
	#define	IR_head_Size	(13)

	char	head[15]= {	0x00,  0x00,  0x00,  0x00,  0x00,  0x96,  0x81, 0x10,
						0x00,  0x00,  0x01,  0x40,  0x0fe, 0x00,  0x00 };

	static int	bufp, cnt;
	char		*src, *dst;
	int			i, sum, size;

	// お約束のErrorTrap
	if ( termBuf==NULL || termSize < 1 ){
		return -1;
	}
	// flag がFALSEなら転送条件を初期化する
	if ( flag < 1 ){
		bufp = 0;
		cnt = 1;
		return 0;
	}
	// バッファ終端なら何もしない
	if ( termSize <= bufp ){
		return 0;
	}
	// バッファを越える転送はしないように
	size = 512;
	if ( (bufp + size) > termSize ){
		size = termSize - bufp;
	}
	// ヘッダを付ける
	memcpy( irBuf, head, IR_head_Len );
	// ブロック番号を設定する(size<512なら最後のブロックなのでFFFFに)
	*(unsigned short *)( &irBuf[0] + IR_head_BlNo ) = (size == 512) ?cnt :0x0ffff;
	// データサイズを設定する
	*(unsigned short *)( &irBuf[0] + IR_head_Size ) = size;
	// データを転送する
	dst = irBuf + IR_head_Len;
	src = termBuf + bufp;
	memcpy( dst, src, size );
	cnt++;
	bufp += size;
	// チェックサムを設定する
	for( i=sum=0; i < size; i++ ){
		sum += *( dst + i );
	}
	*(unsigned short *)(&irBuf[0] + IR_head_Len + size) = sum;

	return (IR_head_Len + size + 2);
}

// 指定バッファの内容をセーブする
int		WL_saveFile( char *buf, int size )
{
	FILE	*fp;
	int		ret = ERROR;
	
	if ( (strlen(fname)< 1) || (buf==NULL) || (size<1) ){
		return ret;
	}
	if ( (fp=EIN_fopen(fname,"wb")) == (FILE *)NULL ){
		return ret;
	}
	if ( fwrite( buf, size, 1, fp ) > 0 ){
		ret = NOERR;
	}
	fclose( fp ) ;
	return ret;
}

// 指定バッファの内容をポケットに入れる
int		WL_savePocket( char *buf, int size )
{
	int		ret = ERROR;
	if ( SCB_open()==NOERR ){
		// まずポケットの内容をクリア
		SCB_empty();
		if ( SCB_write(SCBF_CSTR,buf,size) == size ){
			SCB_seek(SCBF_CSTR, 0, SCBS_SET);
			ret = NOERR;
		}
		SCB_close();
	}
	return ret;
}

// ファイルの内容を指定バッファにロードする
int		WL_loadFile( char *buf, int size )
{
	FILE	*fp;
	int		ret = ERROR;
	
	if ( (strlen(fname)< 1) || (buf==NULL) || (size<1) ){
		return ret;
	}
	if ( (fp=EIN_fopen(fname,"rb")) == (FILE *)NULL ){
		return ret;
	}
	if (fread( buf, 1, size, fp ) == size){
		ret = NOERR;
	}
	fclose( fp ) ;
	return ret;
}

// ポケットの内容を指定バッファ入れる
int		WL_loadPocket( char *buf, int size )
{
	int		ret = ERROR;

	if ( SCB_open()==NOERR ){
		if ( SCB_isFormatAvailable(SCBF_CSTR) > 0 ){
			SCB_seek(SCBF_CSTR, 0, SCBS_SET);
			/* データ終端まで読み込み */
			if (SCB_read(SCBF_CSTR, buf, size) == size ){
				ret = NOERR;
			}
		}
		SCB_close();
	}
	return ret;
}

// ファイルサイズを得る
int		WL_getFileSize()
{
	FILE	*fp;
	int		size = -1;
	
	if ( strlen(fname)< 1 ){
		return size;
	}
	if ( (fp=EIN_fopen(fname,"rb")) == (FILE *)NULL ){
		return size;
	}
	if (fseek( fp, 0L, SEEK_END ) == 0){
		size = ftell( fp );
	}
	fclose( fp ) ;
	return size;
}

// ポケットの内容のデータサイズを得る
int		WL_getPocketSize()
{
	int		size = -1;

	if ( SCB_open()==NOERR ){
		size = SCB_isFormatAvailable(SCBF_CSTR);
		SCB_close();
	}
	return size;
}


// 元バッファのプレーンテキストから無地メモ形式へ変換
// (`dsize'(byte) で別メモに分割する。dsize<1の時は分割しない)
// (※実測では1037byteまではWizでも取り込めるみたいっす)
int		WL_convText2Csv( int dsize )
{
	char	str_crlf[] = { 0x0d, 0x0a, 0 };
	char	str_i[] = "\"i\",\"SCRT\",\"CLAS\",\"MEM1\",\"PRF1\",\"CLSC\"";
	char	str_T[] = "\"T\",\"シークレット\",\"ファイル名\",\"メモ内容\",\"印字形式\",\"分類コード\"";
	char	str_Dh[]= "\"D\",\" \",,\"";
	char	str_Dt[]= "\",,\"　\"";
	char	str_quote[] = { 0x0d, 0x0a, 0x1a, 0 };

	char	*tmpBuf, *sp, *dp, *dp2;
	int		i, d, len, rem, cnt, tsize;

	if ( (termBuf==NULL) || (termSize<1) ){
		return ERROR;
	}
	
	// 3倍のワークバッファを取っておく
	tsize = ( ((termSize * 3) / 1024)+1) * 1024;
	if ( (tmpBuf=TL_mallocMemory(GV_apliLot, tsize)) == NULL ){
		#ifdef DEBUG
		printf("WL_convText2Buf(%s): Can't malloc!\n", size);
		#endif
		return ERROR;
	}
	// まずヘッダその1を転送
	strcpy( tmpBuf, str_i );
	strcat( tmpBuf, str_crlf );
	// まずヘッダその2を転送
	strcat( tmpBuf, str_T );
	strcat( tmpBuf, str_crlf );

	strcat( tmpBuf, str_Dh );
	
	sp = (char *)termBuf;
	dp = (char *)tmpBuf + strlen( tmpBuf );
	dp2= dp;
	for ( i=0; i<termSize; i++, sp++ ){
		d = *(unsigned char *)(sp);
		len = (int)(dp - dp2);			// 現在の処理済文字数
		switch ( d ){
			// 改行記号(1bute目)の時
			case 0x0d:
				// 頁先頭の時は改行は無視しないとタイトルが読めない(^^;)
				if ( len > 0 ){
					*(unsigned char *)(dp) = 0x1f;
					dp++;
				}
				break;
			// 改行記号(2bute目)の時
			case 0x0a:
				break;
			// TAB記号の時
			case 0x09:
				// 頁先頭のTABは無視しないとタイトルが読めない(^^;)
				if ( len > 0 ){
					*(unsigned char *)(dp)= 0;
					strcat( tmpBuf, "    " );
					dp = (char *)tmpBuf + strlen( tmpBuf );
				}
				break;
			// 特殊文字の時
			case 0x1a:
				break;
			// 改頁記号の時
			case 0x0c:
				// 頁先頭の時は改頁は無視しないと無駄(^^;)
				if ( len > 0 ){
					// 行を変える
					*(unsigned char *)(dp)= 0;
					strcat( tmpBuf, str_Dt );
					strcat( tmpBuf, str_crlf );
					strcat( tmpBuf, str_Dh );
					dp = (char *)tmpBuf + strlen( tmpBuf );
					dp2= dp;
				}
				break;
			// `"'の時
			case 0x22:
				*(unsigned char *)(dp)= 0xde;	// `ﾞ'
				dp++;
				break;
			// `,'の時
			case 0x2c:
				*(unsigned char *)(dp)= 0x2e;	// `.'
				dp++;
				break;
			// 通常の文字の場合
			default:
				*(unsigned char *)(dp)= d;
				dp++;
				break;
		}
		// 現在の総文字数をチェック
		rem = sp - (char *)termBuf;		// 残り文字数
		len = (int)(dp - dp2);			// 現在の処理済文字数
		if ( (dsize > 0) && ((len + rem) > dsize) ){
			len = (int)(dp - dp2);
			if ( d==0x0d || d==0x0a ){
				cnt = 160;
			} else {
				cnt = 80;
				// 漢字1byte目だったら優先(泣き別れ防止)
				if (((d)>0x080 && (d)<0x0A0)||((d)>0xDF && (d)<0x0FD)){
					cnt--;
				}
			}
			if ( (len + cnt) > dsize ){
				// 行を変える
				*(unsigned char *)(dp)= 0;
				strcat( tmpBuf, str_Dt );
				strcat( tmpBuf, str_crlf );
				strcat( tmpBuf, str_Dh );
				dp = (char *)tmpBuf + strlen( tmpBuf );
				dp2= dp;
			}
		}
	}
	*(unsigned char *)(dp) = 0;
	
	strcat( tmpBuf, str_Dt );
	strcat( tmpBuf, str_quote );
	
	// 古いバッファをpurge
	TL_freeMemory(termBuf, termBufSize);
	
	termBufSize = tsize;
	termSize = strlen(tmpBuf);
	termBuf = tmpBuf;
	#ifdef DEBUG
	printf("WL_convText2CSV(): %x  %d\n", termBuf, termSize);
	#endif

	#ifdef DEBUG
	FILE	*fp;
	if ( (fp=EIN_fopen("g:text2csv.$$$","wb")) != (FILE *)NULL ){
		fwrite( termBuf, termSize, 1, fp );
	}
	fclose( fp );
	#endif

	return NOERR;
}

// "MEM1" フィールドの位置を取得
// (※データエリア末尾には必ず`0x1a'を入れておくこと)
int		WL_countCsvField( char *sp )
{
	int		flag, mcnt;

	// "MEM1" フィールドの位置を取得
	for ( flag=0, mcnt=0; flag==0; sp++ ){
		switch ( *(unsigned char *)(sp) ){
			// `,'の時
			case 0x2c:
				// まずカウントアップ
				mcnt++;
//				printf("+");
				// `,"MEM1"'か? (※もうちょっとエレガントに書きたいものだ)
				if ( *(unsigned char *)(sp +1) == 0x22  ){	// `"'
					if ( *(unsigned char *)(sp +2) == 'M' ){
						if ( *(unsigned char *)(sp +3) == 'E' ){
							if ( *(unsigned char *)(sp +4) == 'M' ){
								if ( *(unsigned char *)(sp +5) == '1' ){
									if ( *(unsigned char *)(sp +6) == 0x22 ){
										flag++;
									}
								}
							}
						}
					}
				}
				break;
			// 0x1aの時
			case 0x1a:
				mcnt=-1;
				flag++;
				break;
			// 通常の文字の場合
			default:
				break;
		}
	}
	return mcnt;
}

// (※データエリア末尾には必ず`0x1a'を入れておくこと)
char	*WL_searchCsvField( char *sp, int mcnt )
{
	int		flag, cnt;

nextline:
	// まず `\n"M"' を探す
	for ( flag=0; flag==0; sp++ ){
		switch ( *(unsigned char *)(sp) ){
			// `\n'の時
			case 0x0a:
				// `\n"M"'か? (※もうちょっとエレガントに書きたいものだ)
				if ( *(unsigned char *)(sp +1) == 0x22  ){	// `"'
					if ( *(unsigned char *)(sp +2) == 'D' ){
						if ( *(unsigned char *)(sp +3) == 0x22 ){
							flag=1;
						}
					}
				}
				break;
			// 0x1aの時
			case 0x1a:
				flag=-1;
				break;
			// 通常の文字の場合
			default:
				break;
		}
	}
	// バッファ末まで来てしまった
	if ( flag < 0 ){
		return NULL;
	}
	// "MEM1" フィールドの位置まで飛ばす
	for ( flag=0, cnt=0; flag==0; sp++ ){
		switch ( *(unsigned char *)(sp) ){
			// `,'の時
			case 0x2c:
				// まずカウントアップ
				cnt++;
				if ( cnt == mcnt ){
					flag = 1;
				}
				break;
			// \nの時
			case 0x0a:
				goto nextline;
			// 0x1aの時
			case 0x1a:
				flag=-1;
				break;
			// 通常の文字の場合
			default:
				break;
		}
	}
	// バッファ末まで来てしまった
	if ( flag < 0 ){
		return NULL;
	}
	return sp;
}

// 元バッファの無地メモ形式からプレーンテキストへ変換
int		WL_convCsv2Text()
{
	char	*tmpBuf, *sp, *dp, *sp2;
	int		mcnt, flag, flag2, d, d2, tsize, page;

	// お約束のErrorTrap
	if ( (termBuf==NULL) || (termSize<1) ){
		return ERROR;
	}
	// CSVでなかったらERROR (バッファ先頭から `"i",' の文字列と照合)
	if ( termBuf[0]!='"' || (termBuf[1]!='i' && termBuf[1]!='I') ||
		 termBuf[2]!='"' || termBuf[3]!=',' ){
		return ERROR;
	}
	sp = (char *)termBuf;
	// まず "MEM1" フィールドの位置を取得
	mcnt = WL_countCsvField( sp );
	#ifdef DEBUG
	printf("WL_countCsvField( %x ) = %d\n", sp, mcnt);
	#endif

	// `,"MEM1"'フィールドが無かったので何もせず終了
	if ( mcnt < 0 ){
		return ERROR;
	}
	// とりあえず2倍の容量のワークバッファを取っておく
	tsize = ( ((termSize * 2) / 1024)+1) * 1024;
	if ( (tmpBuf=TL_mallocMemory(GV_apliLot, tsize)) == NULL ){
		#ifdef DEBUG
		printf("WL_convText2Buf(%s): Can't malloc!\n", tsize);
		#endif
		return ERROR;
	}
	dp = (char *)tmpBuf;

	for ( page=0,flag=0; flag==0; ){
		sp2 = WL_searchCsvField( sp, mcnt );
		#ifdef DEBUG
		printf("WL_searchCsvField( %x, %d ) = %x\n", sp, mcnt, sp2);
		#endif
		// フィールドが有ったなら
		if ( sp2 != NULL ){
			sp = sp2;
			// ちゃんと `"'で始まっているなら
			if ( *(unsigned char *)(sp) == 0x22 ){
				sp++;
				// 二行目からは改頁を入れる
				if ( page>0 ){
					*(unsigned char *)(dp++) = 0x0c;
				}
				page++;
				// フィールド末までワークバッファに転送
				for ( flag2=0; flag2==0; sp++ ){
					d = *(unsigned char *)(sp);
					switch ( d ){
						// 改行記号の時
						case 0x1f:
							*(unsigned char *)(dp++) = 0x0d;
							*(unsigned char *)(dp++) = 0x0a;
							break;
						// 2byte半角英数字の時(EB9F〜EBFC)
						case 0x0eb:
							d2 = *(unsigned char *)(++sp);
							if ( d2==0x9f ){						// `>'
								*(unsigned char *)(dp++)= '>';
							} else if ( d2==0xa0 ){					// `<'
								*(unsigned char *)(dp++)= '<';
							} else if ( d2>=0x0ae && d2<=0x0b7 ){	// `0'〜`9'
								*(unsigned char *)(dp++)= d2 - 0x0ae + '0';
							} else if ( d2>=0x0b8 && d2<=0x0be ){	// `10'〜`16'
								*(unsigned char *)(dp++)= '1';
								*(unsigned char *)(dp++)= d2 - 0x0b8 + '0';
							} else if ( d2>=0x0bf && d2<=0x0d8 ){	// `A'〜`Z'
								*(unsigned char *)(dp++)= d2 - 0x0bf + 'A';
							} else if ( d2>=0x0df && d2<=0x0f8 ){	// `a'〜`z'
								*(unsigned char *)(dp++)= d2 - 0x0df + 'a';
							} else if ( d2==0xd9 ){					// `※'
								*(unsigned char *)(dp++)= 0x81;
								*(unsigned char *)(dp++)= 0x0a6;
							} else if ( d2>=0x0da && d2<=0x0dd ){	// `ヽヾゝ〃'
								*(unsigned char *)(dp++)= 0x81;
								*(unsigned char *)(dp++)= d2 - (0x0da - 0x52);
							} else if ( d2==0x0f9 ){				// `〒'
								*(unsigned char *)(dp++)= 0x81;
								*(unsigned char *)(dp++)= 0x0a7;
							} else if ( d2>=0x0fa && d2<=0x0fc ){	// `仝々〆'
								*(unsigned char *)(dp++)= 0x81;
								*(unsigned char *)(dp++)= d2 - (0x0fa - 0x56);
							} else {								// その他
								*(unsigned char *)(dp++)= d;
								*(unsigned char *)(dp++)= d2;
							}
							break;
						// 2byte半角かな文字の時(EC40〜ECF5)
						case 0x0ec:
							d2 = *(unsigned char *)(++sp);
							if ( d2>=0x40 && d2<=0x7e ){			// `ぁ'〜`み'
								*(unsigned char *)(dp++)= 0x82;
								*(unsigned char *)(dp++)= d2 + (0x9f - 0x40);
							} else if ( d2>=0x80 && d2<=0x93 ){		// `む'〜`ん'
								*(unsigned char *)(dp++)= 0x82;
								*(unsigned char *)(dp++)= d2 + (0x0de - 0x80);
							} else if ( d2>=0x9f && d2<=0x0dd ){	// `ァ'〜`ミ'
								*(unsigned char *)(dp++)= 0x83;
								*(unsigned char *)(dp++)= d2 - (0x09f - 0x40);
							} else if ( d2>=0x0de && d2<=0x0f4 ){	// `ム'〜`ヶ'
								*(unsigned char *)(dp++)= 0x83;
								*(unsigned char *)(dp++)= d2 - (0x0de - 0x80);
							} else if ( d2==0x0f5 ){				// `ー'
								*(unsigned char *)(dp++)= 0x81;
								*(unsigned char *)(dp++)= 0x5b;
							} else {								// その他
								*(unsigned char *)(dp++)= d;
								*(unsigned char *)(dp++)= d2;
							}
							break;

						// `"'の時
						case 0x22:
							d = *(unsigned char *)(sp +1);
							// `,'か`\n' か 0x1a なら終了
							if ( d==0x2c || d==0x0d || d==0x1a ){
								flag2=1;
								if ( d==0x1a ){
									flag=1;
								}
							} else {
								*(unsigned char *)(dp)= d;
								dp++;
							}
							break;
						// 通常の文字の場合
						default:
							*(unsigned char *)(dp++)= d;
							// 漢字の先頭バイトだったら次の文字も
							if (((d)>0x080 && (d)<0x0A0)||((d)>0xDF && (d)<0x0FD)){
								d2 = *(unsigned char *)(sp+1);
								if ( d2!=0 && d2!=0x22 ){
									*(unsigned char *)(dp++)= d2;
									sp++;
								}
							}
							break;
					}
				}
				*(unsigned char *)(dp) = 0;
			}
		} else {
			// バッファ末なので終了
			flag = 1;
		}
	}
	// (strlenで文字数を計る為)
	*(unsigned char *)(dp) = 0;
	
	// 古いバッファをpurge
	TL_freeMemory(termBuf, termBufSize);
	
	termBufSize = tsize;
	termSize = strlen(tmpBuf);
	termBuf = tmpBuf;
	#ifdef DEBUG
	printf("WL_convCsv2Text(): %x  %d\n", termBuf, termSize);
	#endif

	#ifdef DEBUG
	FILE	*fp;
	if ( (fp=EIN_fopen("g:csv2text.$$$","wb")) != (FILE *)NULL ){
		fwrite( termBuf, termSize, 1, fp );
	}
	fclose( fp );
	#endif

	return NOERR;
}
