From: scottmk <scottmk@9efc2488-bf62-4759-914b-345cdb29e865>
Date: Thu, 15 Jan 2009 02:05:24 +0000 (+0000)
Subject: Add a new function osrfStringArrayTokenize.  It parses an input
X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=d83c93d48bc50a2157dc220d9bf8ed1c81ec8846;p=opensrf%2Fbjwebb.git

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
---

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;
+}