Support multiple values on the command line
diff --git a/programs/psa/psa_constant_names.c b/programs/psa/psa_constant_names.c
index dd19677..f551e5a 100644
--- a/programs/psa/psa_constant_names.c
+++ b/programs/psa/psa_constant_names.c
@@ -138,7 +138,7 @@
static void usage(const char *program_name)
{
- printf("Usage: %s TYPE VALUE\n",
+ printf("Usage: %s TYPE VALUE [VALUE...]\n",
program_name == NULL ? "psa_constant_names" : program_name);
printf("Print the symbolic name whose numerical value is VALUE in TYPE.\n");
printf("Supported types (with = between aliases):\n");
@@ -149,11 +149,18 @@
printf(" error=status Status code (psa_status_t)\n");
}
+typedef enum {
+ TYPE_STATUS,
+ TYPE_ALGORITHM,
+ TYPE_ECC_CURVE,
+ TYPE_KEY_TYPE,
+ TYPE_KEY_USAGE,
+} value_type;
+
int main(int argc, char *argv[])
{
- char buffer[200];
- unsigned long value;
- char *end;
+ value_type type;
+ int i;
if (argc <= 1 ||
!strcmp(argv[1], "help") ||
@@ -162,31 +169,55 @@
usage(argv[0]);
return EXIT_FAILURE;
}
- if (argc != 3) {
- usage(argv[0]);
- return EXIT_FAILURE;
- }
- value = strtoul(argv[2], &end, 0);
- if (*end) {
- printf("Non-numeric value: %s\n", argv[2]);
- return EXIT_FAILURE;
- }
- if (!strcmp(argv[1], "error") || !strcmp(argv[1], "status"))
- psa_snprint_status(buffer, sizeof(buffer), (psa_status_t) value);
- else if (!strcmp(argv[1], "alg") || !strcmp(argv[1], "algorithm"))
- psa_snprint_algorithm(buffer, sizeof(buffer), (psa_algorithm_t) value);
- else if (!strcmp(argv[1], "curve") || !strcmp(argv[1], "ecc_curve"))
- psa_snprint_ecc_curve(buffer, sizeof(buffer), (psa_ecc_curve_t) value);
- else if (!strcmp(argv[1], "type") || !strcmp(argv[1], "key_type"))
- psa_snprint_key_type(buffer, sizeof(buffer), (psa_key_type_t) value);
- else if (!strcmp(argv[1], "usage") || !strcmp(argv[1], "key_usage"))
- psa_snprint_key_usage(buffer, sizeof(buffer), (psa_key_usage_t) value);
- else {
+ if (!strcmp(argv[1], "error") || !strcmp(argv[1], "status")) {
+ type = TYPE_STATUS;
+ } else if (!strcmp(argv[1], "alg") || !strcmp(argv[1], "algorithm")) {
+ type = TYPE_ALGORITHM;
+ } else if (!strcmp(argv[1], "curve") || !strcmp(argv[1], "ecc_curve")) {
+ type = TYPE_ECC_CURVE;
+ } else if (!strcmp(argv[1], "type") || !strcmp(argv[1], "key_type")) {
+ type = TYPE_KEY_TYPE;
+ } else if (!strcmp(argv[1], "usage") || !strcmp(argv[1], "key_usage")) {
+ type = TYPE_KEY_USAGE;
+ } else {
printf("Unknown type: %s\n", argv[1]);
return EXIT_FAILURE;
}
- puts(buffer);
+ for (i = 2; i < argc; i++) {
+ char buffer[200];
+ char *end;
+ unsigned long value = strtoul(argv[i], &end, 0);
+ if (*end) {
+ printf("Non-numeric value: %s\n", argv[i]);
+ return EXIT_FAILURE;
+ }
+
+ switch (type) {
+ case TYPE_STATUS:
+ psa_snprint_status(buffer, sizeof(buffer),
+ (psa_status_t) value);
+ break;
+ case TYPE_ALGORITHM:
+ psa_snprint_algorithm(buffer, sizeof(buffer),
+ (psa_algorithm_t) value);
+ break;
+ case TYPE_ECC_CURVE:
+ psa_snprint_ecc_curve(buffer, sizeof(buffer),
+ (psa_ecc_curve_t) value);
+ break;
+ case TYPE_KEY_TYPE:
+ psa_snprint_key_type(buffer, sizeof(buffer),
+ (psa_key_type_t) value);
+ break;
+ case TYPE_KEY_USAGE:
+ psa_snprint_key_usage(buffer, sizeof(buffer),
+ (psa_key_usage_t) value);
+ break;
+ }
+ puts(buffer);
+ }
+
return EXIT_SUCCESS;
}