1 /* Martin Asser Hansen (mail@maasha.dk) Copyright (C) 2008 - All right reserved */
7 #define SIZE_BLOCK 10000000
9 barray *barray_new( size_t nmemb )
11 /* Martin A. Hansen, November 2008. */
13 /* Initialize a new zeroed byte array
14 * with nmemb number of elements. */
18 ba = mem_get( sizeof( barray ) );
19 ba->array = mem_get_zero( nmemb * sizeof( ba->array ) );
27 size_t barray_new_size( size_t nmemb_old )
29 /* Martin A. Hansen, November 2008. */
31 /* Returns a new larger byte array size. */
35 while ( nmemb_new < nmemb_old ) {
36 nmemb_new += SIZE_BLOCK;
39 // fprintf( stderr, "New size: %zu\n", nmemb_new );
45 void barray_resize( barray *ba, size_t nmemb_new )
47 /* Martin A. Hansen, November 2008. */
49 /* Reallocate a byte array, any new elements will be zeroed. */
51 size_t size_old = ba->nmemb * sizeof( ba->array );
52 size_t size_new = nmemb_new * sizeof( ba->array );
54 ba->array = ( ushort * ) mem_resize_zero( ( void * ) ba->array, size_old, size_new );
55 ba->nmemb = nmemb_new;
59 void barray_print( barray *ba )
61 /* Martin A. Hansen, November 2008. */
63 /* Debug function to print the content of a byte array. */
67 printf( "\nnmemb: %zu end: %zu\n", ba->nmemb, ba->end );
69 for ( i = 0; i < ba->nmemb; i++ ) {
70 printf( "%d: %d\n", i, ba->array[ i ] );
75 void barray_interval_inc( barray *ba, size_t beg, size_t end, ushort score )
77 /* Martin A. Hansen, November 2008. */
79 /* Increments a given interval of a byte array with a given score.
80 * Resizes the byte array if needed. */
86 if ( end > ba->nmemb ) {
87 barray_resize( ba, barray_new_size( end ) );
92 for ( i = beg; i <= end; i++ ) {
93 ba->array[ i ] += score;
96 ba->end = MAX( ba->end, end );
100 bool barray_interval_scan( barray *ba, size_t *pos_pt, size_t *beg_pt, size_t *end_pt )
102 /* Martin A. Hansen, November 2008. */
104 /* Scan a byte array from a given position
105 * for the next interval of non-zero values. */
107 size_t pos = *pos_pt;
108 size_t beg = *beg_pt;
109 size_t end = *end_pt;
111 if ( pos > ba->end ) {
115 while ( pos < ba->end && ba->array[ pos ] == 0 ) {
121 while ( pos <= ba->end && ba->array[ pos ] != 0 ) {
141 void barray_destroy( barray **ba_ppt )
143 /* Martin A. Hansen, November 2008. */
145 /* Deallocates a byte array and set it to NULL. */
147 barray *ba = *ba_ppt;
149 mem_free( ba->array );