[LTP] [PATCH 1/2] metaparse: Add shell test parser

Ricardo B. Marlière ricardo@marliere.net
Thu Feb 13 13:48:44 CET 2025


On Wed Feb 12, 2025 at 10:16 AM -03, Cyril Hrubis wrote:
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> ---
>  metadata/.gitignore     |   1 +
>  metadata/Makefile       |   4 +-
>  metadata/metaparse-sh.c | 127 ++++++++++++++++++++++++++++++++++++++++
>  metadata/parse.sh       |  13 ++++
>  4 files changed, 143 insertions(+), 2 deletions(-)
>  create mode 100644 metadata/metaparse-sh.c
>
> diff --git a/metadata/.gitignore b/metadata/.gitignore
> index 07d2fd6ff..bb6399e5c 100644
> --- a/metadata/.gitignore
> +++ b/metadata/.gitignore
> @@ -1,2 +1,3 @@
>  metaparse
> +metaparse-sh
>  ltp.json
> diff --git a/metadata/Makefile b/metadata/Makefile
> index 522af4270..641657318 100644
> --- a/metadata/Makefile
> +++ b/metadata/Makefile
> @@ -7,12 +7,12 @@ include $(top_srcdir)/include/mk/env_pre.mk
>  include $(top_srcdir)/include/mk/functions.mk
>  
>  MAKE_TARGETS		:= ltp.json
> -HOST_MAKE_TARGETS	:= metaparse
> +HOST_MAKE_TARGETS	:= metaparse metaparse-sh
>  INSTALL_DIR		= metadata
>  
>  .PHONY: ltp.json
>  
> -ltp.json: metaparse
> +ltp.json: metaparse metaparse-sh
>  	$(abs_srcdir)/parse.sh > ltp.json
>  ifeq ($(WITH_METADATA),yes)
>  	mkdir -p $(abs_top_builddir)/docparse
> diff --git a/metadata/metaparse-sh.c b/metadata/metaparse-sh.c
> new file mode 100644
> index 000000000..9eb38f583
> --- /dev/null
> +++ b/metadata/metaparse-sh.c
> @@ -0,0 +1,127 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2025 Cyril Hrubis <chrubis@suse.cz>
> + */
> +
> +#include <stdio.h>
> +#include <string.h>
> +#include <libgen.h>
> +
> +#include "data_storage.h"
> +
> +static int started;
> +
> +static void json_start(char *path)
> +{
> +	if (started)
> +		return;
> +
> +	started = 1;
> +
> +	printf("   \"%s\": {\n", basename(path));
> +}
> +
> +static void json_finish(const char *path)
> +{
> +	if (!started)
> +		return;
> +
> +	printf("   \"fname\": \"%s\"\n", path);
> +	printf("  }");
> +}
> +
> +enum state {
> +	NONE,
> +	START,
> +	DOC_FIRST,
> +	DOC,
> +	ENV_START,
> +	ENV_FIRST,
> +	ENV
> +};
> +
> +static void parse_shell(char *path)
> +{
> +	char line[4096];
> +	FILE *f = fopen(path, "r");
> +	enum state state = NONE;
> +
> +	while (fgets(line, sizeof(line), f)) {
> +		/* Strip newline */
> +		line[strlen(line)-1] = 0;
> +
> +		switch (state) {
> +		case NONE:
> +			if (!strcmp(line, "# ---"))
> +				state = START;
> +		break;
> +		case START:
> +			if (!strcmp(line, "# doc")) {
> +				json_start(path);
> +				state = DOC_FIRST;
> +				printf("   \"doc\": [\n");
> +			} else if (!strcmp(line, "# env")) {
> +				json_start(path);
> +				state = ENV_START;
> +			} else {
> +				state = NONE;
> +			}
> +		break;
> +		case DOC:
> +		case DOC_FIRST:
> +			if (!strcmp(line, "# ---")) {
> +				state = NONE;
> +				printf("\n   ],\n");
> +				continue;
> +			}
> +
> +			if (state == DOC_FIRST)
> +				state = DOC;
> +			else
> +				printf(",\n");
> +
> +			data_fprintf_esc(stdout, 4, line+2);
> +		break;
> +		case ENV_START:
> +			if (!strcmp(line, "# {")) {
> +				state = ENV_FIRST;
> +			} else {
> +				fprintf(stderr,
> +				        "%s: Invalid line in JSON block '%s'",
> +					path, line);
> +			}
> +		break;
> +		case ENV:
> +		case ENV_FIRST:
> +			if (!strcmp(line, "# }")) {
> +				state = NONE;
> +				printf(",\n");
> +				continue;
> +			}
> +
> +

nit: double blank line here

> +			if (state == ENV_FIRST)
> +				state = ENV;
> +			else
> +				printf("\n");
> +
> +			line[0] = ' ';
> +			line[1] = ' ';
> +
> +			printf("%s", line);
> +		break;
> +		}
> +	}
> +
> +	json_finish(path);
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	int i;
> +
> +	for (i = 1; i < argc; i++)
> +		parse_shell(argv[i]);
> +
> +	return 0;
> +}
> diff --git a/metadata/parse.sh b/metadata/parse.sh
> index 7db2e2415..45776e4d0 100755
> --- a/metadata/parse.sh
> +++ b/metadata/parse.sh
> @@ -42,6 +42,19 @@ EOF
>  	fi
>  done
>  
> +for test in `find testcases/ -not -path "testcases/lib/*" -name '*.sh'|sort`; do
> +	a=$($top_builddir/metadata/metaparse-sh "$test")
> +	if [ -n "$a" ]; then
> +		if [ -z "$first" ]; then
> +			echo ','
> +		fi
> +		first=
> +		cat <<EOF
> +$a
> +EOF
> +	fi
> +done
> +
>  echo
>  echo ' }'
>  echo '}'



More information about the ltp mailing list