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( "\nba->nmemb: %zu ba->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. */
87 if ( end > ba->nmemb ) {
88 barray_resize( ba, barray_new_size( end ) );
93 for ( i = beg; i <= end; i++ ) {
94 ba->array[ i ] += score;
97 ba->end = MAX( ba->end, end );
101 bool barray_interval_scan( barray *ba, size_t *pos_pt, size_t *beg_pt, size_t *end_pt )
103 /* Martin A. Hansen, November 2008. */
105 /* Scan a byte array from a given position
106 * for the next interval of non-zero values. */
108 size_t pos = *pos_pt;
109 size_t beg = *beg_pt;
110 size_t end = *end_pt;
112 if ( pos > ba->end || ba->end == 0 ) {
116 while ( pos < ba->end && ba->array[ pos ] == 0 ) {
122 while ( pos <= ba->end && ba->array[ pos ] != 0 ) {
142 ushort barray_interval_max( barray *ba, size_t beg, size_t end )
144 /* Martin A. Hansen, December 2008. */
146 /* Locate the max value in an interval within a byte array. */
151 for ( i = beg; i <= end; i++ ) {
152 max = MAX( max, ba->array[ i ] );
159 void barray_destroy( barray **ba_ppt )
161 /* Martin A. Hansen, November 2008. */
163 /* Deallocates a byte array and set it to NULL. */
165 barray *ba = *ba_ppt;
167 mem_free( ba->array );