176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Copyright (C) 1991, 1992  Linus Torvalds
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Copyright (C) 2004 Tobias Lorenz
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  string handling functions
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  based on linux/lib/string.c
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or modify
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * it under the terms of the GNU General Public License version 2 as
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * published by the Free Software Foundation.
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * stupid library routines.. The optimized versions should generally be found
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * as inline code in <asm-xx/string.h>
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * These are buggy as well..
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * -  Added strsep() which will replace strtok() soon (because strsep() is
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *    reentrant and should be faster). Use only strsep() in new code, please.
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * these are the standard string functions that are currently not used by
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * any code in etherboot. put into a separate file to avoid linking them in
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * with the rest of string.o
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * if anything ever does want to use a function of these, consider moving
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the function in question back into string.c
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h>
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h>
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <ctype.h>
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* *** FROM string.c *** */
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_STRNICMP
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * strnicmp - Case insensitive, length-limited string comparison
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @s1: One string
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @s2: The other string
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @len: the maximum number of characters to compare
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint strnicmp(const char *s1, const char *s2, size_t len)
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* Yes, Virginia, it had better be unsigned */
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	unsigned char c1, c2;
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	c1 = 0;	c2 = 0;
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (len) {
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		do {
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			c1 = *s1; c2 = *s2;
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			s1++; s2++;
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			if (!c1)
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				break;
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			if (!c2)
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				break;
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			if (c1 == c2)
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				continue;
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			c1 = tolower(c1);
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			c2 = tolower(c2);
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			if (c1 != c2)
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				break;
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		} while (--len);
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return (int)c1 - (int)c2;
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar * ___strtok;
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_STRNCAT
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * strncat - Append a length-limited, %NUL-terminated string to another
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @dest: The string to be appended to
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @src: The string to append to it
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @count: The maximum numbers of bytes to copy
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note that in contrast to strncpy, strncat ensures the result is
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * terminated.
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar * strncat(char *dest, const char *src, size_t count)
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char *tmp = dest;
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (count) {
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		while (*dest)
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			dest++;
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		while ((*dest++ = *src++)) {
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			if (--count == 0) {
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				*dest = '\0';
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				break;
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			}
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		}
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return tmp;
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_STRSPN
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * strspn - Calculate the length of the initial substring of @s which only
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 	contain letters in @accept
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @s: The string to be searched
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @accept: The string to search for
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansize_t strspn(const char *s, const char *accept)
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	const char *p;
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	const char *a;
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	size_t count = 0;
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	for (p = s; *p != '\0'; ++p) {
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		for (a = accept; *a != '\0'; ++a) {
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			if (*p == *a)
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				break;
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		}
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		if (*a == '\0')
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			return count;
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		++count;
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return count;
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_STRCSPN
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * strcspn - Calculate the length of the initial substring of @s which only
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 	contain letters not in @reject
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @s: The string to be searched
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @accept: The string to search for
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansize_t strcspn(const char *s, const char *reject)
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	const char *p;
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	const char *r;
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	size_t count = 0;
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	for (p = s; *p != '\0'; ++p) {
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		for (r = reject; *r != '\0'; ++r) {
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			if (*p == *r)
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				return count;
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		}
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		++count;
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return count;
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_STRPBRK
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * strpbrk - Find the first occurrence of a set of characters
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @cs: The string to be searched
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ct: The characters to search for
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar * strpbrk(const char * cs,const char * ct)
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	const char *sc1,*sc2;
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	for( sc1 = cs; *sc1 != '\0'; ++sc1) {
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		for( sc2 = ct; *sc2 != '\0'; ++sc2) {
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			if (*sc1 == *sc2)
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman				return (char *) sc1;
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		}
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return NULL;
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_STRTOK
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * strtok - Split a string into tokens
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @s: The string to be searched
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ct: The characters to search for
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * WARNING: strtok is deprecated, use strsep instead.
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar * strtok(char * s,const char * ct)
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char *sbegin, *send;
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	sbegin  = s ? s : ___strtok;
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (!sbegin) {
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return NULL;
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	sbegin += strspn(sbegin,ct);
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (*sbegin == '\0') {
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		___strtok = NULL;
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return( NULL );
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	send = strpbrk( sbegin, ct);
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (send && *send != '\0')
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		*send++ = '\0';
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	___strtok = send;
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return (sbegin);
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_STRSEP
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * strsep - Split a string into tokens
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @s: The string to be searched
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ct: The characters to search for
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * strsep() updates @s to point after the token, ready for the next call.
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * It returns empty tokens, too, behaving exactly like the libc function
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of that name. In fact, it was stolen from glibc2 and de-fancy-fied.
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Same semantics, slimmer shape. ;)
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar * strsep(char **s, const char *ct)
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	char *sbegin = *s, *end;
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (sbegin == NULL)
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return NULL;
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	end = strpbrk(sbegin, ct);
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (end)
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		*end++ = '\0';
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	*s = end;
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return sbegin;
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_BCOPY
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * bcopy - Copy one area of memory to another
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @src: Where to copy from
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @dest: Where to copy to
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @count: The size of the area.
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Note that this is the same as memcpy(), with the arguments reversed.
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * memcpy() is the standard, bcopy() is a legacy BSD function.
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * You should not use this function to access IO space, use memcpy_toio()
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * or memcpy_fromio() instead.
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar * bcopy(const char * src, char * dest, int count)
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return memmove(dest,src,count);
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __HAVE_ARCH_MEMSCAN
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * memscan - Find a character in an area of memory.
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @addr: The memory area
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @c: The byte to search for
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @size: The size of the area.
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * returns the address of the first occurrence of @c, or 1 byte past
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the area if @c is not found
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid * memscan(const void * addr, int c, size_t size)
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	unsigned char * p = (unsigned char *) addr;
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	while (size) {
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		if (*p == c)
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			return (void *) p;
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		p++;
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		size--;
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  	return (void *) p;
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
274