Module Name: src Committed By: rillig Date: Sun Sep 26 00:57:28 UTC 2021
Modified Files: src/usr.bin/indent: args.c Log Message: indent: handle special options separately Handling the special options separately removes the need for several macro definitions. It saves a bit of memory since without the option '--version', the option names are shorter. No functional change. To generate a diff of this commit: cvs rdiff -u -r1.31 -r1.32 src/usr.bin/indent/args.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/indent/args.c diff -u src/usr.bin/indent/args.c:1.31 src/usr.bin/indent/args.c:1.32 --- src/usr.bin/indent/args.c:1.31 Sat Sep 25 23:38:45 2021 +++ src/usr.bin/indent/args.c Sun Sep 26 00:57:28 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: args.c,v 1.31 2021/09/25 23:38:45 rillig Exp $ */ +/* $NetBSD: args.c,v 1.32 2021/09/26 00:57:28 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -43,7 +43,7 @@ static char sccsid[] = "@(#)args.c 8.1 ( #include <sys/cdefs.h> #if defined(__NetBSD__) -__RCSID("$NetBSD: args.c,v 1.31 2021/09/25 23:38:45 rillig Exp $"); +__RCSID("$NetBSD: args.c,v 1.32 2021/09/26 00:57:28 rillig Exp $"); #elif defined(__FreeBSD__) __FBSDID("$FreeBSD: head/usr.bin/indent/args.c 336318 2018-07-15 21:04:21Z pstef $"); #endif @@ -56,7 +56,6 @@ __FBSDID("$FreeBSD: head/usr.bin/indent/ #include <ctype.h> #include <err.h> #include <limits.h> -#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -65,53 +64,34 @@ __FBSDID("$FreeBSD: head/usr.bin/indent/ #define INDENT_VERSION "2.0" -/* profile types */ -#define PRO_SPECIAL 1 /* special case */ -#define PRO_BOOL 2 /* boolean */ -#define PRO_INT 3 /* integer */ - -/* profile specials for specials */ -#define IGN 1 /* ignore it */ -#define CLI 2 /* case label indent (float) */ -#define STDIN 3 /* use stdin */ -#define KEY 4 /* type (keyword) */ -#define KEY_FILE 5 /* only used for args */ -#define VERSION 6 /* only used for args */ - static void scan_profile(FILE *); - -const char *option_source = "?"; - void add_typedefs_from_file(const char *); +static const char *option_source = "?"; + #if __STDC_VERSION__ >= 201112L #define assert_type(expr, type) _Generic((expr), type : (expr)) #else #define assert_type(expr, type) (expr) #endif #define bool_option(name, value, var) \ - {name, PRO_BOOL, /*CONSTCOND*/(value) ? 1 : 0, \ - assert_type(&(var), bool *)} + {name, true, value, assert_type(&(var), bool *)} #define int_option(name, var) \ - {name, PRO_INT, 0, assert_type(&(var), int *)} -#define special_option(name, value) \ - {name, PRO_SPECIAL, assert_type(value, int), NULL} + {name, false, false, assert_type(&(var), int *)} /* * N.B.: because of the way the table here is scanned, options whose names are * a prefix of other options must occur later; that is, with -lp vs -l, -lp * must be first and -l must be last. + * + * See also set_special_option. */ static const struct pro { - const char p_name[9]; /* name, e.g. "bl", "cli" */ - uint8_t p_type; /* type (int, bool, special) */ - int p_special; /* depends on type */ + const char p_name[6]; /* name, e.g. "bl", "cli" */ + bool p_is_bool; + bool p_bool_value; void *p_obj; /* the associated variable (bool, int) */ } pro[] = { - special_option("T", KEY), - special_option("U", KEY_FILE), - special_option("-version", VERSION), - special_option("P", IGN), bool_option("bacc", true, opt.blanklines_around_conditional_compilation), bool_option("badp", true, opt.blanklines_after_declarations_at_proctop), bool_option("bad", true, opt.blanklines_after_declarations), @@ -125,7 +105,6 @@ static const struct pro { int_option("cd", opt.decl_comment_column), bool_option("ce", true, opt.cuddle_else), int_option("ci", opt.continuation_indent), - special_option("cli", CLI), bool_option("cs", true, opt.space_after_cast), int_option("c", opt.comment_column), int_option("di", opt.decl_indent), @@ -163,7 +142,6 @@ static const struct pro { bool_option("nlpl", false, opt.lineup_to_parens_always), bool_option("nlp", false, opt.lineup_to_parens), bool_option("npcs", false, opt.proc_calls_space), - special_option("npro", IGN), bool_option("npsl", false, opt.procnames_start_line), bool_option("nsc", false, opt.star_comment_cont), bool_option("nsob", false, opt.swallow_optional_blanklines), @@ -173,13 +151,10 @@ static const struct pro { bool_option("psl", true, opt.procnames_start_line), bool_option("sc", true, opt.star_comment_cont), bool_option("sob", true, opt.swallow_optional_blanklines), - special_option("st", STDIN), bool_option("ta", true, opt.auto_typedefs), int_option("ts", opt.tabsize), bool_option("ut", true, opt.use_tabs), bool_option("v", true, opt.verbose), - /* whew! */ - {"", 0, 0, 0} }; /* @@ -252,6 +227,60 @@ skip_over(const char *s, const char *pre return s; } +static bool +set_special_option(const char *arg) +{ + const char *arg_end; + + if (strncmp(arg, "-version", 8) == 0) { + printf("FreeBSD indent %s\n", INDENT_VERSION); + exit(0); + /*NOTREACHED*/ + } + + if (arg[0] == 'P' || strncmp(arg, "npro", 4) == 0) + return true; + + if (strncmp(arg, "cli", 3) == 0) { + arg_end = arg + 3; + if (arg_end[0] == '\0') + goto need_param; + opt.case_indent = atof(arg_end); + return true; + } + + if (strncmp(arg, "st", 2) == 0) { + if (input == NULL) + input = stdin; + if (output == NULL) + output = stdout; + return true; + } + + if (arg[0] == 'T') { + arg_end = arg + 1; + if (arg_end[0] == '\0') + goto need_param; + add_typename(arg_end); + return true; + } + + if (arg[0] == 'U') { + arg_end = arg + 1; + if (arg_end[0] == '\0') + goto need_param; + add_typedefs_from_file(arg_end); + return true; + } + + return false; + +need_param: + errx(1, "%s: ``%.*s'' requires a parameter", + option_source, (int)(arg_end - arg), arg); + /* NOTREACHED */ +} + void set_option(const char *arg) { @@ -259,70 +288,23 @@ set_option(const char *arg) const char *param_start; arg++; /* ignore leading "-" */ - for (p = pro; p->p_name[0] != '\0'; p++) + if (set_special_option(arg)) + return; + + for (p = pro; p != pro + nitems(pro); p++) if (p->p_name[0] == arg[0]) if ((param_start = skip_over(arg, p->p_name)) != NULL) goto found; errx(1, "%s: unknown parameter \"%s\"", option_source, arg - 1); found: - switch (p->p_type) { - - case PRO_SPECIAL: - switch (p->p_special) { - - case IGN: - break; - - case CLI: - if (param_start[0] == '\0') - goto need_param; - opt.case_indent = atof(param_start); - break; - - case STDIN: - if (input == NULL) - input = stdin; - if (output == NULL) - output = stdout; - break; - - case KEY: - if (param_start[0] == '\0') - goto need_param; - add_typename(param_start); - break; - - case KEY_FILE: - if (param_start[0] == '\0') - goto need_param; - add_typedefs_from_file(param_start); - break; - - case VERSION: - printf("FreeBSD indent %s\n", INDENT_VERSION); - exit(0); - /*NOTREACHED*/ - - default: - errx(1, "set_option: internal error: p_special %d", p->p_special); - } - break; - - case PRO_BOOL: - *(bool *)p->p_obj = p->p_special != 0; - break; - - case PRO_INT: - if (!isdigit((unsigned char)*param_start)) { - need_param: - errx(1, "%s: ``%s'' requires a parameter", option_source, p->p_name); - } + if (p->p_is_bool) + *(bool *)p->p_obj = p->p_bool_value; + else { + if (!isdigit((unsigned char)*param_start)) + errx(1, "%s: ``%s'' requires a parameter", + option_source, p->p_name); *(int *)p->p_obj = atoi(param_start); - break; - - default: - errx(1, "set_option: internal error: p_type %d", p->p_type); } }