1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

commands: use nul for EOL for compiled-in buffer

Use \0 as EOL in compiled-in syntax description to avoid
unnecessary line copy that just replaced \n with \0.
Also use already splitted lines when possible.
This commit is contained in:
Zdenek Kabelac 2024-03-24 00:06:45 +01:00
parent 50ad27a4ab
commit b951f81db5
2 changed files with 29 additions and 45 deletions

View File

@ -185,8 +185,8 @@ command-lines-input.h: $(srcdir)/command-lines.in $(srcdir)/license.inc Makefile
( cat $(srcdir)/license.inc && \
echo "/* Do not edit. This file is generated by the Makefile. */" && \
printf "static const char _command_input[] =\n\n\"" && \
$(AWK) 'BEGIN {ORS = "\\n\"\n\""} !/^#/ && !/---/ && !/^$$/' $(srcdir)/command-lines.in && \
printf '\\n\\n";\n' \
$(AWK) 'BEGIN {ORS = "\\0\"\n\""} !/^#/ && !/---/ && !/^$$/' $(srcdir)/command-lines.in && \
printf '\\0\\0";\n' \
) > $@
$(SOURCES:%.c=%.d) $(SOURCES2:%.c=%.d): command-lines-input.h command-count.h

View File

@ -367,7 +367,7 @@ static int _val_str_to_num(char *str)
#define MAX_LONG_OPT_NAME_LEN 32
static int _opt_str_to_num(struct command *cmd, char *str)
static int _opt_str_to_num(struct command *cmd, const char *str)
{
char long_name[MAX_LONG_OPT_NAME_LEN];
char *p = NULL;
@ -450,7 +450,7 @@ int command_id_to_enum(const char *str)
/* "lv_is_prop" to is_prop_LVP */
static int _lvp_name_to_enum(struct command *cmd, char *str)
static int _lvp_name_to_enum(struct command *cmd, const char *str)
{
int i;
@ -466,7 +466,7 @@ static int _lvp_name_to_enum(struct command *cmd, char *str)
/* "type" to type_LVT */
static int _lvt_name_to_enum(struct command *cmd, char *str)
static int _lvt_name_to_enum(struct command *cmd, const char *str)
{
int i;
@ -482,7 +482,7 @@ static int _lvt_name_to_enum(struct command *cmd, char *str)
/* LV_<type> to <type>_LVT */
static int _lv_to_enum(struct command *cmd, char *name)
static int _lv_to_enum(struct command *cmd, const char *name)
{
return _lvt_name_to_enum(cmd, name + 3);
}
@ -1208,7 +1208,7 @@ static void _add_required_line(struct cmd_context *cmdtool, struct command *cmd,
}
}
static void _add_flags(struct command *cmd, char *line)
static void _add_flags(struct command *cmd, const char *line)
{
if (strstr(line, "SECONDARY_SYNTAX"))
cmd->cmd_flags |= CMD_FLAG_SECONDARY_SYNTAX;
@ -1216,13 +1216,9 @@ static void _add_flags(struct command *cmd, char *line)
cmd->cmd_flags |= CMD_FLAG_PREVIOUS_SYNTAX;
}
static void _add_autotype(struct cmd_context *cmdtool, struct command *cmd, char *line)
static void _add_autotype(struct cmd_context *cmdtool, struct command *cmd,
int line_argc, char *line_argv[])
{
int line_argc;
char *line_argv[MAX_LINE_ARGC];
_split_line(line, &line_argc, line_argv, ' ');
if (cmd->autotype)
cmd->autotype2 = dm_pool_strdup(cmdtool->libmem, line_argv[1]);
else
@ -1231,12 +1227,11 @@ static void _add_autotype(struct cmd_context *cmdtool, struct command *cmd, char
#define MAX_RULE_OPTS 64
static void _add_rule(struct cmd_context *cmdtool, struct command *cmd, char *line)
static void _add_rule(struct cmd_context *cmdtool, struct command *cmd,
int line_argc, char *line_argv[])
{
struct cmd_rule *rule;
char *line_argv[MAX_LINE_ARGC];
char *arg;
int line_argc;
const char *arg;
int i, lvt_enum, lvp_enum;
int check = 0;
@ -1248,8 +1243,6 @@ static void _add_rule(struct cmd_context *cmdtool, struct command *cmd, char *li
rule = &cmd->rules[cmd->rule_count++];
_split_line(line, &line_argc, line_argv, ' ');
for (i = 0; i < line_argc; i++) {
arg = line_argv[i];
@ -1428,33 +1421,27 @@ static void _create_opt_names_alpha(void)
qsort(opt_names_alpha, ARG_COUNT, sizeof(long), _long_name_compare);
}
static int _copy_line(char *line, int max_line, int *position)
static int _copy_line(const char **line, int max_line, int *position)
{
int p = *position;
int i = 0;
size_t len;
max_line--;
while (i < max_line) {
if (_command_input[p] == '\n') {
p++;
break;
}
*line = _command_input + *position;
len = strlen(*line);
*position += len + 1;
if (len >= max_line)
return 0;
line[i++] = _command_input[p++];
}
*position = p;
line[i] = 0;
return 1;
return len;
}
int define_commands(struct cmd_context *cmdtool, const char *run_name)
{
struct command *cmd = NULL;
const char *line_orig;
char line[MAX_LINE];
char line_orig[MAX_LINE];
char *line_argv[MAX_LINE_ARGC];
const char *name;
size_t line_orig_len;
int line_argc;
int cmd_count = 0;
int prev_was_oo_def = 0;
@ -1471,15 +1458,12 @@ int define_commands(struct cmd_context *cmdtool, const char *run_name)
/* Process each line of command-lines-input.h (from command-lines.in) */
while (_copy_line(line, MAX_LINE, &copy_pos)) {
if (!line[0])
break;
if (line[0] == '-' && line[1] == '-' &&
(!line[2] || (line[2] == '-' && !line[3])))
while ((line_orig_len = _copy_line(&line_orig, MAX_LINE, &copy_pos)) > 0) {
if (line_orig[0] == '-' && line_orig[1] == '-' &&
(!line_orig[2] || (line_orig[2] == '-' && !line_orig[3])))
continue; /* "---" or "--" */
dm_strncpy(line_orig, line, sizeof(line_orig));
memcpy(line, line_orig, line_orig_len + 1);
_split_line(line, &line_argc, line_argv, ' ');
if (!line_argc)
@ -1532,7 +1516,7 @@ int define_commands(struct cmd_context *cmdtool, const char *run_name)
if (cmd && !skip && _is_desc_line(line_argv[0])) {
if (cmd->desc) {
size_t newlen = strlen(cmd->desc) + strlen(line_orig) + 2;
size_t newlen = strlen(cmd->desc) + line_orig_len + 2;
char *newdesc = dm_pool_alloc(cmdtool->libmem, newlen);
if (!newdesc) {
@ -1556,7 +1540,7 @@ int define_commands(struct cmd_context *cmdtool, const char *run_name)
}
if (cmd && !skip && _is_autotype_line(line_argv[0])) {
_add_autotype(cmdtool, cmd, line_orig);
_add_autotype(cmdtool, cmd, line_argc, line_argv);
continue;
}
@ -1566,7 +1550,7 @@ int define_commands(struct cmd_context *cmdtool, const char *run_name)
}
if (cmd && !skip && _is_rule_line(line_argv[0])) {
_add_rule(cmdtool, cmd, line_orig);
_add_rule(cmdtool, cmd, line_argc, line_argv);
continue;
}