diff options
Diffstat (limited to 'cfe/cfe/lib/lib_string.c')
-rw-r--r-- | cfe/cfe/lib/lib_string.c | 386 |
1 files changed, 386 insertions, 0 deletions
diff --git a/cfe/cfe/lib/lib_string.c b/cfe/cfe/lib/lib_string.c new file mode 100644 index 0000000..08e9ee7 --- /dev/null +++ b/cfe/cfe/lib/lib_string.c @@ -0,0 +1,386 @@ +/* ********************************************************************* + * Broadcom Common Firmware Environment (CFE) + * + * String routines File: lib_string.c + * + * Some standard routines for messing with strings. + * + * Author: Mitch Lichtenberg (mpl@broadcom.com) + * + ********************************************************************* + * + * Copyright 2000,2001,2002,2003 + * Broadcom Corporation. All rights reserved. + * + * This software is furnished under license and may be used and + * copied only in accordance with the following terms and + * conditions. Subject to these conditions, you may download, + * copy, install, use, modify and distribute modified or unmodified + * copies of this software in source and/or binary form. No title + * or ownership is transferred hereby. + * + * 1) Any source code used, modified or distributed must reproduce + * and retain this copyright notice and list of conditions + * as they appear in the source file. + * + * 2) No right is granted to use any trade name, trademark, or + * logo of Broadcom Corporation. The "Broadcom Corporation" + * name may not be used to endorse or promote products derived + * from this software without the prior written permission of + * Broadcom Corporation. + * + * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT + * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN + * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + ********************************************************************* */ + + + + +#include "lib_types.h" +#define _LIB_NO_MACROS_ +#include "lib_string.h" + +char *lib_strcpy(char *dest,const char *src) +{ + char *ptr = dest; + + while (*src) *ptr++ = *src++; + *ptr = '\0'; + + return dest; +} + +char *lib_strncpy(char *dest,const char *src,size_t cnt) +{ + char *ptr = dest; + + while (*src && (cnt > 0)) { + *ptr++ = *src++; + cnt--; + } + if (cnt > 0) *ptr = '\0'; + + return dest; +} + + +size_t lib_xstrncpy(char *dest,const char *src,size_t cnt) +{ + char *ptr = dest; + size_t copied = 0; + + while (*src && (cnt > 1)) { + *ptr++ = *src++; + cnt--; + copied++; + } + *ptr = '\0'; + + return copied; +} + +size_t lib_strlen(const char *str) +{ + size_t cnt = 0; + + while (*str) { + str++; + cnt++; + } + + return cnt; +} + + +int lib_strcmp(const char *dest,const char *src) +{ + while (*src && *dest) { + if (*dest < *src) return -1; + if (*dest > *src) return 1; + dest++; + src++; + } + + if (*dest && !*src) return 1; + if (!*dest && *src) return -1; + return 0; +} + +/* Foxconn add start by Jenny Zhao, 07/02/2008*/ +int lib_strncmp(const char *dest, const char *src, size_t cnt ) +{ + while (*src && *dest && cnt) { + if (*dest < *src ) return -1; + if (*dest > *src) return 1; + dest++; + src++; + cnt--; + } + + if (!cnt) return 0; + if (*dest && !*src) return 1; + if (!*dest && *src) return -1; + return 0; +} +/* Foxconn add start by Jenny Zhao, 07/02/2008*/ + + +int lib_strcmpi(const char *dest,const char *src) +{ + char dc,sc; + + while (*src && *dest) { + dc = lib_toupper(*dest); + sc = lib_toupper(*src); + if (dc < sc) return -1; + if (dc > sc) return 1; + dest++; + src++; + } + + if (*dest && !*src) return 1; + if (!*dest && *src) return -1; + return 0; +} + + +char *lib_strchr(const char *dest,int c) +{ + while (*dest) { + if (*dest == c) return (char *) dest; + dest++; + } + return NULL; +} + +char *lib_strnchr(const char *dest,int c,size_t cnt) +{ + while (*dest && (cnt > 0)) { + if (*dest == c) return (char *) dest; + dest++; + cnt--; + } + return NULL; +} + +char *lib_strrchr(const char *dest,int c) +{ + char *ret = NULL; + + while (*dest) { + if (*dest == c) ret = (char *) dest; + dest++; + } + + return ret; +} + + +int lib_memcmp(const void *dest,const void *src,size_t cnt) +{ + const unsigned char *d; + const unsigned char *s; + + d = (const unsigned char *) dest; + s = (const unsigned char *) src; + + while (cnt) { + if (*d < *s) return -1; + if (*d > *s) return 1; + d++; s++; cnt--; + } + + return 0; +} + +void *lib_memcpy(void *dest,const void *src,size_t cnt) +{ + unsigned char *d; + const unsigned char *s; + + d = (unsigned char *) dest; + s = (const unsigned char *) src; + + while (cnt) { + *d++ = *s++; + cnt--; + } + + return dest; +} + +void *lib_memset(void *dest,int c,size_t cnt) +{ + unsigned char *d; + + d = dest; + + while (cnt) { + *d++ = (unsigned char) c; + cnt--; + } + + return d; +} + +char lib_toupper(char c) +{ + if ((c >= 'a') && (c <= 'z')) c -= 32; + return c; +} + +void lib_strupr(char *str) +{ + while (*str) { + *str = lib_toupper(*str); + str++; + } +} + +char *lib_strcat(char *dest,const char *src) +{ + char *ptr = dest; + + while (*ptr) ptr++; + while (*src) *ptr++ = *src++; + *ptr = '\0'; + + return dest; +} + +#define isspace(x) (((x) == ' ') || ((x) == '\t')) + +char *lib_gettoken(char **ptr) +{ + char *p = *ptr; + char *ret; + + /* skip white space */ + + while (*p && isspace(*p)) p++; + ret = p; + + /* check for end of string */ + + if (!*p) { + *ptr = p; + return NULL; + } + + /* skip non-whitespace */ + + while (*p) { + if (isspace(*p)) break; + + /* do quoted strings */ + + if (*p == '"') { + p++; + ret = p; + while (*p && (*p != '"')) p++; + if (*p == '"') *p = '\0'; + } + + p++; + + } + + if (*p) { + *p++ = '\0'; + } + *ptr = p; + + return ret; +} + + +int lib_atoi(const char *dest) +{ + int x = 0; + int digit; + + if ((*dest == '0') && (*(dest+1) == 'x')) { + return lib_xtoi(dest+2); + } + + while (*dest) { + if ((*dest >= '0') && (*dest <= '9')) { + digit = *dest - '0'; + } + else { + break; + } + x *= 10; + x += digit; + dest++; + } + + return x; +} + +uint64_t lib_xtoq(const char *dest) +{ + uint64_t x = 0; + unsigned int digit; + + if ((*dest == '0') && (*(dest+1) == 'x')) dest += 2; + + while (*dest) { + if ((*dest >= '0') && (*dest <= '9')) { + digit = *dest - '0'; + } + else if ((*dest >= 'A') && (*dest <= 'F')) { + digit = 10 + *dest - 'A'; + } + else if ((*dest >= 'a') && (*dest <= 'f')) { + digit = 10 + *dest - 'a'; + } + else { + break; + } + x *= 16; + x += digit; + dest++; + } + + return x; +} + +int lib_xtoi(const char *dest) +{ + int x = 0; + int digit; + + if ((*dest == '0') && (*(dest+1) == 'x')) dest += 2; + + while (*dest) { + if ((*dest >= '0') && (*dest <= '9')) { + digit = *dest - '0'; + } + else if ((*dest >= 'A') && (*dest <= 'F')) { + digit = 10 + *dest - 'A'; + } + else if ((*dest >= 'a') && (*dest <= 'f')) { + digit = 10 + *dest - 'a'; + } + else { + break; + } + x *= 16; + x += digit; + dest++; + } + + return x; +} |