#include <stdio.h> #include <stdint.h> #include <morphisms/length-prefix.h> void length_prefix_uint64_array_clear( struct LengthPrefixUInt64Array * data ) { data->len = 0; } void length_prefix_uint64_array_push( struct LengthPrefixUInt64Array * data, uint64_t value ) { data->items[ data->len ] = value; data->len += 1; } int length_prefix_uint64_array_reverse( struct LengthPrefixUInt64Array const * restrict src, struct LengthPrefixUInt64Array * restrict dst ) { dst->len = src->len; for(uint64_t i = 0; i < src->len; ++i) { dst->items[i] = src->items[src->len - i - 1]; } return 0; } int length_prefix_array_map_64_to_64( int (*f) ( uint64_t const * restrict, uint64_t * restrict ), struct LengthPrefixUInt64Array const * restrict src, struct LengthPrefixUInt64Array * restrict dst ) { dst->len = src->len; for( uint64_t i = 0; i < src->len; ++i ) { int result = f( &src->items[i], &dst->items[i] ); if( result ) { return result; } } return 0; } int length_prefix_array_map_8_to_64( int (*f) ( uint8_t const * restrict, uint64_t * restrict ), struct LengthPrefixUInt8Array const * restrict src, struct LengthPrefixUInt64Array * restrict dst ) { dst->len = src->len; for( uint64_t i = 0; i < src->len; ++i ) { int result = f( &src->items[i], &dst->items[i] ); if( result ) { return result; } } return 0; } int length_prefix_array_map_64_to_8( int (*f) ( uint64_t const * restrict, uint8_t * restrict ), struct LengthPrefixUInt64Array const * restrict src, struct LengthPrefixUInt8Array * restrict dst ) { dst->len = src->len; for( uint64_t i = 0; i < src->len; ++i ) { int result = f( &src->items[i], &dst->items[i] ); if( result ) { return result; } } return 0; } void length_prefix_uint64_array_dump( struct LengthPrefixUInt64Array const * data ) { printf("Len = %d, [", data->len); for( uint64_t i = 0; i < data->len; ++i ) { printf("%d; ", data->items[i]); } printf("]\n"); } void length_prefix_uint8_array_clear( struct LengthPrefixUInt8Array * data ) { data->len = 0; } void length_prefix_uint8_array_push( struct LengthPrefixUInt8Array * data, uint8_t value ) { data->items[ data->len ] = value; data->len += 1; } int length_prefix_uint8_array_reverse( struct LengthPrefixUInt8Array const * restrict src, struct LengthPrefixUInt8Array * restrict dst ) { dst->len = src->len; for(uint64_t i = 0; i < src->len; ++i) { dst->items[i] = src->items[src->len - i - 1]; } return 0; } void length_prefix_uint8_array_dump( struct LengthPrefixUInt8Array const * data ) { printf("Len = %d, [", data->len); for( uint64_t i = 0; i < data->len; ++i ) { printf("%d; ", data->items[i]); } printf("]\n"); } int morph_string_as_nullterm_to_length_prefix( char const * restrict src, struct LengthPrefixUInt8Array * restrict dst ) { length_prefix_uint8_array_clear(dst); while( *src ) { length_prefix_uint8_array_push(dst, *src); src++; } return 0; } int morph_string_as_length_prefix_to_nullterm( struct LengthPrefixUInt8Array const * restrict src, char * restrict dst ) { for( uint64_t i = 0; i < src->len; ++i ) { *dst ++ = src->items[i]; } *dst = '\0'; return 0; }