dispol: display operations as ranges.

Change-Id: Ic40a137a9b3f1023a6b23f67d0b05708486a98d0
diff --git a/test/dispol.c b/test/dispol.c
index 7be9267..3b7726d 100644
--- a/test/dispol.c
+++ b/test/dispol.c
@@ -55,23 +55,50 @@
 }
 
 #define operation_perm_test(x, p) (1 & (p[x >> 5] >> (x & 0x1f)))
+#define next_bit_in_range(i, p) \
+	((i + 1 < sizeof(p)*8) && operation_perm_test((i + 1), p))
 
 int render_operations(avtab_operations_t *ops, avtab_key_t * key, FILE * fp)
 {
 	uint16_t value;
-	unsigned int bit = 0;
+	uint16_t low_bit;
+	uint16_t low_value;
+	unsigned int bit;
+	unsigned int in_range = 0;
 
 	fprintf(fp, "{ ");
 	for (bit = 0; bit < sizeof(ops->perms)*8; bit++) {
 		if (!operation_perm_test(bit, ops->perms))
 			continue;
+
+		if (in_range && next_bit_in_range(bit, ops->perms)) {
+			/* continue until high value found */
+			continue;
+		} else if (next_bit_in_range(bit, ops->perms)) {
+			/* low value */
+			low_bit = bit;
+			in_range = 1;
+			continue;
+		}
+
 		if (key->specified & AVTAB_OPNUM) {
 			value = ops->type<<8 | bit;
-			fprintf(fp, "0x%hx ", value);
+			low_value = ops->type<<8 | low_bit;
+			if (in_range)
+				fprintf(fp, "0x%hx-0x%hx ", low_value, value);
+			else
+				fprintf(fp, "0x%hx ", value);
 		} else if (key->specified & AVTAB_OPTYPE) {
 			value = bit << 8;
-			fprintf(fp, "0x%hx-0x%hx ", value, value|0xff);
+			low_value = low_bit << 8;
+			if (in_range)
+				fprintf(fp, "0x%hx-0x%hx ", low_value, (uint16_t) (value|0xff));
+			else
+				fprintf(fp, "0x%hx-0x%hx ", value, (uint16_t) (value|0xff));
+
 		}
+		if (in_range)
+			in_range = 0;
 	}
 	fprintf(fp, "}");
 	return 0;