aboutsummaryrefslogtreecommitdiff
path: root/qapi/qapi-util.c
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2017-02-28 22:27:04 +0100
committerMarkus Armbruster <armbru@redhat.com>2017-03-07 16:07:47 +0100
commit069b64e3fe75c81edef6685c9941a7937a48fec4 (patch)
tree4100f5d87d5d79e7348e5341bdf93990b84327d0 /qapi/qapi-util.c
parent6c873d1149d47201dbb71f6e04791447605a17e1 (diff)
qapi: New parse_qapi_name()
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <1488317230-26248-19-git-send-email-armbru@redhat.com>
Diffstat (limited to 'qapi/qapi-util.c')
-rw-r--r--qapi/qapi-util.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
index 818730a660..e28dbd0ac3 100644
--- a/qapi/qapi-util.c
+++ b/qapi/qapi-util.c
@@ -33,3 +33,50 @@ int qapi_enum_parse(const char * const lookup[], const char *buf,
error_setg(errp, "invalid parameter value: %s", buf);
return def;
}
+
+/*
+ * Parse a valid QAPI name from @str.
+ * A valid name consists of letters, digits, hyphen and underscore.
+ * It may be prefixed by __RFQDN_ (downstream extension), where RFQDN
+ * may contain only letters, digits, hyphen and period.
+ * The special exception for enumeration names is not implemented.
+ * See docs/qapi-code-gen.txt for more on QAPI naming rules.
+ * Keep this consistent with scripts/qapi.py!
+ * If @complete, the parse fails unless it consumes @str completely.
+ * Return its length on success, -1 on failure.
+ */
+int parse_qapi_name(const char *str, bool complete)
+{
+ const char *p = str;
+
+ if (*p == '_') { /* Downstream __RFQDN_ */
+ p++;
+ if (*p != '_') {
+ return -1;
+ }
+ while (*++p) {
+ if (!qemu_isalnum(*p) && *p != '-' && *p != '.') {
+ break;
+ }
+ }
+
+ if (*p != '_') {
+ return -1;
+ }
+ p++;
+ }
+
+ if (!qemu_isalpha(*p)) {
+ return -1;
+ }
+ while (*++p) {
+ if (!qemu_isalnum(*p) && *p != '-' && *p != '_') {
+ break;
+ }
+ }
+
+ if (complete && *p) {
+ return -1;
+ }
+ return p - str;
+}