2021-03-19 20:57:07 +01:00
#include "FFstrbuf.h"
#include <malloc.h>
2021-04-09 19:21:56 +02:00
#include <ctype.h>
2021-03-19 20:57:07 +01:00
#include <string.h>
2022-01-12 01:02:14 +01:00
#include <stdlib.h>
2021-03-19 20:57:07 +01:00
2021-11-16 12:54:49 +01:00
static char * CHAR_NULL_PTR = "" ;
2021-03-19 20:57:07 +01:00
void ffStrbufInit ( FFstrbuf * strbuf )
{
ffStrbufInitA ( strbuf , FASTFETCH_STRBUF_DEFAULT_ALLOC );
}
void ffStrbufInitA ( FFstrbuf * strbuf , uint32_t allocate )
{
strbuf -> allocated = allocate ;
2021-03-27 18:14:19 +01:00
2021-11-16 12:54:49 +01:00
if ( strbuf -> allocated > 0 )
strbuf -> chars = ( char * ) malloc ( sizeof ( char ) * strbuf -> allocated );
//This will set the length to zero and the null byte.
2021-03-19 20:57:07 +01:00
ffStrbufClear ( strbuf );
}
2022-01-12 01:02:14 +01:00
void ffStrbufInitCopy ( FFstrbuf * strbuf , const FFstrbuf * src )
2021-03-19 20:57:07 +01:00
{
2022-01-12 01:02:14 +01:00
ffStrbufInitA ( strbuf , src -> allocated );
ffStrbufAppend ( strbuf , src );
2021-03-19 20:57:07 +01:00
}
2021-11-17 10:59:31 +01:00
static void setCapacity ( FFstrbuf * strbuf , uint32_t capacity )
2021-03-19 20:57:07 +01:00
{
2021-11-16 12:54:49 +01:00
if ( strbuf -> allocated == 0 )
2021-11-17 10:59:31 +01:00
{
2022-01-12 01:02:14 +01:00
strbuf -> chars = malloc ( sizeof ( * strbuf -> chars ) * capacity );
2021-11-17 10:59:31 +01:00
strbuf -> chars [ 0 ] = '\0' ;
}
2021-11-16 12:54:49 +01:00
else
2022-01-12 01:02:14 +01:00
strbuf -> chars = realloc ( strbuf -> chars , sizeof ( * strbuf -> chars ) * capacity );
2021-11-16 12:54:49 +01:00
2021-11-17 10:59:31 +01:00
strbuf -> allocated = capacity ;
}
void ffStrbufEnsureCapacity ( FFstrbuf * strbuf , uint32_t capacity )
{
2021-11-17 12:00:06 +01:00
if ( strbuf -> allocated > capacity || capacity == 0 )
2021-11-17 10:59:31 +01:00
return ;
2021-11-17 12:07:08 +01:00
if ( capacity == UINT32_MAX )
{
2022-01-12 01:33:03 +01:00
fputs ( "Warning: ffStrbufEnsureCapacity called with UINT32_MAX. Highest allowed value is UINT32_MAX - 1. Exiting. \n " , stderr );
2022-01-12 01:02:14 +01:00
exit ( 812 );
2021-11-17 12:07:08 +01:00
}
2021-11-17 10:59:31 +01:00
setCapacity ( strbuf , capacity + 1 ); // + 1 for the null byte
2021-03-19 20:57:07 +01:00
}
void ffStrbufEnsureFree ( FFstrbuf * strbuf , uint32_t free )
{
2021-11-17 10:59:31 +01:00
if ( ffStrbufGetFree ( strbuf ) >= free )
2021-11-16 12:54:49 +01:00
return ;
2021-03-19 20:57:07 +01:00
uint32_t allocate = strbuf -> allocated ;
2021-04-03 11:39:59 +02:00
if ( allocate < 2 )
allocate = 2 ;
2021-11-16 12:54:49 +01:00
2021-11-17 10:59:31 +01:00
while (( strbuf -> length + free + 1 ) > allocate ) // + 1 for the null byte
2021-03-19 20:57:07 +01:00
allocate *= 2 ;
2021-11-16 12:54:49 +01:00
2021-11-17 10:59:31 +01:00
setCapacity ( strbuf , allocate );
}
uint32_t ffStrbufGetFree ( const FFstrbuf * strbuf )
{
if ( strbuf -> allocated == 0 )
return 0 ;
return strbuf -> allocated - strbuf -> length - 1 ; // - 1 for the null byte
2021-03-19 20:57:07 +01:00
}
void ffStrbufClear ( FFstrbuf * strbuf )
{
2021-11-16 12:54:49 +01:00
if ( strbuf -> allocated == 0 )
strbuf -> chars = CHAR_NULL_PTR ;
else
strbuf -> chars [ 0 ] = '\0' ;
2021-03-19 20:57:07 +01:00
strbuf -> length = 0 ;
}
2022-01-12 01:02:14 +01:00
void ffStrbufRecalculateLength ( FFstrbuf * strbuf )
2021-03-19 20:57:07 +01:00
{
2022-01-12 01:02:14 +01:00
for ( strbuf -> length = 0 ; strbuf -> chars [ strbuf -> length ] != '\0' ; ++ strbuf -> length );
2021-03-19 20:57:07 +01:00
}
2021-03-21 20:42:07 +01:00
void ffStrbufAppend ( FFstrbuf * strbuf , const FFstrbuf * value )
2021-03-19 20:57:07 +01:00
{
2021-04-24 21:42:48 +02:00
if ( value == NULL )
return ;
2021-03-19 20:57:07 +01:00
ffStrbufAppendNS ( strbuf , value -> length , value -> chars );
}
2022-01-12 01:02:14 +01:00
void ffStrbufAppendC ( FFstrbuf * strbuf , char c )
2021-04-18 15:19:21 +02:00
{
2022-01-12 01:02:14 +01:00
ffStrbufEnsureFree ( strbuf , 1 );
strbuf -> chars [ strbuf -> length ++ ] = c ;
2021-04-18 15:19:21 +02:00
strbuf -> chars [ strbuf -> length ] = '\0' ;
}
2021-03-19 20:57:07 +01:00
void ffStrbufAppendS ( FFstrbuf * strbuf , const char * value )
{
if ( value == NULL )
return ;
for ( uint32_t i = 0 ; value [ i ] != '\0' ; i ++ )
{
if ( i % 16 == 0 )
ffStrbufEnsureFree ( strbuf , 16 );
strbuf -> chars [ strbuf -> length ++ ] = value [ i ];
}
2021-05-23 19:40:34 +02:00
2021-03-19 20:57:07 +01:00
strbuf -> chars [ strbuf -> length ] = '\0' ;
}
void ffStrbufAppendNS ( FFstrbuf * strbuf , uint32_t length , const char * value )
{
if ( value == NULL )
return ;
ffStrbufEnsureFree ( strbuf , length );
for ( uint32_t i = 0 ; i < length ; i ++ )
{
if ( value [ i ] == '\0' )
break ;
2021-03-27 18:14:19 +01:00
2021-03-19 20:57:07 +01:00
strbuf -> chars [ strbuf -> length ++ ] = value [ i ];
}
2021-05-23 19:40:34 +02:00
strbuf -> chars [ strbuf -> length ] = '\0' ;
}
void ffStrbufAppendNSExludingC ( FFstrbuf * strbuf , uint32_t length , const char * value , char exclude )
{
if ( value == NULL )
return ;
ffStrbufEnsureFree ( strbuf , length );
for ( uint32_t i = 0 ; i < length ; i ++ )
{
if ( value [ i ] != exclude )
strbuf -> chars [ strbuf -> length ++ ] = value [ i ];
}
2021-03-19 20:57:07 +01:00
strbuf -> chars [ strbuf -> length ] = '\0' ;
}
2022-01-12 01:02:14 +01:00
void ffStrbufAppendTransformS ( FFstrbuf * strbuf , const char * value , int ( * transformFunc )( int ))
2021-03-19 20:57:07 +01:00
{
2022-01-12 01:02:14 +01:00
if ( value == NULL )
2021-03-19 20:57:07 +01:00
return ;
2022-01-12 01:02:14 +01:00
for ( uint32_t i = 0 ; value [ i ] != '\0' ; i ++ )
{
if ( i % 16 == 0 )
ffStrbufEnsureFree ( strbuf , 16 );
strbuf -> chars [ strbuf -> length ++ ] = ( char ) transformFunc ( value [ i ]);
}
strbuf -> chars [ strbuf -> length ] = '\0' ;
2021-03-19 20:57:07 +01:00
}
void ffStrbufAppendVF ( FFstrbuf * strbuf , const char * format , va_list arguments )
{
if ( format == NULL )
return ;
2022-01-12 18:57:35 +01:00
va_list copy ;
va_copy ( copy , arguments );
2021-11-17 11:41:17 +01:00
uint32_t free = ffStrbufGetFree ( strbuf );
uint32_t written = ( uint32_t ) vsnprintf ( strbuf -> chars + strbuf -> length , free , format , arguments );
2021-03-19 20:57:07 +01:00
2021-11-17 11:41:17 +01:00
if ( strbuf -> length + written > free )
2021-03-19 20:57:07 +01:00
{
2021-11-17 11:41:17 +01:00
ffStrbufEnsureFree ( strbuf , written );
2022-01-12 18:57:35 +01:00
written = ( uint32_t ) vsnprintf ( strbuf -> chars + strbuf -> length , ffStrbufGetFree ( strbuf ), format , copy );
2021-03-19 20:57:07 +01:00
}
2021-11-17 11:41:17 +01:00
2022-01-12 18:57:35 +01:00
va_end ( copy );
if ( written <= 0 )
return ;
2021-11-17 11:41:17 +01:00
strbuf -> length += written ;
strbuf -> chars [ strbuf -> length ] = '\0' ;
2021-03-19 20:57:07 +01:00
}
2022-01-12 01:02:14 +01:00
void ffStrbufAppendF ( FFstrbuf * strbuf , const char * format , ...)
2021-03-19 20:57:07 +01:00
{
2022-01-12 01:02:14 +01:00
if ( format == NULL )
return ;
2021-03-19 20:57:07 +01:00
2022-01-12 01:02:14 +01:00
va_list arguments ;
va_start ( arguments , format );
ffStrbufAppendVF ( strbuf , format , arguments );
va_end ( arguments );
2021-03-19 20:57:07 +01:00
}
2022-01-12 01:02:14 +01:00
void ffStrbufSet ( FFstrbuf * strbuf , const FFstrbuf * value )
2021-03-19 20:57:07 +01:00
{
2022-01-12 01:02:14 +01:00
ffStrbufClear ( strbuf );
ffStrbufAppendNS ( strbuf , value -> length , value -> chars );
2021-03-19 20:57:07 +01:00
}
2022-01-12 01:02:14 +01:00
void ffStrbufSetS ( FFstrbuf * strbuf , const char * value )
2021-03-22 20:02:32 +01:00
{
2022-01-12 01:02:14 +01:00
ffStrbufClear ( strbuf );
ffStrbufAppendS ( strbuf , value );
2021-03-22 20:02:32 +01:00
}
2021-04-22 21:41:42 +02:00
int ffStrbufComp ( const FFstrbuf * strbuf , const FFstrbuf * comp )
2021-03-19 20:57:07 +01:00
{
2022-01-07 17:37:57 +01:00
if ( strbuf -> length != comp -> length )
return ( int ) strbuf -> length - ( int ) comp -> length ;
2021-05-07 14:55:43 +02:00
return ffStrbufCompS ( strbuf , comp -> chars );
2021-03-19 20:57:07 +01:00
}
2021-04-22 21:41:42 +02:00
int ffStrbufCompS ( const FFstrbuf * strbuf , const char * comp )
2021-03-19 20:57:07 +01:00
{
return strcmp ( strbuf -> chars , comp );
}
2021-04-22 21:41:42 +02:00
int ffStrbufIgnCaseComp ( const FFstrbuf * strbuf , const FFstrbuf * comp )
2021-03-19 20:57:07 +01:00
{
2022-01-07 17:37:57 +01:00
if ( strbuf -> length != comp -> length )
return ( int ) strbuf -> length - ( int ) comp -> length ;
2021-05-07 14:55:43 +02:00
return ffStrbufIgnCaseCompS ( strbuf , comp -> chars );
2021-03-19 20:57:07 +01:00
}
2021-04-22 21:41:42 +02:00
int ffStrbufIgnCaseCompS ( const FFstrbuf * strbuf , const char * comp )
2021-03-19 20:57:07 +01:00
{
return strcasecmp ( strbuf -> chars , comp );
}
2021-03-21 16:52:17 +01:00
void ffStrbufTrimLeft ( FFstrbuf * strbuf , char c )
{
uint32_t index = 0 ;
2021-05-13 12:27:44 +02:00
while ( index < strbuf -> length && strbuf -> chars [ index ] == c )
2021-03-21 16:52:17 +01:00
++ index ;
if ( index == 0 )
return ;
2021-04-25 19:12:05 +02:00
memmove ( strbuf -> chars , strbuf -> chars + index , strbuf -> length - index );
2021-03-21 16:52:17 +01:00
strbuf -> length -= index ;
2021-04-25 19:03:59 +02:00
strbuf -> chars [ strbuf -> length ] = '\0' ;
2021-03-21 16:52:17 +01:00
}
void ffStrbufTrimRight ( FFstrbuf * strbuf , char c )
2021-03-27 18:14:19 +01:00
{
2022-01-01 17:28:41 +01:00
while ( ffStrbufEndsWithC ( strbuf , c ))
2021-03-21 16:52:17 +01:00
-- strbuf -> length ;
strbuf -> chars [ strbuf -> length ] = '\0' ;
}
void ffStrbufTrim ( FFstrbuf * strbuf , char c )
{
ffStrbufTrimRight ( strbuf , c );
ffStrbufTrimLeft ( strbuf , c );
}
2022-01-12 01:02:14 +01:00
void ffStrbufRemoveSubstr ( FFstrbuf * strbuf , uint32_t startIndex , uint32_t endIndex )
2021-03-28 13:02:40 +02:00
{
2022-01-12 01:02:14 +01:00
if ( startIndex > strbuf -> length || startIndex >= endIndex )
return ;
2021-03-28 13:02:40 +02:00
2022-01-12 01:02:14 +01:00
if ( endIndex > strbuf -> length )
{
ffStrbufSubstrBefore ( strbuf , startIndex );
return ;
2021-03-28 13:02:40 +02:00
}
2022-01-12 01:02:14 +01:00
memmove ( strbuf -> chars + startIndex , strbuf -> chars + endIndex , strbuf -> length - endIndex );
strbuf -> length -= ( endIndex - startIndex );
2021-03-28 13:02:40 +02:00
strbuf -> chars [ strbuf -> length ] = '\0' ;
2022-01-12 01:02:14 +01:00
}
void ffStrbufRemoveS ( FFstrbuf * strbuf , const char * str )
{
uint32_t stringLength = ( uint32_t ) strlen ( str );
for ( uint32_t i = ffStrbufNextIndexS ( strbuf , 0 , str ); i < strbuf -> length ; i = ffStrbufNextIndexS ( strbuf , i , str ))
ffStrbufRemoveSubstr ( strbuf , i , i + stringLength );
2021-03-28 13:02:40 +02:00
}
2021-04-17 14:37:32 +02:00
void ffStrbufRemoveStringsA ( FFstrbuf * strbuf , uint32_t numStrings , const char * strings [])
2021-03-28 13:02:40 +02:00
{
2022-01-12 01:02:14 +01:00
for ( uint32_t i = 0 ; i < numStrings ; i ++ )
ffStrbufRemoveS ( strbuf , strings [ i ]);
2021-03-28 13:02:40 +02:00
}
2021-04-17 14:37:32 +02:00
void ffStrbufRemoveStringsV ( FFstrbuf * strbuf , uint32_t numStrings , va_list arguments )
{
for ( uint32_t i = 0 ; i < numStrings ; i ++ )
2022-01-12 01:02:14 +01:00
ffStrbufRemoveS ( strbuf , va_arg ( arguments , const char * ));
2021-04-17 14:37:32 +02:00
}
void ffStrbufRemoveStrings ( FFstrbuf * strbuf , uint32_t numStrings , ...)
{
va_list argp ;
va_start ( argp , numStrings );
ffStrbufRemoveStringsV ( strbuf , numStrings , argp );
va_end ( argp );
}
2021-06-26 15:34:01 +02:00
uint32_t ffStrbufNextIndexC ( const FFstrbuf * strbuf , uint32_t start , char c )
2021-03-28 15:38:52 +02:00
{
2021-03-28 20:09:29 +02:00
for ( uint32_t i = start ; i < strbuf -> length ; i ++ )
2021-03-28 15:38:52 +02:00
{
if ( strbuf -> chars [ i ] == c )
return i ;
}
return strbuf -> length ;
}
2022-01-12 01:02:14 +01:00
uint32_t ffStrbufNextIndexS ( const FFstrbuf * strbuf , uint32_t start , const char * str )
2021-04-24 21:42:48 +02:00
{
2021-06-26 15:34:01 +02:00
for ( uint32_t i = start ; i < strbuf -> length ; i ++ )
2021-04-24 21:42:48 +02:00
{
bool found = true ;
2022-01-12 01:02:14 +01:00
for ( uint32_t k = 0 ; str [ k ] != '\0' ; k ++ )
2021-04-24 21:42:48 +02:00
{
if ( i + k == strbuf -> length )
return strbuf -> length ;
2022-01-12 01:02:14 +01:00
if ( strbuf -> chars [ i + k ] != str [ k ])
2021-04-24 21:42:48 +02:00
{
found = false ;
break ;
}
}
if ( found )
return i ;
}
2021-06-26 15:34:01 +02:00
2021-04-24 21:42:48 +02:00
return strbuf -> length ;
}
2021-07-12 19:01:31 +02:00
uint32_t ffStrbufFirstIndexC ( const FFstrbuf * strbuf , char c )
{
return ffStrbufNextIndexC ( strbuf , 0 , c );
}
uint32_t ffStrbufFirstIndex ( const FFstrbuf * strbuf , const FFstrbuf * searched )
{
2022-01-12 01:02:14 +01:00
return ffStrbufNextIndexS ( strbuf , 0 , searched -> chars );
2021-07-12 19:01:31 +02:00
}
2021-05-05 21:12:42 +02:00
uint32_t ffStrbufFirstIndexS ( const FFstrbuf * strbuf , const char * str )
{
2021-06-26 15:34:01 +02:00
return ffStrbufNextIndexS ( strbuf , 0 , str );
2021-05-05 21:12:42 +02:00
}
2021-06-26 15:34:01 +02:00
uint32_t ffStrbufPreviousIndexC ( const FFstrbuf * strbuf , uint32_t start , char c )
2021-03-28 13:02:40 +02:00
{
2021-06-26 15:34:01 +02:00
if ( start >= strbuf -> length )
return strbuf -> length ;
2021-03-28 13:02:40 +02:00
//We need to loop one higher than the actual index, because uint32_t is guranteed to be >= 0, so this statement would always be true
2021-06-26 15:34:01 +02:00
for ( uint32_t i = start + 1 ; i > 0 ; i -- )
2021-03-28 13:02:40 +02:00
{
if ( strbuf -> chars [ i - 1 ] == c )
return i - 1 ;
}
return strbuf -> length ;
}
2021-06-26 15:34:01 +02:00
uint32_t ffStrbufLastIndexC ( const FFstrbuf * strbuf , char c )
{
return ffStrbufPreviousIndexC ( strbuf , strbuf -> length - 1 , c );
}
2021-04-02 16:21:52 +02:00
void ffStrbufSubstrBefore ( FFstrbuf * strbuf , uint32_t index )
2021-03-28 13:02:40 +02:00
{
2021-04-02 16:21:52 +02:00
if ( strbuf -> length <= index )
2021-03-28 13:02:40 +02:00
return ;
2021-04-02 16:21:52 +02:00
strbuf -> length = index ;
2021-03-28 13:02:40 +02:00
strbuf -> chars [ strbuf -> length ] = '\0' ;
}
2022-01-10 20:20:18 +01:00
void ffStrbufSubstrBeforeFirstC ( FFstrbuf * strbuf , char c )
2021-04-02 16:21:52 +02:00
{
ffStrbufSubstrBefore ( strbuf , ffStrbufFirstIndexC ( strbuf , c ));
}
2022-01-10 20:20:18 +01:00
void ffStrbufSubstrBeforeLastC ( FFstrbuf * strbuf , char c )
2021-05-07 17:10:22 +02:00
{
ffStrbufSubstrBefore ( strbuf , ffStrbufLastIndexC ( strbuf , c ));
}
2021-04-02 16:21:52 +02:00
void ffStrbufSubstrAfter ( FFstrbuf * strbuf , uint32_t index )
{
if ( index >= strbuf -> length )
{
ffStrbufClear ( strbuf );
return ;
}
memmove ( strbuf -> chars , strbuf -> chars + index + 1 , strbuf -> length - index - 1 );
strbuf -> length -= ( index + 1 );
2021-04-03 23:10:14 +02:00
strbuf -> chars [ strbuf -> length ] = '\0' ;
2021-04-02 16:21:52 +02:00
}
2022-01-10 20:20:18 +01:00
void ffStrbufSubstrAfterFirstC ( FFstrbuf * strbuf , char c )
2021-05-07 17:10:22 +02:00
{
uint32_t index = ffStrbufFirstIndexC ( strbuf , c );
if ( index < strbuf -> length )
ffStrbufSubstrAfter ( strbuf , index );
}
2022-01-10 20:20:18 +01:00
void ffStrbufSubstrAfterFirstS ( FFstrbuf * strbuf , const char * str )
{
2022-01-12 01:02:14 +01:00
if ( * str == '\0' )
return ;
uint32_t index = ffStrbufFirstIndexS ( strbuf , str ) + ( uint32_t ) strlen ( str ) - 1 ; // -1, because firstIndexS is already pointing to str[0], we want to add only the remaining length
2022-01-10 20:20:18 +01:00
if ( index < strbuf -> length )
ffStrbufSubstrAfter ( strbuf , index );
}
void ffStrbufSubstrAfterLastC ( FFstrbuf * strbuf , char c )
2021-04-02 16:21:52 +02:00
{
uint32_t index = ffStrbufLastIndexC ( strbuf , c );
if ( index < strbuf -> length )
ffStrbufSubstrAfter ( strbuf , index );
}
2021-04-22 21:41:42 +02:00
bool ffStrbufStartsWithS ( const FFstrbuf * strbuf , const char * start )
2021-04-09 19:21:56 +02:00
{
for ( uint32_t i = 0 ; start [ i ] != '\0' ; i ++ )
{
if ( i >= strbuf -> length )
return false ;
2021-04-02 16:21:52 +02:00
2021-04-09 19:21:56 +02:00
if ( strbuf -> chars [ i ] != start [ i ])
return false ;
}
2021-04-02 16:21:52 +02:00
return true ;
}
2021-04-22 21:41:42 +02:00
bool ffStrbufStartsWithIgnCase ( const FFstrbuf * strbuf , const FFstrbuf * start )
2021-04-09 19:21:56 +02:00
{
2022-01-12 01:02:14 +01:00
return ffStrbufStartsWithS ( strbuf , start -> chars );
2021-04-09 19:21:56 +02:00
}
2021-04-22 21:41:42 +02:00
bool ffStrbufStartsWithIgnCaseS ( const FFstrbuf * strbuf , const char * start )
2021-04-02 16:21:52 +02:00
{
for ( uint32_t i = 0 ; start [ i ] != '\0' ; i ++ )
{
2021-04-09 19:21:56 +02:00
if ( i >= strbuf -> length )
return false ;
if ( tolower ( strbuf -> chars [ i ]) != tolower ( start [ i ]))
2021-04-02 16:21:52 +02:00
return false ;
}
return true ;
}
2021-12-31 14:12:44 +01:00
bool ffStrbufEndsWithC ( const FFstrbuf * strbuf , char c )
{
return strbuf -> length == 0 ? false :
strbuf -> chars [ strbuf -> length - 1 ] == c ;
}
2021-05-23 19:40:34 +02:00
bool ffStrbufEndsWithS ( const FFstrbuf * strbuf , const char * end )
{
2021-11-17 18:38:57 +01:00
uint32_t endLength = ( uint32_t ) strlen ( end );
2021-05-23 19:40:34 +02:00
if ( endLength > strbuf -> length )
return false ;
2022-01-12 01:02:14 +01:00
for ( uint32_t i = endLength ; i > 0 ; i -- )
2021-05-23 19:40:34 +02:00
{
2022-01-12 01:02:14 +01:00
if ( strbuf -> chars [ strbuf -> length - endLength + i - 1 ] != end [ i - 1 ])
2021-05-23 19:40:34 +02:00
return false ;
}
return true ;
}
2021-06-26 16:48:15 +02:00
static bool testEndsWithIgnCaseS ( const FFstrbuf * strbuf , const char * end , uint32_t * endLength )
{
2021-11-17 18:38:57 +01:00
* endLength = ( uint32_t ) strlen ( end );
2021-06-26 16:48:15 +02:00
if ( * endLength > strbuf -> length )
return false ;
for ( uint32_t i = 0 ; i < * endLength ; ++ i )
{
if ( tolower ( strbuf -> chars [ strbuf -> length - * endLength + i ]) != tolower ( end [ i ]))
return false ;
}
return true ;
}
bool ffStrbufRemoveIgnCaseEndS ( FFstrbuf * strbuf , const char * end )
{
uint32_t endLength ;
if ( testEndsWithIgnCaseS ( strbuf , end , & endLength ))
{
ffStrbufSubstrBefore ( strbuf , strbuf -> length - endLength );
return true ;
}
return false ;
}
2022-01-12 01:02:14 +01:00
void ffStrbufWriteTo ( const FFstrbuf * strbuf , FILE * file )
2021-04-05 19:25:34 +02:00
{
2022-01-12 01:02:14 +01:00
fwrite ( strbuf -> chars , sizeof ( * strbuf -> chars ), strbuf -> length , file );
}
void ffStrbufPutTo ( const FFstrbuf * strbuf , FILE * file )
{
ffStrbufWriteTo ( strbuf , file );
fputc ( '\n' , file );
2021-04-05 19:25:34 +02:00
}
2021-03-19 20:57:07 +01:00
void ffStrbufDestroy ( FFstrbuf * strbuf )
{
free ( strbuf -> chars );
2021-03-27 18:14:19 +01:00
}