#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include "../include/pdictype.h"
#include "../include/data.h"
#include "../include/field.h"

///////////////////////////////////////////////////////////////////////////
//検索対象のみをマッチングして、一致したものを返す
GList *pdicDataRead(newdic3 *h, FILE *fp,guint16 dpos,GList *rlist,
								gchar *keyword)
{
	guint16 c,dsize,keywordlen=strlen(keyword);
	guint32 xpos;
	fpos_t pos;
	field_st field;
	char *data_top,*data_last, *data;
	gchar *direct=0;
	gchar *buf, *utfst;
	findword *fw;

	//ファイルの位置情報を計算
	xpos=0x100+                    //ヘッダサイズ
		h->extheader+                //拡張ヘッダサイズ
		h->index_block*h->block_size+//インデックスサイズ
		dpos*h->block_size;          //データ位置
	fseek(fp,xpos,SEEK_SET);

	//使用ブロック数を検出する。
	//検出した値にblock_size(default=256)を掛けた値がデータブロックの
	//サイズとなる。
	//データブロックを丸ごとメモリ上(data_top)に置く
	fgetpos(fp,&pos);
	c=fgetc(fp)+(fgetc(fp)<<8);
	fsetpos(fp,&pos);

	//フィールドのバイト情報をチェック
	//dsize=0...2バイト長
	//dsize=1...4バイト長
	dsize=(c&0x8000)?1:0;

	//データブロックを格納するメモリ領域を確保
	data_top=(char*)malloc(c*h->block_size);
	//データブロックの最後のポインタアドレスを保存
	data_last=data_top+c*h->block_size;

	//データブロックをメモリ(data_top)に読み込み
	fread(data_top,(c*h->block_size),1,fp);
	//処理用ポインタdataをセット
	data=data_top;
	//ブロック数スキップ
	data++;data++;

	while(1){
		//フィールドデータの取得
		data=(char*)pdicGetField(data,&field,dsize);

		//field.attributeの拡張構成フラグ(0x10のビット)が立っているとき、拡張情報が
		//存在する。現在は対応していない。なお、処理はここに記述する

		//
		//見出語圧縮を展開するための処理
		//
		if(direct){
			buf=direct;
			buf[field.exp]=0;
			//メモリ確保
			direct=g_strnfill(field.exp+strlen(field.chapter)+1,0);
			//文字を代入
			strcpy(direct,buf);
			strcat(direct,field.chapter);
			//前見出し語を解放
			buf[field.exp]=1;
			g_free(buf);
		}
		else{
			direct=g_strdup(field.chapter);
		}

		//見出し語のエンコード変換処理
		utfst=g_convert(
				direct,strlen(direct),
				"utf-8","shift_jis",NULL,NULL,NULL);

		//キーワードとマッチング処理を行なう
		if(!g_ascii_strncasecmp(keyword,utfst,keywordlen)){
			//検索一致情報構造体のメモリ確保
			fw=g_new(findword,1);
			fw->key=utfst;
		
			//訳語のエンコード変換処理
			utfst=g_convert(
					field.translation,strlen(field.translation),
					"utf-8","shift_jis",NULL,NULL,NULL);

			//訳語をセット
			fw->direct=utfst;

			//リストにセット
			rlist=g_list_append(rlist,fw);
		}
		//確保したフィールド情報を開放
		pdicClearField(&field);

		//データブロックの最後かどうかの末端チェック
		if(data_last<data+4)break;
		if(data[0]==0 && data[1] ==0 && data[2] == 0 && data[3]==0) break;
	}
	//文字列を解放
	if(direct){g_free(direct);}
	//データブロックを解放
	free(data_top);


	return g_list_first(rlist);
}

