GCC Code Coverage Report


Directory: csrc/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 33 / 0 / 33
Functions: 100.0% 1 / 0 / 1
Branches: -% 0 / 0 / 0

dat.c
Line Branch Exec Source
1 #include "evutils/dat.h"
2
3 typedef struct dat_state_s {
4 uint64_t ts_offset; /* accumulated 2^32 timestamp wraps */
5 uint32_t last_ts; /* last raw 32-bit timestamp seen */
6 uint8_t have_last; /* whether last_ts is valid */
7 } dat_state_t;
8
9 17 size_t DAT_state_size(void) {
10 17 return sizeof(dat_state_t);
11 }
12
13 EVUTILS_TARGET_CLONES
14 95 parser_result_t DAT_parse_chunk_soa(
15 dat_state_t *state,
16 const dat_input_buffer_t *input_buffer,
17 event_buffer_soa_t *event_buffer,
18 trigger_buffer_soa_t *trigger_buffer) {
19
20 (void)trigger_buffer; /* DAT CD files carry no triggers */
21
22 95 const uint32_t *restrict current = input_buffer->begin;
23 95 const uint32_t *restrict end = input_buffer->end;
24
25 95 timestamp_t* restrict out_ts = event_buffer->t;
26 95 uint16_t* restrict out_x = event_buffer->x;
27 95 uint16_t* restrict out_y = event_buffer->y;
28 95 uint8_t* restrict out_p = event_buffer->p;
29
30 95 size_t n = event_buffer->size;
31 95 const size_t capacity = event_buffer->capacity;
32
33 95 uint64_t ts_offset = state->ts_offset;
34 95 uint32_t last_ts = state->last_ts;
35 95 uint8_t have_last = state->have_last;
36
37 95 parse_status_t status = EVUTILS_PARSE_OK;
38
39 /* Each event is two uint32 words: [timestamp, data]. */
40 87696102 while (current + 2 <= end && n < capacity) {
41 87696007 uint32_t ts_raw = current[0];
42 87696007 uint32_t data = current[1];
43 87696007 current += 2;
44
45 87696007 if (have_last && ts_raw < last_ts) {
46 2 ts_offset += (uint64_t)1 << 32; /* 32-bit timestamp wrapped */
47 }
48 87696007 last_ts = ts_raw;
49 87696007 have_last = 1;
50
51 87696007 out_ts[n] = ts_offset | (uint64_t)ts_raw;
52 87696007 out_x[n] = (uint16_t)(data & 0x3FFF);
53 87696007 out_y[n] = (uint16_t)((data >> 14) & 0x3FFF);
54 87696007 out_p[n] = (uint8_t)((data >> 28) & 0x1);
55 87696007 n++;
56 }
57
58 95 event_buffer->size = n;
59 95 state->ts_offset = ts_offset;
60 95 state->last_ts = last_ts;
61 95 state->have_last = have_last;
62
63 95 return (parser_result_t){
64 .current = (const void *)current,
65 .status = status
66 };
67 }
68