2 * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
3 * All rights reserved. The file named COPYRIGHT specifies the terms
4 * and conditions for redistribution.
16 static int str_errno ;
18 #define HANDLE_ERROR( flags, retval, errp, errval, msg ) \
19 if ( flags & STR_RETURN_ERROR ) \
28 char *new_string( const char *s )
36 str_h str_parse( register char *str, const char *separ, int flags, int *errnop )
38 register struct str_handle *hp ;
39 int *errp = ( errnop == NULL ) ? &str_errno : errnop ;
41 if ( separ == NULL ) {
42 HANDLE_ERROR( flags, NULL, errp, STR_ENULLSEPAR,
43 "STR str_parse: NULL separator" ) ;
46 hp = (struct str_handle *) malloc( sizeof( struct str_handle ) ) ;
48 HANDLE_ERROR( flags, NULL, errp, STR_ENOMEM,
49 "STR str_parse: malloc failed" ) ;
54 hp->separator = new_string( separ ) ;
55 if ( hp->separator == NULL ) {
56 if ( flags & STR_RETURN_ERROR )
62 terminate( "STR str_parse: malloc failed" ) ;
68 hp->no_more = ( str == NULL ) ;
69 return( (str_h) hp ) ;
73 void str_endparse( str_h handle )
75 register struct str_handle *hp = (struct str_handle *) handle ;
77 if( hp->separator != NULL )
78 free( hp->separator ) ;
79 free( (char *) handle ) ;
86 int str_setstr( str_h handle, char *newstr )
88 register struct str_handle *hp = (struct str_handle *) handle ;
90 if ( newstr == NULL ) {
91 HANDLE_ERROR( hp->flags, STR_ERR, hp->errnop, STR_ENULLSTRING,
92 "STR str_setstr: NULL string" ) ;
102 char *str_component( str_h handle )
104 register char *start ;
105 register char *last ;
106 register unsigned int sep_count ;
109 register struct str_handle *hp = (struct str_handle *) handle ;
110 register int first_call = ( hp->pos == hp->string ) ;
116 * Get number of separator characters.
117 * Find beginning of component.
119 sep_count = strspn( hp->pos, hp->separator ) ;
122 * If this is the first call, and there are separator characters
123 * at the beginning of the string and the STR_NULL_START flag is set
124 * we return a 0-length string.
126 if ( first_call && ( sep_count > 0 ) && ( hp->flags & STR_NULL_START ))
133 start = hp->pos + sep_count ;
135 if ( *start == '\0' )
139 if ( ! ( hp->flags & STR_NULL_END ) )
144 last = strpbrk( start, hp->separator ) ;
146 last = start + strlen( start ) ;
151 * At this point, the following variables must be set:
152 * start: beginning of component
153 * last: end of component + 1
155 * If STR_MALLOC is set, allocate space for the new string.
157 * NOTE: If STR_MALLOC is not set, the processed string is trashed.
160 if ( hp->flags & STR_MALLOC )
162 int len = last - start ;
164 retval = malloc( (unsigned)len + 1 ) ;
165 if ( retval == NULL ) {
166 HANDLE_ERROR( hp->flags, NULL, hp->errnop, STR_ENOMEM,
167 "STR str_component: malloc failed" ) ;
169 strncpy( retval, start, len )[ len ] = '\0' ;
178 * Check if last_char is NUL to avoid setting hp->pos past the
181 hp->pos = ( last_char == '\0' ) ? last : last+1 ;