27 if (!value_str || strlen(value_str) == 0) {
29 SAFE_SNPRINTF(error_msg, error_msg_size,
"Port value is required");
38 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid port value '%s'. Port must be a number between 1 and 65535.",
51 if (!value_str || strlen(value_str) == 0) {
53 SAFE_SNPRINTF(error_msg, error_msg_size,
"Value is required");
59 if (val == INT_MIN || val <= 0) {
61 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid value '%s'. Must be a positive integer.", value_str);
73 if (!value_str || strlen(value_str) == 0) {
75 SAFE_SNPRINTF(error_msg, error_msg_size,
"Value is required");
81 if (val == INT_MIN || val < 0) {
83 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid value '%s'. Must be a non-negative integer.", value_str);
97 SAFE_SNPRINTF(error_msg, error_msg_size,
"Color mode value is required");
102 if (strcmp(value_str,
"auto") == 0) {
105 if (strcmp(value_str,
"none") == 0 || strcmp(value_str,
"mono") == 0) {
108 if (strcmp(value_str,
"16") == 0 || strcmp(value_str,
"16color") == 0) {
111 if (strcmp(value_str,
"256") == 0 || strcmp(value_str,
"256color") == 0) {
114 if (strcmp(value_str,
"truecolor") == 0 || strcmp(value_str,
"24bit") == 0) {
119 "Invalid color mode '%s'. Valid modes: auto, none, mono, 16, 256, truecolor", value_str);
131 SAFE_SNPRINTF(error_msg, error_msg_size,
"Render mode value is required");
136 if (strcmp(value_str,
"foreground") == 0 || strcmp(value_str,
"fg") == 0) {
139 if (strcmp(value_str,
"background") == 0 || strcmp(value_str,
"bg") == 0) {
142 if (strcmp(value_str,
"half-block") == 0 || strcmp(value_str,
"halfblock") == 0) {
147 "Invalid render mode '%s'. Valid modes: foreground, background, half-block", value_str);
159 SAFE_SNPRINTF(error_msg, error_msg_size,
"Palette value is required");
164 if (strcmp(value_str,
"standard") == 0) {
166 }
else if (strcmp(value_str,
"blocks") == 0) {
168 }
else if (strcmp(value_str,
"digital") == 0) {
170 }
else if (strcmp(value_str,
"minimal") == 0) {
172 }
else if (strcmp(value_str,
"cool") == 0) {
174 }
else if (strcmp(value_str,
"custom") == 0) {
179 "Invalid palette '%s'. Valid palettes: standard, blocks, digital, minimal, cool, custom",
193 SAFE_SNPRINTF(error_msg, error_msg_size,
"Log level value is required");
213 "Invalid log level '%s'. Valid levels: dev, debug, info, warn, error, fatal", value_str);
225 char *error_msg,
size_t error_msg_size) {
227 if (!value_str || strlen(value_str) == 0) {
229 SAFE_SNPRINTF(error_msg, error_msg_size,
"Address value is required");
237 value_str = parsed_addr;
242 SAFE_SNPRINTF(parsed_address, address_size,
"%s", value_str);
247 SAFE_SNPRINTF(parsed_address, address_size,
"%s", value_str);
251 if (strchr(value_str,
'.') != NULL) {
254 "Invalid IP address format '%s'. IPv4 addresses must have exactly 4 octets.", value_str);
262 SAFE_SNPRINTF(parsed_address, address_size,
"%s", resolved_ip);
266 SAFE_SNPRINTF(error_msg, error_msg_size,
"Failed to resolve hostname '%s' to IP address.", value_str);
277 if (!value_str || strlen(value_str) == 0) {
279 SAFE_SNPRINTF(error_msg, error_msg_size,
"Value is required");
285 float val = strtof(value_str, &endptr);
286 if (*endptr !=
'\0' || value_str == endptr) {
288 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid float value '%s'. Must be a number.", value_str);
294 SAFE_SNPRINTF(error_msg, error_msg_size,
"Value must be non-negative (got %.2f)", val);
306 if (!value_str || strlen(value_str) == 0) {
308 SAFE_SNPRINTF(error_msg, error_msg_size,
"Max clients value is required");
314 if (max == INT_MIN || max < 1 || max > 32) {
316 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid max clients '%s'. Must be between 1 and 32.", value_str);
328 if (!value_str || strlen(value_str) == 0) {
330 SAFE_SNPRINTF(error_msg, error_msg_size,
"Compression level value is required");
336 if (level == INT_MIN || level < 1 || level > 9) {
338 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid compression level '%s'. Must be between 1 and 9.", value_str);
350 if (!value_str || strlen(value_str) == 0) {
352 SAFE_SNPRINTF(error_msg, error_msg_size,
"FPS value is required");
358 if (fps_val == INT_MIN || fps_val < 1 || fps_val > 144) {
360 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid FPS value '%s'. FPS must be between 1 and 144.", value_str);
376 if (!value_str || strlen(value_str) == 0) {
378 SAFE_SNPRINTF(error_msg, error_msg_size,
"Reconnect value is required");
393 if (val == INT_MIN) {
395 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid reconnect value '%s'. Use 'off', 'auto', or a number 0-999.",
408 if (val < 1 || val > 999) {
410 SAFE_SNPRINTF(error_msg, error_msg_size,
"Invalid reconnect count '%s'. Must be 'off', 'auto', or 1-999.",
423 if (!value_str || strlen(value_str) == 0) {
425 SAFE_SNPRINTF(error_msg, error_msg_size,
"Device index value is required");
431 if (index == INT_MIN) {
434 "Invalid device index '%s'. Must be -1 (default) or a non-negative integer.", value_str);
443 "Invalid device index '%d'. Must be -1 (default) or a non-negative integer.", index);
457 SAFE_SNPRINTF(error_msg, error_msg_size,
"Password value is required");
462 size_t len = strlen(value_str);
465 SAFE_SNPRINTF(error_msg, error_msg_size,
"Password too short (%zu chars). Must be at least 8 characters.", len);
471 SAFE_SNPRINTF(error_msg, error_msg_size,
"Password too long (%zu chars). Must be at most 256 characters.", len);
#define SAFE_SNPRINTF(buffer, buffer_size,...)
int validate_opt_device_index(const char *value_str, char *error_msg, size_t error_msg_size)
Validate device index (-1 for default, 0+ for specific device)
#define COLOR_MODE_16_COLOR
16-color mode (full name)
#define COLOR_MODE_256_COLOR
256-color mode (full name)
#define COLOR_MODE_TRUECOLOR
24-bit truecolor mode
int validate_opt_reconnect(const char *value_str, char *error_msg, size_t error_msg_size)
Validate reconnect value.
int validate_opt_color_mode(const char *value_str, char *error_msg, size_t error_msg_size)
Validate color mode string.
#define COLOR_MODE_AUTO
Backward compatibility aliases for color mode enum values.
int validate_opt_compression_level(const char *value_str, char *error_msg, size_t error_msg_size)
Validate compression level (1-9)
int strtoint_safe(const char *str)
Safely parse string to integer with validation.
int validate_opt_fps(const char *value_str, char *error_msg, size_t error_msg_size)
Validate FPS value (1-144)
int validate_opt_palette(const char *value_str, char *error_msg, size_t error_msg_size)
Validate palette type string.
int validate_opt_positive_int(const char *value_str, char *error_msg, size_t error_msg_size)
Validate positive integer.
int validate_opt_password(const char *value_str, char *error_msg, size_t error_msg_size)
Validate password (8-256 characters)
#define OPTIONS_BUFF_SIZE
Buffer size for option string values.
float validate_opt_float_non_negative(const char *value_str, char *error_msg, size_t error_msg_size)
Validate non-negative float value.
int validate_opt_non_negative_int(const char *value_str, char *error_msg, size_t error_msg_size)
Validate non-negative integer.
#define COLOR_MODE_NONE
Monochrome mode.
int validate_opt_render_mode(const char *value_str, char *error_msg, size_t error_msg_size)
Validate render mode string.
int validate_opt_max_clients(const char *value_str, char *error_msg, size_t error_msg_size)
Validate max clients value (1-32)
int validate_opt_port(const char *value_str, char *error_msg, size_t error_msg_size)
Validate port number (1-65535)
int validate_opt_log_level(const char *value_str, char *error_msg, size_t error_msg_size)
Validate log level string.
int validate_opt_ip_address(const char *value_str, char *parsed_address, size_t address_size, bool is_client, char *error_msg, size_t error_msg_size)
Validate IP address or hostname.
@ PALETTE_BLOCKS
Unicode block characters: " ░░▒▒▓▓██".
@ PALETTE_CUSTOM
User-defined via –palette-chars.
@ PALETTE_COOL
Ascending blocks: " ▁▂▃▄▅▆▇█".
@ PALETTE_STANDARD
Standard ASCII palette: " ...',;:clodxkO0KXNWM".
@ PALETTE_DIGITAL
Digital/glitch aesthetic: " -=≡≣▰▱◼".
@ PALETTE_MINIMAL
Simple ASCII: " .-+*#".
int is_valid_ipv4(const char *ip)
Check if a string is a valid IPv4 address.
int is_valid_ipv6(const char *ip)
Check if a string is a valid IPv6 address.
int parse_ipv6_address(const char *input, char *output, size_t output_size)
Parse IPv6 address, removing brackets if present.
🌍 IP Address Parsing and Formatting Utilities
Application limits and constraints.
📝 Logging API with multiple log levels and terminal output control
Validation functions for options parsing.
⚙️ Command-line options parsing and configuration management for ascii-chat
ASCII Palette Management for Video-to-ASCII Conversion.
asciichat_error_t parse_port(const char *str, uint16_t *out_port)
Parse port number (1-65535) from string.
🖥️ Cross-platform terminal interface for ascii-chat
Common SIMD utilities and structures.