2002-01-19 18:40:18 +03:00
/*************************************************************************
*
* $ Id $
*
* Copyright ( C ) 2001 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 .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*************************************************************************
* Include files
*/
# include <assert.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <math.h>
2002-09-26 02:44:43 +04:00
# include "triodef.h"
2002-01-19 18:40:18 +03:00
# include "triostr.h"
/*************************************************************************
* Definitions
*/
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_STRING_PUBLIC)
# define TRIO_STRING_PUBLIC TRIO_PUBLIC
# endif
# if !defined(TRIO_STRING_PRIVATE)
# define TRIO_STRING_PRIVATE TRIO_PRIVATE
# endif
# if !defined(NULL)
2002-01-19 18:40:18 +03:00
# define NULL 0
# endif
2002-09-26 02:44:43 +04:00
# if !defined(NIL)
# define NIL ((char)0)
# endif
# if !defined(FALSE)
2002-01-19 18:40:18 +03:00
# define FALSE (1 == 0)
# define TRUE (! FALSE)
# endif
2002-09-26 02:44:43 +04:00
# if !defined(BOOLEAN_T)
# define BOOLEAN_T int
# endif
2002-01-19 18:40:18 +03:00
2013-12-17 11:32:57 +04:00
# ifdef __VMS
# define USE_STRTOD
# elif defined(TRIO_COMPILER_SUPPORTS_C99)
2002-01-19 18:40:18 +03:00
# define USE_STRTOD
# define USE_STRTOF
# elif defined(TRIO_COMPILER_MSVC)
# define USE_STRTOD
# endif
# if defined(TRIO_PLATFORM_UNIX)
# define USE_STRCASECMP
# define USE_STRNCASECMP
2003-04-03 19:28:28 +04:00
# if defined(TRIO_PLATFORM_SUNOS)
# define USE_SYS_ERRLIST
# else
# define USE_STRERROR
# endif
2002-01-19 18:40:18 +03:00
# if defined(TRIO_PLATFORM_QNX)
# define strcasecmp(x,y) stricmp(x,y)
# define strncasecmp(x,y,n) strnicmp(x,y,n)
# endif
# elif defined(TRIO_PLATFORM_WIN32)
# define USE_STRCASECMP
2007-04-17 16:44:58 +04:00
# if defined(_WIN32_WCE)
# define strcasecmp(x,y) _stricmp(x,y)
# else
# define strcasecmp(x,y) strcmpi(x,y)
# endif
2013-12-12 11:11:40 +04:00
# elif defined(TRIO_PLATFORM_OS400)
# define USE_STRCASECMP
# define USE_STRNCASECMP
# include <strings.h>
2002-01-19 18:40:18 +03:00
# endif
2003-04-03 19:28:28 +04:00
# if !(defined(TRIO_PLATFORM_SUNOS))
# define USE_TOLOWER
# define USE_TOUPPER
# endif
2002-01-19 18:40:18 +03:00
/*************************************************************************
* Structures
*/
struct _trio_string_t
{
char * content ;
size_t length ;
size_t allocated ;
} ;
2002-09-26 02:44:43 +04:00
/*************************************************************************
* Constants
*/
# if !defined(TRIO_MINIMAL)
static TRIO_CONST char rcsid [ ] = " @(#)$Id$ " ;
# endif
2002-01-19 18:40:18 +03:00
/*************************************************************************
* Static String Functions
*/
# if defined(TRIO_DOCUMENTATION)
# include "doc / doc_static.h"
# endif
/** @addtogroup StaticStrings
@ {
*/
/**
Create new string .
@ param size Size of new string .
@ return Pointer to string , or NULL if allocation failed .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_create
TRIO_ARGS1 ( ( size ) ,
size_t size )
2002-01-19 18:40:18 +03:00
{
return ( char * ) TRIO_MALLOC ( size ) ;
}
/**
Destroy string .
@ param string String to be freed .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC void
trio_destroy
TRIO_ARGS1 ( ( string ) ,
char * string )
2002-01-19 18:40:18 +03:00
{
if ( string )
{
TRIO_FREE ( string ) ;
}
}
/**
Count the number of characters in a string .
@ param string String to measure .
@ return Number of characters in @ string .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC size_t
trio_length
TRIO_ARGS1 ( ( string ) ,
TRIO_CONST char * string )
2002-01-19 18:40:18 +03:00
{
return strlen ( string ) ;
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Append @ p source at the end of @ p target .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param target Target string .
@ param source Source string .
@ return Boolean value indicating success or failure .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ pre @ p target must point to a memory chunk with sufficient room to
contain the @ p target string and @ p source string .
@ pre No boundary checking is performed , so insufficient memory will
result in a buffer overrun .
@ post @ p target will be zero terminated .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_append
TRIO_ARGS2 ( ( target , source ) ,
char * target ,
TRIO_CONST char * source )
2002-01-19 18:40:18 +03:00
{
assert ( target ) ;
assert ( source ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return ( strcat ( target , source ) ! = NULL ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Append at most @ p max characters from @ p source to @ p target .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param target Target string .
@ param max Maximum number of characters to append .
@ param source Source string .
@ return Boolean value indicating success or failure .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ pre @ p target must point to a memory chuck with sufficient room to
contain the @ p target string and the @ p source string ( at most @ p max
characters ) .
@ pre No boundary checking is performed , so insufficient memory will
result in a buffer overrun .
@ post @ p target will be zero terminated .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_append_max
TRIO_ARGS3 ( ( target , max , source ) ,
char * target ,
size_t max ,
TRIO_CONST char * source )
2002-01-19 18:40:18 +03:00
{
size_t length ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
assert ( target ) ;
assert ( source ) ;
length = trio_length ( target ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
if ( max > length )
{
strncat ( target , source , max - length - 1 ) ;
}
return TRUE ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Determine if a string contains a substring .
@ param string String to be searched .
@ param substring String to be found .
@ return Boolean value indicating success or failure .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_contains
TRIO_ARGS2 ( ( string , substring ) ,
TRIO_CONST char * string ,
TRIO_CONST char * substring )
2002-01-19 18:40:18 +03:00
{
assert ( string ) ;
assert ( substring ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return ( 0 ! = strstr ( string , substring ) ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Copy @ p source to @ p target .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param target Target string .
@ param source Source string .
@ return Boolean value indicating success or failure .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ pre @ p target must point to a memory chunk with sufficient room to
contain the @ p source string .
@ pre No boundary checking is performed , so insufficient memory will
result in a buffer overrun .
@ post @ p target will be zero terminated .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_copy
TRIO_ARGS2 ( ( target , source ) ,
char * target ,
TRIO_CONST char * source )
2002-01-19 18:40:18 +03:00
{
assert ( target ) ;
assert ( source ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
( void ) strcpy ( target , source ) ;
return TRUE ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/**
Copy at most @ p max characters from @ p source to @ p target .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param target Target string .
@ param max Maximum number of characters to append .
@ param source Source string .
@ return Boolean value indicating success or failure .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ pre @ p target must point to a memory chunk with sufficient room to
contain the @ p source string ( at most @ p max characters ) .
@ pre No boundary checking is performed , so insufficient memory will
result in a buffer overrun .
@ post @ p target will be zero terminated .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_copy_max
TRIO_ARGS3 ( ( target , max , source ) ,
char * target ,
size_t max ,
TRIO_CONST char * source )
2002-01-19 18:40:18 +03:00
{
assert ( target ) ;
assert ( source ) ;
assert ( max > 0 ) ; /* Includes != 0 */
( void ) strncpy ( target , source , max - 1 ) ;
target [ max - 1 ] = ( char ) 0 ;
return TRUE ;
}
2002-09-26 02:44:43 +04:00
/*
* TrioDuplicateMax
*/
TRIO_STRING_PRIVATE char *
TrioDuplicateMax
TRIO_ARGS2 ( ( source , size ) ,
TRIO_CONST char * source ,
size_t size )
{
char * target ;
assert ( source ) ;
/* Make room for string plus a terminating zero */
size + + ;
target = trio_create ( size ) ;
if ( target )
{
trio_copy_max ( target , size , source ) ;
}
return target ;
}
2002-01-19 18:40:18 +03:00
/**
Duplicate @ p source .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param source Source string .
@ return A copy of the @ p source string .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ post @ p target will be zero terminated .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_duplicate
TRIO_ARGS1 ( ( source ) ,
TRIO_CONST char * source )
2002-01-19 18:40:18 +03:00
{
return TrioDuplicateMax ( source , trio_length ( source ) ) ;
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Duplicate at most @ p max characters of @ p source .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param source Source string .
@ param max Maximum number of characters to duplicate .
@ return A copy of the @ p source string .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ post @ p target will be zero terminated .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_duplicate_max TRIO_ARGS2 ( ( source , max ) ,
TRIO_CONST char * source ,
size_t max )
2002-01-19 18:40:18 +03:00
{
size_t length ;
assert ( source ) ;
assert ( max > 0 ) ;
length = trio_length ( source ) ;
if ( length > max )
{
length = max ;
}
return TrioDuplicateMax ( source , length ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/**
Compare if two strings are equal .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param first First string .
@ param second Second string .
@ return Boolean indicating whether the two strings are equal or not .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
Case - insensitive comparison .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_equal
TRIO_ARGS2 ( ( first , second ) ,
TRIO_CONST char * first ,
TRIO_CONST char * second )
2002-01-19 18:40:18 +03:00
{
assert ( first ) ;
assert ( second ) ;
if ( ( first ! = NULL ) & & ( second ! = NULL ) )
{
# if defined(USE_STRCASECMP)
return ( 0 = = strcasecmp ( first , second ) ) ;
# else
while ( ( * first ! = NIL ) & & ( * second ! = NIL ) )
{
2003-04-03 19:28:28 +04:00
if ( trio_to_upper ( * first ) ! = trio_to_upper ( * second ) )
2002-01-19 18:40:18 +03:00
{
break ;
}
first + + ;
second + + ;
}
return ( ( * first = = NIL ) & & ( * second = = NIL ) ) ;
# endif
}
return FALSE ;
}
/**
Compare if two strings are equal .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param first First string .
@ param second Second string .
@ return Boolean indicating whether the two strings are equal or not .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
Case - sensitive comparison .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_equal_case
TRIO_ARGS2 ( ( first , second ) ,
TRIO_CONST char * first ,
TRIO_CONST char * second )
2002-01-19 18:40:18 +03:00
{
assert ( first ) ;
assert ( second ) ;
if ( ( first ! = NULL ) & & ( second ! = NULL ) )
{
return ( 0 = = strcmp ( first , second ) ) ;
}
return FALSE ;
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Compare if two strings up until the first @ p max characters are equal .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param first First string .
@ param max Maximum number of characters to compare .
@ param second Second string .
@ return Boolean indicating whether the two strings are equal or not .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
Case - sensitive comparison .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_equal_case_max
TRIO_ARGS3 ( ( first , max , second ) ,
TRIO_CONST char * first ,
size_t max ,
TRIO_CONST char * second )
2002-01-19 18:40:18 +03:00
{
assert ( first ) ;
assert ( second ) ;
if ( ( first ! = NULL ) & & ( second ! = NULL ) )
{
return ( 0 = = strncmp ( first , second , max ) ) ;
}
return FALSE ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/**
Compare if two strings are equal .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param first First string .
@ param second Second string .
@ return Boolean indicating whether the two strings are equal or not .
Collating characters are considered equal .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_equal_locale
TRIO_ARGS2 ( ( first , second ) ,
TRIO_CONST char * first ,
TRIO_CONST char * second )
2002-01-19 18:40:18 +03:00
{
assert ( first ) ;
assert ( second ) ;
# if defined(LC_COLLATE)
return ( strcoll ( first , second ) = = 0 ) ;
# else
return trio_equal ( first , second ) ;
# endif
}
/**
Compare if two strings up until the first @ p max characters are equal .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param first First string .
@ param max Maximum number of characters to compare .
@ param second Second string .
@ return Boolean indicating whether the two strings are equal or not .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
Case - insensitive comparison .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_equal_max
TRIO_ARGS3 ( ( first , max , second ) ,
TRIO_CONST char * first ,
size_t max ,
TRIO_CONST char * second )
2002-01-19 18:40:18 +03:00
{
assert ( first ) ;
assert ( second ) ;
if ( ( first ! = NULL ) & & ( second ! = NULL ) )
{
# if defined(USE_STRNCASECMP)
return ( 0 = = strncasecmp ( first , second , max ) ) ;
# else
/* Not adequately tested yet */
size_t cnt = 0 ;
while ( ( * first ! = NIL ) & & ( * second ! = NIL ) & & ( cnt < = max ) )
{
2003-04-03 19:28:28 +04:00
if ( trio_to_upper ( * first ) ! = trio_to_upper ( * second ) )
2002-01-19 18:40:18 +03:00
{
break ;
}
first + + ;
second + + ;
cnt + + ;
}
return ( ( cnt = = max ) | | ( ( * first = = NIL ) & & ( * second = = NIL ) ) ) ;
# endif
}
return FALSE ;
}
/**
Provide a textual description of an error code ( errno ) .
@ param error_number Error number .
@ return Textual description of @ p error_number .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC TRIO_CONST char *
trio_error
TRIO_ARGS1 ( ( error_number ) ,
int error_number )
2002-01-19 18:40:18 +03:00
{
# if defined(USE_STRERROR)
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return strerror ( error_number ) ;
2003-04-03 19:28:28 +04:00
# elif defined(USE_SYS_ERRLIST)
extern char * sys_errlist [ ] ;
extern int sys_nerr ;
return ( ( error_number < 0 ) | | ( error_number > = sys_nerr ) )
? " unknown "
: sys_errlist [ error_number ] ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
# else
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return " unknown " ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
# endif
}
2007-04-17 16:44:58 +04:00
# if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE)
2002-01-19 18:40:18 +03:00
/**
Format the date / time according to @ p format .
@ param target Target string .
@ param max Maximum number of characters to format .
@ param format Formatting string .
@ param datetime Date / time structure .
@ return Number of formatted characters .
The formatting string accepts the same specifiers as the standard C
function strftime .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC size_t
trio_format_date_max
TRIO_ARGS4 ( ( target , max , format , datetime ) ,
char * target ,
size_t max ,
TRIO_CONST char * format ,
TRIO_CONST struct tm * datetime )
2002-01-19 18:40:18 +03:00
{
assert ( target ) ;
assert ( format ) ;
assert ( datetime ) ;
assert ( max > 0 ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return strftime ( target , max , format , datetime ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Calculate a hash value for a string .
@ param string String to be calculated on .
@ param type Hash function .
@ return Calculated hash value .
@ p type can be one of the following
@ li @ c TRIO_HASH_PLAIN Plain hash function .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC unsigned long
trio_hash
TRIO_ARGS2 ( ( string , type ) ,
TRIO_CONST char * string ,
int type )
2002-01-19 18:40:18 +03:00
{
unsigned long value = 0L ;
char ch ;
assert ( string ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
switch ( type )
{
case TRIO_HASH_PLAIN :
while ( ( ch = * string + + ) ! = NIL )
{
value * = 31 ;
value + = ( unsigned long ) ch ;
}
break ;
default :
assert ( FALSE ) ;
break ;
}
return value ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Find first occurrence of a character in a string .
@ param string String to be searched .
@ param character Character to be found .
@ param A pointer to the found character , or NULL if character was not found .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_index
TRIO_ARGS2 ( ( string , character ) ,
TRIO_CONST char * string ,
int character )
2002-01-19 18:40:18 +03:00
{
assert ( string ) ;
return strchr ( string , character ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Find last occurrence of a character in a string .
@ param string String to be searched .
@ param character Character to be found .
@ param A pointer to the found character , or NULL if character was not found .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_index_last
TRIO_ARGS2 ( ( string , character ) ,
TRIO_CONST char * string ,
int character )
2002-01-19 18:40:18 +03:00
{
assert ( string ) ;
return strchr ( string , character ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Convert the alphabetic letters in the string to lower - case .
@ param target String to be converted .
@ return Number of processed characters ( converted or not ) .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_lower
TRIO_ARGS1 ( ( target ) ,
char * target )
2002-01-19 18:40:18 +03:00
{
assert ( target ) ;
2003-04-03 19:28:28 +04:00
return trio_span_function ( target , target , trio_to_lower ) ;
2002-01-19 18:40:18 +03:00
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Compare two strings using wildcards .
@ param string String to be searched .
@ param pattern Pattern , including wildcards , to search for .
@ return Boolean value indicating success or failure .
Case - insensitive comparison .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
The following wildcards can be used
@ li @ c * Match any number of characters .
@ li @ c ? Match a single character .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_match
TRIO_ARGS2 ( ( string , pattern ) ,
TRIO_CONST char * string ,
TRIO_CONST char * pattern )
2002-01-19 18:40:18 +03:00
{
assert ( string ) ;
assert ( pattern ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
for ( ; ( ' * ' ! = * pattern ) ; + + pattern , + + string )
{
if ( NIL = = * string )
{
return ( NIL = = * pattern ) ;
}
2003-04-03 19:28:28 +04:00
if ( ( trio_to_upper ( ( int ) * string ) ! = trio_to_upper ( ( int ) * pattern ) )
2002-01-19 18:40:18 +03:00
& & ( ' ? ' ! = * pattern ) )
{
return FALSE ;
}
}
/* two-line patch to prevent *too* much recursiveness: */
while ( ' * ' = = pattern [ 1 ] )
pattern + + ;
do
{
if ( trio_match ( string , & pattern [ 1 ] ) )
{
return TRUE ;
}
}
while ( * string + + ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return FALSE ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Compare two strings using wildcards .
@ param string String to be searched .
@ param pattern Pattern , including wildcards , to search for .
@ return Boolean value indicating success or failure .
Case - sensitive comparison .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
The following wildcards can be used
@ li @ c * Match any number of characters .
@ li @ c ? Match a single character .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_match_case
TRIO_ARGS2 ( ( string , pattern ) ,
TRIO_CONST char * string ,
TRIO_CONST char * pattern )
2002-01-19 18:40:18 +03:00
{
assert ( string ) ;
assert ( pattern ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
for ( ; ( ' * ' ! = * pattern ) ; + + pattern , + + string )
{
if ( NIL = = * string )
{
return ( NIL = = * pattern ) ;
}
if ( ( * string ! = * pattern )
& & ( ' ? ' ! = * pattern ) )
{
return FALSE ;
}
}
/* two-line patch to prevent *too* much recursiveness: */
while ( ' * ' = = pattern [ 1 ] )
pattern + + ;
do
{
if ( trio_match_case ( string , & pattern [ 1 ] ) )
{
return TRUE ;
}
}
while ( * string + + ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return FALSE ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Execute a function on each character in string .
@ param target Target string .
@ param source Source string .
@ param Function Function to be executed .
@ return Number of processed characters .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC size_t
trio_span_function
TRIO_ARGS3 ( ( target , source , Function ) ,
char * target ,
TRIO_CONST char * source ,
int ( * Function ) TRIO_PROTO ( ( int ) ) )
2002-01-19 18:40:18 +03:00
{
size_t count = 0 ;
assert ( target ) ;
assert ( source ) ;
assert ( Function ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
while ( * source ! = NIL )
{
* target + + = Function ( * source + + ) ;
count + + ;
}
return count ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Search for a substring in a string .
@ param string String to be searched .
@ param substring String to be found .
@ return Pointer to first occurrence of @ p substring in @ p string , or NULL
if no match was found .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_substring
TRIO_ARGS2 ( ( string , substring ) ,
TRIO_CONST char * string ,
TRIO_CONST char * substring )
2002-01-19 18:40:18 +03:00
{
assert ( string ) ;
assert ( substring ) ;
return strstr ( string , substring ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Search for a substring in the first @ p max characters of a string .
@ param string String to be searched .
@ param max Maximum characters to be searched .
@ param substring String to be found .
@ return Pointer to first occurrence of @ p substring in @ p string , or NULL
if no match was found .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_substring_max
TRIO_ARGS3 ( ( string , max , substring ) ,
TRIO_CONST char * string ,
size_t max ,
TRIO_CONST char * substring )
2002-01-19 18:40:18 +03:00
{
size_t count ;
size_t size ;
char * result = NULL ;
assert ( string ) ;
assert ( substring ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
size = trio_length ( substring ) ;
if ( size < = max )
{
for ( count = 0 ; count < = max - size ; count + + )
{
if ( trio_equal_max ( substring , size , & string [ count ] ) )
{
result = ( char * ) & string [ count ] ;
break ;
}
}
}
return result ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Tokenize string .
@ param string String to be tokenized .
@ param tokens String containing list of delimiting characters .
@ return Start of new token .
@ warning @ p string will be destroyed .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_tokenize
TRIO_ARGS2 ( ( string , delimiters ) ,
char * string ,
TRIO_CONST char * delimiters )
2002-01-19 18:40:18 +03:00
{
assert ( delimiters ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return strtok ( string , delimiters ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/**
Convert string to floating - point number .
@ param source String to be converted .
@ param endp Pointer to end of the converted string .
@ return A floating - point number .
The following Extended Backus - Naur form is used
@ verbatim
double : : = [ < sign > ]
( < number > |
< number > < decimal_point > < number > |
< decimal_point > < number > )
[ < exponential > [ < sign > ] < number > ]
number : : = 1 * ( < digit > )
digit : : = ( ' 0 ' | ' 1 ' | ' 2 ' | ' 3 ' | ' 4 ' | ' 5 ' | ' 6 ' | ' 7 ' | ' 8 ' | ' 9 ' )
exponential : : = ( ' e ' | ' E ' )
sign : : = ( ' - ' | ' + ' )
decimal_point : : = ' . '
@ endverbatim
*/
/* FIXME: Add EBNF for hex-floats */
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC trio_long_double_t
trio_to_long_double
TRIO_ARGS2 ( ( source , endp ) ,
TRIO_CONST char * source ,
char * * endp )
{
# if defined(USE_STRTOLD)
return strtold ( source , endp ) ;
2002-01-19 18:40:18 +03:00
# else
int isNegative = FALSE ;
int isExponentNegative = FALSE ;
2002-09-26 02:44:43 +04:00
trio_long_double_t integer = 0.0 ;
trio_long_double_t fraction = 0.0 ;
2002-01-19 18:40:18 +03:00
unsigned long exponent = 0 ;
2002-09-26 02:44:43 +04:00
trio_long_double_t base ;
trio_long_double_t fracdiv = 1.0 ;
trio_long_double_t value = 0.0 ;
2002-01-19 18:40:18 +03:00
/* First try hex-floats */
if ( ( source [ 0 ] = = ' 0 ' ) & & ( ( source [ 1 ] = = ' x ' ) | | ( source [ 1 ] = = ' X ' ) ) )
{
2002-09-26 02:44:43 +04:00
base = 16.0 ;
2002-01-19 18:40:18 +03:00
source + = 2 ;
while ( isxdigit ( ( int ) * source ) )
{
2002-09-26 02:44:43 +04:00
integer * = base ;
2002-01-19 18:40:18 +03:00
integer + = ( isdigit ( ( int ) * source )
? ( * source - ' 0 ' )
2003-04-03 19:28:28 +04:00
: 10 + ( trio_to_upper ( ( int ) * source ) - ' A ' ) ) ;
2002-01-19 18:40:18 +03:00
source + + ;
}
if ( * source = = ' . ' )
{
source + + ;
while ( isxdigit ( ( int ) * source ) )
{
2002-09-26 02:44:43 +04:00
fracdiv / = base ;
fraction + = fracdiv * ( isdigit ( ( int ) * source )
? ( * source - ' 0 ' )
2003-04-03 19:28:28 +04:00
: 10 + ( trio_to_upper ( ( int ) * source ) - ' A ' ) ) ;
2002-01-19 18:40:18 +03:00
source + + ;
}
if ( ( * source = = ' p ' ) | | ( * source = = ' P ' ) )
{
source + + ;
if ( ( * source = = ' + ' ) | | ( * source = = ' - ' ) )
{
isExponentNegative = ( * source = = ' - ' ) ;
source + + ;
}
while ( isdigit ( ( int ) * source ) )
{
2003-04-03 19:28:28 +04:00
exponent * = 10 ;
2002-01-19 18:40:18 +03:00
exponent + = ( * source - ' 0 ' ) ;
source + + ;
}
}
}
2003-04-03 19:28:28 +04:00
/* For later use with exponent */
base = 2.0 ;
2002-01-19 18:40:18 +03:00
}
else /* Then try normal decimal floats */
{
2002-09-26 02:44:43 +04:00
base = 10.0 ;
2002-01-19 18:40:18 +03:00
isNegative = ( * source = = ' - ' ) ;
/* Skip sign */
if ( ( * source = = ' + ' ) | | ( * source = = ' - ' ) )
source + + ;
/* Integer part */
while ( isdigit ( ( int ) * source ) )
{
2002-09-26 02:44:43 +04:00
integer * = base ;
2002-01-19 18:40:18 +03:00
integer + = ( * source - ' 0 ' ) ;
source + + ;
}
if ( * source = = ' . ' )
{
source + + ; /* skip decimal point */
while ( isdigit ( ( int ) * source ) )
{
2002-09-26 02:44:43 +04:00
fracdiv / = base ;
fraction + = ( * source - ' 0 ' ) * fracdiv ;
2002-01-19 18:40:18 +03:00
source + + ;
}
}
if ( ( * source = = ' e ' )
| | ( * source = = ' E ' )
# if TRIO_MICROSOFT
| | ( * source = = ' d ' )
| | ( * source = = ' D ' )
# endif
)
{
source + + ; /* Skip exponential indicator */
isExponentNegative = ( * source = = ' - ' ) ;
if ( ( * source = = ' + ' ) | | ( * source = = ' - ' ) )
source + + ;
while ( isdigit ( ( int ) * source ) )
{
2002-09-26 02:44:43 +04:00
exponent * = ( int ) base ;
2002-01-19 18:40:18 +03:00
exponent + = ( * source - ' 0 ' ) ;
source + + ;
}
}
}
2012-09-11 09:26:36 +04:00
2002-09-26 02:44:43 +04:00
value = integer + fraction ;
2002-01-19 18:40:18 +03:00
if ( exponent ! = 0 )
{
if ( isExponentNegative )
2002-09-26 02:44:43 +04:00
value / = pow ( base , ( double ) exponent ) ;
2002-01-19 18:40:18 +03:00
else
2002-09-26 02:44:43 +04:00
value * = pow ( base , ( double ) exponent ) ;
2002-01-19 18:40:18 +03:00
}
if ( isNegative )
value = - value ;
if ( endp )
2002-09-26 02:44:43 +04:00
* endp = ( char * ) source ;
2002-01-19 18:40:18 +03:00
return value ;
# endif
}
/**
Convert string to floating - point number .
@ param source String to be converted .
@ param endp Pointer to end of the converted string .
@ return A floating - point number .
2002-09-26 02:44:43 +04:00
See @ ref trio_to_long_double .
*/
TRIO_STRING_PUBLIC double
trio_to_double
TRIO_ARGS2 ( ( source , endp ) ,
TRIO_CONST char * source ,
char * * endp )
{
# if defined(USE_STRTOD)
return strtod ( source , endp ) ;
# else
return ( double ) trio_to_long_double ( source , endp ) ;
# endif
}
# if !defined(TRIO_MINIMAL)
/**
Convert string to floating - point number .
@ param source String to be converted .
@ param endp Pointer to end of the converted string .
@ return A floating - point number .
See @ ref trio_to_long_double .
2002-01-19 18:40:18 +03:00
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC float
trio_to_float
TRIO_ARGS2 ( ( source , endp ) ,
TRIO_CONST char * source ,
char * * endp )
2002-01-19 18:40:18 +03:00
{
# if defined(USE_STRTOF)
2002-09-26 02:44:43 +04:00
return strtof ( source , endp ) ;
2002-01-19 18:40:18 +03:00
# else
2002-09-26 02:44:43 +04:00
return ( float ) trio_to_long_double ( source , endp ) ;
2002-01-19 18:40:18 +03:00
# endif
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/**
Convert string to signed integer .
@ param string String to be converted .
@ param endp Pointer to end of converted string .
@ param base Radix number of number .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC long
trio_to_long
TRIO_ARGS3 ( ( string , endp , base ) ,
TRIO_CONST char * string ,
char * * endp ,
int base )
2002-01-19 18:40:18 +03:00
{
assert ( string ) ;
assert ( ( base > = 2 ) & & ( base < = 36 ) ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return strtol ( string , endp , base ) ;
}
2003-04-03 19:28:28 +04:00
# if !defined(TRIO_MINIMAL)
/**
Convert one alphabetic letter to lower - case .
@ param source The letter to be converted .
@ return The converted letter .
*/
TRIO_STRING_PUBLIC int
trio_to_lower
TRIO_ARGS1 ( ( source ) ,
int source )
{
# if defined(USE_TOLOWER)
2012-09-11 09:26:36 +04:00
2003-04-03 19:28:28 +04:00
return tolower ( source ) ;
2012-09-11 09:26:36 +04:00
2003-04-03 19:28:28 +04:00
# else
/* Does not handle locales or non-contiguous alphabetic characters */
return ( ( source > = ( int ) ' A ' ) & & ( source < = ( int ) ' Z ' ) )
? source - ' A ' + ' a '
: source ;
2012-09-11 09:26:36 +04:00
2003-04-03 19:28:28 +04:00
# endif
}
# endif /* !defined(TRIO_MINIMAL) */
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Convert string to unsigned integer .
@ param string String to be converted .
@ param endp Pointer to end of converted string .
@ param base Radix number of number .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC unsigned long
trio_to_unsigned_long
TRIO_ARGS3 ( ( string , endp , base ) ,
TRIO_CONST char * string ,
char * * endp ,
int base )
2002-01-19 18:40:18 +03:00
{
assert ( string ) ;
assert ( ( base > = 2 ) & & ( base < = 36 ) ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
return strtoul ( string , endp , base ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2003-04-03 19:28:28 +04:00
/**
Convert one alphabetic letter to upper - case .
@ param source The letter to be converted .
@ return The converted letter .
*/
TRIO_STRING_PUBLIC int
trio_to_upper
TRIO_ARGS1 ( ( source ) ,
int source )
{
# if defined(USE_TOUPPER)
2012-09-11 09:26:36 +04:00
2003-04-03 19:28:28 +04:00
return toupper ( source ) ;
2012-09-11 09:26:36 +04:00
2003-04-03 19:28:28 +04:00
# else
/* Does not handle locales or non-contiguous alphabetic characters */
return ( ( source > = ( int ) ' a ' ) & & ( source < = ( int ) ' z ' ) )
? source - ' a ' + ' A '
: source ;
2012-09-11 09:26:36 +04:00
2003-04-03 19:28:28 +04:00
# endif
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Convert the alphabetic letters in the string to upper - case .
@ param target The string to be converted .
@ return The number of processed characters ( converted or not ) .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_upper
TRIO_ARGS1 ( ( target ) ,
char * target )
2002-01-19 18:40:18 +03:00
{
assert ( target ) ;
2003-04-03 19:28:28 +04:00
return trio_span_function ( target , target , trio_to_upper ) ;
2002-01-19 18:40:18 +03:00
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/** @} End of StaticStrings */
/*************************************************************************
* Dynamic String Functions
*/
# if defined(TRIO_DOCUMENTATION)
# include "doc / doc_dynamic.h"
# endif
/** @addtogroup DynamicStrings
@ {
*/
/*
* TrioStringAlloc
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PRIVATE trio_string_t *
TrioStringAlloc ( TRIO_NOARGS )
2002-01-19 18:40:18 +03:00
{
trio_string_t * self ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
self = ( trio_string_t * ) TRIO_MALLOC ( sizeof ( trio_string_t ) ) ;
if ( self )
{
self - > content = NULL ;
self - > length = 0 ;
self - > allocated = 0 ;
}
return self ;
}
/*
* TrioStringGrow
*
* The size of the string will be increased by ' delta ' characters . If
* ' delta ' is zero , the size will be doubled .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PRIVATE BOOLEAN_T
TrioStringGrow
TRIO_ARGS2 ( ( self , delta ) ,
trio_string_t * self ,
size_t delta )
2002-01-19 18:40:18 +03:00
{
BOOLEAN_T status = FALSE ;
char * new_content ;
size_t new_size ;
new_size = ( delta = = 0 )
? ( ( self - > allocated = = 0 ) ? 1 : self - > allocated * 2 )
: self - > allocated + delta ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
new_content = ( char * ) TRIO_REALLOC ( self - > content , new_size ) ;
if ( new_content )
{
self - > content = new_content ;
self - > allocated = new_size ;
status = TRUE ;
}
return status ;
}
2003-04-03 19:28:28 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* TrioStringGrowTo
*
* The size of the string will be increased to ' length ' plus one characters .
* If ' length ' is less than the original size , the original size will be
* used ( that is , the size of the string is never decreased ) .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PRIVATE BOOLEAN_T
TrioStringGrowTo
TRIO_ARGS2 ( ( self , length ) ,
trio_string_t * self ,
size_t length )
2002-01-19 18:40:18 +03:00
{
length + + ; /* Room for terminating zero */
return ( self - > allocated < length )
? TrioStringGrow ( self , length - self - > allocated )
: TRUE ;
}
2003-04-03 19:28:28 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Create a new dynamic string .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param initial_size Initial size of the buffer .
@ return Newly allocated dynamic string , or NULL if memory allocation failed .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC trio_string_t *
trio_string_create
TRIO_ARGS1 ( ( initial_size ) ,
int initial_size )
2002-01-19 18:40:18 +03:00
{
trio_string_t * self ;
self = TrioStringAlloc ( ) ;
if ( self )
{
if ( TrioStringGrow ( self ,
( size_t ) ( ( initial_size > 0 ) ? initial_size : 1 ) ) )
{
self - > content [ 0 ] = ( char ) 0 ;
self - > allocated = initial_size ;
}
else
{
trio_string_destroy ( self ) ;
self = NULL ;
}
}
return self ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/**
Deallocate the dynamic string and its contents .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param self Dynamic string
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC void
trio_string_destroy
TRIO_ARGS1 ( ( self ) ,
trio_string_t * self )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
if ( self )
{
trio_destroy ( self - > content ) ;
TRIO_FREE ( self ) ;
}
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Get a pointer to the content .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param self Dynamic string .
@ param offset Offset into content .
@ return Pointer to the content .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ p Offset can be zero , positive , or negative . If @ p offset is zero ,
then the start of the content will be returned . If @ p offset is positive ,
then a pointer to @ p offset number of characters from the beginning of the
content is returned . If @ p offset is negative , then a pointer to @ p offset
number of characters from the ending of the string , starting at the
terminating zero , is returned .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_string_get
TRIO_ARGS2 ( ( self , offset ) ,
trio_string_t * self ,
int offset )
2002-01-19 18:40:18 +03:00
{
char * result = NULL ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
assert ( self ) ;
if ( self - > content ! = NULL )
{
if ( self - > length = = 0 )
{
( void ) trio_string_length ( self ) ;
}
if ( offset > = 0 )
{
2002-09-26 02:44:43 +04:00
if ( offset > ( int ) self - > length )
2002-01-19 18:40:18 +03:00
{
offset = self - > length ;
}
}
else
{
offset + = self - > length + 1 ;
if ( offset < 0 )
{
offset = 0 ;
}
}
result = & ( self - > content [ offset ] ) ;
}
return result ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/**
Extract the content .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param self Dynamic String
@ return Content of dynamic string .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
The content is removed from the dynamic string . This enables destruction
of the dynamic string without deallocation of the content .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_string_extract
TRIO_ARGS1 ( ( self ) ,
trio_string_t * self )
2002-01-19 18:40:18 +03:00
{
char * result ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
assert ( self ) ;
result = self - > content ;
/* FIXME: Allocate new empty buffer? */
self - > content = NULL ;
self - > length = self - > allocated = 0 ;
return result ;
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Set the content of the dynamic string .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param self Dynamic String
@ param buffer The new content .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
Sets the content of the dynamic string to a copy @ p buffer .
An existing content will be deallocated first , if necessary .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ remark
This function will make a copy of @ p buffer .
You are responsible for deallocating @ p buffer yourself .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC void
trio_xstring_set
TRIO_ARGS2 ( ( self , buffer ) ,
trio_string_t * self ,
char * buffer )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
trio_destroy ( self - > content ) ;
self - > content = trio_duplicate ( buffer ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/*
* trio_string_size
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_size
TRIO_ARGS1 ( ( self ) ,
trio_string_t * self )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
return self - > allocated ;
}
/*
* trio_string_terminate
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC void
trio_string_terminate
TRIO_ARGS1 ( ( self ) ,
trio_string_t * self )
2002-01-19 18:40:18 +03:00
{
2002-09-26 02:44:43 +04:00
trio_xstring_append_char ( self , 0 ) ;
2002-01-19 18:40:18 +03:00
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Append the second string to the first .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param self Dynamic string to be modified .
@ param other Dynamic string to copy from .
@ return Boolean value indicating success or failure .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_append
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
size_t length ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
assert ( self ) ;
assert ( other ) ;
length = self - > length + other - > length ;
if ( ! TrioStringGrowTo ( self , length ) )
goto error ;
trio_copy ( & self - > content [ self - > length ] , other - > content ) ;
self - > length = length ;
return TRUE ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
error :
return FALSE ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_append
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_append
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
size_t length ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
assert ( self ) ;
assert ( other ) ;
length = self - > length + trio_length ( other ) ;
if ( ! TrioStringGrowTo ( self , length ) )
goto error ;
trio_copy ( & self - > content [ self - > length ] , other ) ;
self - > length = length ;
return TRUE ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
error :
return FALSE ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_append_char
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_append_char
TRIO_ARGS2 ( ( self , character ) ,
trio_string_t * self ,
char character )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
2002-09-26 02:44:43 +04:00
if ( ( int ) self - > length > = trio_string_size ( self ) )
2002-01-19 18:40:18 +03:00
{
if ( ! TrioStringGrow ( self , 0 ) )
goto error ;
}
self - > content [ self - > length ] = character ;
self - > length + + ;
return TRUE ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
error :
return FALSE ;
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/**
Search for the first occurrence of second parameter in the first .
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
@ param self Dynamic string to be modified .
@ param other Dynamic string to copy from .
@ return Boolean value indicating success or failure .
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_contains
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_contains ( self - > content , other - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_contains
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_contains
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_contains ( self - > content , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_copy
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_copy
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
self - > length = 0 ;
return trio_string_append ( self , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_copy
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_copy
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
self - > length = 0 ;
return trio_xstring_append ( self , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_duplicate
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC trio_string_t *
trio_string_duplicate
TRIO_ARGS1 ( ( other ) ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
trio_string_t * self ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
assert ( other ) ;
self = TrioStringAlloc ( ) ;
if ( self )
{
self - > content = TrioDuplicateMax ( other - > content , other - > length ) ;
if ( self - > content )
{
self - > length = other - > length ;
self - > allocated = self - > length + 1 ;
}
else
{
self - > length = self - > allocated = 0 ;
}
}
return self ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_duplicate
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC trio_string_t *
trio_xstring_duplicate
TRIO_ARGS1 ( ( other ) ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
trio_string_t * self ;
2012-09-11 09:26:36 +04:00
2002-01-19 18:40:18 +03:00
assert ( other ) ;
self = TrioStringAlloc ( ) ;
if ( self )
{
self - > content = TrioDuplicateMax ( other , trio_length ( other ) ) ;
if ( self - > content )
{
self - > length = trio_length ( self - > content ) ;
self - > allocated = self - > length + 1 ;
}
else
{
self - > length = self - > allocated = 0 ;
}
}
return self ;
}
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_equal
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_equal
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_equal ( self - > content , other - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_equal
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_equal
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_equal ( self - > content , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_equal_max
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_equal_max
TRIO_ARGS3 ( ( self , max , other ) ,
trio_string_t * self ,
size_t max ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_equal_max ( self - > content , max , other - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_equal_max
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_equal_max
TRIO_ARGS3 ( ( self , max , other ) ,
trio_string_t * self ,
size_t max ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_equal_max ( self - > content , max , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_equal_case
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_equal_case
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_equal_case ( self - > content , other - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_equal_case
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_equal_case
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_equal_case ( self - > content , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_equal_case_max
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_equal_case_max
TRIO_ARGS3 ( ( self , max , other ) ,
trio_string_t * self ,
size_t max ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_equal_case_max ( self - > content , max , other - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_equal_case_max
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_equal_case_max
TRIO_ARGS3 ( ( self , max , other ) ,
trio_string_t * self ,
size_t max ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_equal_case_max ( self - > content , max , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2007-04-17 16:44:58 +04:00
# if !defined(TRIO_MINIMAL) && !defined(_WIN32_WCE)
2002-01-19 18:40:18 +03:00
/*
* trio_string_format_data_max
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC size_t
trio_string_format_date_max
TRIO_ARGS4 ( ( self , max , format , datetime ) ,
trio_string_t * self ,
size_t max ,
TRIO_CONST char * format ,
TRIO_CONST struct tm * datetime )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
return trio_format_date_max ( self - > content , max , format , datetime ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_index
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_string_index
TRIO_ARGS2 ( ( self , character ) ,
trio_string_t * self ,
int character )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
return trio_index ( self - > content , character ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_index_last
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_string_index_last
TRIO_ARGS2 ( ( self , character ) ,
trio_string_t * self ,
int character )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
return trio_index_last ( self - > content , character ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_length
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_length
TRIO_ARGS1 ( ( self ) ,
trio_string_t * self )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
if ( self - > length = = 0 )
{
self - > length = trio_length ( self - > content ) ;
}
return self - > length ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_lower
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_lower
TRIO_ARGS1 ( ( self ) ,
trio_string_t * self )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
return trio_lower ( self - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_match
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_match
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_match ( self - > content , other - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_match
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_match
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_match ( self - > content , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_match_case
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_match_case
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_match_case ( self - > content , other - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_match_case
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_xstring_match_case
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_match_case ( self - > content , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_substring
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_string_substring
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
trio_string_t * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_substring ( self - > content , other - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_xstring_substring
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC char *
trio_xstring_substring
TRIO_ARGS2 ( ( self , other ) ,
trio_string_t * self ,
TRIO_CONST char * other )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
assert ( other ) ;
return trio_substring ( self - > content , other ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
2002-09-26 02:44:43 +04:00
# if !defined(TRIO_MINIMAL)
2002-01-19 18:40:18 +03:00
/*
* trio_string_upper
*/
2002-09-26 02:44:43 +04:00
TRIO_STRING_PUBLIC int
trio_string_upper
TRIO_ARGS1 ( ( self ) ,
trio_string_t * self )
2002-01-19 18:40:18 +03:00
{
assert ( self ) ;
return trio_upper ( self - > content ) ;
}
2002-09-26 02:44:43 +04:00
# endif /* !defined(TRIO_MINIMAL) */
2002-01-19 18:40:18 +03:00
/** @} End of DynamicStrings */