2 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
12 #include <ac/string.h>
18 #define TK_NOENDQUOTE -2
19 #define TK_OUTOFMEM -1
22 #define TK_UNEXPCHAR 1
34 get_token(const char ** sp, char ** token_val)
43 if( (**sp) != '\0' || iscntrl(**sp) || !isascii(**sp) ) {
69 **sp != '\"' && **sp != '\0' && isascii(**sp);
74 if( **sp == '\0' ) break;
80 res = LDAP_MALLOC(q-p+1);
99 while ( isascii(**sp) &&
122 res = LDAP_MALLOC(q-p+1);
140 static void kv_destory( struct kv **kv )
144 if( kv == NULL ) return;
146 for( i=0; kv[i] != NULL; i++ ) {
147 if( kv[i]->key != NULL ) {
148 LDAP_FREE( kv[i]->key );
151 if( kv[i]->value != NULL ) {
152 LDAP_FREE( kv[i]->value );
161 static int kv_add( struct kv ***kvs, const struct kv *kv )
167 assert( kvs != NULL );
168 assert( kv != NULL );
170 tmp_kv = LDAP_MALLOC( sizeof(struct kv) );
172 if( tmp_kv == NULL ) {
179 tmp_kvs = LDAP_MALLOC( 2 * sizeof(struct kv *) );
183 for( n=0; (*kvs)[n] != NULL; n++ ) {
187 tmp_kvs = LDAP_REALLOC( kvs, (n+2) * sizeof(struct kv *) );
190 if( tmp_kvs == NULL ) {
216 const char *ss = str;
219 struct kv **kvs = NULL;
222 assert( kvsp != NULL );
223 assert( str != NULL );
230 while( state > ST_DONE ) {
231 kind = get_token( &ss, &sval );
234 state = ( state == ST_SEP )
235 ? ST_DONE : ST_ERROR;
239 if( state == ST_KEY ) {
242 assert( kv.key == NULL );
243 assert( kv.value == NULL );
246 } else if ( state == ST_VALUE ) {
249 assert( kv.key != NULL );
250 assert( kv.value == NULL );
259 state = ( state == ST_SEP )
264 state = ( state == ST_EQUALS )
265 ? ST_VALUE : ST_ERROR;
269 if( state == ST_VALUE ) {
272 assert( kv.key != NULL );
273 assert( kv.value == NULL );
285 if( state == ST_SEP ) {
286 /* add kv to return */
287 if( kv_add( &kvs, &kv ) != 0 ) {
298 if( state == ST_ERROR ) {
299 if( kv.key != NULL ) LDAP_FREE(kv.key);
300 if( kv.value != NULL ) LDAP_FREE( kv.value );
305 rc = ( kind == TK_OUTOFMEM ) ? -1 : 1 ;
318 char **values = NULL;
321 const char *ss = str;
324 assert( valuesp != NULL );
325 assert( str != NULL );
329 while( state > ST_DONE ) {
330 kind = get_token( &ss, &sval );
333 state = ( state == ST_SEP )
334 ? ST_DONE : ST_ERROR;
338 if( state == ST_VALUE ) {
347 state = ( state == ST_SEP )
348 ? ST_VALUE : ST_ERROR;
355 if( state == ST_SEP ) {
356 if( ldap_charray_add( &values, sval ) != 0 ) {
366 if( state == ST_ERROR ) {
367 if( sval != NULL ) LDAP_FREE( sval );
369 LDAP_VFREE( values );
372 rc = ( kind == TK_OUTOFMEM ) ? -1 : 1 ;