aboutsummaryrefslogtreecommitdiffstats
path: root/trio/triostr.h
diff options
context:
space:
mode:
Diffstat (limited to 'trio/triostr.h')
-rw-r--r--trio/triostr.h706
1 files changed, 620 insertions, 86 deletions
diff --git a/trio/triostr.h b/trio/triostr.h
index edec4264..357d192b 100644
--- a/trio/triostr.h
+++ b/trio/triostr.h
@@ -1,6 +1,6 @@
/*************************************************************************
*
- * $Id: triostr.h,v 1.10 2003/03/01 15:34:01 breese Exp $
+ * $Id: triostr.h,v 1.17 2007/11/11 13:21:49 breese Exp $
*
* Copyright (C) 2001 Bjorn Reese and Daniel Stenberg.
*
@@ -18,6 +18,10 @@
#ifndef TRIO_TRIOSTR_H
#define TRIO_TRIOSTR_H
+/*
+ * Documentation is located in triostr.c
+ */
+
#include <assert.h>
#include <stdlib.h>
#include <string.h>
@@ -25,63 +29,417 @@
#include "triodef.h"
#include "triop.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
enum {
TRIO_HASH_NONE = 0,
TRIO_HASH_PLAIN,
TRIO_HASH_TWOSIGNED
};
-#if !defined(TRIO_STRING_PUBLIC)
+#if !defined(TRIO_PUBLIC_STRING)
# if !defined(TRIO_PUBLIC)
# define TRIO_PUBLIC
# endif
-# define TRIO_STRING_PUBLIC TRIO_PUBLIC
+# define TRIO_PUBLIC_STRING TRIO_PUBLIC
#endif
/*************************************************************************
+ * Dependencies
+ */
+
+#if defined(TRIO_EMBED_STRING)
+
+/*
+ * The application that triostr is embedded in must define which functions
+ * it uses.
+ *
+ * The following resolves internal dependencies.
+ */
+
+# if defined(TRIO_FUNC_XSTRING_SET)
+# if !defined(TRIO_FUNC_DUPLICATE)
+# define TRIO_FUNC_DUPLICATE
+# endif
+# endif
+
+# if defined(TRIO_FUNC_DUPLICATE) \
+ || defined(TRIO_FUNC_DUPLICATE_MAX) \
+ || defined(TRIO_FUNC_STRING_DUPLICATE) \
+ || defined(TRIO_FUNC_XSTRING_DUPLICATE)
+# if !defined(TRIO_FUNC_CREATE)
+# define TRIO_FUNC_CREATE
+# endif
+# if !defined(TRIO_FUNC_COPY_MAX)
+# define TRIO_FUNC_COPY_MAX
+# endif
+# endif
+
+# if defined(TRIO_FUNC_STRING_CREATE)
+# if !defined(TRIO_FUNC_STRING_DESTROY)
+# define TRIO_FUNC_STRING_DESTROY
+# endif
+# endif
+
+# if defined(TRIO_FUNC_STRING_DESTROY) \
+ || defined(TRIO_FUNC_XSTRING_SET)
+# if !defined(TRIO_FUNC_DESTROY)
+# define TRIO_FUNC_DESTROY
+# endif
+# endif
+
+# if defined(TRIO_FUNC_EQUAL_LOCALE) \
+ || defined(TRIO_FUNC_STRING_EQUAL) \
+ || defined(TRIO_FUNC_XSTRING_EQUAL)
+# if !defined(TRIO_FUNC_EQUAL)
+# define TRIO_FUNC_EQUAL
+# endif
+# endif
+
+# if defined(TRIO_FUNC_EQUAL_CASE) \
+ || defined(TRIO_FUNC_STRING_EQUAL_CASE) \
+ || defined(TRIO_FUNC_XSTRING_EQUAL_CASE)
+# if !defined(TRIO_FUNC_EQUAL_CASE)
+# define TRIO_FUNC_EQUAL_CASE
+# endif
+# endif
+
+# if defined(TRIO_FUNC_SUBSTRING_MAX) \
+ || defined(TRIO_FUNC_STRING_EQUAL_MAX) \
+ || defined(TRIO_FUNC_XSTRING_EQUAL_MAX)
+# if !defined(TRIO_FUNC_EQUAL_MAX)
+# define TRIO_FUNC_EQUAL_MAX
+# endif
+# endif
+
+# if defined(TRIO_FUNC_TO_DOUBLE) \
+ || defined(TRIO_FUNC_TO_FLOAT)
+# if !defined(TRIO_FUNC_TO_LONG_DOUBLE)
+# define TRIO_FUNC_TO_LONG_DOUBLE
+# endif
+# endif
+
+# if defined(TRIO_FUNC_STRING_TERMINATE)
+# if !defined(TRIO_FUNC_XSTRING_APPEND_CHAR)
+# define TRIO_FUNC_XSTRING_APPEND_CHAR
+# endif
+# endif
+
+# if defined(TRIO_FUNC_XSTRING_APPEND_CHAR)
+# if !defined(TRIO_FUNC_STRING_SIZE)
+# define TRIO_FUNC_STRING_SIZE
+# endif
+# endif
+
+#else
+
+/*
+ * When triostr is not embedded all functions are defined.
+ */
+
+# define TRIO_FUNC_APPEND
+# define TRIO_FUNC_APPEND_MAX
+# define TRIO_FUNC_CONTAINS
+# define TRIO_FUNC_COPY
+# define TRIO_FUNC_COPY_MAX
+# define TRIO_FUNC_CREATE
+# define TRIO_FUNC_DESTROY
+# define TRIO_FUNC_DUPLICATE
+# define TRIO_FUNC_DUPLICATE_MAX
+# define TRIO_FUNC_EQUAL
+# define TRIO_FUNC_EQUAL_CASE
+# define TRIO_FUNC_EQUAL_CASE_MAX
+# define TRIO_FUNC_EQUAL_LOCALE
+# define TRIO_FUNC_EQUAL_MAX
+# define TRIO_FUNC_ERROR
+# if !defined(TRIO_PLATFORM_WINCE)
+# define TRIO_FUNC_FORMAT_DATE_MAX
+# endif
+# define TRIO_FUNC_HASH
+# define TRIO_FUNC_INDEX
+# define TRIO_FUNC_INDEX_LAST
+# define TRIO_FUNC_LENGTH
+# define TRIO_FUNC_LENGTH_MAX
+# define TRIO_FUNC_LOWER
+# define TRIO_FUNC_MATCH
+# define TRIO_FUNC_MATCH_CASE
+# define TRIO_FUNC_SPAN_FUNCTION
+# define TRIO_FUNC_SUBSTRING
+# define TRIO_FUNC_SUBSTRING_MAX
+# define TRIO_FUNC_TO_DOUBLE
+# define TRIO_FUNC_TO_FLOAT
+# define TRIO_FUNC_TO_LONG
+# define TRIO_FUNC_TO_LONG_DOUBLE
+# define TRIO_FUNC_TO_LOWER
+# define TRIO_FUNC_TO_UNSIGNED_LONG
+# define TRIO_FUNC_TO_UPPER
+# define TRIO_FUNC_TOKENIZE
+# define TRIO_FUNC_UPPER
+
+# define TRIO_FUNC_STRING_APPEND
+# define TRIO_FUNC_STRING_CONTAINS
+# define TRIO_FUNC_STRING_COPY
+# define TRIO_FUNC_STRING_CREATE
+# define TRIO_FUNC_STRING_DESTROY
+# define TRIO_FUNC_STRING_DUPLICATE
+# define TRIO_FUNC_STRING_EQUAL
+# define TRIO_FUNC_STRING_EQUAL_CASE
+# define TRIO_FUNC_STRING_EQUAL_CASE_MAX
+# define TRIO_FUNC_STRING_EQUAL_MAX
+# define TRIO_FUNC_STRING_EXTRACT
+# if !defined(TRIO_PLATFORM_WINCE)
+# define TRIO_FUNC_STRING_FORMAT_DATE_MAX
+# endif
+# define TRIO_FUNC_STRING_GET
+# define TRIO_FUNC_STRING_INDEX
+# define TRIO_FUNC_STRING_INDEX_LAST
+# define TRIO_FUNC_STRING_LENGTH
+# define TRIO_FUNC_STRING_LOWER
+# define TRIO_FUNC_STRING_MATCH
+# define TRIO_FUNC_STRING_MATCH_CASE
+# define TRIO_FUNC_STRING_SIZE
+# define TRIO_FUNC_STRING_SUBSTRING
+# define TRIO_FUNC_STRING_TERMINATE
+# define TRIO_FUNC_STRING_UPPER
+
+# define TRIO_FUNC_XSTRING_APPEND
+# define TRIO_FUNC_XSTRING_APPEND_CHAR
+# define TRIO_FUNC_XSTRING_CONTAINS
+# define TRIO_FUNC_XSTRING_COPY
+# define TRIO_FUNC_XSTRING_DUPLICATE
+# define TRIO_FUNC_XSTRING_EQUAL
+# define TRIO_FUNC_XSTRING_EQUAL_CASE
+# define TRIO_FUNC_XSTRING_EQUAL_CASE_MAX
+# define TRIO_FUNC_XSTRING_EQUAL_MAX
+# define TRIO_FUNC_XSTRING_MATCH
+# define TRIO_FUNC_XSTRING_MATCH_CASE
+# define TRIO_FUNC_XSTRING_SET
+# define TRIO_FUNC_XSTRING_SUBSTRING
+
+#endif
+
+
+/*************************************************************************
* String functions
*/
-TRIO_STRING_PUBLIC int trio_copy_max TRIO_PROTO((char *target, size_t max, const char *source));
-TRIO_STRING_PUBLIC char *trio_create TRIO_PROTO((size_t size));
-TRIO_STRING_PUBLIC void trio_destroy TRIO_PROTO((char *string));
-TRIO_STRING_PUBLIC char *trio_duplicate TRIO_PROTO((const char *source));
-TRIO_STRING_PUBLIC int trio_equal TRIO_PROTO((const char *first, const char *second));
-TRIO_STRING_PUBLIC int trio_equal_case TRIO_PROTO((const char *first, const char *second));
-TRIO_STRING_PUBLIC int trio_equal_locale TRIO_PROTO((const char *first, const char *second));
-TRIO_STRING_PUBLIC int trio_equal_max TRIO_PROTO((const char *first, size_t max, const char *second));
-TRIO_STRING_PUBLIC TRIO_CONST char *trio_error TRIO_PROTO((int));
-TRIO_STRING_PUBLIC size_t trio_length TRIO_PROTO((const char *string));
-TRIO_STRING_PUBLIC double trio_to_double TRIO_PROTO((const char *source, char **endp));
-TRIO_STRING_PUBLIC long trio_to_long TRIO_PROTO((const char *source, char **endp, int base));
-TRIO_STRING_PUBLIC trio_long_double_t trio_to_long_double TRIO_PROTO((const char *source, char **endp));
-TRIO_STRING_PUBLIC int trio_to_upper TRIO_PROTO((int source));
-
-#if !defined(TRIO_MINIMAL)
-
-TRIO_STRING_PUBLIC int trio_append TRIO_PROTO((char *target, const char *source));
-TRIO_STRING_PUBLIC int trio_append_max TRIO_PROTO((char *target, size_t max, const char *source));
-TRIO_STRING_PUBLIC int trio_contains TRIO_PROTO((const char *string, const char *substring));
-TRIO_STRING_PUBLIC int trio_copy TRIO_PROTO((char *target, const char *source));
-TRIO_STRING_PUBLIC char *trio_duplicate_max TRIO_PROTO((const char *source, size_t max));
-TRIO_STRING_PUBLIC int trio_equal_case_max TRIO_PROTO((const char *first, size_t max, const char *second));
-TRIO_STRING_PUBLIC size_t trio_format_date_max TRIO_PROTO((char *target, size_t max, const char *format, const struct tm *datetime));
-TRIO_STRING_PUBLIC unsigned long trio_hash TRIO_PROTO((const char *string, int type));
-TRIO_STRING_PUBLIC char *trio_index TRIO_PROTO((const char *string, int character));
-TRIO_STRING_PUBLIC char *trio_index_last TRIO_PROTO((const char *string, int character));
-TRIO_STRING_PUBLIC int trio_lower TRIO_PROTO((char *target));
-TRIO_STRING_PUBLIC int trio_match TRIO_PROTO((const char *string, const char *pattern));
-TRIO_STRING_PUBLIC int trio_match_case TRIO_PROTO((const char *string, const char *pattern));
-TRIO_STRING_PUBLIC size_t trio_span_function TRIO_PROTO((char *target, const char *source, int (*Function) TRIO_PROTO((int))));
-TRIO_STRING_PUBLIC char *trio_substring TRIO_PROTO((const char *string, const char *substring));
-TRIO_STRING_PUBLIC char *trio_substring_max TRIO_PROTO((const char *string, size_t max, const char *substring));
-TRIO_STRING_PUBLIC float trio_to_float TRIO_PROTO((const char *source, char **endp));
-TRIO_STRING_PUBLIC int trio_to_lower TRIO_PROTO((int source));
-TRIO_STRING_PUBLIC unsigned long trio_to_unsigned_long TRIO_PROTO((const char *source, char **endp, int base));
-TRIO_STRING_PUBLIC char *trio_tokenize TRIO_PROTO((char *string, const char *delimiters));
-TRIO_STRING_PUBLIC int trio_upper TRIO_PROTO((char *target));
-
-#endif /* !defined(TRIO_MINIMAL) */
+#if defined(TRIO_FUNC_APPEND)
+TRIO_PUBLIC_STRING int
+trio_append
+TRIO_PROTO((char *target, TRIO_CONST char *source));
+#endif
+
+#if defined(TRIO_FUNC_APPEND_MAX)
+TRIO_PUBLIC_STRING int
+trio_append_max
+TRIO_PROTO((char *target, size_t max, TRIO_CONST char *source));
+#endif
+
+#if defined(TRIO_FUNC_CONTAINS)
+TRIO_PUBLIC_STRING int
+trio_contains
+TRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *substring));
+#endif
+
+#if defined(TRIO_FUNC_COPY)
+TRIO_PUBLIC_STRING int
+trio_copy
+TRIO_PROTO((char *target, TRIO_CONST char *source));
+#endif
+
+#if defined(TRIO_FUNC_COPY_MAX)
+TRIO_PUBLIC_STRING int
+trio_copy_max
+TRIO_PROTO((char *target, size_t max, TRIO_CONST char *source));
+#endif
+
+#if defined(TRIO_FUNC_CREATE)
+TRIO_PUBLIC_STRING char *
+trio_create
+TRIO_PROTO((size_t size));
+#endif
+
+#if defined(TRIO_FUNC_DESTROY)
+TRIO_PUBLIC_STRING void
+trio_destroy
+TRIO_PROTO((char *string));
+#endif
+
+#if defined(TRIO_FUNC_DUPLICATE)
+TRIO_PUBLIC_STRING char *
+trio_duplicate
+TRIO_PROTO((TRIO_CONST char *source));
+#endif
+
+#if defined(TRIO_FUNC_DUPLICATE_MAX)
+TRIO_PUBLIC_STRING char *
+trio_duplicate_max
+TRIO_PROTO((TRIO_CONST char *source, size_t max));
+#endif
+
+#if defined(TRIO_FUNC_EQUAL)
+TRIO_PUBLIC_STRING int
+trio_equal
+TRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second));
+#endif
+
+#if defined(TRIO_FUNC_EQUAL_CASE)
+TRIO_PUBLIC_STRING int
+trio_equal_case
+TRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second));
+#endif
+
+#if defined(TRIO_FUNC_EQUAL_CASE_MAX)
+TRIO_PUBLIC_STRING int
+trio_equal_case_max
+TRIO_PROTO((TRIO_CONST char *first, size_t max, TRIO_CONST char *second));
+#endif
+
+#if defined(TRIO_FUNC_EQUAL_LOCALE)
+TRIO_PUBLIC_STRING int
+trio_equal_locale
+TRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second));
+#endif
+
+#if defined(TRIO_FUNC_EQUAL_MAX)
+TRIO_PUBLIC_STRING int
+trio_equal_max
+TRIO_PROTO((TRIO_CONST char *first, size_t max, TRIO_CONST char *second));
+#endif
+
+#if defined(TRIO_FUNC_ERROR)
+TRIO_PUBLIC_STRING TRIO_CONST char *
+trio_error
+TRIO_PROTO((int));
+#endif
+
+#if defined(TRIO_FUNC_FORMAT_DATE_MAX)
+TRIO_PUBLIC_STRING size_t
+trio_format_date_max
+TRIO_PROTO((char *target, size_t max, TRIO_CONST char *format, TRIO_CONST struct tm *datetime));
+#endif
+
+#if defined(TRIO_FUNC_HASH)
+TRIO_PUBLIC_STRING unsigned long
+trio_hash
+TRIO_PROTO((TRIO_CONST char *string, int type));
+#endif
+
+#if defined(TRIO_FUNC_INDEX)
+TRIO_PUBLIC_STRING char *
+trio_index
+TRIO_PROTO((TRIO_CONST char *string, int character));
+#endif
+
+#if defined(TRIO_FUNC_INDEX_LAST)
+TRIO_PUBLIC_STRING char *
+trio_index_last
+TRIO_PROTO((TRIO_CONST char *string, int character));
+#endif
+
+#if defined(TRIO_FUNC_LENGTH)
+TRIO_PUBLIC_STRING size_t
+trio_length
+TRIO_PROTO((TRIO_CONST char *string));
+#endif
+
+#if defined(TRIO_FUNC_LENGTH_MAX)
+TRIO_PUBLIC_STRING size_t
+trio_length_max
+TRIO_PROTO((TRIO_CONST char *string, size_t max));
+#endif
+
+#if defined(TRIO_FUNC_LOWER)
+TRIO_PUBLIC_STRING int
+trio_lower
+TRIO_PROTO((char *target));
+#endif
+
+#if defined(TRIO_FUNC_MATCH)
+TRIO_PUBLIC_STRING int
+trio_match
+TRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *pattern));
+#endif
+
+#if defined(TRIO_FUNC_MATCH_CASE)
+TRIO_PUBLIC_STRING int
+trio_match_case
+TRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *pattern));
+#endif
+
+#if defined(TRIO_FUNC_SPAN_FUNCTION)
+TRIO_PUBLIC_STRING size_t
+trio_span_function
+TRIO_PROTO((char *target, TRIO_CONST char *source, int (*Function) TRIO_PROTO((int))));
+#endif
+
+#if defined(TRIO_FUNC_SUBSTRING)
+TRIO_PUBLIC_STRING char *
+trio_substring
+TRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *substring));
+#endif
+
+#if defined(TRIO_FUNC_SUBSTRING_MAX)
+TRIO_PUBLIC_STRING char *
+trio_substring_max
+TRIO_PROTO((TRIO_CONST char *string, size_t max, TRIO_CONST char *substring));
+#endif
+
+#if defined(TRIO_FUNC_TO_DOUBLE)
+TRIO_PUBLIC_STRING double
+trio_to_double
+TRIO_PROTO((TRIO_CONST char *source, char **endp));
+#endif
+
+#if defined(TRIO_FUNC_TO_FLOAT)
+TRIO_PUBLIC_STRING float
+trio_to_float
+TRIO_PROTO((TRIO_CONST char *source, char **endp));
+#endif
+
+#if defined(TRIO_FUNC_TO_LONG)
+TRIO_PUBLIC_STRING long
+trio_to_long
+TRIO_PROTO((TRIO_CONST char *source, char **endp, int base));
+#endif
+
+#if defined(TRIO_FUNC_TO_LOWER)
+TRIO_PUBLIC_STRING int
+trio_to_lower
+TRIO_PROTO((int source));
+#endif
+
+#if defined(TRIO_FUNC_TO_LONG_DOUBLE)
+TRIO_PUBLIC_STRING trio_long_double_t
+trio_to_long_double
+TRIO_PROTO((TRIO_CONST char *source, char **endp));
+#endif
+
+#if defined(TRIO_FUNC_TO_UNSIGNED_LONG)
+TRIO_PUBLIC_STRING unsigned long
+trio_to_unsigned_long
+TRIO_PROTO((TRIO_CONST char *source, char **endp, int base));
+#endif
+
+#if defined(TRIO_FUNC_TO_UPPER)
+TRIO_PUBLIC_STRING int
+trio_to_upper
+TRIO_PROTO((int source));
+#endif
+
+#if defined(TRIO_FUNC_TOKENIZE)
+TRIO_PUBLIC_STRING char *
+trio_tokenize
+TRIO_PROTO((char *string, TRIO_CONST char *delimiters));
+#endif
+
+#if defined(TRIO_FUNC_UPPER)
+TRIO_PUBLIC_STRING int
+trio_upper
+TRIO_PROTO((char *target));
+#endif
/*************************************************************************
* Dynamic string functions
@@ -93,48 +451,224 @@ TRIO_STRING_PUBLIC int trio_upper TRIO_PROTO((char *target));
typedef struct _trio_string_t trio_string_t;
-TRIO_STRING_PUBLIC void trio_string_destroy TRIO_PROTO((trio_string_t *self));
-TRIO_STRING_PUBLIC char *trio_string_extract TRIO_PROTO((trio_string_t *self));
-TRIO_STRING_PUBLIC int trio_string_size TRIO_PROTO((trio_string_t *self));
-TRIO_STRING_PUBLIC void trio_string_terminate TRIO_PROTO((trio_string_t *self));
-TRIO_STRING_PUBLIC int trio_xstring_append_char TRIO_PROTO((trio_string_t *self, char character));
-TRIO_STRING_PUBLIC trio_string_t *trio_xstring_duplicate TRIO_PROTO((const char *other));
-
-#if !defined(TRIO_MINIMAL)
-
-TRIO_STRING_PUBLIC trio_string_t *trio_string_create TRIO_PROTO((int initial_size));
-TRIO_STRING_PUBLIC char *trio_string_get TRIO_PROTO((trio_string_t *self, int offset));
-TRIO_STRING_PUBLIC void trio_xstring_set TRIO_PROTO((trio_string_t *self, char *buffer));
-
-TRIO_STRING_PUBLIC int trio_string_append TRIO_PROTO((trio_string_t *self, trio_string_t *other));
-TRIO_STRING_PUBLIC int trio_string_contains TRIO_PROTO((trio_string_t *self, trio_string_t *other));
-TRIO_STRING_PUBLIC int trio_string_copy TRIO_PROTO((trio_string_t *self, trio_string_t *other));
-TRIO_STRING_PUBLIC trio_string_t *trio_string_duplicate TRIO_PROTO((trio_string_t *other));
-TRIO_STRING_PUBLIC int trio_string_equal TRIO_PROTO((trio_string_t *self, trio_string_t *other));
-TRIO_STRING_PUBLIC int trio_string_equal_max TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *second));
-TRIO_STRING_PUBLIC int trio_string_equal_case TRIO_PROTO((trio_string_t *self, trio_string_t *other));
-TRIO_STRING_PUBLIC int trio_string_equal_case_max TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *other));
-TRIO_STRING_PUBLIC size_t trio_string_format_date_max TRIO_PROTO((trio_string_t *self, size_t max, const char *format, const struct tm *datetime));
-TRIO_STRING_PUBLIC char *trio_string_index TRIO_PROTO((trio_string_t *self, int character));
-TRIO_STRING_PUBLIC char *trio_string_index_last TRIO_PROTO((trio_string_t *self, int character));
-TRIO_STRING_PUBLIC int trio_string_length TRIO_PROTO((trio_string_t *self));
-TRIO_STRING_PUBLIC int trio_string_lower TRIO_PROTO((trio_string_t *self));
-TRIO_STRING_PUBLIC int trio_string_match TRIO_PROTO((trio_string_t *self, trio_string_t *other));
-TRIO_STRING_PUBLIC int trio_string_match_case TRIO_PROTO((trio_string_t *self, trio_string_t *other));
-TRIO_STRING_PUBLIC char *trio_string_substring TRIO_PROTO((trio_string_t *self, trio_string_t *other));
-TRIO_STRING_PUBLIC int trio_string_upper TRIO_PROTO((trio_string_t *self));
-
-TRIO_STRING_PUBLIC int trio_xstring_append TRIO_PROTO((trio_string_t *self, const char *other));
-TRIO_STRING_PUBLIC int trio_xstring_contains TRIO_PROTO((trio_string_t *self, const char *other));
-TRIO_STRING_PUBLIC int trio_xstring_copy TRIO_PROTO((trio_string_t *self, const char *other));
-TRIO_STRING_PUBLIC int trio_xstring_equal TRIO_PROTO((trio_string_t *self, const char *other));
-TRIO_STRING_PUBLIC int trio_xstring_equal_max TRIO_PROTO((trio_string_t *self, size_t max, const char *other));
-TRIO_STRING_PUBLIC int trio_xstring_equal_case TRIO_PROTO((trio_string_t *self, const char *other));
-TRIO_STRING_PUBLIC int trio_xstring_equal_case_max TRIO_PROTO((trio_string_t *self, size_t max, const char *other));
-TRIO_STRING_PUBLIC int trio_xstring_match TRIO_PROTO((trio_string_t *self, const char *other));
-TRIO_STRING_PUBLIC int trio_xstring_match_case TRIO_PROTO((trio_string_t *self, const char *other));
-TRIO_STRING_PUBLIC char *trio_xstring_substring TRIO_PROTO((trio_string_t *self, const char *other));
-
-#endif /* !defined(TRIO_MINIMAL) */
+#if defined(TRIO_FUNC_STRING_APPEND)
+TRIO_PUBLIC_STRING int
+trio_string_append
+TRIO_PROTO((trio_string_t *self, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_CONTAINS)
+TRIO_PUBLIC_STRING int
+trio_string_contains
+TRIO_PROTO((trio_string_t *self, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_COPY)
+TRIO_PUBLIC_STRING int
+trio_string_copy
+TRIO_PROTO((trio_string_t *self, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_CREATE)
+TRIO_PUBLIC_STRING trio_string_t *
+trio_string_create
+TRIO_PROTO((int initial_size));
+#endif
+
+#if defined(TRIO_FUNC_STRING_DESTROY)
+TRIO_PUBLIC_STRING void
+trio_string_destroy
+TRIO_PROTO((trio_string_t *self));
+#endif
+
+#if defined(TRIO_FUNC_STRING_DUPLICATE)
+TRIO_PUBLIC_STRING trio_string_t *
+trio_string_duplicate
+TRIO_PROTO((trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_EQUAL)
+TRIO_PUBLIC_STRING int
+trio_string_equal
+TRIO_PROTO((trio_string_t *self, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_EQUAL_MAX)
+TRIO_PUBLIC_STRING int
+trio_string_equal_max
+TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *second));
+#endif
+
+#if defined(TRIO_FUNC_STRING_EQUAL_CASE)
+TRIO_PUBLIC_STRING int
+trio_string_equal_case
+TRIO_PROTO((trio_string_t *self, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_EQUAL_CASE_MAX)
+TRIO_PUBLIC_STRING int
+trio_string_equal_case_max
+TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_EXTRACT)
+TRIO_PUBLIC_STRING char *
+trio_string_extract
+TRIO_PROTO((trio_string_t *self));
+#endif
+
+#if defined(TRIO_FUNC_STRING_FORMAT_DATE_MAX)
+TRIO_PUBLIC_STRING size_t
+trio_string_format_date_max
+TRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *format, TRIO_CONST struct tm *datetime));
+#endif
+
+#if defined(TRIO_FUNC_STRING_GET)
+TRIO_PUBLIC_STRING char *
+trio_string_get
+TRIO_PROTO((trio_string_t *self, int offset));
+#endif
+
+#if defined(TRIO_FUNC_STRING_INDEX)
+TRIO_PUBLIC_STRING char *
+trio_string_index
+TRIO_PROTO((trio_string_t *self, int character));
+#endif
+
+#if defined(TRIO_FUNC_STRING_INDEX_LAST)
+TRIO_PUBLIC_STRING char *
+trio_string_index_last
+TRIO_PROTO((trio_string_t *self, int character));
+#endif
+
+#if defined(TRIO_FUNC_STRING_LENGTH)
+TRIO_PUBLIC_STRING int
+trio_string_length
+TRIO_PROTO((trio_string_t *self));
+#endif
+
+#if defined(TRIO_FUNC_STRING_LOWER)
+TRIO_PUBLIC_STRING int
+trio_string_lower
+TRIO_PROTO((trio_string_t *self));
+#endif
+
+#if defined(TRIO_FUNC_STRING_MATCH)
+TRIO_PUBLIC_STRING int
+trio_string_match
+TRIO_PROTO((trio_string_t *self, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_MATCH_CASE)
+TRIO_PUBLIC_STRING int
+trio_string_match_case
+TRIO_PROTO((trio_string_t *self, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_SIZE)
+TRIO_PUBLIC_STRING int
+trio_string_size
+TRIO_PROTO((trio_string_t *self));
+#endif
+
+#if defined(TRIO_FUNC_STRING_SUBSTRING)
+TRIO_PUBLIC_STRING char *
+trio_string_substring
+TRIO_PROTO((trio_string_t *self, trio_string_t *other));
+#endif
+
+#if defined(TRIO_FUNC_STRING_TERMINATE)
+TRIO_PUBLIC_STRING void
+trio_string_terminate
+TRIO_PROTO((trio_string_t *self));
+#endif
+
+#if defined(TRIO_FUNC_STRING_UPPER)
+TRIO_PUBLIC_STRING int
+trio_string_upper
+TRIO_PROTO((trio_string_t *self));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_APPEND)
+TRIO_PUBLIC_STRING int
+trio_xstring_append
+TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_APPEND_CHAR)
+TRIO_PUBLIC_STRING int
+trio_xstring_append_char
+TRIO_PROTO((trio_string_t *self, char character));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_CONTAINS)
+TRIO_PUBLIC_STRING int
+trio_xstring_contains
+TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_COPY)
+TRIO_PUBLIC_STRING int
+trio_xstring_copy
+TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_DUPLICATE)
+TRIO_PUBLIC_STRING trio_string_t *
+trio_xstring_duplicate
+TRIO_PROTO((TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_EQUAL)
+TRIO_PUBLIC_STRING int
+trio_xstring_equal
+TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_EQUAL_MAX)
+TRIO_PUBLIC_STRING int
+trio_xstring_equal_max
+TRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE)
+TRIO_PUBLIC_STRING int
+trio_xstring_equal_case
+TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE_MAX)
+TRIO_PUBLIC_STRING int
+trio_xstring_equal_case_max
+TRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_MATCH)
+TRIO_PUBLIC_STRING int
+trio_xstring_match
+TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_MATCH_CASE)
+TRIO_PUBLIC_STRING int
+trio_xstring_match_case
+TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_SET)
+TRIO_PUBLIC_STRING void
+trio_xstring_set
+TRIO_PROTO((trio_string_t *self, char *buffer));
+#endif
+
+#if defined(TRIO_FUNC_XSTRING_SUBSTRING)
+TRIO_PUBLIC_STRING char *
+trio_xstring_substring
+TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
#endif /* TRIO_TRIOSTR_H */