brintos

brintos / linux-shallow public Read only

0
0
Text · 3.7 KiB · 168fe8e Raw
205 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Taken from:4 *  linux/lib/string.c5 *6 *  Copyright (C) 1991, 1992  Linus Torvalds7 */8 9#include <linux/ctype.h>10#include <linux/kernel.h>11#include <linux/types.h>12#include <linux/string.h>13 14#ifndef EFI_HAVE_STRLEN15/**16 * strlen - Find the length of a string17 * @s: The string to be sized18 */19size_t strlen(const char *s)20{21	const char *sc;22 23	for (sc = s; *sc != '\0'; ++sc)24		/* nothing */;25	return sc - s;26}27#endif28 29#ifndef EFI_HAVE_STRNLEN30/**31 * strnlen - Find the length of a length-limited string32 * @s: The string to be sized33 * @count: The maximum number of bytes to search34 */35size_t strnlen(const char *s, size_t count)36{37	const char *sc;38 39	for (sc = s; count-- && *sc != '\0'; ++sc)40		/* nothing */;41	return sc - s;42}43#endif44 45/**46 * strstr - Find the first substring in a %NUL terminated string47 * @s1: The string to be searched48 * @s2: The string to search for49 */50char *strstr(const char *s1, const char *s2)51{52	size_t l1, l2;53 54	l2 = strlen(s2);55	if (!l2)56		return (char *)s1;57	l1 = strlen(s1);58	while (l1 >= l2) {59		l1--;60		if (!memcmp(s1, s2, l2))61			return (char *)s1;62		s1++;63	}64	return NULL;65}66 67#ifndef EFI_HAVE_STRCMP68/**69 * strcmp - Compare two strings70 * @cs: One string71 * @ct: Another string72 */73int strcmp(const char *cs, const char *ct)74{75	unsigned char c1, c2;76 77	while (1) {78		c1 = *cs++;79		c2 = *ct++;80		if (c1 != c2)81			return c1 < c2 ? -1 : 1;82		if (!c1)83			break;84	}85	return 0;86}87#endif88 89/**90 * strncmp - Compare two length-limited strings91 * @cs: One string92 * @ct: Another string93 * @count: The maximum number of bytes to compare94 */95int strncmp(const char *cs, const char *ct, size_t count)96{97	unsigned char c1, c2;98 99	while (count) {100		c1 = *cs++;101		c2 = *ct++;102		if (c1 != c2)103			return c1 < c2 ? -1 : 1;104		if (!c1)105			break;106		count--;107	}108	return 0;109}110 111/* Works only for digits and letters, but small and fast */112#define TOLOWER(x) ((x) | 0x20)113 114static unsigned int simple_guess_base(const char *cp)115{116	if (cp[0] == '0') {117		if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))118			return 16;119		else120			return 8;121	} else {122		return 10;123	}124}125 126/**127 * simple_strtoull - convert a string to an unsigned long long128 * @cp: The start of the string129 * @endp: A pointer to the end of the parsed string will be placed here130 * @base: The number base to use131 */132 133unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)134{135	unsigned long long result = 0;136 137	if (!base)138		base = simple_guess_base(cp);139 140	if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')141		cp += 2;142 143	while (isxdigit(*cp)) {144		unsigned int value;145 146		value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;147		if (value >= base)148			break;149		result = result * base + value;150		cp++;151	}152	if (endp)153		*endp = (char *)cp;154 155	return result;156}157 158long simple_strtol(const char *cp, char **endp, unsigned int base)159{160	if (*cp == '-')161		return -simple_strtoull(cp + 1, endp, base);162 163	return simple_strtoull(cp, endp, base);164}165 166#ifdef CONFIG_EFI_PARAMS_FROM_FDT167#ifndef EFI_HAVE_STRRCHR168/**169 * strrchr - Find the last occurrence of a character in a string170 * @s: The string to be searched171 * @c: The character to search for172 */173char *strrchr(const char *s, int c)174{175	const char *last = NULL;176	do {177		if (*s == (char)c)178			last = s;179	} while (*s++);180	return (char *)last;181}182#endif183#ifndef EFI_HAVE_MEMCHR184/**185 * memchr - Find a character in an area of memory.186 * @s: The memory area187 * @c: The byte to search for188 * @n: The size of the area.189 *190 * returns the address of the first occurrence of @c, or %NULL191 * if @c is not found192 */193void *memchr(const void *s, int c, size_t n)194{195	const unsigned char *p = s;196	while (n-- != 0) {197		if ((unsigned char)c == *p++) {198			return (void *)(p - 1);199		}200	}201	return NULL;202}203#endif204#endif205