From d83c93d48bc50a2157dc220d9bf8ed1c81ec8846 Mon Sep 17 00:00:00 2001 From: scottmk Date: Thu, 15 Jan 2009 02:05:24 +0000 Subject: [PATCH] Add a new function osrfStringArrayTokenize. It parses an input string into tokens separated by a specified delimiter character, much like strtok() or strtok_r(), and loads them into an osrfStringArray. git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@1627 9efc2488-bf62-4759-914b-345cdb29e865 --- include/opensrf/string_array.h | 7 +++++ src/libopensrf/string_array.c | 50 ++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/include/opensrf/string_array.h b/include/opensrf/string_array.h index 89d9f32..e321444 100644 --- a/include/opensrf/string_array.h +++ b/include/opensrf/string_array.h @@ -34,6 +34,13 @@ void osrfStringArrayFree( osrfStringArray* ); void osrfStringArrayRemove( osrfStringArray* arr, const char* str ); +/** + Parse a string into tokens separated by a specified delimiter, + as if by strtok() or strtok_r(). Load the tokens into an + osrfStringArray. + */ +osrfStringArray* osrfStringArrayTokenize( const char* src, char delim ); + #ifdef __cplusplus } #endif diff --git a/src/libopensrf/string_array.c b/src/libopensrf/string_array.c index d44491d..428ff84 100644 --- a/src/libopensrf/string_array.c +++ b/src/libopensrf/string_array.c @@ -100,3 +100,53 @@ void osrfStringArrayRemove( osrfStringArray* arr, const char* tstr ) { osrfListSetDefaultFree(&arr->list); arr->size--; } + +osrfStringArray* osrfStringArrayTokenize( const char* src, char delim ) +{ + // Take the length so that we know how big a buffer we need, + // in the worst case. Esitimate the number of tokens, assuming + // 5 characters per token, and add a few for a pad. + + if( NULL == src || '\0' == *src ) // Got nothing? + return osrfNewStringArray( 1 ); // Retrun empty array + + size_t src_len = strlen( src ); + size_t est_count = src_len / 6 + 5; + int in_token = 0; // boolean + char buf[ src_len + 1 ]; + char* out = buf; + osrfStringArray* arr = osrfNewStringArray( est_count ); + + for( ;; ++src ) { + if( in_token ) { // We're building a token + if( *src == delim ) { + *out = '\0'; + osrfStringArrayAdd( arr, buf ); + in_token = 0; + } + else if( '\0' == *src ) { + *out = '\0'; + osrfStringArrayAdd( arr, buf ); + break; + } + else { + *out++ = *src; + } + } + else { // We're between tokens + if( *src == delim ) { + ; // skip it + } + else if( '\0' == *src ) { + break; + } + else { + out = buf; // Start the next one + *out++ = *src; + in_token = 1; + } + } + } + + return arr; +} -- 2.43.2