/******************************************
 *   File search from wild card : findf   *
 *         Programmade by K,Ajima         *
 *     Copyright  ajiyamn sfot l.t.d.     *
 ******************************************/



#if 0
/*** fidf ****************************************************************

  ワイルドカードで与えられたファイルを検索し、そのリストを作成します。

**************************************************************************/
#endif



#include <stdio.h>
#include <dos.h>
#include <errno.h>
#include <malloc.h>
#include <memory.h>



typedef struct _fnd_file_list FND_FILE_LIST;

struct _fnd_file_list {			/* ファイルリスト */
	char attrib;					/* 属性 */
	unsigned int wr_time;			/* タイムスタンプ(時間) */
	unsigned int wr_date;			/* タイムスタンプ(日時) */
	long size;						/* サイズ */
	char name[13];					/* 名前 */
	FND_FILE_LIST * prev;			/* 前の FND_FILE_LIST */
	FND_FILE_LIST * next;			/* 次の FND_FILE_LIST */
};



/********************************************************************
 *	struct find_t > FND_FILE_LIST へデータのコピー
 *		1. FND_FILE_LIST のポインタ
 *		2. struct find_t のポインタ
 ********************************************************************/
void _fastcall infnd_cpy(
					FND_FILE_LIST * fnd_file_list,
					struct find_t * fnd_find_t)
{
	fnd_file_list->attrib	= fnd_find_t->attrib;
	fnd_file_list->wr_time	= fnd_find_t->wr_time;
	fnd_file_list->wr_date	= fnd_find_t->wr_date;
	fnd_file_list->size		= fnd_find_t->size;
	memcpy(fnd_file_list->name,fnd_find_t->name,13);
}



/********************************************************************
 *	FND_FILE_LIST の開放
 *		FND_FILE_LIST の先頭のポインタ
 ********************************************************************/
void _fastcall fnd_free_fnd_file_list(FND_FILE_LIST * root)
{
	FND_FILE_LIST * now,
				  * next;

	now=root;

	while(now != NULL) {
		next=now->next;
		free(now);
		now=next;
	}
}



/********************************************************************
 *	ファイル検索 (最大ファイル数 65535)
 *		1. ファイル名 (ワイルドカード)
 *		2. ファイル属性 (_dos_find_first() 参照)
 *		3. 見つかったファイル数を格納するポインタ
 *		ret: FND_FILE_LIST の先頭ポインタ
 *			 NULL エラー
 *		errno: 0    メモリが足りない
 *             else DOS エラー
 ********************************************************************/
FND_FILE_LIST * _cdecl fnd_get_file_list(
					char * fnd_file_name,
					char fnd_attrib,
					unsigned int * fnd_num)
{
	FND_FILE_LIST * root=NULL,						/* ファイルリストの先頭 */
				  * link,
				  * new;

	struct find_t stat;								/* 検索用ステータス */

	* fnd_num =0U;

													/* 最初の検索 */
	if(_dos_findfirst(fnd_file_name,fnd_attrib,& stat) ) {
		return(NULL);									/* 見つからない */
	}

													/* root 確保 */
	if((root=malloc(sizeof(FND_FILE_LIST)))==NULL) {
		errno=0;										/* メモリが足りない */
		return(NULL);
	}
	infnd_cpy(root,& stat);							/* コピー stat > root */
	root->prev=NULL;
	root->next=NULL;
	* fnd_num =1U;

	link=root;										/* link セット */

	for(;;) {
		if(_dos_findnext(& stat) ) {					/* 次の検索 */
			break;											/* 見つからない */
		}

														/* new 確保 */
		if((new=malloc(sizeof(FND_FILE_LIST)))==NULL) {
			fnd_free_fnd_file_list(root);					/* メモリが足りない */
			errno=0;
			return(NULL);
		}
		infnd_cpy(new,& stat);							/* コピー stat > dmm */

		link->next=new;									/* リンク構造設定 */
		new->prev=link;
		new->next=NULL;
		link=new;

		(* fnd_num)++;									/* 検索数 +1 */
	}

	return(root);
}

