summaryrefslogtreecommitdiffstats
path: root/src/vf_strings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vf_strings.c')
-rw-r--r--src/vf_strings.c472
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
+ *============================================================================*/