diff options
Diffstat (limited to 'src/vf_strings.c')
-rw-r--r-- | src/vf_strings.c | 472 |
1 files changed, 472 insertions, 0 deletions
diff --git a/src/vf_strings.c b/src/vf_strings.c new file mode 100644 index 0000000..204a188 --- /dev/null +++ b/src/vf_strings.c @@ -0,0 +1,472 @@ +/****************************************************************************** + + (C) Nick Marley, 2001 - + + This software is distributed under the GNU Lesser General Public Licence. + Please read and understand the comments at the top of vf_iface.h before use! + +FILE + $Workfile$ + $Revision: 1.9 $ + $Author: tilda $ + +ORIGINAL AUTHOR + Nick Marley + +DESCRIPTION + String handling functions. The library uses the p_ functions (where hopefully + the 'p' stands for 'portable') and they are provided here in terms of C runtime + functions or implemented explicitly. + +REFERENCES + (none) + +MODIFICATION HISTORY + * $Log: vf_strings.c,v $ + * Revision 1.9 2002/11/15 09:15:00 tilda + * IID638823 - Various portability issues. + * + * Revision 1.8 2002/10/26 16:09:23 tilda + * IID629125 - Ensure string functions used are portable. + * + * Revision 1.7 2002/10/08 21:45:07 tilda + * IID620473 - reduce c-runtime dependencies. + * + * Revision 1.6 2002/10/08 21:11:36 tilda + * Remove common.h. + * + * Revision 1.5 2001/11/05 21:07:19 tilda + * Various changes for initial version of vfedit. + * + * Revision 1.4 2001/10/14 20:42:37 tilda + * Addition of group searching. + * + * Revision 1.3 2001/10/13 16:22:08 tilda + * Introduce VBINDATA_T and VOBJDATA_T to tidy up internals. + * + * Revision 1.2 2001/10/13 14:58:56 tilda + * Tidy up version headers, add vf_strings.h where needed. + * + * Revision 1.1 2001/10/13 14:50:33 tilda + * Add string array code to unify handling of names / values. + * + *******************************************************************************/ + +#ifndef NORCSID +static const char vf_strings_c_vss_id[] = "$Header: /cvsroot/vformat/src/vformat/src/vf_strings.c,v 1.9 2002/11/15 09:15:00 tilda Exp $"; +#endif + +/*=============================================================================* + ANSI C & System-wide Header Files + *=============================================================================*/ + +#include <common/types.h> + +#include <ctype.h> +#include <string.h> + +/*============================================================================* + Interface Header Files + *============================================================================*/ + +#include "vformat/vf_iface.h" + +/*============================================================================* + Local Header File + *============================================================================*/ + +#include "vf_config.h" +#include "vf_internals.h" +#include "vf_strings.h" + +/*============================================================================* + Public Data + *============================================================================*/ +/* None */ + +/*============================================================================* + Private Defines + *============================================================================*/ + + +/*============================================================================* + Private Data Types + *============================================================================*/ +/* None */ + +/*============================================================================* + Private Function Prototypes + *============================================================================*/ +/* None */ + +/*============================================================================* + Private Data + *============================================================================*/ +/* None */ + +/*============================================================================* + Public Function Implementations + *============================================================================*/ + + +/*----------------------------------------------------------------------------* + * NAME + * p_strlen() + * + * DESCRIPTION + * Find length of string. + * + * RETURNS + * Length of strings. + *----------------------------------------------------------------------------*/ + +int p_strlen( + const char *p_string /* String to measure */ + ) +{ +#if defined(HAVE_STRLEN) + return strlen(p_string); +#else + int len = 0; + + while (*p_string) + { + p_string++; + len++; + } + + return len; +#endif +} + + + + + +/*----------------------------------------------------------------------------* + * NAME + * p_strcpy() + * + * DESCRIPTION + * Copy string to buffer. + * + * RETURNS + * Pointer to buffer. + *----------------------------------------------------------------------------*/ + +char *p_strcpy( + char *p_string1, /* Buffer to copy to */ + const char *p_string2 /* String to copy */ + ) +{ +#if defined(HAVE_STRCPY) + return strcpy(p_string1, p_string2); +#else + char *p_return = p_string1; + + while ((*p_string1++ = *p_string2++)) + ; + + return p_return; +#endif +} + + + + + + +/*----------------------------------------------------------------------------* + * NAME + * p_strcmp() + * + * DESCRIPTION + * Case sensitive string comparison. + * + * RETURNS + * 0<=>strings match, !=0 else. + *----------------------------------------------------------------------------*/ + +int p_strcmp( + const char *p_string1, + const char *p_string2 + ) +{ +#if defined(HAVE_STRCMP) + return strcmp(p_string1, p_string2); +#else + while (*p_string1 && (*p_string1 == *p_string2)) + { + p_string1++; + p_string2++; + } + + return (*(unsigned char *)p_string1) - (*(unsigned char *)p_string2); +#endif +} + + + + + + +/*----------------------------------------------------------------------------* + * NAME + * p_strcat() + * + * DESCRIPTION + * Append one string to another. + * + * RETURNS + * Pointer to resulting string. + *----------------------------------------------------------------------------*/ + +char *p_strcat( + char *p_string1, /* String to append to */ + const char *p_string2 /* String to append */ + ) +{ +#if defined(HAVE_STRCAT) + return strcat(p_string1, p_string2); +#else + char *p_return = p_string1; + + while (*p_string1) + p_string1++; + + while ((*p_string1++ = *p_string2++)) + ; + + return p_return; +#endif +} + + + + + + +/*----------------------------------------------------------------------------* + * NAME + * p_strstr() + * + * DESCRIPTION + * Case sensitive string searching function. + * + * RETURNS + * Pointer to position "looked for" has been located or NULL if !found. + *----------------------------------------------------------------------------*/ + +char *p_strstr( + const char *p_searched, /* Buffer searched */ + const char *p_lookedfor /* String we're looking for */ + ) +{ +#if defined(HAVE_STRSTR) + return strstr(p_searched, p_lookedfor); +#else + if (*p_searched == 0) + { + if (*p_lookedfor) + { + return (char *)NULL; + } + + return (char *)p_searched; + } + + while (*p_searched) + { + uint32_t i; + + for (i = 0;;i++) + { + if (p_lookedfor[i] == 0) + { + return (char *)p_searched; + } + + if (p_lookedfor[i] != p_searched[i]) + { + break; + } + } + + p_searched++; + } + + return (char *)NULL; +#endif +} + + + + + + +/*----------------------------------------------------------------------------* + * NAME + * p_stricmp() + * + * DESCRIPTION + * Case insensitive string comparison function. + * + * RETURNS + * 0<=>strings match, !=0 else. + *----------------------------------------------------------------------------*/ + +int p_stricmp( + const char *p_string1, /* First string */ + const char *p_string2 /* Second string */ + ) +{ +#if defined(HAVE_STRCASECMP) + return strcasecmp(p_string1, p_string2); +#elif defined(HAVE_STRICMP) + return stricmp(p_string1, p_string2); +#else + while (*p_string1 && (tolower(*p_string1) == tolower(*p_string2))) + { + p_string1++; + p_string2++; + } + + return tolower(*(unsigned char *)p_string1) - tolower(*(unsigned char *)p_string2); +#endif +} + + + + + + + +/*----------------------------------------------------------------------------* + * NAME + * p_stristr() + * + * DESCRIPTION + * Case insensitive string searching function. + * + * RETURNS + * Pointer to position "looked for" has been located or NULL if !found. + *----------------------------------------------------------------------------*/ + +char *p_stristr( + const char *p_searched, /* Buffer searched */ + const char *p_lookedfor /* String we're looking for */ + ) +{ +#if defined(HAVE_STRISTR) + return strstr(p_searched, p_lookedfor); +#else + if (*p_searched == 0) + { + if (*p_lookedfor) + { + return (char *)NULL; + } + + return (char *)p_searched; + } + + while (*p_searched) + { + uint32_t i; + + for (i = 0;;i++) + { + if (p_lookedfor[i] == 0) + { + return (char *)p_searched; + } + + if (tolower(p_lookedfor[i]) != tolower(p_searched[i])) + { + break; + } + } + + p_searched++; + } + + return (char *)NULL; +#endif +} + + + + + + +/*----------------------------------------------------------------------------* + * NAME + * p_memcpy() + * + * DESCRIPTION + * Copy characetrs between buffers. No checks on overlap. + * + * RETURNS + * (none) + *----------------------------------------------------------------------------*/ + +void p_memcpy( + void *p_destination, /* Pointer to buffer */ + const void *p_source, /* Source of copy */ + uint32_t length /* Number of characters to copy */ + ) +{ +#if defined(HAVE_MEMCPY) + memcpy(p_destination, p_source, length); +#else + uint8_t *p_dst = (uint8_t *)p_destination; + uint8_t *p_src = (uint8_t *)p_source; + + while (length--) + { + *p_dst++ = *p_src++; + } +#endif +} + + + + + + +/*----------------------------------------------------------------------------* + * NAME + * p_memset() + * + * DESCRIPTION + * Fill buffer with indicated character. + * + * RETURNS + * (none) + *----------------------------------------------------------------------------*/ + +void p_memset( + void *p_destination, /* Pointer to buffer */ + uint8_t v, /* Character to fill with */ + uint32_t length /* Length of buffer to set */ + ) +{ +#if defined(HAVE_MEMSET) + memset(p_destination, v, length); +#else + uint8_t *p_dst = (uint8_t *)p_destination; + + while (length--) + *p_dst++ = v; +#endif +} + + +/*============================================================================* + Private Function Implementations + *============================================================================*/ +/* None */ + +/*============================================================================* + End Of File + *============================================================================*/ |