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

Client mode option parsing and help text. 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 *desc)
 Print client mode usage/help text.
 

Detailed Description

Client mode option parsing and help text.

Client-specific command-line argument parsing with support for:

  • Server connection (positional address[:port])
  • Webcam configuration
  • Audio capture/playback
  • Display settings
  • Cryptographic authentication
  • Network compression
  • Reconnection behavior

Definition in file lib/options/client.c.

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().