tholm@uvicctr.UUCP (Terrence W. Holm) (09/14/88)
EFTH MINIX report #44 - September 1988 - lsearch(3) & lfind(3) There follows an implementation of lsearch(3) and lfind(3) for MINIX. Please consider this public domain software. A "man" page is included. ---------------------------------------------------------- echo x - lsearch.3 gres '^X' '' > lsearch.3 << '/' XSUBROUTINES X lsearch(3) - linear search X XINVOCATION X char *lsearch( key, base, count, width, keycmp ) X char *key; X char *base; X unsigned int *count; X unsigned int width; X int (*keycmp)(); X X char *lfind( key, base, count, width, keycmp ) X char *key; X char *base; X unsigned int *count; X unsigned int width; X int (*keycmp)(); X XEXPLANATION X Lsearch(3) and lfind(3) scan through a list of items until X one matches <key>. The list starts at <base> and contains X *<count> entries of size <width>. The entries are compared X using keycmp(key,entry); this routine should return 0 for X matching items, non-zero otherwise. X X If the item is not found then lsearch(3) adds it to the end X of the list, and *<count> is updated. Lfind(3) does not append X items if they are not found. X XRESULTS X NULL : Not found, lfind(3) only. X o/w : Pointer to matching entry. X XREFERENCES X bsearch(3), tsearch(3) / echo x - lsearch.c gres '^X' '' > lsearch.c << '/' X/* lsearch(3) and lfind(3) X * X * Author: Terrence W. Holm Sep. 1988 X */ X X#define NULL (char *) 0 X X Xchar *lsearch( key, base, count, width, keycmp ) X char *key; X char *base; X unsigned *count; X unsigned width; X int (*keycmp)(); X X { X char *entry; X char *last = base + *count * width; X X for ( entry = base; entry < last; entry += width ) X if ( keycmp( key, entry ) == 0 ) X return( entry ); X X bcopy( key, last, width ); X *count += 1; X return( last ); X } X X X Xchar *lfind( key, base, count, width, keycmp ) X char *key; X char *base; X unsigned *count; X unsigned width; X int (*keycmp)(); X X { X char *entry; X char *last = base + *count * width; X X for ( entry = base; entry < last; entry += width ) X if ( keycmp( key, entry ) == 0 ) X return( entry ); X X return( NULL ); X } / ---------------------------------------------------------- Edwin L. Froese uw-beaver!ubc-cs!mprg!handel!froese Terrence W. Holm uw-beaver!uvicctr!tholm