15 if (!config || config->num_descriptors == 0) {
16 char *buffer = SAFE_MALLOC(1,
char *);
23 size_t buffer_capacity = 32768;
24 char *buffer = SAFE_MALLOC(buffer_capacity,
char *);
28 for (
size_t i = 0; i < config->num_descriptors; i++) {
29 const option_descriptor_t *desc = &config->descriptors[i];
32 if (!desc->env_var_name) {
37 if (offset + 512 >= buffer_capacity) {
39 buffer = SAFE_REALLOC(buffer, buffer_capacity,
char *);
42 log_debug(
"[ENVIRONMENT] env=%s, desc=%s", desc->env_var_name ? desc->env_var_name :
"NULL",
43 desc->help_text ? desc->help_text :
"NULL");
46 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
".TP\n");
47 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
".B %s\n", desc->env_var_name);
49 if (desc->help_text) {
50 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
"%s\n", desc->help_text);
54 log_debug(
"Generated ENVIRONMENT ASCII_CHAT_* section (%zu bytes)", offset);
75 size_t manual_count,
const char **manual_descs) {
78 char *buffer = SAFE_MALLOC(1,
char *);
84 size_t num_auto_vars = 0;
85 for (
size_t i = 0; i < config->num_descriptors; i++) {
86 if (config->descriptors[i].env_var_name) {
92 size_t total_vars = num_auto_vars + manual_count;
97 for (
size_t i = 0; i < config->num_descriptors; i++) {
98 const option_descriptor_t *desc = &config->descriptors[i];
99 if (desc->env_var_name) {
100 all_vars[var_idx].
name = desc->env_var_name;
101 all_vars[var_idx].
description = desc->help_text ? desc->help_text :
"";
108 for (
size_t i = 0; i < manual_count && var_idx < total_vars; i++) {
109 all_vars[var_idx].
name = manual_vars[i];
110 all_vars[var_idx].
description = (manual_descs && manual_descs[i]) ? manual_descs[i] :
"";
119 size_t buffer_capacity = 32768;
120 char *buffer = SAFE_MALLOC(buffer_capacity,
char *);
124 for (
size_t i = 0; i < total_vars; i++) {
125 if (offset + 512 >= buffer_capacity) {
126 buffer_capacity *= 2;
127 buffer = SAFE_REALLOC(buffer, buffer_capacity,
char *);
130 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
".TP\n");
131 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
".B %s\n", all_vars[i].name);
132 if (*all_vars[i].description) {
133 if (all_vars[i].option_long_name) {
135 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
"See: \\fB\\-\\-%s\\fR\n",
136 all_vars[i].option_long_name);
139 offset +=
safe_snprintf(buffer + offset, buffer_capacity - offset,
"%s\n", all_vars[i].description);
146 log_debug(
"Generated ENVIRONMENT section (%zu manual + %zu auto = %zu total, %zu bytes)", manual_count, num_auto_vars,
Environment variable entry for manpage generation.
const char * name
Environment variable name.
const char * option_long_name
Long option name (for "(see --option)" suffix), or NULL for manual.
int safe_snprintf(char *buffer, size_t buffer_size, const char *format,...)
Safe formatted string printing to buffer.