ldmc/morphisms/src/length-prefix.c

147 lines
3.4 KiB
C

#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;
}