From 5abf2791961103434236cd349edd65f15cd14807 Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Tue, 21 Jan 2025 06:51:10 +0900 Subject: [PATCH 1/4] optlib2c: fix a typo Signed-off-by: Masatake YAMATO --- misc/optlib2c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/optlib2c b/misc/optlib2c index 492017dcca..b812d3afcf 100755 --- a/misc/optlib2c +++ b/misc/optlib2c @@ -88,7 +88,7 @@ my $options = $_[0]->{'versionCurrent'} = 0; $_[0]->{'versionAge'} = 0; $_[0]->{'foreignLanguages'} = []; - parse_flags ($rest, $_[0], $langdef_flags,); + parse_flags ($rest, $_[0], $langdef_flags); return 1; } ], From a3a4501e70a55075b6d703ccb68e6394df073311 Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Tue, 21 Jan 2025 06:25:49 +0900 Subject: [PATCH 2/4] main,Tmain,doc: use term 'parser specific' instead of 'parser own' Signed-off-by: Masatake YAMATO --- .../run.sh | 0 .../stderr-expected.txt | 0 .../input-0.x1 | 0 .../input-1.x1 | 0 .../run.sh | 0 .../stderr-expected.txt | 0 .../stdout-expected.txt | 0 .../x0.ctags | 0 .../x1.ctags | 0 Tmain/{parser-own-extras.d => parser-specific-extras.d}/run.sh | 0 .../stdout-expected.txt | 0 .../run.sh | 0 .../stdout-expected.txt | 0 .../input.unknownx | 0 .../knownz.ctags | 0 .../run.sh | 0 .../stderr-expected.txt | 0 .../stdout-expected.txt | 0 .../unknownx.ctags | 0 .../input.unknownx | 0 Tmain/{parser-own-fields.d => parser-specific-fields.d}/run.sh | 0 .../stderr-expected.txt | 0 .../stdout-expected.txt | 0 .../unknownx.ctags | 0 .../input.rst | 0 .../run.sh | 0 .../stderr-expected.txt | 0 .../stdout-expected.txt | 0 docs/optlib.rst | 2 +- main/entry.h | 2 +- 30 files changed, 2 insertions(+), 2 deletions(-) rename Tmain/{errors-about-parser-own-extras.d => errors-about-parser-specific-extras.d}/run.sh (100%) rename Tmain/{errors-about-parser-own-extras.d => errors-about-parser-specific-extras.d}/stderr-expected.txt (100%) rename Tmain/{parser-own-extras-for-foreign-lang.d => parser-specific-extras-for-foreign-lang.d}/input-0.x1 (100%) rename Tmain/{parser-own-extras-for-foreign-lang.d => parser-specific-extras-for-foreign-lang.d}/input-1.x1 (100%) rename Tmain/{parser-own-extras-for-foreign-lang.d => parser-specific-extras-for-foreign-lang.d}/run.sh (100%) rename Tmain/{parser-own-extras-for-foreign-lang.d => parser-specific-extras-for-foreign-lang.d}/stderr-expected.txt (100%) rename Tmain/{parser-own-extras-for-foreign-lang.d => parser-specific-extras-for-foreign-lang.d}/stdout-expected.txt (100%) rename Tmain/{parser-own-extras-for-foreign-lang.d => parser-specific-extras-for-foreign-lang.d}/x0.ctags (100%) rename Tmain/{parser-own-extras-for-foreign-lang.d => parser-specific-extras-for-foreign-lang.d}/x1.ctags (100%) rename Tmain/{parser-own-extras.d => parser-specific-extras.d}/run.sh (100%) rename Tmain/{parser-own-extras.d => parser-specific-extras.d}/stdout-expected.txt (100%) rename Tmain/{parser-own-fields-clearing-all.d => parser-specific-fields-clearing-all.d}/run.sh (100%) rename Tmain/{parser-own-fields-clearing-all.d => parser-specific-fields-clearing-all.d}/stdout-expected.txt (100%) rename Tmain/{parser-own-fields-for-foreign-lang.d => parser-specific-fields-for-foreign-lang.d}/input.unknownx (100%) rename Tmain/{parser-own-fields-for-foreign-lang.d => parser-specific-fields-for-foreign-lang.d}/knownz.ctags (100%) rename Tmain/{parser-own-fields-for-foreign-lang.d => parser-specific-fields-for-foreign-lang.d}/run.sh (100%) rename Tmain/{parser-own-fields-for-foreign-lang.d => parser-specific-fields-for-foreign-lang.d}/stderr-expected.txt (100%) rename Tmain/{parser-own-fields-for-foreign-lang.d => parser-specific-fields-for-foreign-lang.d}/stdout-expected.txt (100%) rename Tmain/{parser-own-fields-for-foreign-lang.d => parser-specific-fields-for-foreign-lang.d}/unknownx.ctags (100%) rename Tmain/{parser-own-fields.d => parser-specific-fields.d}/input.unknownx (100%) rename Tmain/{parser-own-fields.d => parser-specific-fields.d}/run.sh (100%) rename Tmain/{parser-own-fields.d => parser-specific-fields.d}/stderr-expected.txt (100%) rename Tmain/{parser-own-fields.d => parser-specific-fields.d}/stdout-expected.txt (100%) rename Tmain/{parser-own-fields.d => parser-specific-fields.d}/unknownx.ctags (100%) rename Tmain/{xref-output-formatting-parser-own-field.d => xref-output-formatting-parser-specific-field.d}/input.rst (100%) rename Tmain/{xref-output-formatting-parser-own-field.d => xref-output-formatting-parser-specific-field.d}/run.sh (100%) rename Tmain/{xref-output-formatting-parser-own-field.d => xref-output-formatting-parser-specific-field.d}/stderr-expected.txt (100%) rename Tmain/{xref-output-formatting-parser-own-field.d => xref-output-formatting-parser-specific-field.d}/stdout-expected.txt (100%) diff --git a/Tmain/errors-about-parser-own-extras.d/run.sh b/Tmain/errors-about-parser-specific-extras.d/run.sh similarity index 100% rename from Tmain/errors-about-parser-own-extras.d/run.sh rename to Tmain/errors-about-parser-specific-extras.d/run.sh diff --git a/Tmain/errors-about-parser-own-extras.d/stderr-expected.txt b/Tmain/errors-about-parser-specific-extras.d/stderr-expected.txt similarity index 100% rename from Tmain/errors-about-parser-own-extras.d/stderr-expected.txt rename to Tmain/errors-about-parser-specific-extras.d/stderr-expected.txt diff --git a/Tmain/parser-own-extras-for-foreign-lang.d/input-0.x1 b/Tmain/parser-specific-extras-for-foreign-lang.d/input-0.x1 similarity index 100% rename from Tmain/parser-own-extras-for-foreign-lang.d/input-0.x1 rename to Tmain/parser-specific-extras-for-foreign-lang.d/input-0.x1 diff --git a/Tmain/parser-own-extras-for-foreign-lang.d/input-1.x1 b/Tmain/parser-specific-extras-for-foreign-lang.d/input-1.x1 similarity index 100% rename from Tmain/parser-own-extras-for-foreign-lang.d/input-1.x1 rename to Tmain/parser-specific-extras-for-foreign-lang.d/input-1.x1 diff --git a/Tmain/parser-own-extras-for-foreign-lang.d/run.sh b/Tmain/parser-specific-extras-for-foreign-lang.d/run.sh similarity index 100% rename from Tmain/parser-own-extras-for-foreign-lang.d/run.sh rename to Tmain/parser-specific-extras-for-foreign-lang.d/run.sh diff --git a/Tmain/parser-own-extras-for-foreign-lang.d/stderr-expected.txt b/Tmain/parser-specific-extras-for-foreign-lang.d/stderr-expected.txt similarity index 100% rename from Tmain/parser-own-extras-for-foreign-lang.d/stderr-expected.txt rename to Tmain/parser-specific-extras-for-foreign-lang.d/stderr-expected.txt diff --git a/Tmain/parser-own-extras-for-foreign-lang.d/stdout-expected.txt b/Tmain/parser-specific-extras-for-foreign-lang.d/stdout-expected.txt similarity index 100% rename from Tmain/parser-own-extras-for-foreign-lang.d/stdout-expected.txt rename to Tmain/parser-specific-extras-for-foreign-lang.d/stdout-expected.txt diff --git a/Tmain/parser-own-extras-for-foreign-lang.d/x0.ctags b/Tmain/parser-specific-extras-for-foreign-lang.d/x0.ctags similarity index 100% rename from Tmain/parser-own-extras-for-foreign-lang.d/x0.ctags rename to Tmain/parser-specific-extras-for-foreign-lang.d/x0.ctags diff --git a/Tmain/parser-own-extras-for-foreign-lang.d/x1.ctags b/Tmain/parser-specific-extras-for-foreign-lang.d/x1.ctags similarity index 100% rename from Tmain/parser-own-extras-for-foreign-lang.d/x1.ctags rename to Tmain/parser-specific-extras-for-foreign-lang.d/x1.ctags diff --git a/Tmain/parser-own-extras.d/run.sh b/Tmain/parser-specific-extras.d/run.sh similarity index 100% rename from Tmain/parser-own-extras.d/run.sh rename to Tmain/parser-specific-extras.d/run.sh diff --git a/Tmain/parser-own-extras.d/stdout-expected.txt b/Tmain/parser-specific-extras.d/stdout-expected.txt similarity index 100% rename from Tmain/parser-own-extras.d/stdout-expected.txt rename to Tmain/parser-specific-extras.d/stdout-expected.txt diff --git a/Tmain/parser-own-fields-clearing-all.d/run.sh b/Tmain/parser-specific-fields-clearing-all.d/run.sh similarity index 100% rename from Tmain/parser-own-fields-clearing-all.d/run.sh rename to Tmain/parser-specific-fields-clearing-all.d/run.sh diff --git a/Tmain/parser-own-fields-clearing-all.d/stdout-expected.txt b/Tmain/parser-specific-fields-clearing-all.d/stdout-expected.txt similarity index 100% rename from Tmain/parser-own-fields-clearing-all.d/stdout-expected.txt rename to Tmain/parser-specific-fields-clearing-all.d/stdout-expected.txt diff --git a/Tmain/parser-own-fields-for-foreign-lang.d/input.unknownx b/Tmain/parser-specific-fields-for-foreign-lang.d/input.unknownx similarity index 100% rename from Tmain/parser-own-fields-for-foreign-lang.d/input.unknownx rename to Tmain/parser-specific-fields-for-foreign-lang.d/input.unknownx diff --git a/Tmain/parser-own-fields-for-foreign-lang.d/knownz.ctags b/Tmain/parser-specific-fields-for-foreign-lang.d/knownz.ctags similarity index 100% rename from Tmain/parser-own-fields-for-foreign-lang.d/knownz.ctags rename to Tmain/parser-specific-fields-for-foreign-lang.d/knownz.ctags diff --git a/Tmain/parser-own-fields-for-foreign-lang.d/run.sh b/Tmain/parser-specific-fields-for-foreign-lang.d/run.sh similarity index 100% rename from Tmain/parser-own-fields-for-foreign-lang.d/run.sh rename to Tmain/parser-specific-fields-for-foreign-lang.d/run.sh diff --git a/Tmain/parser-own-fields-for-foreign-lang.d/stderr-expected.txt b/Tmain/parser-specific-fields-for-foreign-lang.d/stderr-expected.txt similarity index 100% rename from Tmain/parser-own-fields-for-foreign-lang.d/stderr-expected.txt rename to Tmain/parser-specific-fields-for-foreign-lang.d/stderr-expected.txt diff --git a/Tmain/parser-own-fields-for-foreign-lang.d/stdout-expected.txt b/Tmain/parser-specific-fields-for-foreign-lang.d/stdout-expected.txt similarity index 100% rename from Tmain/parser-own-fields-for-foreign-lang.d/stdout-expected.txt rename to Tmain/parser-specific-fields-for-foreign-lang.d/stdout-expected.txt diff --git a/Tmain/parser-own-fields-for-foreign-lang.d/unknownx.ctags b/Tmain/parser-specific-fields-for-foreign-lang.d/unknownx.ctags similarity index 100% rename from Tmain/parser-own-fields-for-foreign-lang.d/unknownx.ctags rename to Tmain/parser-specific-fields-for-foreign-lang.d/unknownx.ctags diff --git a/Tmain/parser-own-fields.d/input.unknownx b/Tmain/parser-specific-fields.d/input.unknownx similarity index 100% rename from Tmain/parser-own-fields.d/input.unknownx rename to Tmain/parser-specific-fields.d/input.unknownx diff --git a/Tmain/parser-own-fields.d/run.sh b/Tmain/parser-specific-fields.d/run.sh similarity index 100% rename from Tmain/parser-own-fields.d/run.sh rename to Tmain/parser-specific-fields.d/run.sh diff --git a/Tmain/parser-own-fields.d/stderr-expected.txt b/Tmain/parser-specific-fields.d/stderr-expected.txt similarity index 100% rename from Tmain/parser-own-fields.d/stderr-expected.txt rename to Tmain/parser-specific-fields.d/stderr-expected.txt diff --git a/Tmain/parser-own-fields.d/stdout-expected.txt b/Tmain/parser-specific-fields.d/stdout-expected.txt similarity index 100% rename from Tmain/parser-own-fields.d/stdout-expected.txt rename to Tmain/parser-specific-fields.d/stdout-expected.txt diff --git a/Tmain/parser-own-fields.d/unknownx.ctags b/Tmain/parser-specific-fields.d/unknownx.ctags similarity index 100% rename from Tmain/parser-own-fields.d/unknownx.ctags rename to Tmain/parser-specific-fields.d/unknownx.ctags diff --git a/Tmain/xref-output-formatting-parser-own-field.d/input.rst b/Tmain/xref-output-formatting-parser-specific-field.d/input.rst similarity index 100% rename from Tmain/xref-output-formatting-parser-own-field.d/input.rst rename to Tmain/xref-output-formatting-parser-specific-field.d/input.rst diff --git a/Tmain/xref-output-formatting-parser-own-field.d/run.sh b/Tmain/xref-output-formatting-parser-specific-field.d/run.sh similarity index 100% rename from Tmain/xref-output-formatting-parser-own-field.d/run.sh rename to Tmain/xref-output-formatting-parser-specific-field.d/run.sh diff --git a/Tmain/xref-output-formatting-parser-own-field.d/stderr-expected.txt b/Tmain/xref-output-formatting-parser-specific-field.d/stderr-expected.txt similarity index 100% rename from Tmain/xref-output-formatting-parser-own-field.d/stderr-expected.txt rename to Tmain/xref-output-formatting-parser-specific-field.d/stderr-expected.txt diff --git a/Tmain/xref-output-formatting-parser-own-field.d/stdout-expected.txt b/Tmain/xref-output-formatting-parser-specific-field.d/stdout-expected.txt similarity index 100% rename from Tmain/xref-output-formatting-parser-own-field.d/stdout-expected.txt rename to Tmain/xref-output-formatting-parser-specific-field.d/stdout-expected.txt diff --git a/docs/optlib.rst b/docs/optlib.rst index fa94e9ba29..3ef1d7e54d 100644 --- a/docs/optlib.rst +++ b/docs/optlib.rst @@ -1970,7 +1970,7 @@ the output for input.docc: decompress input.docc /^- function: decompress(const char *compressed_byteseq) => char *$/;" function language:C roles:documented -.. TESTCASE: Tmain/parser-own-fields-for-foreign-lang.d +.. TESTCASE: Tmain/parser-specific-fields-for-foreign-lang.d ``{_language=}`` flag affects ``{_field=FIELDNAME:GROUP}`` flag; ctags looks up the field defintion in ``. diff --git a/main/entry.h b/main/entry.h index 2cd09af3a1..3c1729998e 100644 --- a/main/entry.h +++ b/main/entry.h @@ -141,7 +141,7 @@ struct sTagEntryInfo { short nth; } extensionFields; /* list of extension fields*/ - /* `usedParserFields' tracks how many parser own fields are + /* `usedParserFields' tracks how many parser specific fields are used. If it is a few (less than PRE_ALLOCATED_PARSER_FIELDS), statically allocated parserFields is used. If more fields than PRE_ALLOCATED_PARSER_FIELDS is defined and attached, parserFieldsDynamic From f8f152fe8e3ce5d2f016b35ef88eeb508a38f92f Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Mon, 15 May 2023 00:42:49 +0900 Subject: [PATCH 3/4] main: allow to specify data type for a parser specific field from CLI --_list-fielddef-flags option is added, too. Signed-off-by: Masatake YAMATO --- .../exit-expected.txt | 1 + Tmain/flags-fielddef-datatype.d/run.sh | 22 +++++++++ .../stderr-expected.txt | 5 ++ .../stdout-expected.txt | 6 +++ Tmain/list-fielddef-flags.d/exit-expected.txt | 1 + Tmain/list-fielddef-flags.d/run.sh | 7 +++ .../list-fielddef-flags.d/stderr-expected.txt | 0 .../list-fielddef-flags.d/stdout-expected.txt | 2 + .../exit-expected.txt | 1 + .../input.testlang | 17 +++++++ .../run.sh | 8 ++++ .../stderr-expected.txt | 0 .../stdout-expected.txt | 14 ++++++ .../testlang.ctags | 33 +++++++++++++ main/options.c | 11 +++++ main/parse.c | 48 +++++++++++++++++-- main/parse_p.h | 1 + 17 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 Tmain/flags-fielddef-datatype.d/exit-expected.txt create mode 100644 Tmain/flags-fielddef-datatype.d/run.sh create mode 100644 Tmain/flags-fielddef-datatype.d/stderr-expected.txt create mode 100644 Tmain/flags-fielddef-datatype.d/stdout-expected.txt create mode 100644 Tmain/list-fielddef-flags.d/exit-expected.txt create mode 100644 Tmain/list-fielddef-flags.d/run.sh create mode 100644 Tmain/list-fielddef-flags.d/stderr-expected.txt create mode 100644 Tmain/list-fielddef-flags.d/stdout-expected.txt create mode 100644 Tmain/parser-specific-fields-with-datatype.d/exit-expected.txt create mode 100644 Tmain/parser-specific-fields-with-datatype.d/input.testlang create mode 100755 Tmain/parser-specific-fields-with-datatype.d/run.sh create mode 100644 Tmain/parser-specific-fields-with-datatype.d/stderr-expected.txt create mode 100644 Tmain/parser-specific-fields-with-datatype.d/stdout-expected.txt create mode 100644 Tmain/parser-specific-fields-with-datatype.d/testlang.ctags diff --git a/Tmain/flags-fielddef-datatype.d/exit-expected.txt b/Tmain/flags-fielddef-datatype.d/exit-expected.txt new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/Tmain/flags-fielddef-datatype.d/exit-expected.txt @@ -0,0 +1 @@ +0 diff --git a/Tmain/flags-fielddef-datatype.d/run.sh b/Tmain/flags-fielddef-datatype.d/run.sh new file mode 100644 index 0000000000..0364b89eaf --- /dev/null +++ b/Tmain/flags-fielddef-datatype.d/run.sh @@ -0,0 +1,22 @@ +# Copyright: 2023 Masatake YAMATO +# License: GPL-2 + +CTAGS=$1 + +${CTAGS} --quiet --options=NONE --langdef=FIELDTEST \ + --_fielddef-FIELDTEST=strfield,"a field having string value"'{datatype=str}' \ + --_fielddef-FIELDTEST=boolfield,"a field having boolean value"'{datatype=bool}' \ + --_fielddef-FIELDTEST=intfield,"a field having integer value"'{datatype=int}' \ + --_fielddef-FIELDTEST=strboolfield,"a field having string value or false"'{datatype=str+bool}' \ + --_fielddef-FIELDTEST=deffield,"a field that type is not specified" \ + --list-fields=FIELDTEST && \ +! ${CTAGS} --quiet --options=NONE --langdef=FIELDTEST \ + --_fielddef-FIELDTEST=fooA,"unexpected data type"'{datatype=bar}' && +! ${CTAGS} --quiet --options=NONE --langdef=FIELDTEST \ + --_fielddef-FIELDTEST=fooB,"unexpected data type"'{datatype=int+baz}' && +! ${CTAGS} --quiet --options=NONE --langdef=FIELDTEST \ + --_fielddef-FIELDTEST=fooC,"unexpected data type"'{datatype=}' && +! ${CTAGS} --quiet --options=NONE --langdef=FIELDTEST \ + --_fielddef-FIELDTEST=fooD,"unexpected data type"'{datatype=+baz}' && +! ${CTAGS} --quiet --options=NONE --langdef=FIELDTEST \ + --_fielddef-FIELDTEST=fooE,"unexpected data type"'{datatype=bool+str}' diff --git a/Tmain/flags-fielddef-datatype.d/stderr-expected.txt b/Tmain/flags-fielddef-datatype.d/stderr-expected.txt new file mode 100644 index 0000000000..9b0d2e42d0 --- /dev/null +++ b/Tmain/flags-fielddef-datatype.d/stderr-expected.txt @@ -0,0 +1,5 @@ +ctags: unknown datatype for field "fooA": "bar" +ctags: unknown datatype for field "fooB": "int+baz" +ctags: no datatype given for field: "fooC" +ctags: unknown datatype for field "fooD": "+baz" +ctags: unknown datatype for field "fooE": "bool+str" diff --git a/Tmain/flags-fielddef-datatype.d/stdout-expected.txt b/Tmain/flags-fielddef-datatype.d/stdout-expected.txt new file mode 100644 index 0000000000..9bbd7f209c --- /dev/null +++ b/Tmain/flags-fielddef-datatype.d/stdout-expected.txt @@ -0,0 +1,6 @@ +#LETTER NAME ENABLED LANGUAGE JSTYPE FIXED OP DESCRIPTION +- boolfield no FIELDTEST --b no -- a field having boolean value +- deffield no FIELDTEST s-- no -- a field that type is not specified +- intfield no FIELDTEST -i- no -- a field having integer value +- strboolfield no FIELDTEST s-b no -- a field having string value or false +- strfield no FIELDTEST s-- no -- a field having string value diff --git a/Tmain/list-fielddef-flags.d/exit-expected.txt b/Tmain/list-fielddef-flags.d/exit-expected.txt new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/Tmain/list-fielddef-flags.d/exit-expected.txt @@ -0,0 +1 @@ +0 diff --git a/Tmain/list-fielddef-flags.d/run.sh b/Tmain/list-fielddef-flags.d/run.sh new file mode 100644 index 0000000000..542e385b97 --- /dev/null +++ b/Tmain/list-fielddef-flags.d/run.sh @@ -0,0 +1,7 @@ +#!/bin/sh +# Copyright: 2023 Masatake YAMATO +# License: GPL-2 + +CTAGS=$1 + +${CTAGS} --quiet --options=NONE --_list-fielddef-flags diff --git a/Tmain/list-fielddef-flags.d/stderr-expected.txt b/Tmain/list-fielddef-flags.d/stderr-expected.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Tmain/list-fielddef-flags.d/stdout-expected.txt b/Tmain/list-fielddef-flags.d/stdout-expected.txt new file mode 100644 index 0000000000..64d73e8ccc --- /dev/null +++ b/Tmain/list-fielddef-flags.d/stdout-expected.txt @@ -0,0 +1,2 @@ +#LETTER NAME DESCRIPTION +- datatype=TYPE acceaptable datatype of the field ([str]|bool|int|str+bool) diff --git a/Tmain/parser-specific-fields-with-datatype.d/exit-expected.txt b/Tmain/parser-specific-fields-with-datatype.d/exit-expected.txt new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/Tmain/parser-specific-fields-with-datatype.d/exit-expected.txt @@ -0,0 +1 @@ +0 diff --git a/Tmain/parser-specific-fields-with-datatype.d/input.testlang b/Tmain/parser-specific-fields-with-datatype.d/input.testlang new file mode 100644 index 0000000000..2e09cae691 --- /dev/null +++ b/Tmain/parser-specific-fields-with-datatype.d/input.testlang @@ -0,0 +1,17 @@ +str:s0 +str:s1 +str:s2 + +int:i0 +int:i1 +int:i2 +int:i3 +int:i4 + +bool:b0 +bool:b1 +bool:b2 + +strbool:sb0 +strbool:sb1 +strbool:sb2 diff --git a/Tmain/parser-specific-fields-with-datatype.d/run.sh b/Tmain/parser-specific-fields-with-datatype.d/run.sh new file mode 100755 index 0000000000..ec553d169d --- /dev/null +++ b/Tmain/parser-specific-fields-with-datatype.d/run.sh @@ -0,0 +1,8 @@ +# Copyright: 2025 Masatake YAMATO +# License: GPL-2 + +CTAGS=$1 + +${CTAGS} --quiet --options=NONE --options=testlang.ctags -o - \ + --output-format=u-ctags \ + input.testlang diff --git a/Tmain/parser-specific-fields-with-datatype.d/stderr-expected.txt b/Tmain/parser-specific-fields-with-datatype.d/stderr-expected.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Tmain/parser-specific-fields-with-datatype.d/stdout-expected.txt b/Tmain/parser-specific-fields-with-datatype.d/stdout-expected.txt new file mode 100644 index 0000000000..c20fcf3154 --- /dev/null +++ b/Tmain/parser-specific-fields-with-datatype.d/stdout-expected.txt @@ -0,0 +1,14 @@ +s0 input.testlang /^str:s0$/;" o str:string +s1 input.testlang /^str:s1$/;" o str: +s2 input.testlang /^str:s2$/;" o +i0 input.testlang /^int:i0$/;" o int:10 +i1 input.testlang /^int:i1$/;" o int:-1 +i2 input.testlang /^int:i2$/;" o int:1 +i3 input.testlang /^int:i3$/;" o int:0 +i4 input.testlang /^int:i4$/;" o +b0 input.testlang /^bool:b0$/;" o bool: +b1 input.testlang /^bool:b1$/;" o bool: +b2 input.testlang /^bool:b2$/;" o +sb0 input.testlang /^strbool:sb0$/;" o strbool:abc +sb1 input.testlang /^strbool:sb1$/;" o strbool: +sb2 input.testlang /^strbool:sb2$/;" o diff --git a/Tmain/parser-specific-fields-with-datatype.d/testlang.ctags b/Tmain/parser-specific-fields-with-datatype.d/testlang.ctags new file mode 100644 index 0000000000..9b6b4dd019 --- /dev/null +++ b/Tmain/parser-specific-fields-with-datatype.d/testlang.ctags @@ -0,0 +1,33 @@ +--sort=no + +--langdef=Testlang +--map-Testlang=+.testlang + +--kinddef-Testlang=o,object,objects + +--_fielddef-Testlang=str,String{datatype=str} +--fields-Testlang=+{str} +--_fielddef-Testlang=int,Integer{datatype=int} +--fields-Testlang=+{int} +--_fielddef-Testlang=bool,Boolean{datatype=bool} +--fields-Testlang=+{bool} +--_fielddef-Testlang=strbool,String or Boolean{datatype=str+bool} +--fields-Testlang=+{strbool} + +--regex-Testlang=/^str:(s0)/\1/o/{_field=str:string} +--regex-Testlang=/^str:(s1)/\1/o/{_field=str:} +--regex-Testlang=/^str:(s2)/\1/o/ + +--regex-Testlang=/^int:(i0)/\1/o/{_field=int:10} +--regex-Testlang=/^int:(i1)/\1/o/{_field=int:-1} +--regex-Testlang=/^int:(i2)/\1/o/{_field=int:abc} +--regex-Testlang=/^int:(i3)/\1/o/{_field=int:} +--regex-Testlang=/^int:(i4)/\1/o/ + +--regex-Testlang=/^bool:(b0)/\1/o/{_field=bool:abc} +--regex-Testlang=/^bool:(b1)/\1/o/{_field=bool:} +--regex-Testlang=/^bool:(b2)/\1/o/ + +--regex-Testlang=/^strbool:(sb0)/\1/o/{_field=strbool:abc} +--regex-Testlang=/^strbool:(sb1)/\1/o/{_field=strbool:} +--regex-Testlang=/^strbool:(sb2)/\1/o/ diff --git a/main/options.c b/main/options.c index ef3ee55203..7e339d0239 100644 --- a/main/options.c +++ b/main/options.c @@ -464,6 +464,8 @@ static optionDescription LongOptionDescription [] = { {1,0," --list-{aliases,extras,features,fields,kind-full,langdef-flags,params," }, {1,0," pseudo-tags,regex-flags,roles,subparsers} support this option."}, {1,0," Specify before --list-* option."}, + {1,1," --_list-fielddef-flags"}, + {1,1," Output list of flags which can be used with --fielddef option."}, {1,1," --_list-kinddef-flags"}, {1,1," Output list of flags which can be used with --kinddef option."}, {1,1," --_list-langdef-flags"}, @@ -2234,6 +2236,14 @@ static void processListKinddefFlagsOptions ( exit (0); } +static void processListFielddefFlagsOptions ( + const char *const option CTAGS_ATTR_UNUSED, + const char *const parameter CTAGS_ATTR_UNUSED) +{ + printFielddefFlags (localOption.withListHeader, localOption.machinable, stdout); + exit (0); +} + attr__noreturn static void processListRolesOptions (const char *const option CTAGS_ATTR_UNUSED, const char *const parameter) @@ -2935,6 +2945,7 @@ static parametricOption ParametricOptions [] = { #ifdef HAVE_JANSSON { "_interactive", processInteractiveOption, true, STAGE_ANY }, #endif + { "_list-fielddef-flags", processListFielddefFlagsOptions,true, STAGE_ANY }, { "_list-kinddef-flags", processListKinddefFlagsOptions, true, STAGE_ANY }, { "_list-langdef-flags", processListLangdefFlagsOptions, true, STAGE_ANY }, { "_list-mtable-regex-flags", processListMultitableRegexFlagsOptions, true, STAGE_ANY }, diff --git a/main/parse.c b/main/parse.c index e9b98ecc39..5677fa65e3 100644 --- a/main/parse.c +++ b/main/parse.c @@ -4001,6 +4001,33 @@ static void fieldDefinitionDestroy (fieldDefinition *fdef) eFree (fdef); } +static void field_def_flag_datatype_long (const char *const optflag CTAGS_ATTR_UNUSED, + const char* const param, + void *data) +{ + fieldDefinition *fdef = data; + + if (*param == '\0') + error (FATAL, "no datatype given for field: \"%s\"", fdef->name); + + fdef->dataType = 0; + if (strcmp (param, "int") == 0) + fdef->dataType |= FIELDTYPE_INTEGER; + else if (strcmp (param, "str") == 0) + fdef->dataType |= FIELDTYPE_STRING; + else if (strcmp (param, "bool") == 0) + fdef->dataType |= FIELDTYPE_BOOL; + else if (strcmp (param, "str+bool") == 0) + fdef->dataType |= FIELDTYPE_STRING|FIELDTYPE_BOOL; + else + error (FATAL, "unknown datatype for field \"%s\": \"%s\"", fdef->name, param); +} + +static flagDefinition FieldDefFlagDef [] = { + { '\0', "datatype", NULL, field_def_flag_datatype_long, + "TYPE", "acceaptable datatype of the field ([str]|bool|int|str+bool)" }, +}; + static bool processLangDefineField (const langType language, const char *const option, const char *const parameter) @@ -4047,13 +4074,14 @@ static bool processLangDefineField (const langType language, fdef->setValueObject = NULL; fdef->setterValueType = NULL; fdef->checkValueForSetter = NULL; - fdef->dataType = FIELDTYPE_STRING; /* TODO */ + fdef->dataType = 0; + if (flags) + flagsEval (flags, FieldDefFlagDef, ARRAY_SIZE (FieldDefFlagDef), fdef); + if (!fdef->dataType) + fdef->dataType = FIELDTYPE_STRING; fdef->ftype = FIELD_UNKNOWN; DEFAULT_TRASH_BOX(fdef, fieldDefinitionDestroy); - if (flags) - flagsEval (flags, NULL, 0, fdef); - defineField (fdef, language); return true; @@ -5362,6 +5390,18 @@ extern void printKinddefFlags (bool withListHeader, bool machinable, FILE *fp) colprintTableDelete(table); } +extern void printFielddefFlags (bool withListHeader, bool machinable, FILE *fp) +{ + struct colprintTable * table; + + table = flagsColprintTableNew (); + + flagsColprintAddDefinitions (table, FieldDefFlagDef, ARRAY_SIZE (FieldDefFlagDef)); + + flagsColprintTablePrint (table, withListHeader, machinable, fp); + colprintTableDelete(table); +} + extern void printLanguageMultitableStatistics (langType language) { parserObject* const parser = LanguageTable + language; diff --git a/main/parse_p.h b/main/parse_p.h index b841cce41b..a1ea8f828e 100644 --- a/main/parse_p.h +++ b/main/parse_p.h @@ -130,6 +130,7 @@ extern void printLanguageSubparsers (const langType language, bool withListHeader, bool machinable, FILE *fp); extern void printLangdefFlags (bool withListHeader, bool machinable, FILE *fp); extern void printKinddefFlags (bool withListHeader, bool machinable, FILE *fp); +extern void printFielddefFlags (bool withListHeader, bool machinable, FILE *fp); extern bool doesParserRequireMemoryStream (const langType language); extern bool parseFile (const char *const fileName); extern bool parseFileWithMio (const char *const fileName, MIO *mio, void *clientData); From 14616644639fe92d561859580122b3140afc614f Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Tue, 21 Jan 2025 06:58:48 +0900 Subject: [PATCH 4/4] optlib2c: support datatype flag in --_fielddef option Signed-off-by: Masatake YAMATO --- misc/optlib2c | 45 +++++++++++++++++++++++++++++++++++++++++++-- optlib/inko.c | 1 + optlib/inko.ctags | 2 +- optlib/passwd.c | 2 ++ optlib/passwd.ctags | 4 ++-- 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/misc/optlib2c b/misc/optlib2c index b812d3afcf..cf1ee55730 100755 --- a/misc/optlib2c +++ b/misc/optlib2c @@ -58,6 +58,36 @@ my $langdef_flags = } ], ]; +my $fielddef_flags = + [ + [ qr/\{datatype=([^\}]+)\}/, sub { + my $datatype = ""; + + if ($1 eq 'str') + { + $datatype .= "FIELDTYPE_STRING"; + } + elsif ($1 eq 'int') + { + $datatype .= "FIELDTYPE_INTEGER"; + } + elsif ($1 eq 'bool') + { + $datatype .= "FIELDTYPE_BOOL"; + } + elsif (($1 eq 'bool+str') || ($1 eq 'str+bool')) + { + $datatype .= "FIELDTYPE_STRING|FIELDTYPE_BOOL"; + } + else + { + die "Unknown datatype specification: \"{datatype=$1}\" in \"--_fielddef-=...\""; + } + + $_[0]->{'datatype'} = $datatype; + } ], + ]; + my $options = [ [ qr/^--options=(.*)/, sub { @@ -135,7 +165,7 @@ my $options = push @{$_[0]->{'extradefs'}}, { name => $name, desc => $desc }; return 1; } ], - [ qr/^--_fielddef-(.*)=([^,]+),([^\{]+)/, sub { + [ qr/^--_fielddef-(.*)=([^,]+),([^\{]+)(.*)/, sub { die "Don't use --_fielddef-=+ option before defining the language" if (! defined $_[0]->{'langdef'}); die "Adding a field is allowed only to the language specified with --langdef: $1" @@ -143,10 +173,14 @@ my $options = my $name = $2; my $desc = $3; + my $rest = $4; die "unacceptable character is used for field name: $name" unless ($name =~ /^[a-zA-Z]+$/); - push @{$_[0]->{'fielddefs'}}, { name => $name, desc => $desc }; + my $fdef = { name => $name, desc => $desc }; + push @{$_[0]->{'fielddefs'}}, $fdef; + parse_flags ($rest, $fdef, $fielddef_flags); + return 1; } ], [ qr/^--_roledef-([^.]*)\.(?:([a-zA-Z])|\{([a-zA-Z][a-zA-Z0-9]*)\})=([a-zA-Z0-9]+),([^\{]+)/, sub { @@ -1062,6 +1096,13 @@ EOF .enabled = $enabled, .name = "$_->{'name'}", .description = "$desc", +EOF + if (defined $_->{'datatype'}) { + print <{'datatype'}, +EOF + } + print <