Index: ossp-pkg/xds/find-engine.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/find-engine.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/xds/Attic/find-engine.c,v' | diff -u /dev/null - -L'ossp-pkg/xds/find-engine.c' 2>/dev/null --- ossp-pkg/xds/find-engine.c +++ - 2024-05-18 08:44:22.396431140 +0200 @@ -0,0 +1,69 @@ +/* + XDS - OSSP Extensible Data Serialization Library + Copyright (c) 2001 The OSSP Project (http://www.ossp.org/) + Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/) + + This file is part of OSSP XDS, an extensible data serialization + library which can be found at http://www.ossp.com/pkg/xds/. + + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include +#include +#include "internal.h" + +int xds_find_engine(const engine_map_t* engines, size_t last, const char* name, size_t* pos) + { + size_t first; + + /* Sanity checks. */ + + assert(engines != NULL); + assert(name != NULL); + assert(pos != NULL); + if (engines == NULL || name == NULL || pos == NULL) + return XDS_ERR_INVALID_ARG; + + /* Use binary search to find "name" in "engines". */ + + for (first = 0; (last - first) > 0; ) + { + size_t half = first + ((last - first) / 2); + int rc = strcmp(engines[half].name, name); + + if (rc < 0) + { + first = half + 1; + } + else if(rc == 0) + { /* found it */ + *pos = half; + return (1 == 1); + } + else + { + last = half; + } + assert(first <= last); + } + + *pos = first; + return (1 != 1); + }