usr/src/lib/libc/port/gen/memmem.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 13105 48f2dbca79a2
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o 478 Build needs fixing for pkgdepend flag day Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13105
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     1
/*
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     2
 * CDDL HEADER START
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     3
 *
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     7
 *
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    11
 * and limitations under the License.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    12
 *
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    18
 *
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    19
 * CDDL HEADER END
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    20
 */
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    21
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    22
/*
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    23
 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    24
 */
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    25
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    26
/*
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    27
 * Copyright (c) 2005 Pascal Gloor <[email protected]>
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    28
 *
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    29
 * Redistribution and use in source and binary forms, with or without
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    30
 * modification, are permitted provided that the following conditions
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    31
 * are met:
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    32
 * 1. Redistributions of source code must retain the above copyright
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    33
 *    notice, this list of conditions and the following disclaimer.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    34
 * 2. Redistributions in binary form must reproduce the above copyright
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    35
 *    notice, this list of conditions and the following disclaimer in the
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    36
 *    documentation and/or other materials provided with the distribution.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    37
 * 3. The name of the author may not be used to endorse or promote
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    38
 *    products derived from this software without specific prior written
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    39
 *    permission.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    40
 *
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    41
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    42
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    43
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    44
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    45
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    46
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    47
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    49
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    50
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    51
 * SUCH DAMAGE.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    52
 */
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    53
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    54
#include <string.h>
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    55
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    56
/*
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    57
 * Find the first occurrence of the byte string s in byte string l.
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    58
 */
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    59
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    60
void *
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    61
memmem(const void *l, size_t l_len, const void *s, size_t s_len)
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    62
{
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    63
	char *cur, *last;
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    64
	const char *cl = (const char *)l;
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    65
	const char *cs = (const char *)s;
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    66
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    67
	/* we need something to compare */
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    68
	if (l_len == 0 || s_len == 0)
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    69
		return (NULL);
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    70
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    71
	/* "s" must be smaller or equal to "l" */
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    72
	if (l_len < s_len)
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    73
		return (NULL);
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    74
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    75
	/* special case where s_len == 1 */
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    76
	if (s_len == 1)
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    77
		return (memchr(l, (int)*cs, l_len));
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    78
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    79
	/* the last position where its possible to find "s" in "l" */
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    80
	last = (char *)cl + l_len - s_len;
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    81
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    82
	for (cur = (char *)cl; cur <= last; cur++)
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    83
		if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    84
			return (cur);
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    85
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    86
	return (NULL);
48f2dbca79a2 PSARC 2010/299 GNU/Linux/BSD compatibility functions
Roger A. Faulkner <Roger.Faulkner@Oracle.COM>
parents:
diff changeset
    87
}