ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
client.h File Reference

Client mode option parsing. More...

Go to the source code of this file.

Functions

asciichat_error_t parse_client_options (int argc, char **argv, options_t *opts)
 Parse client-specific command-line options.
 
void usage_client (FILE *stream)
 Print client mode usage/help text.
 

Detailed Description

Client mode option parsing.

Client-specific command-line option parsing and help text. The client mode connects to a server and displays received video streams while capturing and sending local webcam/audio data.

Client-Specific Options:

  • Network: [address][:port] positional, --port, --lan
  • Webcam: --webcam-index, --webcam-flip, --test-pattern
  • Display: --width, --height, --color-mode, --render-mode, --fps
  • Audio: --audio, --microphone-index, --speakers-index, --audio-analysis
  • Crypto: --key, --server-key (TOFU verification)
  • Connection: --reconnect
  • Compression: --compression-level, --no-compress, --encode-audio
  • Debug: --show-capabilities, --utf8, --list-webcams, --list-microphones, --list-speakers

Positional Arguments:

  • Format: [address][:port]
  • Examples: localhost, 192.168.1.100, example.com:8080, [::1]:27224
  • Port in positional conflicts with --port flag

Shared Options (parsed in options.c):

  • Palette: --palette, --palette-chars
  • Output: --stretch, --quiet, --snapshot, --strip-ansi
  • Encryption: --encrypt, --no-encrypt, --password, --keyfile
See also
options.h
common.h
server.h
mirror.h

Definition in file lib/options/client.h.

Function Documentation

◆ parse_client_options()

asciichat_error_t parse_client_options ( int  argc,
char **  argv,
options_t opts 
)

Parse client-specific command-line options.

Parses all client mode options including:

  • Positional argument: [address][:port] for server connection
  • Client-specific flags (webcam, audio, display, network options)
  • Shared options (palette, encryption, output options)

Parsing Logic:

  1. getopt_long() loop processes all flags
  2. After loop, parse positional argument for server address
  3. Validate port conflicts (positional vs –port flag)
  4. Set default values for unspecified options

Error Handling:

  • Invalid options: Prints error with typo suggestions
  • Missing required arguments: Prints usage hint
  • Port conflicts: Errors if both positional port and –port specified
  • Returns ERROR_INVALID_PARAM on any validation failure
Parameters
argcArgument count from main()
argvArgument vector from main()
Returns
ASCIICHAT_OK on success, ERROR_INVALID_PARAM on parse error
Note
Modifies global opt_* variables (opt_address, opt_port, opt_width, etc.)
Prints error messages to stderr on failure
Prints help text and exits if –help flag present

Positional Argument Parsing: After getopt_long() completes, optind points to first non-option argument. Format: [address][:port]

  • IPv4: 192.168.1.100, 192.168.1.100:8080
  • IPv6: [::1], [2001:db8::1]:8080
  • Hostname: localhost, example.com:27224

Port conflicts:

// ❌ WRONG - conflicting port specifications
./ascii-chat client localhost:8080 --port 9090
// Error: Cannot specify port in both positional argument and --port flag
// ✅ CORRECT - specify port only once
./ascii-chat client localhost:8080
./ascii-chat client localhost --port 8080

Example usage:

int main(int argc, char **argv) {
if (err != ASCIICHAT_OK) {
return 1; // Error already printed
}
// Option globals are now populated:
log_info("Connecting to %s:%s", opt_address, opt_port);
log_info("Terminal size: %dx%d", opt_width, opt_height);
log_info("Webcam: %d, Audio: %s", opt_webcam_index,
opt_audio_enabled ? "enabled" : "disabled");
// ... proceed with client initialization
}
int main(int argc, char **argv)
Definition acds/main.c:55
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:46
@ ASCIICHAT_OK
Definition error_codes.h:48
#define log_info(...)
Log an INFO message.
asciichat_error_t options_init(int argc, char **argv)
Initialize options by parsing command-line arguments.
Definition options.c:144
@ MODE_CLIENT
Client mode - network client options.
Definition options.h:428
ASCIICHAT_API char opt_address[OPTIONS_BUFF_SIZE]
ASCIICHAT_API unsigned short int opt_height
ASCIICHAT_API char opt_port[OPTIONS_BUFF_SIZE]
ASCIICHAT_API unsigned short int opt_width
ASCIICHAT_API unsigned short int opt_audio_enabled
ASCIICHAT_API unsigned short int opt_webcam_index
See also
parse_server_options()
parse_mirror_options()
options_init()

Definition at line 50 of file lib/options/client.c.

50 {
51 const options_config_t *config = options_preset_client("ascii-chat client", "connect to an ascii-chat server");
52 int remaining_argc;
53 char **remaining_argv;
54
55 // Apply defaults from preset before parsing command-line args
56 asciichat_error_t defaults_result = options_config_set_defaults(config, opts);
57 if (defaults_result != ASCIICHAT_OK) {
59 return defaults_result;
60 }
61
62 asciichat_error_t result = options_config_parse(config, argc, argv, opts, &remaining_argc, &remaining_argv);
63 if (result != ASCIICHAT_OK) {
65 return result;
66 }
67
68 // Check for unexpected remaining arguments
69 if (remaining_argc > 0) {
70 (void)fprintf(stderr, "Error: Unexpected arguments after options:\n");
71 for (int i = 0; i < remaining_argc; i++) {
72 (void)fprintf(stderr, " %s\n", remaining_argv[i]);
73 }
75 return option_error_invalid();
76 }
77
79 return ASCIICHAT_OK;
80}
asciichat_error_t options_config_set_defaults(const options_config_t *config, void *options_struct)
Set default values in options struct.
Definition builder.c:716
asciichat_error_t options_config_parse(const options_config_t *config, int argc, char **argv, void *options_struct, int *remaining_argc, char ***remaining_argv)
Parse command-line arguments.
Definition builder.c:1101
void options_config_destroy(options_config_t *config)
Free options config.
Definition builder.c:329
const options_config_t * options_preset_client(const char *program_name, const char *description)
Get client mode options preset.
Definition presets.c:398
Options configuration.
Definition builder.h:165

References ASCIICHAT_OK, options_config_destroy(), options_config_parse(), options_config_set_defaults(), and options_preset_client().

Referenced by options_init().

◆ usage_client()

void usage_client ( FILE *  stream)

Print client mode usage/help text.

Displays comprehensive help for all client options, including:

  • Description of client mode
  • Positional argument format and examples
  • All client-specific flags with descriptions
  • Shared flags (palette, encryption, output)
  • Usage examples for common scenarios

Output Format:

Client mode: Connect to ascii-chat server and display video grid
Usage: ascii-chat client [OPTIONS] [address][:port]
Positional Arguments:
[address][:port] Server address with optional port (default: localhost:27224)
Examples: localhost, 192.168.1.100:8080, [::1]:27224
Network Options:
-p, --port PORT Server port (default: 27224)
Note: Conflicts with port in positional argument
Webcam Options:
-c, --webcam-index N Webcam device index (default: 0)
-f, --webcam-flip Mirror webcam horizontally (default: true)
--test-pattern Use test pattern instead of real webcam
--list-webcams List available webcams and exit
[... continues with all option categories ...]
#define true
Definition stdbool.h:23
Parameters
streamOutput stream (stdout for –help, stderr for errors)
Note
Does not exit - caller decides whether to exit after printing
Always includes mode description, positional args, and all flags
Examples show real-world usage patterns

Example usage:

// Print help and exit successfully
if (help_requested) {
usage_client(stdout);
exit(0);
}
// Print usage hint on error
if (parse_error) {
fprintf(stderr, "Error: Invalid option\n\n");
usage_client(stderr);
exit(1);
}
void usage_client(FILE *desc)
Print client mode usage/help text.
See also
usage_server()
usage_mirror()

Definition at line 86 of file lib/options/client.c.

86 {
87 // Get config with program name and description
88 const options_config_t *config = options_preset_client("ascii-chat client", "connect to an ascii-chat server");
89 if (!config) {
90 (void)fprintf(desc, "Error: Failed to create options config\n");
91 return;
92 }
93
94 // Print custom address format help first
95 (void)fprintf(desc, "%s - %s\n\n", config->program_name, config->description);
96 (void)fprintf(desc, "USAGE:\n");
97 (void)fprintf(desc, " %s [address][:port] [options...]\n\n", config->program_name);
98
99 // Print positional argument examples programmatically
100 if (config->num_positional_args > 0) {
101 const positional_arg_descriptor_t *pos_arg = &config->positional_args[0];
102 if (pos_arg->section_heading && pos_arg->examples && pos_arg->num_examples > 0) {
103 (void)fprintf(desc, "%s:\n", pos_arg->section_heading);
104 for (size_t i = 0; i < pos_arg->num_examples; i++) {
105 (void)fprintf(desc, " %s\n", pos_arg->examples[i]);
106 }
107 (void)fprintf(desc, "\n");
108 }
109 }
110
111 // Generate options from builder configuration
112 options_config_print_usage(config, desc);
113
114 // Clean up the config
116}
void options_config_print_usage(const options_config_t *config, FILE *stream)
Print usage/help text.
Definition builder.c:1236
positional_arg_descriptor_t * positional_args
Array of positional argument descriptors.
Definition builder.h:172
const char * program_name
For usage header.
Definition builder.h:176
size_t num_positional_args
Number of positional arguments.
Definition builder.h:173
const char * description
For usage header.
Definition builder.h:177
Positional argument descriptor.
Definition builder.h:136
const char * section_heading
Section heading for examples (e.g., "ADDRESS FORMATS")
Definition builder.h:142
const char ** examples
Array of example strings with descriptions.
Definition builder.h:143
size_t num_examples
Number of examples.
Definition builder.h:144