Ignore:
Timestamp:
Apr 13, 2025, 9:15:33 PM (9 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
b0296dba
Parents:
a514fed
Message:

more inlining, add strnlen and strncmp for string type

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/collections/string.cfa

    ra514fed r5ad6f0d  
    1010// Created On       : Fri Sep 03 11:00:00 2021
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Apr 11 18:18:07 2025
    13 // Update Count     : 370
     12// Last Modified On : Sun Apr 13 07:58:55 2025
     13// Update Count     : 390
    1414//
    1515
     
    202202        return s;
    203203}
     204
     205////////////////////////////////////////////////////////
     206// Getter
     207
     208size_t strnlen( const string & s, size_t maxlen ) { return min( len( s ), maxlen ); }
    204209
    205210////////////////////////////////////////////////////////
     
    265270
    266271////////////////////////////////////////////////////////
    267 // Comparison
    268 
    269 int strcmp( const string & s1, const string & s2 ) { return strcmp( *s1.inner, *s2.inner ); }
    270 bool ?==?( const string & s1, const string & s2 ) { return *s1.inner == *s2.inner; }
    271 bool ?!=?( const string & s1, const string & s2 ) { return *s1.inner != *s2.inner; }
    272 bool ?>? ( const string & s1, const string & s2 ) { return *s1.inner >  *s2.inner; }
    273 bool ?>=?( const string & s1, const string & s2 ) { return *s1.inner >= *s2.inner; }
    274 bool ?<=?( const string & s1, const string & s2 ) { return *s1.inner <= *s2.inner; }
    275 bool ?<? ( const string & s1, const string & s2 ) { return *s1.inner <  *s2.inner; }
    276 
    277 int strcmp( const string & s1, const char * s2 ) { return strcmp( *s1.inner, s2 ); }
    278 bool ?==?( const string & s1, const char * s2 ) { return *s1.inner == s2; }
    279 bool ?!=?( const string & s1, const char * s2 ) { return *s1.inner != s2; }
    280 bool ?>? ( const string & s1, const char * s2 ) { return *s1.inner >  s2; }
    281 bool ?>=?( const string & s1, const char * s2 ) { return *s1.inner >= s2; }
    282 bool ?<=?( const string & s1, const char * s2 ) { return *s1.inner <= s2; }
    283 bool ?<? ( const string & s1, const char * s2 ) { return *s1.inner <  s2; }
    284 
    285 int strcmp( const char * s1, const string & s2 ) { return strcmp( s1, *s2.inner ); }
    286 bool ?==?( const char * s1, const string & s2 ) { return s1 == *s2.inner; }
    287 bool ?!=?( const char * s1, const string & s2 ) { return s1 != *s2.inner; }
    288 bool ?>? ( const char * s1, const string & s2 ) { return s1 >  *s2.inner; }
    289 bool ?>=?( const char * s1, const string & s2 ) { return s1 >= *s2.inner; }
    290 bool ?<=?( const char * s1, const string & s2 ) { return s1 <= *s2.inner; }
    291 bool ?<? ( const char * s1, const string & s2 ) { return s1 <  *s2.inner; }
    292 
    293 ////////////////////////////////////////////////////////
    294272// Concatenation
    295273
     
    403381        string ret = { *s.inner, index, 1 };
    404382        return ret`share;
     383}
     384
     385////////////////////////////////////////////////////////
     386// Comparison
     387
     388#define STRNCPY_FMT "**** Error **** strncpy: maximum length %zu is greater than string lengths %zd or %zd."
     389
     390int strncmp( const string & s1, const string & s2, size_t maxlen ) {
     391        if ( maxlen > len( s1 ) || maxlen > len( s2 ) ) {
     392                abort( STRNCPY_FMT, maxlen, len( s1 ), len( s2 ) );
     393        } // if
     394        return strcmp$( s1.inner->Handle.s, maxlen, s2.inner->Handle.s, maxlen );
     395}
     396
     397int strncmp( const string & s1, const char * s2, size_t maxlen ) {
     398        size_t s2len = len( s2 );
     399        if ( maxlen > len( s1 ) || maxlen > s2len ) {
     400                abort( STRNCPY_FMT, maxlen, len( s1 ), s2len );
     401        } // if
     402        return strcmp$( s1.inner->Handle.s, maxlen, s2, maxlen );
     403}
     404
     405int strncmp( const char * s1, const string & s2, size_t maxlen ) {
     406        size_t s1len = len( s1 );
     407        if ( maxlen > s1len || maxlen > len( s2 ) ) {
     408                abort( STRNCPY_FMT, maxlen, s1len, len( s2 ) );
     409        } // if
     410        return strcmp$( s1, maxlen, s2.inner->Handle.s, maxlen );
    405411}
    406412
     
    523529}
    524530
    525 size_t test( const string & s, int (*f)( int ) ) {
     531size_t include( const string & s, int (*f)( int ) ) {
    526532        size_t l = len( s );
    527533        for ( i; l ) {
     
    531537}
    532538
    533 string replace( string & s, const string & from, const string & to ) {
     539size_t exclude( const string & s, int (*f)( int ) ) {
     540        size_t l = len( s );
     541        for ( i; l ) {
     542                if ( f( s[i] ) ) return i;
     543        } // for
     544        return l;
     545}
     546
     547string replace( const string & s, const string & from, const string & to ) {
    534548        ssize_t pos;
    535549    string r;
Note: See TracChangeset for help on using the changeset viewer.