00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00028 #include "dbprim.h"
00029 #include "dbprim_int.h"
00030
00031 RCSTAG("@(#)$Id: sh_find.c,v 1.3 2006/07/13 19:16:24 klmitch Exp $");
00032
00041 struct _sh_find_s {
00042 smat_comp_t sf_comp;
00043 db_key_t *sf_key;
00044 };
00045
00060 static unsigned long
00061 _sh_find_comp(db_key_t *key, void *data)
00062 {
00063 struct _sh_find_s *sf;
00064
00065 sf = dk_key(key);
00066
00067
00068 return (*sf->sf_comp)(sf->sf_key, data);
00069 }
00070
00071 unsigned long
00072 sh_find(smat_head_t *head, smat_entry_t **elem_p, smat_comp_t comp_func,
00073 smat_entry_t *start, db_key_t *key)
00074 {
00075 unsigned long retval;
00076 link_elem_t *elem;
00077 struct _sh_find_s sf;
00078 db_key_t fkey;
00079
00080 initialize_dbpr_error_table();
00081
00082
00083 if (!sh_verify(head) || !elem_p || !comp_func || !key ||
00084 (start && !se_verify(start)))
00085 return DB_ERR_BADARGS;
00086
00087
00088 sf.sf_comp = comp_func;
00089 sf.sf_key = key;
00090 dk_key(&fkey) = &sf;
00091
00092
00093 if ((retval = ll_find(&head->sh_head, &elem, _sh_find_comp,
00094 start ? &start->se_link[head->sh_elem] : 0, &fkey)))
00095 return retval;
00096
00097 *elem_p = le_object(elem);
00098
00099 return 0;
00100 }