Skip to content

Commit 7023fdb

Browse files
authored
Merge pull request #4382 from masatake/qemuhx-ng
QemuHX: various improvements
2 parents 381d57e + 8cdde4e commit 7023fdb

File tree

12 files changed

+322
-22
lines changed

12 files changed

+322
-22
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
help input.hx /^ .name = "help|?",$/;" c
2+
? input.hx /^ .name = "help|?",$/;" c
13
help input.hx /^@item help or ? [@var{cmd}]$/;" i
4+
version input.hx /^DEF("version", 0, QEMU_OPTION_version,$/;" c
25
-version input.hx /^@item -version$/;" i
6+
check input.hx /^DEF("check", img_check,$/;" c
37
check input.hx /^@item check [-q] [-f @var{fmt}] [--output=@var{ofmt}] [-r [leaks | all]] [-T @var{src_cache}] @v/;" i
8+
create input.hx /^DEF("create", img_create,$/;" c
49
create input.hx /^@item create [-q] [-f @var{fmt}] [-o @var{options}] @var{filename} [@var{size}]$/;" i
510
quit input.hx /^quit$/;" q
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
help input.hx /^ .name = "help|?",$/;" c
2+
? input.hx /^ .name = "help|?",$/;" c
13
help input.hx /^@item help or ? [@var{cmd}]$/;" i
4+
version input.hx /^DEF("version", 0, QEMU_OPTION_version,$/;" c
25
-version input.hx /^@item -version$/;" i
6+
check input.hx /^DEF("check", img_check,$/;" c
37
check input.hx /^@item check [-q] [-f @var{fmt}] [--output=@var{ofmt}] [-r [leaks | all]] [-T @var{src_cache}] @v/;" i
8+
create input.hx /^DEF("create", img_create,$/;" c
49
create input.hx /^@item create [-q] [-f @var{fmt}] [-o @var{options}] @var{filename} [@var{size}]$/;" i
510
quit input.hx /^quit$/;" q
611
qmp_quit input.hx /^quit$/;" q extras:funcmap
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
inject-nmi input.hx /^ .name = "inject-nmi",$/;" c
12
inject-nmi input.hx /^inject-nmi$/;" q
2-
system_reset input.hx /^system_reset$/;" q
33
qmp_inject_nmi input.hx /^inject-nmi$/;" q extras:funcmap
4+
system_reset input.hx /^ .name = "system_reset",$/;" c
5+
system_reset input.hx /^system_reset$/;" q
46
qmp_system_reset input.hx /^system_reset$/;" q extras:funcmap
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
--sort=no
2+
--extras=+g
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
version input.hx /^ .name = "version",$/;" c
2+
cryptodev input.hx /^ .name = "cryptodev",$/;" c
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
1HXCOMM Taken fom hmp-commands-info.hx in qemu
2+
HXCOMM
3+
HXCOMM See docs/devel/docs.rst for the format of this file.
4+
HXCOMM
5+
HXCOMM This file defines the contents of an array of HMPCommand structs
6+
HXCOMM which specify the name, behaviour and help text for HMP commands.
7+
HXCOMM Text between SRST and ERST is rST format documentation.
8+
HXCOMM HXCOMM can be used for comments, discarded from both rST and C.
9+
HXCOMM
10+
HXCOMM In this file, generally SRST fragments should have two extra
11+
HXCOMM spaces of indent, so that the documentation list item for "info foo"
12+
HXCOMM appears inside the documentation list item for the top level
13+
HXCOMM "info" documentation entry. The exception is the first SRST
14+
HXCOMM fragment that defines that top level entry.
15+
16+
HXCOMM See docs/devel/docs.rst for the format of this file.
17+
HXCOMM
18+
HXCOMM This file defines the contents of an array of HMPCommand structs
19+
HXCOMM which specify the name, behaviour and help text for HMP commands.
20+
HXCOMM Text between SRST and ERST is rST format documentation.
21+
HXCOMM HXCOMM can be used for comments, discarded from both rST and C.
22+
HXCOMM
23+
HXCOMM In this file, generally SRST fragments should have two extra
24+
HXCOMM spaces of indent, so that the documentation list item for "info foo"
25+
HXCOMM appears inside the documentation list item for the top level
26+
HXCOMM "info" documentation entry. The exception is the first SRST
27+
HXCOMM fragment that defines that top level entry.
28+
29+
SRST
30+
``info`` *subcommand*
31+
Show various information about the system state.
32+
33+
ERST
34+
35+
{
36+
.name = "version",
37+
.args_type = "",
38+
.params = "",
39+
.help = "show the version of QEMU",
40+
.cmd = hmp_info_version,
41+
.flags = "p",
42+
},
43+
44+
SRST
45+
``info version``
46+
Show the version of QEMU.
47+
ERST
48+
49+
{
50+
.name = "cryptodev",
51+
.args_type = "",
52+
.params = "",
53+
.help = "show the crypto devices",
54+
.cmd = hmp_info_cryptodev,
55+
.flags = "p",
56+
},
57+
58+
SRST
59+
``info cryptodev``
60+
Show the crypto devices.
61+
ERST

docs/news/HEAD.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ SQL:
7070

7171
* Add ``type`` kind to extract ``t`` in "``CREATE TYPE t ...``".
7272

73+
QemuHX:
74+
75+
* Extract command in ``{ "command", ...``.
76+
* Implement a selector arbitrating Haxe and QemuHX parsers, both handling
77+
``.hx`` file extension.
78+
7379
New parsers
7480
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7581
The following parsers have been added:

main/selectors.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ static const char *TR_PROLOG = "Prolog";
4848
static const char *TR_SYSTEMD_UNIT = "SystemdUnit";
4949
static const char *TR_DBUS_SERVICE = "DBusService";
5050

51+
static const char *TR_HAXE = "Haxe";
52+
static const char *TR_QEMUHX = "QemuHX";
53+
5154
#define startsWith(line,prefix) \
5255
(strncmp(line, prefix, strlen(prefix)) == 0? true: false)
5356

@@ -503,6 +506,27 @@ selectByDBusServiceAndSystemdUnitSectionNames (MIO *input,
503506
return selectByLines (input, tasteDBusServiceOrSystemdUnit, TR_SYSTEMD_UNIT, NULL);
504507
}
505508

509+
static const char *
510+
tasteHaxeOrQemuHX (const char *line, void *data CTAGS_ATTR_UNUSED)
511+
{
512+
if (startsWith (line, "HXCOMM"))
513+
return TR_QEMUHX;
514+
if (startsWith (line, "enum")
515+
|| startsWith (line, "interface")
516+
|| startsWith (line, "typedef")
517+
|| startsWith (line, "class"))
518+
return TR_HAXE;
519+
return TR_UNKNOWN;
520+
}
521+
522+
const char *
523+
selectHaxeOrQemuHXByCommentMarker (MIO *input,
524+
langType *candidates CTAGS_ATTR_UNUSED,
525+
unsigned int nCandidates CTAGS_ATTR_UNUSED)
526+
{
527+
return selectByLines (input, tasteHaxeOrQemuHX, TR_HAXE, NULL);
528+
}
529+
506530
#ifdef HAVE_LIBXML
507531
#include <libxml/parser.h>
508532
#include <libxml/xpath.h>

main/selectors.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,8 @@ selectPerlOrPrologByDistinctiveToken (struct _MIO *input, langType *candidates,
4545
const char *
4646
selectByDBusServiceAndSystemdUnitSectionNames (struct _MIO *input, langType *candidates, unsigned int nCandidates);
4747

48+
const char *
49+
selectHaxeOrQemuHXByCommentMarker (struct _MIO *input,
50+
langType *candidates CTAGS_ATTR_UNUSED,
51+
unsigned int nCandidates CTAGS_ATTR_UNUSED);
4852
#endif

optlib/qemuhx.c

Lines changed: 149 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,152 @@
66
#include "routines.h"
77
#include "field.h"
88
#include "xtag.h"
9+
#include "selectors.h"
910

1011

11-
static void initializeQemuHXParser (const langType language CTAGS_ATTR_UNUSED)
12+
static void initializeQemuHXParser (const langType language)
1213
{
14+
15+
addLanguageRegexTable (language, "toplevel");
16+
addLanguageRegexTable (language, "skiplines");
17+
addLanguageRegexTable (language, "qmp");
18+
addLanguageRegexTable (language, "texi");
19+
addLanguageRegexTable (language, "rst");
20+
addLanguageRegexTable (language, "cmd");
21+
addLanguageRegexTable (language, "cmd0");
22+
23+
addLanguageTagMultiTableRegex (language, "toplevel",
24+
"^HXCOMM[^\n]*[\n]*",
25+
"", "", "", NULL);
26+
addLanguageTagMultiTableRegex (language, "toplevel",
27+
"^SQMP[[:space:]]+",
28+
"", "", "{tenter=qmp}", NULL);
29+
addLanguageTagMultiTableRegex (language, "toplevel",
30+
"^STEXI[\n]*",
31+
"", "", "{tenter=texi}", NULL);
32+
addLanguageTagMultiTableRegex (language, "toplevel",
33+
"^SRST[^\n]*[\n]*",
34+
"", "", "{tenter=rst}", NULL);
35+
addLanguageTagMultiTableRegex (language, "toplevel",
36+
"^[ \t]*DEF\\(\"([^\"\n]+)\"[^\n]*[\n]",
37+
"\\1", "c", "", NULL);
38+
addLanguageTagMultiTableRegex (language, "toplevel",
39+
"^[ \t]*\\{[ \t]*[\n]+",
40+
"", "", "{tenter=cmd}", NULL);
41+
addLanguageTagMultiTableRegex (language, "toplevel",
42+
"^[^\n]+[\n]*",
43+
"", "", "", NULL);
44+
addLanguageTagMultiTableRegex (language, "toplevel",
45+
"^[\n]+",
46+
"", "", "", NULL);
47+
addLanguageTagMultiTableRegex (language, "toplevel",
48+
"^.",
49+
"", "", "", NULL);
50+
addLanguageTagMultiTableRegex (language, "skiplines",
51+
"^[^\n]+[\n]*",
52+
"", "", "", NULL);
53+
addLanguageTagMultiTableRegex (language, "skiplines",
54+
"^[\n]+",
55+
"", "", "", NULL);
56+
addLanguageTagMultiTableRegex (language, "skiplines",
57+
"^.",
58+
"", "", "", NULL);
59+
addLanguageTagMultiTableRegex (language, "qmp",
60+
"^EQMP[^\n]*[\n]*",
61+
"", "", "{tleave}", NULL);
62+
addLanguageTagMultiTableRegex (language, "qmp",
63+
"^([-a-z_0-9A-Z]+)[[:space:]]---[^\n]*[\n]",
64+
"\\1", "q", ""
65+
"{{\n"
66+
" /QemuHX.funcmap _extraenabled {\n"
67+
" % make an extra tag for \"n-a-m-e\":\n"
68+
" % make string: qmp_n-a-m-e\n"
69+
" mark (qmp_) . :name _buildstring\n"
70+
" % replace - with _: qmp_n_a_m_e\n"
71+
" dup (-_) _tr!\n"
72+
" . :kind . _tagloc _tag\n"
73+
" _commit\n"
74+
" /QemuHX.funcmap _markextra\n"
75+
" } if\n"
76+
"}}", NULL);
77+
addLanguageTagMultiTableRegex (language, "qmp",
78+
"^[^\n]+[\n]*",
79+
"", "", "", NULL);
80+
addLanguageTagMultiTableRegex (language, "qmp",
81+
"^[\n]+",
82+
"", "", "", NULL);
83+
addLanguageTagMultiTableRegex (language, "qmp",
84+
"^.",
85+
"", "", "", NULL);
86+
addLanguageTagMultiTableRegex (language, "texi",
87+
"^ETEXI[\n]*",
88+
"", "", "{tleave}", NULL);
89+
addLanguageTagMultiTableRegex (language, "texi",
90+
"^@item[[:space:]]{1,}([-.a-z_0-9A-Z]{1,})[^\n]*[\n]*",
91+
"\\1", "i", "", NULL);
92+
addLanguageTagMultiTableRegex (language, "texi",
93+
"^[^\n]+[\n]*",
94+
"", "", "", NULL);
95+
addLanguageTagMultiTableRegex (language, "texi",
96+
"^[\n]+",
97+
"", "", "", NULL);
98+
addLanguageTagMultiTableRegex (language, "texi",
99+
"^.",
100+
"", "", "", NULL);
101+
addLanguageTagMultiTableRegex (language, "rst",
102+
"^ERST[^\n]*[\n]*",
103+
"", "", "{tleave}", NULL);
104+
addLanguageTagMultiTableRegex (language, "rst",
105+
"^[^\n]+[\n]*",
106+
"", "", "", NULL);
107+
addLanguageTagMultiTableRegex (language, "rst",
108+
"^[\n]+",
109+
"", "", "", NULL);
110+
addLanguageTagMultiTableRegex (language, "rst",
111+
"^.",
112+
"", "", "", NULL);
113+
addLanguageTagMultiTableRegex (language, "cmd",
114+
"^[ \t]*(SQMP)[\n]*",
115+
"", "", "{tleave}{_advanceTo=1start}", NULL);
116+
addLanguageTagMultiTableRegex (language, "cmd",
117+
"^[ \t]*(STEXI)[\n]*",
118+
"", "", "{tleave}{_advanceTo=1start}", NULL);
119+
addLanguageTagMultiTableRegex (language, "cmd",
120+
"^[ \t]*(SRST)[^\n]*[\n]*",
121+
"", "", "{tleave}{_advanceTo=1start}", NULL);
122+
addLanguageTagMultiTableRegex (language, "cmd",
123+
"^[ \t]*\\}[ \t]*,[ \t]*[\n]*",
124+
"", "", "{tleave}", NULL);
125+
addLanguageTagMultiTableRegex (language, "cmd",
126+
"^[ \t]*DEF\\(\"([^\"\n]+)\"[^\n]*[\n]",
127+
"\\1", "c", "", NULL);
128+
addLanguageTagMultiTableRegex (language, "cmd",
129+
"^[ \t]*\\.name[ \t]*=[ \t]*\"",
130+
"", "", "{tenter=cmd0}", NULL);
131+
addLanguageTagMultiTableRegex (language, "cmd",
132+
"^[^\n]+[\n]*",
133+
"", "", "", NULL);
134+
addLanguageTagMultiTableRegex (language, "cmd",
135+
"^[\n]+",
136+
"", "", "", NULL);
137+
addLanguageTagMultiTableRegex (language, "cmd",
138+
"^.",
139+
"", "", "", NULL);
140+
addLanguageTagMultiTableRegex (language, "cmd0",
141+
"^([^|\n]+)\\|",
142+
"\\1", "c", "", NULL);
143+
addLanguageTagMultiTableRegex (language, "cmd0",
144+
"^([^\"\n]+)\"[^\n]*[\n]",
145+
"\\1", "c", "{tleave}", NULL);
146+
addLanguageTagMultiTableRegex (language, "cmd0",
147+
"^[^\n]+[\n]*",
148+
"", "", "", NULL);
149+
addLanguageTagMultiTableRegex (language, "cmd0",
150+
"^[\n]+",
151+
"", "", "", NULL);
152+
addLanguageTagMultiTableRegex (language, "cmd0",
153+
"^.",
154+
"", "", "", NULL);
13155
}
14156

15157
extern parserDefinition* QemuHXParser (void)
@@ -34,6 +176,10 @@ extern parserDefinition* QemuHXParser (void)
34176
{
35177
true, 'i', "infoitem", "item in texinfo doc",
36178
},
179+
{
180+
true, 'c', "commands", "name member in HMPCommand struct",
181+
.version = 1,
182+
},
37183
};
38184
static xtagDefinition QemuHXXtagTable [] = {
39185
{
@@ -42,19 +188,7 @@ extern parserDefinition* QemuHXParser (void)
42188
.description = "Include mapping SQMP to C function name",
43189
},
44190
};
45-
static tagRegexTable QemuHXTagRegexTable [] = {
46-
{"^SQMP[[:space:]]([-a-z_0-9A-Z]+)[[:space:]]---", "\\1",
47-
"q", "{mgroup=1}", NULL, true},
48-
{"^SQMP[[:space:]]([-a-z_0-9A-Z]+)[[:space:]]---", "qmp_\\1",
49-
"q", "{mgroup=1}{_extra=funcmap}"
50-
"{{\n"
51-
" . :name dup (-_) _tr!\n"
52-
" . exch name:\n"
53-
"}}", NULL, true},
54-
{"^@item[[:space:]]{1,}([-.a-z_0-9A-Z]{1,})", "\\1",
55-
"i", NULL, NULL, false},
56-
};
57-
191+
static selectLanguage selectors[] = { selectHaxeOrQemuHXByCommentMarker, NULL };
58192

59193
parserDefinition* const def = parserNew ("QemuHX");
60194

@@ -64,14 +198,13 @@ extern parserDefinition* QemuHXParser (void)
64198
def->extensions = extensions;
65199
def->patterns = patterns;
66200
def->aliases = aliases;
201+
def->selectLanguage= selectors;
67202
def->method = METHOD_NOT_CRAFTED|METHOD_REGEX;
68203
def->useCork = CORK_QUEUE;
69204
def->kindTable = QemuHXKindTable;
70205
def->kindCount = ARRAY_SIZE(QemuHXKindTable);
71206
def->xtagTable = QemuHXXtagTable;
72207
def->xtagCount = ARRAY_SIZE(QemuHXXtagTable);
73-
def->tagRegexTable = QemuHXTagRegexTable;
74-
def->tagRegexCount = ARRAY_SIZE(QemuHXTagRegexTable);
75208
def->initialize = initializeQemuHXParser;
76209

77210
return def;

0 commit comments

Comments
 (0)