/*	
 *	search.h
 *
 *	POSIX標準のリニアサーチ関数
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2014 Naoyuki Sawa
 *
 *	* Mon Jan 13 19:05:18 JST 2014 Naoyuki Sawa
 *	- lfind()とlsearch()の宣言を、clippce.h⇒include/search.hへ分離しました。
 *	- lfind()とlsearch()の実装を、clippce.c⇒clipsrch.cへ分離しました。
 *	* Fri Feb 14 21:17:26 JST 2014 Naoyuki Sawa
 *	- hcreate(),hsearch(),hdestroy(),hcreate_r(),hsearch_r(),hdestroy_r()を追加しました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef _SEARCH_H
#define _SEARCH_H

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

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

void* lfind(const void* key, const void* base, size_t* num, size_t width, int (*compare)(const void* elem1, const void* elem2));
void* lsearch(const void* key, void* base, size_t* num, size_t width, int (*compare)(const void* elem1, const void* elem2));

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

/* POSIX.1-2001 */
typedef enum { FIND, ENTER } ACTION;
typedef struct entry {
	char* key;
	void* data;
} ENTRY;
int hcreate(size_t nel);
ENTRY* hsearch(ENTRY item, ACTION action);
void hdestroy();

/* GNU extensions */
struct hsearch_data {
	struct hsearch_internal_data* internal;
};
int hcreate_r(size_t nel, struct hsearch_data* htab);
int hsearch_r(ENTRY item, ACTION action, ENTRY** retval, struct hsearch_data* htab);
void hdestroy_r(struct hsearch_data* htab);

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif/*_SEARCH_H*/
