| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 | /* vi: set sw=4 ts=4: *//* Copyright (C) 1995,1996 Robert de Bath <rdebath@cix.compulink.co.uk> * This file is part of the Linux-8086 C library and is distributed * under the GNU Library General Public License. * * Many of the functions in this file have been rewritten for correctness * (but not necessarily speed) by Erik Andersen <andersee@debian.org> */#include <string.h>#include <malloc.h>/********************** Function strlen ************************************/#ifdef L_strlensize_t strlen(const char *str){	register char *ptr = (char *) str;	while (*ptr)		ptr++;	return (ptr - str);}#endif/********************** Function strnlen ************************************/#ifdef L_strnlensize_t strnlen (const char *string, size_t maxlen){	const char *end = memchr (string, '\0', maxlen);	return end ? end - string : maxlen;}#endif/********************** Function strcat ************************************/#ifdef L_strcatchar *strcat(char *dst, const char *src){	register char *ptr = dst; 	while (*ptr)    		ptr++;	while (*src)		*ptr++ = *src++;	*ptr = '\0';	return dst;}#endif/********************** Function strcpy ************************************/#ifdef L_strcpychar *strcpy(char *dst, const char *src){	register char *ptr = dst;	while (*src)		*dst++ = *src++;	*dst = '\0';	return ptr;}#endif/********************** Function stpcpy ************************************/#ifdef L_stpcpychar *stpcpy(char *dst, const char *src){	while (*src)		*dst++ = *src++;	*dst = '\0';	return dst;}#endif/********************** Function stpncpy ************************************/#ifdef L_stpncpychar *stpncpy(char *dst, const char *src, size_t len){	while (len--) {		if (*src)			*dst++ = *src++;		else			*dst++ = '\0';	}	return dst;}#endif/********************** Function strcmp ************************************/#ifdef L_strcmpint strcmp(const char *s1, const char *s2){	unsigned register char c1, c2;	do {		c1 = (unsigned char) *s1++;		c2 = (unsigned char) *s2++;		if (c1 == '\0')			return c1 - c2;	}	while (c1 == c2);	return c1 - c2;}#ifndef __UCLIBC_HAS_LOCALE__weak_alias(strcmp, strcoll);#endif /* __UCLIBC_HAS_LOCALE__ */#endif/***** Function strcoll (locale only, as non-locale is alias of strcmp *****/#ifdef L_strcoll#ifdef __UCLIBC_HAS_LOCALE__#include "../misc/locale/_locale.h"const unsigned char *_uc_collate_b;  /* NULL for no collate, strcoll->strcmp */int strcoll(const char *s1, const char *s2){	unsigned char c1, c2;	while(1) {		c1 = (unsigned char) *s1;		c2 = (unsigned char) *s2;		if(_uc_collate_b) {     /* setuped non-C locale? */			c1 = _uc_collate_b[c1];			c2 = _uc_collate_b[c2];		}		if (*s1 == '\0' || c1 != c2)			return c1 - c2;		s1++;		s2++;	}}#endif /* __UCLIBC_HAS_LOCALE__ */#endif/********************** Function strncat ************************************/#ifdef L_strncatchar *strncat(char *dst, const char *src, size_t len){	register char *s1 = dst + strlen(dst), *s2;	s2 = memchr(src, 0, len);	if (s2) {		memcpy(s1, src, s2 - src + 1);	} else {		memcpy(s1, src, len);		s1[len] = '\0';	}	return dst;}#endif/********************** Function strncpy ************************************/#ifdef L_strncpychar *strncpy(char *dst, const char *src, size_t len){	char *ptr = dst;	while (len--) {		if (*src)			*dst++ = *src++;		else			*dst++ = '\0';	}	return ptr;}#endif#ifdef L_strxfrmsize_t strxfrm(char *dst, const char *src, size_t len){	size_t length;	strncpy( dst, src, len);	length = strlen(src);	if (length<len)		return(length);	return( len);}#endif	/********************** Function strncmp ************************************/#ifdef L_strncmpint strncmp(const char *s1, const char *s2, size_t len){	unsigned register char c1 = '\0';	unsigned register char c2 = '\0';	while (len > 0) {		c1 = (unsigned char) *s1++;		c2 = (unsigned char) *s2++;		if (c1 == '\0' || c1 != c2)			return c1 - c2;		len--;	}	return c1 - c2;}#endif/********************** Function strchr ************************************/#ifdef L_strchrchar *strchr(const char *str, int c){	register char ch;	do {		if ((ch = *str) == c)			return (char *) str;		str++;	}	while (ch);	return 0;}weak_alias(strchr, index);#endif/********************** Function strrchr ************************************/#ifdef L_strrchrchar *strrchr(const char *str, int c){	register char *prev = 0;	register char *ptr = (char *) str;	while (*ptr != '\0') {		if (*ptr == c)			prev = ptr;		ptr++;	}	if (c == '\0')		return(ptr);	return(prev);}weak_alias(strrchr, rindex);#endif/********************** Function strdup ************************************/#ifdef L_strdupchar *strdup(const char *str){	register size_t len;	register char *dst;	len = strlen(str) + 1;	dst = (char *) malloc(len);	if (dst)		memcpy(dst, str, len);	return dst;}#endif/********************** Function strndup ************************************/#ifdef L_strndupchar *strndup(const char *str, size_t len){	register size_t n;	register char *dst;	n = strlen(str);	if (len < n)		n = len;	dst = (char *) malloc(n+1);	if (dst) {		memcpy(dst, str, n);		dst[n] = '\0';	}	return dst;}#endif/********************** Function memcpy ************************************/#ifdef L_memcpyvoid *memcpy(void *dst, const void *src, size_t len){	register char *a = dst;	register const char *b = src;	while (len--)		*a++ = *b++;	return dst;}#endif/********************** Function memccpy ************************************/#ifdef L_memccpyvoid *memccpy(void *dst, const void *src, int c, size_t len){	register char *a = dst;	register const char *b = src;	while (len--) {		if ((*a++ = *b++) == c)			return a;	}	return 0;}#endif/********************** Function memset ************************************/#ifdef L_memsetvoid *memset(void *str, int c, size_t len){	register char *a = str;	while (len--)		*a++ = c;	return str;}#endif/********************** Function memmove ************************************/#ifdef L_memmovevoid *memmove(void *dst, const void *src, size_t len){	register char *s1 = dst, *s2 = (char *) src;	/* This bit of sneakyness c/o Glibc, it assumes the test is unsigned */	if (s1 - s2 >= len)		return memcpy(dst, src, len);	/* This reverse copy only used if we absolutly have to */	s1 += len;	s2 += len;	while (len-- > 0)		*(--s1) = *(--s2);	return dst;}#endif/********************** Function memchr ************************************/#ifdef L_memchrvoid *memchr(const void *str, int c, size_t len){	register unsigned char *ptr = (unsigned char *) str;	while (len--) {		if (*ptr == (unsigned char) c)			return ptr;		ptr++;	}	return 0;}#endif/********************** Function memcmp ************************************/#ifdef L_memcmpint memcmp(const void *s1, const void *s2, size_t len){	unsigned char *c1 = (unsigned char *)s1;	unsigned char *c2 = (unsigned char *)s2;	while (len--) {		if (*c1 != *c2) 			return *c1 - *c2;		c1++;		c2++;	}	return 0;}#endif/********************** Function memcmp ************************************/#ifdef L_ffsint ffs(int x){	int r = 1;	if (!x)		return 0;	if (!(x & 0xffff)) {		x >>= 16;		r += 16;	}	if (!(x & 0xff)) {		x >>= 8;		r += 8;	}	if (!(x & 0xf)) {		x >>= 4;		r += 4;	}	if (!(x & 3)) {		x >>= 2;		r += 2;	}	if (!(x & 1)) {		x >>= 1;		r += 1;	}	return r;}#endif/********************** THE END ********************************************/
 |