GCC Code Coverage Report


Directory: csrc/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 35 / 0 / 35
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 34 size_t DAT_state_size(void) {
10 34 return sizeof(dat_state_t);
11 }
12
13 EVUTILS_TARGET_CLONES
14 150 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 150 const uint32_t *restrict current = input_buffer->begin;
23 150 const uint32_t *restrict end = input_buffer->end;
24
25 150 timestamp_t* restrict out_ts = event_buffer->t;
26 150 uint16_t* restrict out_x = event_buffer->x;
27 150 uint16_t* restrict out_y = event_buffer->y;
28 150 uint8_t* restrict out_p = event_buffer->p;
29
30 150 size_t n = event_buffer->size;
31 150 const size_t capacity = event_buffer->capacity;
32
33 150 uint64_t ts_offset = state->ts_offset;
34 150 uint32_t last_ts = state->last_ts;
35 150 uint8_t have_last = state->have_last;
36
37 150 parse_status_t status = EVUTILS_PARSE_OK;
38
39 /* Each event is two uint32 words: [timestamp, data]. */
40 87983667 while (current + 2 <= end && n < capacity) {
41 87983517 uint32_t ts_raw = current[0];
42 87983517 uint32_t data = current[1];
43 87983517 current += 2;
44
45 87983517 if (have_last && ts_raw < last_ts) {
46 6244 ts_offset += (uint64_t)1 << 32; /* 32-bit timestamp wrapped */
47 }
48 87983517 last_ts = ts_raw;
49 87983517 have_last = 1;
50
51 87983517 out_ts[n] = ts_offset | (uint64_t)ts_raw;
52 87983517 out_x[n] = (uint16_t)(data & 0x3FFF);
53 87983517 out_y[n] = (uint16_t)((data >> 14) & 0x3FFF);
54 87983517 out_p[n] = (uint8_t)((data >> 28) & 0x1);
55 87983517 n++;
56 }
57
58 150 event_buffer->size = n;
59 150 state->ts_offset = ts_offset;
60 150 state->last_ts = last_ts;
61 150 state->have_last = have_last;
62
63 /* Report why parsing stopped: output space exhausted vs input drained. */
64 150 if (n >= capacity) {
65 131 status = EVUTILS_PARSE_OUTPUT_FULL;
66 }
67
68 150 return (parser_result_t){
69 .current = (const void *)current,
70 .status = status
71 };
72 }
73