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);
}
}