diff options
author | Norbert Preining <norbert@preining.info> | 2020-05-28 03:03:21 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-05-28 03:03:21 +0000 |
commit | 745892fbddea56040139108277e728b53fd8fc11 (patch) | |
tree | 15e55e299b38fccdabce8364f1fbf4f02ef37994 /support/texlab/crates/bibutils_sys/src/vplist.c | |
parent | 195ca7e0c377d83455867bdd8e409d4e1cf024ea (diff) |
CTAN sync 202005280303
Diffstat (limited to 'support/texlab/crates/bibutils_sys/src/vplist.c')
-rw-r--r-- | support/texlab/crates/bibutils_sys/src/vplist.c | 387 |
1 files changed, 0 insertions, 387 deletions
diff --git a/support/texlab/crates/bibutils_sys/src/vplist.c b/support/texlab/crates/bibutils_sys/src/vplist.c deleted file mode 100644 index 7f4e2927c9..0000000000 --- a/support/texlab/crates/bibutils_sys/src/vplist.c +++ /dev/null @@ -1,387 +0,0 @@ -/* - * vplist.c - * - * Version: 1/9/2017 - * - * Copyright (c) Chris Putnam 2011-2019 - * - * Source code released under the GPL version 2 - * - * Implements a simple managed array of pointers to void - * - */ -#include <stdlib.h> -#include "vplist.h" - -/* Do not use asserts in VPLIST_NOASSERT defined */ -#ifdef VPLIST_NOASSERT -#define NDEBUG -#endif -#include <assert.h> - -#define VPLIST_MINALLOC (20) - -#define VPLIST_EXACT_SIZE (0) -#define VPLIST_DOUBLE_SIZE (1) - -void -vplist_init( vplist *vpl ) -{ - assert( vpl ); - vpl->data = NULL; - vpl->n = vpl->max = 0; -} - -vplist * -vplist_new( void ) -{ - vplist *vpl; - vpl = ( vplist * ) malloc( sizeof( vplist ) ); - if ( vpl ) vplist_init( vpl ); - return vpl; -} - -static inline int -vplist_alloc( vplist *vpl, vplist_index alloc ) -{ - vpl->data = ( void ** ) malloc( sizeof( void * ) * alloc ); - if ( !vpl->data ) return VPLIST_MEMERR; - - vpl->max = alloc; - vpl->n = 0; - - return VPLIST_OK; -} - -static inline int -vplist_realloc( vplist *vpl, vplist_index alloc ) -{ - void **more; - - more = ( void ** ) realloc( vpl->data, sizeof( void * ) * alloc ); - if ( !more ) return VPLIST_MEMERR; - - vpl->data = more; - vpl->max = alloc; - - return VPLIST_OK; -} - -/* vplist_ensure_space( vpl, n, mode ) - * - * Makes sure that vplist can hold at least n members, allocating memory if required. - * - * mode - * - Can either be VPLIST_DOUBLE_SIZE or VPLIST_EXACT_SIZE. - * - If VPLIST_EXACT_SIZE and current size < n, size will be exactly n. - * - If VPLIST_DOUBLE_SIZE and current size < n, size will be doubled (or VPLIST_MINALLOC - * if the vplist is empty) or n, whichever is bigger. - * - * Returns VPLIST_OK or VPLIST_MEMERR. - */ -static int -vplist_ensure_space( vplist *vpl, vplist_index n, unsigned char mode ) -{ - vplist_index alloc = n; - int status = VPLIST_OK; - - if ( vpl->max == 0 ) { - if ( mode == VPLIST_DOUBLE_SIZE && alloc < VPLIST_MINALLOC ) alloc = VPLIST_MINALLOC; - status = vplist_alloc( vpl, alloc ); - } - - else if ( vpl->max < n ) { - if ( mode == VPLIST_DOUBLE_SIZE && alloc < 2 * vpl->max ) alloc = 2 * vpl->max; - status = vplist_realloc( vpl, alloc ); - } - - return status; -} - -int -vplist_copy( vplist *to, vplist *from ) -{ - vplist_index i; - int status; - - assert( to ); - assert( from ); - - status = vplist_ensure_space( to, from->n, VPLIST_EXACT_SIZE ); - - if ( status == VPLIST_OK ) { - - for ( i=0; i<from->n; ++i ) - to->data[i] = from->data[i]; - to->n = from->n; - - } - - return status; -} - -int -vplist_fill( vplist *vpl, vplist_index n, void *v ) -{ - vplist_index i; - int status; - - assert( vpl ); - - status = vplist_ensure_space( vpl, n, VPLIST_EXACT_SIZE ); - - if ( status == VPLIST_OK ) { - - for ( i=0; i<n; ++i ) - vpl->data[i] = v; - vpl->n = n; - - } - - return status; -} - -int -vplist_add( vplist *vpl, void *v ) -{ - int status; - - assert( vpl ); - - status = vplist_ensure_space( vpl, vpl->n + 1, VPLIST_DOUBLE_SIZE ); - - if ( status == VPLIST_OK ) { - - vpl->data[vpl->n] = v; - vpl->n++; - - } - - return status; -} - -int -vplist_insert_list( vplist *vpl, vplist_index pos, vplist *add ) -{ - vplist_index i; - int status; - - assert( vpl ); - assert( add ); - assert( pos <= vpl->n ); - - /* nothing to do here */ - if ( add->n < 1 ) return VPLIST_OK; - - status = vplist_ensure_space( vpl, vpl->n + add->n, VPLIST_DOUBLE_SIZE ); - - if ( status == VPLIST_OK ) { - - for ( i=vpl->n-1; i>=pos; --i ) - vpl->data[i+add->n] = vpl->data[i]; - - for ( i=0; i<add->n; ++i ) - vpl->data[pos+i] = add->data[i]; - - vpl->n += add->n; - } - - return status; -} - -int -vplist_append( vplist *vpl, vplist *add ) -{ - vplist_index i; - int status; - - assert( vpl ); - assert( add ); - - status = vplist_ensure_space( vpl, vpl->n + add->n, VPLIST_DOUBLE_SIZE ); - - if ( status == VPLIST_OK ) { - - for ( i=0; i<add->n; ++i ) - vpl->data[ vpl->n + i ] = add->data[i]; - - vpl->n += add->n; - - } - - return status; -} - -static void -vplist_freemembers( vplist *vpl, vplist_ptrfree vpf ) -{ - vplist_index i; - void *v; - for ( i=0; i<vpl->n; ++i ) { - v = vplist_get( vpl, i ); - if ( v ) (*vpf)( v ); - } -} - -void -vplist_emptyfn( vplist *vpl, vplist_ptrfree vpf ) -{ - assert( vpl ); - if ( vpf ) vplist_freemembers( vpl, vpf ); - vpl->n = 0; -} - -void -vplist_empty( vplist *vpl ) -{ - vplist_emptyfn( vpl, NULL ); -} - -void -vplist_freefn( vplist *vpl, vplist_ptrfree vpf ) -{ - assert( vpl ); - if ( vpf ) vplist_freemembers( vpl, vpf ); - if ( vpl->data ) free( vpl->data ); - vplist_init( vpl ); -} - -void -vplist_free( vplist *vpl ) -{ - vplist_freefn( vpl, NULL ); -} - -void -vplist_deletefn( vplist **vpl, vplist_ptrfree vpf ) -{ - vplist_freefn( *vpl, vpf ); - free( *vpl ); - *vpl = NULL; -} - -void -vplist_delete( vplist **vpl ) -{ - vplist_deletefn( vpl, NULL ); -} - -static inline int -vplist_validindex( vplist *vpl, vplist_index n ) -{ - if ( n < 0 || n >= vpl->n ) return 0; - return 1; -} - -void * -vplist_get( vplist *vpl, vplist_index n ) -{ - assert( vpl ); - if ( !vplist_validindex( vpl, n ) ) return NULL; - return vpl->data[ n ]; -} - -void -vplist_set( vplist *vpl, vplist_index n, void *v ) -{ - assert( vpl ); - assert( vplist_validindex( vpl, n ) ); - vpl->data[ n ] = v; -} - -int -vplist_find( vplist *vpl, void *v ) -{ - vplist_index i; - assert( vpl ); - for ( i=0; i<vpl->n; ++i ) - if ( vpl->data[i]==v ) return i; - return -1; -} - -void -vplist_swap( vplist *vpl, vplist_index n1, vplist_index n2 ) -{ - void *tmp; - - assert( vpl ); - assert( vplist_validindex( vpl, n1 ) ); - assert( vplist_validindex( vpl, n2 ) ); - - tmp = vpl->data[n1]; - vpl->data[n1] = vpl->data[n2]; - vpl->data[n2] = tmp; -} - -int -vplist_removefn( vplist *vpl, vplist_index n, vplist_ptrfree vpf ) -{ - vplist_index i; - - assert( vpl ); - assert( vplist_validindex( vpl, n ) ); - - if ( vpf ) (*vpf)( vplist_get( vpl, n ) ); - - for ( i=n+1; i<vpl->n; ++i ) - vpl->data[ i-1 ] = vpl->data[ i ]; - vpl->n -= 1; - - return 1; -} - -int -vplist_remove( vplist *vpl, vplist_index n ) -{ - return vplist_removefn( vpl, n, NULL ); -} - -int -vplist_removevpfn( vplist *vpl, void *v, vplist_ptrfree vpf ) -{ - vplist_index n; - int count = 0; - - assert( vpl ); - - do { - n = vplist_find( vpl, v ); - if ( vplist_found( vpl, n ) ) { - vplist_removefn( vpl, n, vpf ); - count++; - } - } while ( vplist_found( vpl, n ) ); - - return count; -} - -int -vplist_removevp( vplist *vpl, void *v ) -{ - return vplist_removevpfn( vpl, v, NULL ); -} - -void -vplist_remove_rangefn( vplist *vpl, vplist_index start, vplist_index endplusone, vplist_ptrfree vpf ) -{ - vplist_index i, n; - - assert( endplusone <= vpl->n ); - assert( endplusone > start ); - - n = endplusone - start; - if ( vpf ) { - for ( i=start; i<endplusone; ++i ) - (*vpf)( vplist_get( vpl, i ) ); - } - for ( i=endplusone; i<vpl->n; ++i ) { - vpl->data[i-n] = vpl->data[i]; - } - vpl->n -= n; -} - -void -vplist_remove_range( vplist *vpl, vplist_index start, vplist_index endplusone ) -{ - vplist_remove_rangefn( vpl, start, endplusone, NULL ); -} |