vty/command: reflect global attributes in the XML reference

Given that commands with either/both of the following attributes:

  - CMD_ATTR_DEPRECATED,
  - CMD_ATTR_HIDDEN,

never end up in the XML reference, only CMD_ATTR_IMMEDIATE would
be reflected for commands taking effect immediately as follows:

  <command id='foo'>
    <!-- Global attributes -->
    <attributes scope='global'>
      <attribute doc='This command applies immediately' />
    </attributes>

    <!-- Application specific attributes -->
    <attributes scope='application'>
      <!-- ... -->
    </attributes>

    <params>
      <!-- ... -->
    </params>
  </command>

Change-Id: I8476c1163c23a9a52641987acf3df0b8c49d8f7b
Related: SYS#4937
diff --git a/src/vty/command.c b/src/vty/command.c
index bad2688..30c39a7 100644
--- a/src/vty/command.c
+++ b/src/vty/command.c
@@ -622,6 +622,13 @@
 
 typedef int (*print_func_t)(void *data, const char *fmt, ...);
 
+static const struct value_string cmd_attr_desc[] = {
+	{ CMD_ATTR_DEPRECATED,		"This command is deprecated" },
+	{ CMD_ATTR_HIDDEN,		"This command is hidden" },
+	{ CMD_ATTR_IMMEDIATE,		"This command applies immediately" },
+	{ 0, NULL }
+};
+
 /*
  * Write one cmd_element as XML via a print_func_t.
  */
@@ -632,6 +639,25 @@
 
 	print_func(data, "    <command id='%s'>%s", xml_string, newline);
 
+	/* Print global attributes and their description */
+	if (cmd->attr != 0x00) { /* ... if at least one flag is set */
+		print_func(data, "      <attributes scope='global'>%s", newline);
+
+		for (i = 0; i < ARRAY_SIZE(cmd_attr_desc) - 1; i++) {
+			char *xml_att_desc;
+
+			if (~cmd->attr & cmd_attr_desc[i].value)
+				continue;
+
+			xml_att_desc = xml_escape(cmd_attr_desc[i].str);
+			print_func(data, "        <attribute doc='%s' />%s",
+				   xml_att_desc, newline);
+			talloc_free(xml_att_desc);
+		}
+
+		print_func(data, "      </attributes>%s", newline);
+	}
+
 	/* Print application specific attributes and their description */
 	if (cmd->usrattr != 0x00) { /* ... if at least one flag is set */
 		print_func(data, "      <attributes scope='application'>%s", newline);