Remove magic numbers from show_usage_line

This commit is contained in:
Nobuyoshi Nakada 2023-10-04 22:55:24 +09:00 committed by Takashi Kokubun
parent 488c0ed051
commit 582369bb4b

41
ruby.c
View File

@ -241,41 +241,46 @@ static const char esc_standout[] = "\n\033[1;7m";
static const char esc_bold[] = "\033[1m"; static const char esc_bold[] = "\033[1m";
static const char esc_reset[] = "\033[0m"; static const char esc_reset[] = "\033[0m";
static const char esc_none[] = ""; static const char esc_none[] = "";
#define USAGE_INDENT " " /* macro for concatenation */
static void static void
show_usage_line(const struct ruby_opt_message *m, show_usage_line(const struct ruby_opt_message *m,
int help, int highlight, unsigned int w, int columns) int help, int highlight, unsigned int w, int columns)
{ {
static const int indent_width = (int)rb_strlen_lit(USAGE_INDENT);
const char *str = m->str; const char *str = m->str;
const unsigned int namelen = m->namelen, secondlen = m->secondlen; const char *str2 = str + m->namelen;
const char *desc = str + m->namelen + m->secondlen;
const unsigned int namelen = m->namelen - 1, secondlen = m->secondlen - 1;
const char *sb = highlight ? esc_bold : esc_none; const char *sb = highlight ? esc_bold : esc_none;
const char *se = highlight ? esc_reset : esc_none; const char *se = highlight ? esc_reset : esc_none;
const char *desc = str + namelen + secondlen;
unsigned int desclen = (unsigned int)strcspn(desc, "\n"); unsigned int desclen = (unsigned int)strcspn(desc, "\n");
if (help && (namelen > w) && (int)(namelen + secondlen) >= columns) { if (help && (namelen + 1 > w) && /* a padding space */
printf(" %s" "%.*s" "%s\n", sb, namelen-1, str, se); (int)(namelen + secondlen + indent_width) >= columns) {
if (secondlen > 1) { printf(USAGE_INDENT "%s" "%.*s" "%s\n", sb, namelen, str, se);
const int second_end = namelen+secondlen-1; if (secondlen > 0) {
int n = namelen; const int second_end = secondlen;
if (str[n] == ',') n++; int n = 0;
if (str[n] == ' ') n++; if (str2[n] == ',') n++;
printf(" %s" "%.*s" "%s\n", sb, second_end-n, str+n, se); if (str2[n] == ' ') n++;
printf(USAGE_INDENT "%s" "%.*s" "%s\n", sb, second_end-n, str2+n, se);
} }
printf("%-*s%.*s\n", w + 2, "", desclen, desc); printf("%-*s%.*s\n", w + indent_width, USAGE_INDENT, desclen, desc);
} }
else { else {
const int wrap = help && namelen + secondlen - 1 > w; const int wrap = help && namelen + secondlen >= w;
printf(" %s%.*s%-*.*s%s%-*s%.*s\n", sb, namelen-1, str, printf(USAGE_INDENT "%s%.*s%-*.*s%s%-*s%.*s\n", sb, namelen, str,
(wrap ? 0 : w - namelen + 1), (wrap ? 0 : w - namelen),
(help ? secondlen-1 : 0), str + namelen, se, (help ? secondlen : 0), str2, se,
(wrap ? w + 3 : 0), (wrap ? "\n" : ""), (wrap ? (int)(w + rb_strlen_lit("\n" USAGE_INDENT)) : 0),
(wrap ? "\n" USAGE_INDENT : ""),
desclen, desc); desclen, desc);
} }
if (help) { if (help) {
while (desc[desclen]) { while (desc[desclen]) {
desc += desclen + 1; desc += desclen + rb_strlen_lit("\n");
desclen = (unsigned int)strcspn(desc, "\n"); desclen = (unsigned int)strcspn(desc, "\n");
printf("%-*s%.*s\n", w + 2, "", desclen, desc); printf("%-*s%.*s\n", w + indent_width, USAGE_INDENT, desclen, desc);
} }
} }
} }