1*4b6da826SThomas Huth /* 2*4b6da826SThomas Huth * libc string functions 3*4b6da826SThomas Huth * 4*4b6da826SThomas Huth * This code is free software; you can redistribute it and/or modify it 5*4b6da826SThomas Huth * under the terms of the GNU Library General Public License version 2. 6*4b6da826SThomas Huth */ 7*4b6da826SThomas Huth 87d36db35SAvi Kivity #include "libcflat.h" 97d36db35SAvi Kivity 107d36db35SAvi Kivity unsigned long strlen(const char *buf) 117d36db35SAvi Kivity { 127d36db35SAvi Kivity unsigned long len = 0; 137d36db35SAvi Kivity 147d36db35SAvi Kivity while (*buf++) 157d36db35SAvi Kivity ++len; 167d36db35SAvi Kivity return len; 177d36db35SAvi Kivity } 187d36db35SAvi Kivity 197d36db35SAvi Kivity char *strcat(char *dest, const char *src) 207d36db35SAvi Kivity { 217d36db35SAvi Kivity char *p = dest; 227d36db35SAvi Kivity 237d36db35SAvi Kivity while (*p) 247d36db35SAvi Kivity ++p; 257d36db35SAvi Kivity while ((*p++ = *src++) != 0) 267d36db35SAvi Kivity ; 277d36db35SAvi Kivity return dest; 287d36db35SAvi Kivity } 297d36db35SAvi Kivity 30782ebe33SAndrew Jones char *strcpy(char *dest, const char *src) 31782ebe33SAndrew Jones { 32782ebe33SAndrew Jones *dest = 0; 33782ebe33SAndrew Jones return strcat(dest, src); 34782ebe33SAndrew Jones } 35782ebe33SAndrew Jones 364fd53297SRadim Krčmář int strncmp(const char *a, const char *b, size_t n) 374fd53297SRadim Krčmář { 384fd53297SRadim Krčmář for (; n--; ++a, ++b) 394fd53297SRadim Krčmář if (*a != *b || *a == '\0') 404fd53297SRadim Krčmář return *a - *b; 414fd53297SRadim Krčmář 424fd53297SRadim Krčmář return 0; 434fd53297SRadim Krčmář } 444fd53297SRadim Krčmář 4569da6c87SAvi Kivity int strcmp(const char *a, const char *b) 4669da6c87SAvi Kivity { 474fd53297SRadim Krčmář return strncmp(a, b, SIZE_MAX); 4869da6c87SAvi Kivity } 4969da6c87SAvi Kivity 50782ebe33SAndrew Jones char *strchr(const char *s, int c) 51782ebe33SAndrew Jones { 52782ebe33SAndrew Jones while (*s != (char)c) 53782ebe33SAndrew Jones if (*s++ == '\0') 54782ebe33SAndrew Jones return NULL; 55782ebe33SAndrew Jones return (char *)s; 56782ebe33SAndrew Jones } 57782ebe33SAndrew Jones 5853da5cc0SAndrew Jones char *strstr(const char *s1, const char *s2) 5953da5cc0SAndrew Jones { 6053da5cc0SAndrew Jones size_t l1, l2; 6153da5cc0SAndrew Jones 6253da5cc0SAndrew Jones l2 = strlen(s2); 6353da5cc0SAndrew Jones if (!l2) 6453da5cc0SAndrew Jones return (char *)s1; 6553da5cc0SAndrew Jones l1 = strlen(s1); 6653da5cc0SAndrew Jones while (l1 >= l2) { 6753da5cc0SAndrew Jones l1--; 6853da5cc0SAndrew Jones if (!memcmp(s1, s2, l2)) 6953da5cc0SAndrew Jones return (char *)s1; 7053da5cc0SAndrew Jones s1++; 7153da5cc0SAndrew Jones } 7253da5cc0SAndrew Jones return NULL; 7353da5cc0SAndrew Jones } 7453da5cc0SAndrew Jones 757d36db35SAvi Kivity void *memset(void *s, int c, size_t n) 767d36db35SAvi Kivity { 777d36db35SAvi Kivity size_t i; 787d36db35SAvi Kivity char *a = s; 797d36db35SAvi Kivity 807d36db35SAvi Kivity for (i = 0; i < n; ++i) 817d36db35SAvi Kivity a[i] = c; 827d36db35SAvi Kivity 837d36db35SAvi Kivity return s; 847d36db35SAvi Kivity } 851b708e8cSJason Wang 868d68030eSArthur Chunqi Li void *memcpy(void *dest, const void *src, size_t n) 878d68030eSArthur Chunqi Li { 888d68030eSArthur Chunqi Li size_t i; 898d68030eSArthur Chunqi Li char *a = dest; 908d68030eSArthur Chunqi Li const char *b = src; 918d68030eSArthur Chunqi Li 928d68030eSArthur Chunqi Li for (i = 0; i < n; ++i) 938d68030eSArthur Chunqi Li a[i] = b[i]; 948d68030eSArthur Chunqi Li 958d68030eSArthur Chunqi Li return dest; 968d68030eSArthur Chunqi Li } 978d68030eSArthur Chunqi Li 98782ebe33SAndrew Jones int memcmp(const void *s1, const void *s2, size_t n) 99782ebe33SAndrew Jones { 100782ebe33SAndrew Jones const unsigned char *a = s1, *b = s2; 101782ebe33SAndrew Jones int ret = 0; 102782ebe33SAndrew Jones 103782ebe33SAndrew Jones while (n--) { 104782ebe33SAndrew Jones ret = *a - *b; 105782ebe33SAndrew Jones if (ret) 106782ebe33SAndrew Jones break; 107782ebe33SAndrew Jones ++a, ++b; 108782ebe33SAndrew Jones } 109782ebe33SAndrew Jones return ret; 110782ebe33SAndrew Jones } 111782ebe33SAndrew Jones 112782ebe33SAndrew Jones void *memmove(void *dest, const void *src, size_t n) 113782ebe33SAndrew Jones { 114782ebe33SAndrew Jones const unsigned char *s = src; 115782ebe33SAndrew Jones unsigned char *d = dest; 116782ebe33SAndrew Jones 117782ebe33SAndrew Jones if (d <= s) { 118782ebe33SAndrew Jones while (n--) 119782ebe33SAndrew Jones *d++ = *s++; 120782ebe33SAndrew Jones } else { 121782ebe33SAndrew Jones d += n, s += n; 122782ebe33SAndrew Jones while (n--) 123782ebe33SAndrew Jones *--d = *--s; 124782ebe33SAndrew Jones } 125782ebe33SAndrew Jones return dest; 126782ebe33SAndrew Jones } 127782ebe33SAndrew Jones 128782ebe33SAndrew Jones void *memchr(const void *s, int c, size_t n) 129782ebe33SAndrew Jones { 130782ebe33SAndrew Jones const unsigned char *str = s, chr = (unsigned char)c; 131782ebe33SAndrew Jones 132782ebe33SAndrew Jones while (n--) 133782ebe33SAndrew Jones if (*str++ == chr) 134782ebe33SAndrew Jones return (void *)(str - 1); 135782ebe33SAndrew Jones return NULL; 136782ebe33SAndrew Jones } 137782ebe33SAndrew Jones 1381b708e8cSJason Wang long atol(const char *ptr) 1391b708e8cSJason Wang { 1401b708e8cSJason Wang long acc = 0; 1411b708e8cSJason Wang const char *s = ptr; 1421b708e8cSJason Wang int neg, c; 1431b708e8cSJason Wang 1441b708e8cSJason Wang while (*s == ' ' || *s == '\t') 1451b708e8cSJason Wang s++; 1461b708e8cSJason Wang if (*s == '-'){ 1471b708e8cSJason Wang neg = 1; 1481b708e8cSJason Wang s++; 1491b708e8cSJason Wang } else { 1501b708e8cSJason Wang neg = 0; 1511b708e8cSJason Wang if (*s == '+') 1521b708e8cSJason Wang s++; 1531b708e8cSJason Wang } 1541b708e8cSJason Wang 1551b708e8cSJason Wang while (*s) { 1561b708e8cSJason Wang if (*s < '0' || *s > '9') 1571b708e8cSJason Wang break; 1581b708e8cSJason Wang c = *s - '0'; 1591b708e8cSJason Wang acc = acc * 10 + c; 1601b708e8cSJason Wang s++; 1611b708e8cSJason Wang } 1621b708e8cSJason Wang 1631b708e8cSJason Wang if (neg) 1641b708e8cSJason Wang acc = -acc; 1651b708e8cSJason Wang 1661b708e8cSJason Wang return acc; 1671b708e8cSJason Wang } 16869205bf1SAndrew Jones 16969205bf1SAndrew Jones extern char **environ; 17069205bf1SAndrew Jones 17169205bf1SAndrew Jones char *getenv(const char *name) 17269205bf1SAndrew Jones { 17369205bf1SAndrew Jones char **envp = environ, *delim; 17469205bf1SAndrew Jones 17569205bf1SAndrew Jones while (*envp) { 17669205bf1SAndrew Jones delim = strchr(*envp, '='); 17769205bf1SAndrew Jones if (delim && strncmp(name, *envp, delim - *envp) == 0) 17869205bf1SAndrew Jones return delim + 1; 17969205bf1SAndrew Jones ++envp; 18069205bf1SAndrew Jones } 18169205bf1SAndrew Jones return NULL; 18269205bf1SAndrew Jones } 183