ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
parsing.h File Reference

🔍 Safe Parsing Utilities More...

Go to the source code of this file.

Functions

asciichat_error_t safe_parse_size_message (const char *message, unsigned int *width, unsigned int *height)
 Parse SIZE message format.
asciichat_error_t safe_parse_audio_message (const char *message, unsigned int *num_samples)
 Parse AUDIO message format.
asciichat_error_t parse_long (const char *str, long *out_value, long min_value, long max_value)
 Parse signed long integer with range validation.
asciichat_error_t parse_ulong (const char *str, unsigned long *out_value, unsigned long min_value, unsigned long max_value)
 Parse unsigned long integer with range validation.
asciichat_error_t parse_ulonglong (const char *str, unsigned long long *out_value, unsigned long long min_value, unsigned long long max_value)
 Parse unsigned long long integer with range validation.
asciichat_error_t parse_port (const char *str, uint16_t *out_port)
 Parse port number (1-65535) from string.
asciichat_error_t parse_int32 (const char *str, int32_t *out_value, int32_t min_value, int32_t max_value)
 Parse signed 32-bit integer with range validation.
asciichat_error_t parse_uint32 (const char *str, uint32_t *out_value, uint32_t min_value, uint32_t max_value)
 Parse unsigned 32-bit integer with range validation.

Detailed Description

🔍 Safe Parsing Utilities

Definition in file util/parsing.h.

Function Documentation

◆ parse_int32()

asciichat_error_t parse_int32 ( const char * str,
int32_t * out_value,
int32_t min_value,
int32_t max_value )

Parse signed 32-bit integer with range validation.

Parameters
strString to parse (must be null-terminated)
out_valueOutput: parsed integer value
min_valueMinimum allowed value (inclusive)
max_valueMaximum allowed value (inclusive)
Returns
ASCIICHAT_OK on success, ERROR_INVALID_PARAM on invalid input or out of range

Definition at line 254 of file util/parsing.c.

254 {
255 if (!str) {
256 return SET_ERRNO(ERROR_INVALID_PARAM, "String pointer is NULL");
257 }
258
259 if (!out_value) {
260 return SET_ERRNO(ERROR_INVALID_PARAM, "Output pointer is NULL");
261 }
262
263 long value;
264 asciichat_error_t err = parse_long(str, &value, (long)min_value, (long)max_value);
265 if (err != ASCIICHAT_OK) {
266 return err;
267 }
268
269 *out_value = (int32_t)value;
270 return ASCIICHAT_OK;
271}
#define SET_ERRNO(code,...)
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
asciichat_error_t parse_long(const char *str, long *out_value, long min_value, long max_value)
Parse signed long integer with range validation.

References ASCIICHAT_OK, ERROR_INVALID_PARAM, parse_long(), and SET_ERRNO.

Referenced by strtoint_safe().

◆ parse_long()

asciichat_error_t parse_long ( const char * str,
long * out_value,
long min_value,
long max_value )

Parse signed long integer with range validation.

Parameters
strString to parse (must be null-terminated)
out_valueOutput: parsed integer value
min_valueMinimum allowed value (inclusive)
max_valueMaximum allowed value (inclusive)
Returns
ASCIICHAT_OK on success, ERROR_INVALID_PARAM on invalid input or out of range

Safe wrapper for strtol() with overflow detection and range validation.

Definition at line 98 of file util/parsing.c.

98 {
99 if (!str) {
100 return SET_ERRNO(ERROR_INVALID_PARAM, "String pointer is NULL");
101 }
102
103 if (!out_value) {
104 return SET_ERRNO(ERROR_INVALID_PARAM, "Output pointer is NULL");
105 }
106
107 if (*str == '\0') {
108 return SET_ERRNO(ERROR_INVALID_PARAM, "Empty string cannot be parsed as integer");
109 }
110
111 // Clear errno before calling strtol to detect errors
112 errno = 0;
113 char *endptr = NULL;
114 long value = strtol(str, &endptr, 10);
115
116 // Check for conversion errors
117 if (errno == ERANGE) {
118 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value out of range: %s", str);
119 }
120
121 // Check that entire string was consumed (no extra characters)
122 if (endptr == str || *endptr != '\0') {
123 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid integer format: %s", str);
124 }
125
126 // Check user-specified range
127 if (value < min_value) {
128 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value %ld is below minimum %ld", value, min_value);
129 }
130
131 if (value > max_value) {
132 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value %ld exceeds maximum %ld", value, max_value);
133 }
134
135 *out_value = value;
136 return ASCIICHAT_OK;
137}
#define ERANGE
int errno

References ASCIICHAT_OK, ERANGE, errno, ERROR_INVALID_PARAM, and SET_ERRNO.

Referenced by parse_int32().

◆ parse_port()

asciichat_error_t parse_port ( const char * str,
uint16_t * out_port )

Parse port number (1-65535) from string.

Parameters
strString to parse (must be null-terminated)
out_portOutput: parsed port number
Returns
ASCIICHAT_OK on success, ERROR_INVALID_PARAM on invalid input or out of range

Convenience function for parsing TCP/UDP port numbers.

Definition at line 223 of file util/parsing.c.

223 {
224 if (!str) {
225 return SET_ERRNO(ERROR_INVALID_PARAM, "String pointer is NULL");
226 }
227
228 if (!out_port) {
229 return SET_ERRNO(ERROR_INVALID_PARAM, "Output pointer is NULL");
230 }
231
232 if (*str == '\0') {
233 return SET_ERRNO(ERROR_INVALID_PARAM, "Empty string cannot be parsed as port");
234 }
235
236 if (str[0] == '0' && str[1] != '\0') {
237 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid port number: %s (leading zeros)", str);
238 }
239 unsigned long port_value = 0;
240 for (const char *p = str; *p; p++) {
241 if (*p < '0' || *p > '9') {
242 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid port number: %s (must be 0-65535)", str);
243 }
244 port_value = port_value * 10 + (unsigned long)(*p - '0');
245 if (port_value > 65535) {
246 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid port number: %s (must be 0-65535)", str);
247 }
248 }
249
250 *out_port = (uint16_t)port_value;
251 return ASCIICHAT_OK;
252}
unsigned short uint16_t
Definition common.h:61

References ASCIICHAT_OK, ERROR_INVALID_PARAM, and SET_ERRNO.

Referenced by main(), parse_address_with_optional_port(), parse_ip_with_port(), parse_port_option(), validate_opt_port(), and validate_port_opt().

◆ parse_uint32()

asciichat_error_t parse_uint32 ( const char * str,
uint32_t * out_value,
uint32_t min_value,
uint32_t max_value )

Parse unsigned 32-bit integer with range validation.

Parameters
strString to parse (must be null-terminated)
out_valueOutput: parsed integer value
min_valueMinimum allowed value (inclusive)
max_valueMaximum allowed value (inclusive)
Returns
ASCIICHAT_OK on success, ERROR_INVALID_PARAM on invalid input or out of range

Definition at line 273 of file util/parsing.c.

273 {
274 if (!str) {
275 return SET_ERRNO(ERROR_INVALID_PARAM, "String pointer is NULL");
276 }
277
278 if (!out_value) {
279 return SET_ERRNO(ERROR_INVALID_PARAM, "Output pointer is NULL");
280 }
281
282 unsigned long value;
283 asciichat_error_t err = parse_ulong(str, &value, (unsigned long)min_value, (unsigned long)max_value);
284 if (err != ASCIICHAT_OK) {
285 return err;
286 }
287
288 *out_value = (uint32_t)value;
289 return ASCIICHAT_OK;
290}
unsigned int uint32_t
Definition common.h:62
asciichat_error_t parse_ulong(const char *str, unsigned long *out_value, unsigned long min_value, unsigned long max_value)
Parse unsigned long integer with range validation.

References ASCIICHAT_OK, ERROR_INVALID_PARAM, parse_ulong(), and SET_ERRNO.

◆ parse_ulong()

asciichat_error_t parse_ulong ( const char * str,
unsigned long * out_value,
unsigned long min_value,
unsigned long max_value )

Parse unsigned long integer with range validation.

Parameters
strString to parse (must be null-terminated)
out_valueOutput: parsed integer value
min_valueMinimum allowed value (inclusive)
max_valueMaximum allowed value (inclusive)
Returns
ASCIICHAT_OK on success, ERROR_INVALID_PARAM on invalid input or out of range

Definition at line 139 of file util/parsing.c.

140 {
141 if (!str) {
142 return SET_ERRNO(ERROR_INVALID_PARAM, "String pointer is NULL");
143 }
144
145 if (!out_value) {
146 return SET_ERRNO(ERROR_INVALID_PARAM, "Output pointer is NULL");
147 }
148
149 if (*str == '\0') {
150 return SET_ERRNO(ERROR_INVALID_PARAM, "Empty string cannot be parsed as integer");
151 }
152
153 // Clear errno before calling strtoul to detect errors
154 errno = 0;
155 char *endptr = NULL;
156 unsigned long value = strtoul(str, &endptr, 10);
157
158 // Check for conversion errors
159 if (errno == ERANGE) {
160 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value out of range: %s", str);
161 }
162
163 // Check that entire string was consumed (no extra characters)
164 if (endptr == str || *endptr != '\0') {
165 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid integer format: %s", str);
166 }
167
168 // Check user-specified range
169 if (value < min_value) {
170 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value %lu is below minimum %lu", value, min_value);
171 }
172
173 if (value > max_value) {
174 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value %lu exceeds maximum %lu", value, max_value);
175 }
176
177 *out_value = value;
178 return ASCIICHAT_OK;
179}

References ASCIICHAT_OK, ERANGE, errno, ERROR_INVALID_PARAM, and SET_ERRNO.

Referenced by main(), and parse_uint32().

◆ parse_ulonglong()

asciichat_error_t parse_ulonglong ( const char * str,
unsigned long long * out_value,
unsigned long long min_value,
unsigned long long max_value )

Parse unsigned long long integer with range validation.

Parameters
strString to parse (must be null-terminated)
out_valueOutput: parsed integer value
min_valueMinimum allowed value (inclusive)
max_valueMaximum allowed value (inclusive)
Returns
ASCIICHAT_OK on success, ERROR_INVALID_PARAM on invalid input or out of range

Definition at line 181 of file util/parsing.c.

182 {
183 if (!str) {
184 return SET_ERRNO(ERROR_INVALID_PARAM, "String pointer is NULL");
185 }
186
187 if (!out_value) {
188 return SET_ERRNO(ERROR_INVALID_PARAM, "Output pointer is NULL");
189 }
190
191 if (*str == '\0') {
192 return SET_ERRNO(ERROR_INVALID_PARAM, "Empty string cannot be parsed as integer");
193 }
194
195 // Clear errno before calling strtoull to detect errors
196 errno = 0;
197 char *endptr = NULL;
198 unsigned long long value = strtoull(str, &endptr, 10);
199
200 // Check for conversion errors
201 if (errno == ERANGE) {
202 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value out of range: %s", str);
203 }
204
205 // Check that entire string was consumed (no extra characters)
206 if (endptr == str || *endptr != '\0') {
207 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid integer format: %s", str);
208 }
209
210 // Check user-specified range
211 if (value < min_value) {
212 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value too small (below minimum)");
213 }
214
215 if (value > max_value) {
216 return SET_ERRNO(ERROR_INVALID_PARAM, "Integer value too large (exceeds maximum)");
217 }
218
219 *out_value = value;
220 return ASCIICHAT_OK;
221}

References ASCIICHAT_OK, ERANGE, errno, ERROR_INVALID_PARAM, and SET_ERRNO.