99 lines
2.7 KiB
Text
99 lines
2.7 KiB
Text
```
|
|
#include <array/length-prefix.h>
|
|
#include <stdlib.h>
|
|
```
|
|
|
|
morph_seqseq_valsep_uint8 (T: Type, SrcDelim: T, DstDelim: T)
|
|
< Seq <Seq T> >
|
|
~ < ValueSep SrcDelim T >
|
|
~ < Seq~<LengthPrefix native.UInt64> T >
|
|
|
|
--> < Seq <Seq T> >
|
|
~ < ValueSep DstDelim T >
|
|
~ < Seq~<LengthPrefix native.UInt64> T >
|
|
```
|
|
length_prefix_uint64_t_array_uint8_t_clear( dst );
|
|
|
|
uint8_t * dst_items = dst->items;
|
|
for( uint64_t i = 0; i < src->len; ++i ) {
|
|
if( src->items[i] == SrcDelim ) {
|
|
length_prefix_uint64_t_array_uint8_t_push( dst, DstDelim );
|
|
} else if( src->items[i] == DstDelim ) {
|
|
if( DstDelim == '\n' ) {
|
|
length_prefix_uint64_t_array_uint8_t_push( dst, '\\' );
|
|
length_prefix_uint64_t_array_uint8_t_push( dst, 'n' );
|
|
}
|
|
} else {
|
|
length_prefix_uint64_t_array_uint8_t_push( dst, src->items[i] );
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
```
|
|
|
|
|
|
morph_seqseq_as_valsep_to_lenpfx (T: Type, Delim: T, EscKey: T)
|
|
< Seq <Seq T> >
|
|
~ < ValueSep T Delim >
|
|
~ < Seq~<LengthPrefix native.UInt64> T >
|
|
|
|
--> < Seq~<LengthPrefix native.UInt64>
|
|
<Seq~<LengthPrefix native.UInt64> T >
|
|
~ <RefMut < Seq~<LengthPrefix native.UInt64> T>>
|
|
~ native.Address
|
|
~ native.UInt64
|
|
>
|
|
```
|
|
length_prefix_uint64_t_array_uint64_t_clear( dst );
|
|
|
|
struct LengthPrefix_uint64_t_Array_uint8_t * cur_item = NULL;
|
|
|
|
uint8_t const * start = &src->items[0];
|
|
uint8_t const * cur = start;
|
|
uint8_t const * end = &src->items[src->len];
|
|
|
|
while( cur < end ) {
|
|
if( *cur == Delim || cur+1 == end ) {
|
|
uint64_t len = cur - start;
|
|
|
|
cur_item = malloc( sizeof(uint64_t) + sizeof(uint8_t) * len );
|
|
cur_item->len = len;
|
|
memcpy( cur_item->items, start, len );
|
|
|
|
length_prefix_uint64_t_array_uint64_t_push( dst, (uint64_t)cur_item );
|
|
start = ++cur;
|
|
} else {
|
|
cur++;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
```
|
|
|
|
morph_seqeq_as_lenpfx_to_valsep (T: Type, Delim: T, EscKey: T)
|
|
< Seq~<LengthPrefix native.UInt64>
|
|
<Seq~<LengthPrefix native.UInt64> T >
|
|
~ <RefMut < Seq~<LengthPrefix native.UInt64> T>>
|
|
~ native.Address
|
|
~ native.UInt64
|
|
>
|
|
--> < Seq <Seq T> >
|
|
~ < ValueSep T Delim >
|
|
~ < Seq~<LengthPrefix native.UInt64> T >
|
|
```
|
|
length_prefix_uint64_t_array_uint8_t_clear( dst );
|
|
|
|
for( uint64_t i = 0; i < src->len; ++i ) {
|
|
LengthPrefix_uint64_t_Array_uint8_t * item = src->items[i];
|
|
|
|
for( uint64_t j = 0; j < item->len; ++j ) {
|
|
length_prefix_uint64_t_array_uint8_t_push( items->items[j] );
|
|
}
|
|
|
|
if( i+1 < src->len ) {
|
|
length_prefix_uint64_t_array_uint8_t_push( Delim );
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
```
|