ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
video/ascii/frame_validator.c
Go to the documentation of this file.
3#include <string.h>
5
16static size_t frame_find_final_reset(const char *frame_data, size_t frame_size) {
17 if (!frame_data || frame_size < 4) {
18 return SIZE_MAX;
19 }
20
21 const char *reset_seq = "\033[0m";
22 size_t reset_len = 4;
23
24 // Search backwards from end to find LAST reset sequence
25 for (int i = (int)frame_size - (int)reset_len; i >= 0; i--) {
26 if (memcmp(&frame_data[i], reset_seq, reset_len) == 0) {
27 return (size_t)i;
28 }
29 }
30
31 return SIZE_MAX;
32}
33
34bool frame_validate_integrity(const char *frame_data, size_t frame_size) {
35 if (!frame_data || frame_size == 0) {
36 return false;
37 }
38
39 size_t reset_pos = frame_find_final_reset(frame_data, frame_size);
40 if (reset_pos == SIZE_MAX) {
41 // No reset sequence found - this is suspicious
42 log_warn("FRAME_VALIDATION: No ESC[0m reset sequence found in %zu byte frame", frame_size);
43 return false;
44 }
45
46 size_t expected_end = reset_pos + 4; // 4 bytes for ESC[0m
47
48 // Check if there's garbage after the reset
49 if (expected_end < frame_size) {
50 // Calculate how much garbage we have
51 size_t garbage_size = frame_size - expected_end;
52
53 // Check what the garbage looks like
54 const uint8_t *garbage = (const uint8_t *)&frame_data[expected_end];
55
56 // Log the garbage for debugging
57 log_warn("FRAME_VALIDATION: Found %zu garbage bytes after reset at offset %zu (frame size %zu): "
58 "[%02x %02x %02x %02x ...]",
59 garbage_size, expected_end, frame_size, garbage[0], garbage_size > 1 ? garbage[1] : 0,
60 garbage_size > 2 ? garbage[2] : 0, garbage_size > 3 ? garbage[3] : 0);
61
62 return false;
63 }
64
65 // Frame looks valid
66 log_debug("FRAME_VALIDATION: Frame OK (%zu bytes, ends at offset %zu)", frame_size, expected_end);
67 return true;
68}
69
70size_t frame_get_valid_end(const char *frame_data, size_t frame_size) {
71 if (!frame_data || frame_size < 4) {
72 return frame_size;
73 }
74
75 size_t reset_pos = frame_find_final_reset(frame_data, frame_size);
76 if (reset_pos == SIZE_MAX) {
77 return frame_size; // No reset found, assume all data is valid
78 }
79
80 return reset_pos + 4; // Return position after the reset sequence
81}
unsigned char uint8_t
Definition common.h:60
#define log_warn(...)
Log a WARN message.
Definition log/log.h:621
#define log_debug(...)
Log a DEBUG message.
Definition log/log.h:595
📝 Logging API with multiple log levels and terminal output control
🔤 String Manipulation and Shell Escaping Utilities
bool frame_validate_integrity(const char *frame_data, size_t frame_size)
Validate ASCII frame integrity.
size_t frame_get_valid_end(const char *frame_data, size_t frame_size)
Get the actual valid frame end position.