3 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
15 #include <ac/string.h>
21 #define TK_NOENDQUOTE -2
22 #define TK_OUTOFMEM -1
25 #define TK_UNEXPCHAR 1
37 get_token(const char ** sp, char ** token_val)
46 if( (**sp) != '\0' || iscntrl(**sp) || !isascii(**sp) ) {
72 **sp != '\"' && **sp != '\0' && isascii(**sp);
77 if( **sp == '\0' ) break;
83 res = LDAP_MALLOC(q-p+1);
102 while ( isascii(**sp) &&
125 res = LDAP_MALLOC(q-p+1);
143 static void kv_destory( struct kv **kv )
147 if( kv == NULL ) return;
149 for( i=0; kv[i] != NULL; i++ ) {
150 if( kv[i]->key != NULL ) {
151 LDAP_FREE( kv[i]->key );
154 if( kv[i]->value != NULL ) {
155 LDAP_FREE( kv[i]->value );
164 static int kv_add( struct kv ***kvs, const struct kv *kv )
170 assert( kvs != NULL );
171 assert( kv != NULL );
173 tmp_kv = LDAP_MALLOC( sizeof(struct kv) );
175 if( tmp_kv == NULL ) {
182 tmp_kvs = LDAP_MALLOC( 2 * sizeof(struct kv *) );
186 for( n=0; (*kvs)[n] != NULL; n++ ) {
190 tmp_kvs = LDAP_REALLOC( kvs, (n+2) * sizeof(struct kv *) );
193 if( tmp_kvs == NULL ) {
219 const char *ss = str;
222 struct kv **kvs = NULL;
225 assert( kvsp != NULL );
226 assert( str != NULL );
233 while( state > ST_DONE ) {
234 kind = get_token( &ss, &sval );
237 state = ( state == ST_SEP )
238 ? ST_DONE : ST_ERROR;
242 if( state == ST_KEY ) {
245 assert( kv.key == NULL );
246 assert( kv.value == NULL );
249 } else if ( state == ST_VALUE ) {
252 assert( kv.key != NULL );
253 assert( kv.value == NULL );
262 state = ( state == ST_SEP )
267 state = ( state == ST_EQUALS )
268 ? ST_VALUE : ST_ERROR;
272 if( state == ST_VALUE ) {
275 assert( kv.key != NULL );
276 assert( kv.value == NULL );
288 if( state == ST_SEP ) {
289 /* add kv to return */
290 if( kv_add( &kvs, &kv ) != 0 ) {
301 if( state == ST_ERROR ) {
302 if( kv.key != NULL ) LDAP_FREE(kv.key);
303 if( kv.value != NULL ) LDAP_FREE( kv.value );
308 rc = ( kind == TK_OUTOFMEM ) ? -1 : 1 ;
321 char **values = NULL;
324 const char *ss = str;
327 assert( valuesp != NULL );
328 assert( str != NULL );
332 while( state > ST_DONE ) {
333 kind = get_token( &ss, &sval );
336 state = ( state == ST_SEP )
337 ? ST_DONE : ST_ERROR;
341 if( state == ST_VALUE ) {
350 state = ( state == ST_SEP )
351 ? ST_VALUE : ST_ERROR;
358 if( state == ST_SEP ) {
359 if( ldap_charray_add( &values, sval ) != 0 ) {
369 if( state == ST_ERROR ) {
370 if( sval != NULL ) LDAP_FREE( sval );
372 LDAP_VFREE( values );
375 rc = ( kind == TK_OUTOFMEM ) ? -1 : 1 ;