summaryrefslogtreecommitdiffstats
path: root/private/crt32/misc/lfind.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/misc/lfind.c')
-rw-r--r--private/crt32/misc/lfind.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/private/crt32/misc/lfind.c b/private/crt32/misc/lfind.c
new file mode 100644
index 000000000..7b7443cbd
--- /dev/null
+++ b/private/crt32/misc/lfind.c
@@ -0,0 +1,79 @@
+/***
+*lfind.c - do a linear search
+*
+* Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* defines _lfind() - do a linear search of an array.
+*
+*Revision History:
+* 06-19-85 TC initial version
+* 02-05-87 BM changed <= to < in while condition to fix bug
+* of looking one element too far
+* 12-11-87 JCR Added "_LOAD_DS" to declaration
+* 01-21-88 JCR Backed out _LOAD_DS...
+* 10-30-89 JCR Added _cdecl to prototypes
+* 03-14-90 GJF Replaced _cdecl with _CALLTYPE1, added #include
+* <cruntime.h>, removed #include <register.h> and
+* fixed the copyright. Also, cleaned up the formatting
+* a bit.
+* 04-05-90 GJF Added #include <search.h> and fixed the resulting
+* compilation errors and warnings. Also, removed an
+* unreferenced local variable.
+* 07-25-90 SBM Replaced <stdio.h> by <stddef.h>
+* 10-04-90 GJF New-style function declarator.
+* 01-17-91 GJF ANSI naming.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <search.h>
+#include <stddef.h>
+
+/***
+*char *_lfind(key, base, num, width, compare) - do a linear search
+*
+*Purpose:
+* Performs a linear search on the array, looking for the value key
+* in an array of num elements of width bytes in size. Returns
+* a pointer to the array value if found, NULL if not found.
+*
+*Entry:
+* char *key - key to search for
+* char *base - base of array to search
+* unsigned *num - number of elements in array
+* int width - number of bytes in each array element
+* int (*compare)() - pointer to function that compares two
+* array values, returning 0 if they are equal and non-0
+* if they are different. Two pointers to array elements
+* are passed to this function.
+*
+*Exit:
+* if key found:
+* returns pointer to array element
+* if key not found:
+* returns NULL
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+void * _CALLTYPE1 _lfind (
+ REG2 const void *key,
+ REG1 const void *base,
+ REG3 unsigned int *num,
+ unsigned int width,
+ int (_CALLTYPE1 *compare)(const void *, const void *)
+ )
+{
+ unsigned int place = 0;
+ while (place < *num )
+ if (!(*compare)(key,base))
+ return( (void *)base );
+ else
+ {
+ base = (char *)base + width;
+ place++;
+ }
+ return( NULL );
+}