15 {
16 if (!config || config->num_usage_lines == 0) {
17 char *buffer = SAFE_MALLOC(1, char *);
18 buffer[0] = '\0';
19 return buffer;
20 }
21
22
23 size_t buffer_capacity = 4096;
24 char *buffer = SAFE_MALLOC(buffer_capacity, char *);
25 size_t offset = 0;
26
27 for (size_t i = 0; i < config->num_usage_lines; i++) {
28 const usage_descriptor_t *
usage = &config->usage_lines[i];
29
30
31 if (offset + 512 >= buffer_capacity) {
32 buffer_capacity *= 2;
33 buffer = SAFE_REALLOC(buffer, buffer_capacity, char *);
34 }
35
36 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
".TP\n");
37 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
".B ascii-chat");
39 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
" %s",
usage->mode);
40 }
41 if (
usage->positional) {
42 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
" %s",
usage->positional);
43 }
44 if (
usage->show_options) {
45 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
" [options...]");
46 }
47 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
"\n");
48
49 if (
usage->description) {
50 offset +=
52 }
53 }
54
55 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
"\n");
56
57 log_debug("Generated USAGE section (%zu bytes)", offset);
58 return buffer;
59}
void usage(FILE *desc, asciichat_mode_t mode)
const char * escape_groff_special(const char *str)
int safe_snprintf(char *buffer, size_t buffer_size, const char *format,...)
Safe formatted string printing to buffer.