mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-01-14 19:24:06 +03:00
228 lines
6.4 KiB
C
228 lines
6.4 KiB
C
/*************************************************************************
|
|
*
|
|
* $Id$
|
|
*
|
|
* Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
|
|
* CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
|
|
*
|
|
************************************************************************/
|
|
|
|
#ifndef TRIO_STRIO_H
|
|
#define TRIO_STRIO_H
|
|
|
|
#if !(defined(DEBUG) || defined(NDEBUG))
|
|
# define NDEBUG
|
|
#endif
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
|
|
#ifndef STRIO_MALLOC
|
|
# define STRIO_MALLOC(n) malloc(n)
|
|
#endif
|
|
#ifndef STRIO_FREE
|
|
# define STRIO_FREE(x) free(x)
|
|
#endif
|
|
|
|
/*
|
|
* StrAppend(target, source)
|
|
* StrAppendMax(target, maxsize, source)
|
|
*
|
|
* Append 'source' to 'target'
|
|
*
|
|
* target = StrAlloc(size)
|
|
*
|
|
* Allocate a new string
|
|
*
|
|
* StrContains(target, substring)
|
|
*
|
|
* Find out if the string 'substring' is
|
|
* contained in the string 'target'
|
|
*
|
|
* StrCopy(target, source)
|
|
* StrCopyMax(target, maxsize, source)
|
|
*
|
|
* Copy 'source' to 'target'
|
|
*
|
|
* target = StrDuplicate(source)
|
|
* target = StrDuplicateMax(source, maxsize)
|
|
*
|
|
* Allocate and copy 'source' to 'target'
|
|
*
|
|
* StrEqual(first, second)
|
|
* StrEqualMax(first, maxsize, second)
|
|
*
|
|
* Compare if 'first' is equal to 'second'.
|
|
* Case-independent.
|
|
*
|
|
* StrEqualCase(first, second)
|
|
* StrEqualCaseMax(first, maxsize, second)
|
|
*
|
|
* Compare if 'first' is equal to 'second'
|
|
* Case-dependent. Please note that the use of the
|
|
* word 'case' has the opposite meaning as that of
|
|
* strcasecmp().
|
|
*
|
|
* StrFormat(target, format, ...)
|
|
* StrFormatMax(target, maxsize, format, ...)
|
|
*
|
|
* Build 'target' according to 'format' and succesive
|
|
* arguments. This is equal to the sprintf() and
|
|
* snprintf() functions.
|
|
*
|
|
* StrFormatDate(target, format, ...)
|
|
*
|
|
* StrFree(target)
|
|
*
|
|
* De-allocates a string
|
|
*
|
|
* StrHash(string, type)
|
|
*
|
|
* Calculates the hash value of 'string' based on the
|
|
* 'type'.
|
|
*
|
|
* StrIndex(target, character)
|
|
* StrIndexLast(target, character)
|
|
*
|
|
* Find the first/last occurrence of 'character' in
|
|
* 'target'
|
|
*
|
|
* StrLength(target)
|
|
*
|
|
* Return the length of 'target'
|
|
*
|
|
* StrMatch(string, pattern)
|
|
* StrMatchCase(string, pattern)
|
|
*
|
|
* Find 'pattern' within 'string'. 'pattern' may contain
|
|
* wildcards such as * (asterics) and ? (question mark)
|
|
* which matches zero or more characters and exactly
|
|
* on character respectively
|
|
*
|
|
* StrScan(source, format, ...)
|
|
*
|
|
* Equal to sscanf()
|
|
*
|
|
* StrSubstring(target, substring)
|
|
*
|
|
* Find the first occurrence of the string 'substring'
|
|
* within the string 'target'
|
|
*
|
|
* StrTokenize(target, list)
|
|
*
|
|
* Split 'target' into the first token delimited by
|
|
* one of the characters in 'list'. If 'target' is
|
|
* NULL then next token will be returned.
|
|
*
|
|
* StrToUpper(target)
|
|
*
|
|
* Convert all lower case characters in 'target' into
|
|
* upper case characters.
|
|
*/
|
|
|
|
enum {
|
|
STRIO_HASH_NONE = 0,
|
|
STRIO_HASH_PLAIN,
|
|
STRIO_HASH_TWOSIGNED
|
|
};
|
|
|
|
#if !defined(DEBUG) || defined(__DECC)
|
|
#define StrAlloc(n) (char *)STRIO_MALLOC(n)
|
|
#define StrAppend(x,y) strcat((x), (y))
|
|
#define StrContains(x,y) (0 != strstr((x), (y)))
|
|
#define StrCopy(x,y) strcpy((x), (y))
|
|
#define StrIndex(x,y) strchr((x), (y))
|
|
#define StrIndexLast(x,y) strrchr((x), (y))
|
|
#define StrFree(x) STRIO_FREE(x)
|
|
#define StrLength(x) strlen((x))
|
|
#define StrSubstring(x,y) strstr((x), (y))
|
|
#define StrTokenize(x,y) strtok((x), (y))
|
|
#define StrToLong(x,y,n) strtol((x), (y), (n))
|
|
#define StrToUnsignedLong(x,y,n) strtoul((x), (y), (n))
|
|
#else /* DEBUG */
|
|
/*
|
|
* To be able to use these macros everywhere, including in
|
|
* if() sentences, the assertions are put first in a comma
|
|
* seperated list.
|
|
*
|
|
* Unfortunately the DECC compiler does not seem to like this
|
|
* so it will use the un-asserted functions above for the
|
|
* debugging case too.
|
|
*/
|
|
#define StrAlloc(n) \
|
|
(assert((n) > 0),\
|
|
(char *)STRIO_MALLOC(n))
|
|
#define StrAppend(x,y) \
|
|
(assert((x) != NULL),\
|
|
assert((y) != NULL),\
|
|
strcat((x), (y)))
|
|
#define StrContains(x,y) \
|
|
(assert((x) != NULL),\
|
|
assert((y) != NULL),\
|
|
(0 != strstr((x), (y))))
|
|
#define StrCopy(x,y) \
|
|
(assert((x) != NULL),\
|
|
assert((y) != NULL),\
|
|
strcpy((x), (y)))
|
|
#define StrIndex(x,c) \
|
|
(assert((x) != NULL),\
|
|
strchr((x), (c)))
|
|
#define StrIndexLast(x,c) \
|
|
(assert((x) != NULL),\
|
|
strrchr((x), (c)))
|
|
#define StrFree(x) \
|
|
(assert((x) != NULL),\
|
|
STRIO_FREE(x))
|
|
#define StrLength(x) \
|
|
(assert((x) != NULL),\
|
|
strlen((x)))
|
|
#define StrSubstring(x,y) \
|
|
(assert((x) != NULL),\
|
|
assert((y) != NULL),\
|
|
strstr((x), (y)))
|
|
#define StrTokenize(x,y) \
|
|
(assert((y) != NULL),\
|
|
strtok((x), (y)))
|
|
#define StrToLong(x,y,n) \
|
|
(assert((x) != NULL),\
|
|
assert((y) != NULL),\
|
|
assert((n) >= 2 && (n) <= 36),\
|
|
strtol((x), (y), (n)))
|
|
#define StrToUnsignedLong(x,y,n) \
|
|
(assert((x) != NULL),\
|
|
assert((y) != NULL),\
|
|
assert((n) >= 2 && (n) <= 36),\
|
|
strtoul((x), (y), (n)))
|
|
#endif /* DEBUG */
|
|
|
|
char *StrAppendMax(char *target, size_t max, const char *source);
|
|
char *StrCopyMax(char *target, size_t max, const char *source);
|
|
char *StrDuplicate(const char *source);
|
|
char *StrDuplicateMax(const char *source, size_t max);
|
|
int StrEqual(const char *first, const char *second);
|
|
int StrEqualCase(const char *first, const char *second);
|
|
int StrEqualCaseMax(const char *first, size_t max, const char *second);
|
|
int StrEqualLocale(const char *first, const char *second);
|
|
int StrEqualMax(const char *first, size_t max, const char *second);
|
|
const char *StrError(int);
|
|
size_t StrFormatDateMax(char *target, size_t max, const char *format, const struct tm *datetime);
|
|
unsigned long StrHash(const char *string, int type);
|
|
int StrMatch(char *string, char *pattern);
|
|
int StrMatchCase(char *string, char *pattern);
|
|
size_t StrSpanFunction(char *source, int (*Function)(int));
|
|
char *StrSubstringMax(const char *string, size_t max, const char *find);
|
|
float StrToFloat(const char *source, const char **target);
|
|
double StrToDouble(const char *source, const char **target);
|
|
int StrToUpper(char *target);
|
|
|
|
#endif /* TRIO_STRIO_H */
|