|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* slist.c
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* version: 2017-11-14
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Copyright (c) Chris Putnam 2004-2018
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Source code released under the GPL version 2
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* Implements a simple managed array of strs.
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
#include "slist.h"
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/* Do not use asserts in VPLIST_NOASSERT defined */
|
|
Packit |
89ede9 |
#ifdef VPLIST_NOASSERT
|
|
Packit |
89ede9 |
#define NDEBUG
|
|
Packit |
89ede9 |
#endif
|
|
Packit |
89ede9 |
#include <assert.h>
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
#define SLIST_MINALLOC (20)
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
#define SLIST_EXACT_SIZE (0)
|
|
Packit |
89ede9 |
#define SLIST_DOUBLE_SIZE (1)
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* returns 1 if n is valid string in slist
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
static inline int
|
|
Packit |
89ede9 |
slist_valid_num( slist *a, slist_index n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( n < 0 || n >= a->n ) return 0;
|
|
Packit |
89ede9 |
return 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_init( slist *a )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a->strs = NULL;
|
|
Packit |
89ede9 |
a->max = 0;
|
|
Packit |
89ede9 |
a->n = 0;
|
|
Packit |
89ede9 |
a->sorted = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_init_values( slist *a, ... )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = SLIST_OK;
|
|
Packit |
89ede9 |
va_list ap;
|
|
Packit |
89ede9 |
str *s, *t;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_init( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
va_start( ap, a );
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
s = va_arg( ap, str * );
|
|
Packit |
89ede9 |
if ( s ) {
|
|
Packit |
89ede9 |
t = slist_add( a, s );
|
|
Packit |
89ede9 |
if ( !t ) {
|
|
Packit |
89ede9 |
status = SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} while ( s );
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
va_end( ap );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_init_valuesc( slist *a, ... )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = SLIST_OK;
|
|
Packit |
89ede9 |
va_list ap;
|
|
Packit |
89ede9 |
char *s;
|
|
Packit |
89ede9 |
str *t;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_init( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
va_start( ap, a );
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
s = va_arg( ap, char * );
|
|
Packit |
89ede9 |
if ( s ) {
|
|
Packit |
89ede9 |
t = slist_addc( a, s );
|
|
Packit |
89ede9 |
if ( !t ) {
|
|
Packit |
89ede9 |
status = SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
} while ( s );
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
va_end( ap );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_empty( slist *a )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<a->max; ++i )
|
|
Packit |
89ede9 |
str_empty( &(a->strs[i]) );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a->n = 0;
|
|
Packit |
89ede9 |
a->sorted = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_free( slist *a )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<a->max; ++i )
|
|
Packit |
89ede9 |
str_free( &(a->strs[i]) );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
free( a->strs );
|
|
Packit |
89ede9 |
slist_init( a );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist *
|
|
Packit |
89ede9 |
slist_new( void )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist *a;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a = ( slist * ) malloc( sizeof ( slist ) );
|
|
Packit |
89ede9 |
if ( a ) slist_init( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return a;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_delete( slist *a )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_free( a );
|
|
Packit |
89ede9 |
free( a );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_deletev( void *v )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_delete( (slist*) v );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_swap( slist *a, slist_index n1, slist_index n2 )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( slist_valid_num( a, n1 ) && slist_valid_num( a, n2 ) )
|
|
Packit |
89ede9 |
str_swapstrings( &(a->strs[n1]), &(a->strs[n2]) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
slist_comp( const void *v1, const void *v2 )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str *s1 = ( str *) v1;
|
|
Packit |
89ede9 |
str *s2 = ( str *) v2;
|
|
Packit |
89ede9 |
if ( !s1->len && !s2->len ) return 0;
|
|
Packit |
89ede9 |
else if ( !s1->len ) return -1;
|
|
Packit |
89ede9 |
else if ( !s2->len ) return 1;
|
|
Packit |
89ede9 |
else return str_strcmp( s1, s2 );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
slist_comp_step( slist *a, slist_index n1, slist_index n2 )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return slist_comp( (const void*) &(a->strs[n1]), (const void*) &(a->strs[n2]) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static str *
|
|
Packit |
89ede9 |
slist_set_cleanup( slist *a, slist_index n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( str_memerr( &(a->strs[n]) ) ) return NULL;
|
|
Packit |
89ede9 |
if ( a->sorted ) {
|
|
Packit |
89ede9 |
if ( n>0 && slist_comp_step( a, n-1, n )>0 )
|
|
Packit |
89ede9 |
a->sorted = 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
if ( a->sorted ) {
|
|
Packit |
89ede9 |
if ( n<a->n-1 && slist_comp_step( a, n, n+1 )>0 )
|
|
Packit |
89ede9 |
a->sorted = 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return &(a->strs[n]);
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_setc( slist *a, slist_index n, const char *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
assert( s );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !slist_valid_num( a, n ) ) return NULL;
|
|
Packit |
89ede9 |
str_strcpyc( &(a->strs[n]), s );
|
|
Packit |
89ede9 |
return slist_set_cleanup( a, n );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_set( slist *a, slist_index n, str *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( s );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return slist_setc( a, n, str_cstr( s ) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* return pointer to str 'n'
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_str( slist *a, slist_index n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !slist_valid_num( a, n ) ) return NULL;
|
|
Packit |
89ede9 |
else return &(a->strs[n]);
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
/*
|
|
Packit |
89ede9 |
* return pointer to C string 'n'
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* So long as the index is a valid number ensure
|
|
Packit |
89ede9 |
* that a pointer is returned even if the newstr isn't
|
|
Packit |
89ede9 |
* allocated. Only return NULL if the index
|
|
Packit |
89ede9 |
* is invalid. Thus we can convert loops like:
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* for ( i=0; i<a->n; ++i ) {
|
|
Packit |
89ede9 |
* p = slist_cstr( a, i );
|
|
Packit |
89ede9 |
* if ( p==NULL ) continue; // empty string
|
|
Packit |
89ede9 |
* ...
|
|
Packit |
89ede9 |
* }
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* to
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
* i = 0;
|
|
Packit |
89ede9 |
* while ( ( p = slist_cstr( a, i ) ) ) {
|
|
Packit |
89ede9 |
* ...
|
|
Packit |
89ede9 |
* i++;
|
|
Packit |
89ede9 |
* }
|
|
Packit |
89ede9 |
*
|
|
Packit |
89ede9 |
*/
|
|
Packit |
89ede9 |
char *
|
|
Packit |
89ede9 |
slist_cstr( slist *a, slist_index n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
static char empty[] = "";
|
|
Packit |
89ede9 |
char *p;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !slist_valid_num( a, n ) ) return NULL;
|
|
Packit |
89ede9 |
p = str_cstr( &(a->strs[n]) );
|
|
Packit |
89ede9 |
if ( p ) return p;
|
|
Packit |
89ede9 |
else return empty;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static inline int
|
|
Packit |
89ede9 |
slist_alloc( slist *a, slist_index alloc )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a->strs = ( str* ) malloc( sizeof( str ) * alloc );
|
|
Packit |
89ede9 |
if ( !(a->strs) ) return SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a->max = alloc;
|
|
Packit |
89ede9 |
a->n = 0;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i
|
|
Packit |
89ede9 |
str_init( &(a->strs[i]) );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return SLIST_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static inline int
|
|
Packit |
89ede9 |
slist_realloc( slist *a, slist_index alloc )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
str *more;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
more = ( str* ) realloc( a->strs, sizeof( str ) * alloc );
|
|
Packit |
89ede9 |
if ( !more ) return SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a->strs = more;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=a->max; i
|
|
Packit |
89ede9 |
str_init( &(a->strs[i]) );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a->max = alloc;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return SLIST_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
#define SLIST_EXACT_SIZE (0)
|
|
Packit |
89ede9 |
#define SLIST_DOUBLE_SIZE (1)
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static int
|
|
Packit |
89ede9 |
slist_ensure_space( slist *a, slist_index n, int mode )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status = SLIST_OK;
|
|
Packit |
89ede9 |
int alloc = n;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( a->max==0 ) {
|
|
Packit |
89ede9 |
if ( mode == SLIST_DOUBLE_SIZE && alloc < SLIST_MINALLOC ) alloc = SLIST_MINALLOC;
|
|
Packit |
89ede9 |
status = slist_alloc( a, alloc );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else if ( a->max < n ) {
|
|
Packit |
89ede9 |
if ( mode == SLIST_DOUBLE_SIZE && alloc < a->max * 2 ) alloc = a->max * 2;
|
|
Packit |
89ede9 |
status = slist_realloc( a, alloc );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_addvp( slist *a, int mode, void *vp )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str *s = NULL;
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
status = slist_ensure_space( a, a->n+1, SLIST_DOUBLE_SIZE );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( status==SLIST_OK ) {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
s = &( a->strs[a->n] );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( mode==SLIST_CHR )
|
|
Packit |
89ede9 |
str_strcpyc( s, (const char*) vp );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
str_strcpy( s, (str*) vp );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( str_memerr( s ) ) return NULL;
|
|
Packit |
89ede9 |
a->n++;
|
|
Packit |
89ede9 |
if ( a->sorted && a->n > 1 ) {
|
|
Packit |
89ede9 |
if ( slist_comp_step( a, a->n-2, a->n-1 ) > 0 )
|
|
Packit |
89ede9 |
a->sorted = 0;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return s;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_addc( slist *a, const char *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return slist_addvp( a, SLIST_CHR, (void*)s );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_add( slist *a, str *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return slist_addvp( a, SLIST_STR, (void*)s );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_addvp_unique( slist *a, int mode, void *vp )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str *s;
|
|
Packit |
89ede9 |
int n;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( mode==SLIST_CHR )
|
|
Packit |
89ede9 |
n = slist_findc( a, (const char*) vp );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
n = slist_find( a, (str*) vp );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( slist_wasfound( a, n ) )
|
|
Packit |
89ede9 |
s = &( a->strs[n] );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
s = slist_addvp( a, mode, vp );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return s;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_addc_unique( slist *a, const char *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return slist_addvp_unique( a, SLIST_CHR, (void*)s );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str *
|
|
Packit |
89ede9 |
slist_add_unique( slist *a, str *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return slist_addvp_unique( a, SLIST_STR, (void*)s );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_addvp_all( slist *a, int mode, ... )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int ret = SLIST_OK;
|
|
Packit |
89ede9 |
va_list ap;
|
|
Packit |
89ede9 |
void *v;
|
|
Packit |
89ede9 |
str *s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
va_start( ap, mode );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( mode==SLIST_CHR )
|
|
Packit |
89ede9 |
v = va_arg( ap, char * );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
v = va_arg( ap, str * );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( v ) {
|
|
Packit |
89ede9 |
s = slist_addvp( a, mode, v );
|
|
Packit |
89ede9 |
if ( s==NULL ) {
|
|
Packit |
89ede9 |
ret = SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
} while ( v );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
va_end( ap );
|
|
Packit |
89ede9 |
return ret;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_add_all( slist *a, ... )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int ret = SLIST_OK;
|
|
Packit |
89ede9 |
va_list ap;
|
|
Packit |
89ede9 |
str *s, *v;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
va_start( ap, a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
v = va_arg( ap, str * );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( v ) {
|
|
Packit |
89ede9 |
s = slist_addvp( a, SLIST_STR, (void*)v );
|
|
Packit |
89ede9 |
if ( s==NULL ) {
|
|
Packit |
89ede9 |
ret = SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
} while ( v );
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
va_end( ap );
|
|
Packit |
89ede9 |
return ret;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_addc_all( slist *a, ... )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int ret = SLIST_OK;
|
|
Packit |
89ede9 |
const char *v;
|
|
Packit |
89ede9 |
va_list ap;
|
|
Packit |
89ede9 |
str *s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
va_start( ap, a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
v = va_arg( ap, const char * );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( v ) {
|
|
Packit |
89ede9 |
s = slist_addvp( a, SLIST_CHR, (void*)v );
|
|
Packit |
89ede9 |
if ( s==NULL ) {
|
|
Packit |
89ede9 |
ret = SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
} while ( v );
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
va_end( ap );
|
|
Packit |
89ede9 |
return ret;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_append( slist *a, slist *toadd )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i, status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
assert( toadd );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
status = slist_ensure_space( a, a->n + toadd->n, SLIST_EXACT_SIZE );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( status == SLIST_OK ) {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<toadd->n; ++i ) {
|
|
Packit |
89ede9 |
str_strcpy( &(a->strs[a->n+i]), &(toadd->strs[i]) );
|
|
Packit |
89ede9 |
if ( str_memerr( &(a->strs[a->n+i]) ) ) return SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a->n += toadd->n;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return status;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_append_unique( slist *a, slist *toadd )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
str *s;
|
|
Packit |
89ede9 |
int i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
assert( toadd );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<toadd->n; ++i ) {
|
|
Packit |
89ede9 |
s = slist_add_unique( a, &(toadd->strs[i]) );
|
|
Packit |
89ede9 |
if ( !s ) return SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return SLIST_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_remove( slist *a, slist_index n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !slist_valid_num( a, n ) ) return SLIST_ERR_BADPARAM;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=n+1; i<a->n; ++i ) {
|
|
Packit |
89ede9 |
str_strcpy( &(a->strs[i-1]), &(a->strs[i]) );
|
|
Packit |
89ede9 |
if ( str_memerr( &(a->strs[i-1]) ) ) return SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
a->n--;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return SLIST_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_sort( slist *a )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
qsort( a->strs, a->n, sizeof( str ), slist_comp );
|
|
Packit |
89ede9 |
a->sorted = 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static slist_index
|
|
Packit |
89ede9 |
slist_find_sorted( slist *a, const char *searchstr )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index min, max, mid;
|
|
Packit |
89ede9 |
str s, *cs;
|
|
Packit |
89ede9 |
int comp;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
assert( searchstr );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
str_initstrc( &s, searchstr );
|
|
Packit |
89ede9 |
min = 0;
|
|
Packit |
89ede9 |
max = a->n - 1;
|
|
Packit |
89ede9 |
while ( min <= max ) {
|
|
Packit |
89ede9 |
mid = ( min + max ) / 2;
|
|
Packit |
89ede9 |
cs = slist_str( a, mid );
|
|
Packit |
89ede9 |
comp = slist_comp( (void*)cs, (void*) (&s) );
|
|
Packit |
89ede9 |
if ( comp==0 ) {
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return mid;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
else if ( comp > 0 ) max = mid - 1;
|
|
Packit |
89ede9 |
else if ( comp < 0 ) min = mid + 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return -1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
static slist_index
|
|
Packit |
89ede9 |
slist_find_simple( slist *a, const char *searchstr, int nocase )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
assert( searchstr );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( nocase ) {
|
|
Packit |
89ede9 |
for ( i=0; i<a->n; ++i )
|
|
Packit |
89ede9 |
if ( !str_strcasecmpc( &(a->strs[i]), searchstr ) )
|
|
Packit |
89ede9 |
return i;
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
for ( i=0; i<a->n; ++i )
|
|
Packit |
89ede9 |
if ( !str_strcmpc( &(a->strs[i]), searchstr ) )
|
|
Packit |
89ede9 |
return i;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return -1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_index
|
|
Packit |
89ede9 |
slist_findc( slist *a, const char *searchstr )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( a->n==0 ) return -1;
|
|
Packit |
89ede9 |
if ( a->sorted )
|
|
Packit |
89ede9 |
return slist_find_sorted( a, searchstr );
|
|
Packit |
89ede9 |
else
|
|
Packit |
89ede9 |
return slist_find_simple( a, searchstr, 0 );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_index
|
|
Packit |
89ede9 |
slist_find( slist *a, str *searchstr )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( searchstr->len==0 ) return -1;
|
|
Packit |
89ede9 |
return slist_findc( a, str_cstr( searchstr ) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_index
|
|
Packit |
89ede9 |
slist_findnocasec( slist *a, const char *searchstr )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return slist_find_simple( a, searchstr, 1 );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_index
|
|
Packit |
89ede9 |
slist_findnocase( slist *a, str *searchstr )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
if ( searchstr->len==0 ) return -1;
|
|
Packit |
89ede9 |
return slist_findnocasec( a, str_cstr( searchstr ) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_wasfound( slist *a, slist_index n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return ( n!=-1 );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_wasnotfound( slist *a, slist_index n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return ( n==-1 );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_fillfp( slist *a, FILE *fp, unsigned char skip_blank_lines )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int ret = SLIST_OK;
|
|
Packit |
89ede9 |
str line, *s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
assert( fp );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_empty( a );
|
|
Packit |
89ede9 |
str_init( &line );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
while ( str_fgetline( &line, fp ) ) {
|
|
Packit |
89ede9 |
if ( skip_blank_lines && line.len==0 ) continue;
|
|
Packit |
89ede9 |
s = slist_add( a, &line );
|
|
Packit |
89ede9 |
if ( !s ) {
|
|
Packit |
89ede9 |
ret = SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
goto out;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &line );
|
|
Packit |
89ede9 |
return ret;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_fill( slist *a, const char *filename, unsigned char skip_blank_lines )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
FILE *fp;
|
|
Packit |
89ede9 |
int ret;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fp = fopen( filename, "r" );
|
|
Packit |
89ede9 |
if ( !fp ) return SLIST_ERR_CANTOPEN;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
ret = slist_fillfp( a, fp, skip_blank_lines );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
fclose( fp );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return ret;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_copy( slist *to, slist *from )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( to );
|
|
Packit |
89ede9 |
assert( from );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_free( to );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( from->n==0 ) return SLIST_OK;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
status = slist_ensure_space( to, from->n, SLIST_EXACT_SIZE );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( status == SLIST_OK ) {
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
to->sorted = from->sorted;
|
|
Packit |
89ede9 |
to->n = from->n;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<from->n; i++ ) {
|
|
Packit |
89ede9 |
str_strcpy( &(to->strs[i]), &(from->strs[i]) );
|
|
Packit |
89ede9 |
if ( str_memerr( &(to->strs[i]) ) ) return SLIST_ERR_MEMERR;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
return SLIST_OK;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist *
|
|
Packit |
89ede9 |
slist_dup( slist *from )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int status;
|
|
Packit |
89ede9 |
slist *to;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
to = slist_new();
|
|
Packit |
89ede9 |
if ( to ) {
|
|
Packit |
89ede9 |
status = slist_copy( to, from );
|
|
Packit |
89ede9 |
if ( status!=SLIST_OK ) {
|
|
Packit |
89ede9 |
slist_delete( to );
|
|
Packit |
89ede9 |
to = NULL;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return to;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
unsigned long
|
|
Packit |
89ede9 |
slist_get_maxlen( slist *a )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
unsigned long max = 0;
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
str *s;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
for ( i=0; i<a->n; ++i ) {
|
|
Packit |
89ede9 |
s = slist_str( a, i );
|
|
Packit |
89ede9 |
if ( s->len > max ) max = s->len;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
return max;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_dump( slist *a, FILE *fp, int newline )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
assert( fp );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( newline ) {
|
|
Packit |
89ede9 |
for ( i=0; i<a->n; ++i )
|
|
Packit |
89ede9 |
fprintf( fp, "%s\n", slist_cstr( a, i ) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
else {
|
|
Packit |
89ede9 |
for ( i=0; i<a->n; ++i )
|
|
Packit |
89ede9 |
fprintf( fp, "%s", slist_cstr( a, i ) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_match_entry( slist *a, int n, const char *s )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( !slist_valid_num( a, n ) ) return 0;
|
|
Packit |
89ede9 |
if ( str_strcmpc( &(a->strs[n]), s ) ) return 0;
|
|
Packit |
89ede9 |
return 1;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slist_trimend( slist *a, int n )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist_index i;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( a );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
if ( a->n - n < 1 ) {
|
|
Packit |
89ede9 |
slist_empty( a );
|
|
Packit |
89ede9 |
} else {
|
|
Packit |
89ede9 |
for ( i=a->n -n; i<a->n; ++i ) {
|
|
Packit |
89ede9 |
str_empty( &(a->strs[i]) );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
a->n -= n;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_tokenizec( slist *tokens, char *p, const char *delim, int merge_delim )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
int ret = SLIST_OK;
|
|
Packit |
89ede9 |
str s, *t;
|
|
Packit |
89ede9 |
char *q;
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
assert( tokens );
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
slist_empty( tokens );
|
|
Packit |
89ede9 |
str_init( &s );
|
|
Packit |
89ede9 |
while ( p && *p ) {
|
|
Packit |
89ede9 |
q = p;
|
|
Packit |
89ede9 |
while ( *q && !strchr( delim, *q ) ) q++;
|
|
Packit |
89ede9 |
str_segcpy( &s, p, q );
|
|
Packit |
89ede9 |
if ( str_memerr( &s ) ) { ret = SLIST_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
if ( s.len ) {
|
|
Packit |
89ede9 |
t = slist_addvp( tokens, SLIST_STR, (void*) &s );
|
|
Packit |
89ede9 |
if ( !t ) { ret = SLIST_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
} else if ( !merge_delim ) {
|
|
Packit |
89ede9 |
t = slist_addvp( tokens, SLIST_CHR, (void*) "" );
|
|
Packit |
89ede9 |
if ( !t ) { ret = SLIST_ERR_MEMERR; goto out; }
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
p = q;
|
|
Packit |
89ede9 |
if ( *p ) p++;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
out:
|
|
Packit |
89ede9 |
str_free( &s );
|
|
Packit |
89ede9 |
return ret;
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
int
|
|
Packit |
89ede9 |
slist_tokenize( slist *tokens, str *in, const char *delim, int merge_delim )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
return slist_tokenizec( tokens, str_cstr( in ), delim, merge_delim );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slists_init( slist *a, ... )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist *a2;
|
|
Packit |
89ede9 |
va_list ap;
|
|
Packit |
89ede9 |
slist_init( a );
|
|
Packit |
89ede9 |
va_start( ap, a );
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
a2 = va_arg( ap, slist * );
|
|
Packit |
89ede9 |
if ( a2 ) slist_init( a2 );
|
|
Packit |
89ede9 |
} while ( a2 );
|
|
Packit |
89ede9 |
va_end( ap );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slists_free( slist *a, ... )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist *a2;
|
|
Packit |
89ede9 |
va_list ap;
|
|
Packit |
89ede9 |
slist_free( a );
|
|
Packit |
89ede9 |
va_start( ap, a );
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
a2 = va_arg( ap, slist * );
|
|
Packit |
89ede9 |
if ( a2 ) slist_free( a2 );
|
|
Packit |
89ede9 |
} while ( a2 );
|
|
Packit |
89ede9 |
va_end( ap );
|
|
Packit |
89ede9 |
}
|
|
Packit |
89ede9 |
|
|
Packit |
89ede9 |
void
|
|
Packit |
89ede9 |
slists_empty( slist *a, ... )
|
|
Packit |
89ede9 |
{
|
|
Packit |
89ede9 |
slist *a2;
|
|
Packit |
89ede9 |
va_list ap;
|
|
Packit |
89ede9 |
slist_empty( a );
|
|
Packit |
89ede9 |
va_start( ap, a );
|
|
Packit |
89ede9 |
do {
|
|
Packit |
89ede9 |
a2 = va_arg( ap, slist * );
|
|
Packit |
89ede9 |
if ( a2 ) slist_empty( a2 );
|
|
Packit |
89ede9 |
} while ( a2 );
|
|
Packit |
89ede9 |
va_end( ap );
|
|
Packit |
89ede9 |
}
|