Adopted case-as-label style in switch statements

So:

  switch (cond) {
  case 0:;
      // first case
      break;

  case 1:;
      // second case
      break;

  default:;
      // default case
      break;
  }

This basically adopts our current label style for the case statements in
switch statements. It initially looks like quite a monstrosity, but I
think it does a good job at highlighting that case statements in C are
no safer than labels and gotos.

I would not use this style in a language with better scoping in switch
statements.

I'd prefer not to use switch statements, their scoping rules in C are
just too error-prone, and the compiler usually optimizes things out
anyways, but there are some places where switch statements are clearly
the correct organization -- state machines such as lfsr_traversal_read
for example.

If you're curious about the ':;' ending, this is used in our current
style for labels to avoid "declaration is not a statement" warnings.
Which I think is just a bit of leftover from C historically not having
mixed statements/declarations.
This commit is contained in:
Christopher Haster
2024-01-20 22:00:59 -06:00
parent 6fc040db1a
commit 4ce582bf9b
3 changed files with 738 additions and 712 deletions
+6 -6
View File
@@ -9313,7 +9313,7 @@ int lfsr_file_opencfg(lfs_t *lfs, lfsr_file_t *file,
0, file->buffer, lfsr_bshrub_size(&file->bshrub)); 0, file->buffer, lfsr_bshrub_size(&file->bshrub));
if (d < 0) { if (d < 0) {
err = d; err = d;
goto failed_with_buffer; goto failed;
} }
// small files remain perpetually unflushed // small files remain perpetually unflushed
@@ -9327,7 +9327,7 @@ int lfsr_file_opencfg(lfs_t *lfs, lfsr_file_t *file,
lfsr_addopened(lfs, &file->m); lfsr_addopened(lfs, &file->m);
return 0; return 0;
failed_with_buffer:; failed:;
// clean up memory // clean up memory
if (!file->cfg->buffer) { if (!file->cfg->buffer) {
lfs_free(file->buffer); lfs_free(file->buffer);
@@ -14777,7 +14777,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
lfs->rcache.buffer = lfs_malloc(lfs->cfg->cache_size); lfs->rcache.buffer = lfs_malloc(lfs->cfg->cache_size);
if (!lfs->rcache.buffer) { if (!lfs->rcache.buffer) {
err = LFS_ERR_NOMEM; err = LFS_ERR_NOMEM;
goto cleanup; goto failed;
} }
} }
@@ -14788,7 +14788,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
lfs->pcache.buffer = lfs_malloc(lfs->cfg->cache_size); lfs->pcache.buffer = lfs_malloc(lfs->cfg->cache_size);
if (!lfs->pcache.buffer) { if (!lfs->pcache.buffer) {
err = LFS_ERR_NOMEM; err = LFS_ERR_NOMEM;
goto cleanup; goto failed;
} }
} }
@@ -14805,7 +14805,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
lfs->lookahead.buffer = lfs_malloc(lfs->cfg->lookahead_size); lfs->lookahead.buffer = lfs_malloc(lfs->cfg->lookahead_size);
if (!lfs->lookahead.buffer) { if (!lfs->lookahead.buffer) {
err = LFS_ERR_NOMEM; err = LFS_ERR_NOMEM;
goto cleanup; goto failed;
} }
} }
lfs->lookahead.start = 0; lfs->lookahead.start = 0;
@@ -14881,7 +14881,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
return 0; return 0;
cleanup: failed:;
lfs_deinit(lfs); lfs_deinit(lfs);
return err; return err;
} }
+50 -37
View File
@@ -1506,7 +1506,7 @@ int main(int argc, char **argv) {
int c = getopt_long(argc, argv, short_opts, long_opts, NULL); int c = getopt_long(argc, argv, short_opts, long_opts, NULL);
switch (c) { switch (c) {
// generate help message // generate help message
case OPT_HELP: { case OPT_HELP:;
printf("usage: %s [options] [bench_id]\n", argv[0]); printf("usage: %s [options] [bench_id]\n", argv[0]);
printf("\n"); printf("\n");
@@ -1560,34 +1560,42 @@ int main(int argc, char **argv) {
printf("\n"); printf("\n");
exit(0); exit(0);
}
// summary/list flags // summary/list flags
case OPT_SUMMARY: case OPT_SUMMARY:;
op = summary; op = summary;
break; break;
case OPT_LIST_SUITES:
case OPT_LIST_SUITES:;
op = list_suites; op = list_suites;
break; break;
case OPT_LIST_CASES:
case OPT_LIST_CASES:;
op = list_cases; op = list_cases;
break; break;
case OPT_LIST_SUITE_PATHS:
case OPT_LIST_SUITE_PATHS:;
op = list_suite_paths; op = list_suite_paths;
break; break;
case OPT_LIST_CASE_PATHS:
case OPT_LIST_CASE_PATHS:;
op = list_case_paths; op = list_case_paths;
break; break;
case OPT_LIST_DEFINES:
case OPT_LIST_DEFINES:;
op = list_defines; op = list_defines;
break; break;
case OPT_LIST_PERMUTATION_DEFINES:
case OPT_LIST_PERMUTATION_DEFINES:;
op = list_permutation_defines; op = list_permutation_defines;
break; break;
case OPT_LIST_IMPLICIT_DEFINES:
case OPT_LIST_IMPLICIT_DEFINES:;
op = list_implicit_defines; op = list_implicit_defines;
break; break;
// configuration // configuration
case OPT_DEFINE: { case OPT_DEFINE:;
// allocate space // allocate space
bench_override_t *override = mappend( bench_override_t *override = mappend(
(void**)&bench_overrides, (void**)&bench_overrides,
@@ -1732,12 +1740,12 @@ int main(int argc, char **argv) {
} }
break; break;
invalid_define: invalid_define:;
fprintf(stderr, "error: invalid define: %s\n", optarg); fprintf(stderr, "error: invalid define: %s\n", optarg);
exit(-1); exit(-1);
}
case OPT_STEP: { case OPT_STEP:;
char *parsed = NULL; parsed = NULL;
bench_step_start = strtoumax(optarg, &parsed, 0); bench_step_start = strtoumax(optarg, &parsed, 0);
bench_step_stop = -1; bench_step_stop = -1;
bench_step_step = 1; bench_step_step = 1;
@@ -1784,39 +1792,43 @@ invalid_define:
} }
break; break;
step_unknown:
step_unknown:;
fprintf(stderr, "error: invalid step: %s\n", optarg); fprintf(stderr, "error: invalid step: %s\n", optarg);
exit(-1); exit(-1);
}
case OPT_DISK: case OPT_DISK:;
bench_disk_path = optarg; bench_disk_path = optarg;
break; break;
case OPT_TRACE:
case OPT_TRACE:;
bench_trace_path = optarg; bench_trace_path = optarg;
break; break;
case OPT_TRACE_BACKTRACE:
case OPT_TRACE_BACKTRACE:;
bench_trace_backtrace = true; bench_trace_backtrace = true;
break; break;
case OPT_TRACE_PERIOD: {
char *parsed = NULL; case OPT_TRACE_PERIOD:;
parsed = NULL;
bench_trace_period = strtoumax(optarg, &parsed, 0); bench_trace_period = strtoumax(optarg, &parsed, 0);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid trace-period: %s\n", optarg); fprintf(stderr, "error: invalid trace-period: %s\n", optarg);
exit(-1); exit(-1);
} }
break; break;
}
case OPT_TRACE_FREQ: { case OPT_TRACE_FREQ:;
char *parsed = NULL; parsed = NULL;
bench_trace_freq = strtoumax(optarg, &parsed, 0); bench_trace_freq = strtoumax(optarg, &parsed, 0);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid trace-freq: %s\n", optarg); fprintf(stderr, "error: invalid trace-freq: %s\n", optarg);
exit(-1); exit(-1);
} }
break; break;
}
case OPT_READ_SLEEP: { case OPT_READ_SLEEP:;
char *parsed = NULL; parsed = NULL;
double read_sleep = strtod(optarg, &parsed); double read_sleep = strtod(optarg, &parsed);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid read-sleep: %s\n", optarg); fprintf(stderr, "error: invalid read-sleep: %s\n", optarg);
@@ -1824,9 +1836,9 @@ step_unknown:
} }
bench_read_sleep = read_sleep*1.0e9; bench_read_sleep = read_sleep*1.0e9;
break; break;
}
case OPT_PROG_SLEEP: { case OPT_PROG_SLEEP:;
char *parsed = NULL; parsed = NULL;
double prog_sleep = strtod(optarg, &parsed); double prog_sleep = strtod(optarg, &parsed);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid prog-sleep: %s\n", optarg); fprintf(stderr, "error: invalid prog-sleep: %s\n", optarg);
@@ -1834,9 +1846,9 @@ step_unknown:
} }
bench_prog_sleep = prog_sleep*1.0e9; bench_prog_sleep = prog_sleep*1.0e9;
break; break;
}
case OPT_ERASE_SLEEP: { case OPT_ERASE_SLEEP:;
char *parsed = NULL; parsed = NULL;
double erase_sleep = strtod(optarg, &parsed); double erase_sleep = strtod(optarg, &parsed);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid erase-sleep: %s\n", optarg); fprintf(stderr, "error: invalid erase-sleep: %s\n", optarg);
@@ -1844,12 +1856,13 @@ step_unknown:
} }
bench_erase_sleep = erase_sleep*1.0e9; bench_erase_sleep = erase_sleep*1.0e9;
break; break;
}
// done parsing // done parsing
case -1: case -1:;
goto getopt_done; goto getopt_done;
// unknown arg, getopt prints a message for us // unknown arg, getopt prints a message for us
default: default:;
exit(-1); exit(-1);
} }
} }
+59 -46
View File
@@ -1946,7 +1946,7 @@ int main(int argc, char **argv) {
int c = getopt_long(argc, argv, short_opts, long_opts, NULL); int c = getopt_long(argc, argv, short_opts, long_opts, NULL);
switch (c) { switch (c) {
// generate help message // generate help message
case OPT_HELP: { case OPT_HELP:;
printf("usage: %s [options] [test_id]\n", argv[0]); printf("usage: %s [options] [test_id]\n", argv[0]);
printf("\n"); printf("\n");
@@ -2000,37 +2000,46 @@ int main(int argc, char **argv) {
printf("\n"); printf("\n");
exit(0); exit(0);
}
// summary/list flags // summary/list flags
case OPT_SUMMARY: case OPT_SUMMARY:;
op = summary; op = summary;
break; break;
case OPT_LIST_SUITES:
case OPT_LIST_SUITES:;
op = list_suites; op = list_suites;
break; break;
case OPT_LIST_CASES:
case OPT_LIST_CASES:;
op = list_cases; op = list_cases;
break; break;
case OPT_LIST_SUITE_PATHS:
case OPT_LIST_SUITE_PATHS:;
op = list_suite_paths; op = list_suite_paths;
break; break;
case OPT_LIST_CASE_PATHS:
case OPT_LIST_CASE_PATHS:;
op = list_case_paths; op = list_case_paths;
break; break;
case OPT_LIST_DEFINES:
case OPT_LIST_DEFINES:;
op = list_defines; op = list_defines;
break; break;
case OPT_LIST_PERMUTATION_DEFINES:
case OPT_LIST_PERMUTATION_DEFINES:;
op = list_permutation_defines; op = list_permutation_defines;
break; break;
case OPT_LIST_IMPLICIT_DEFINES:
case OPT_LIST_IMPLICIT_DEFINES:;
op = list_implicit_defines; op = list_implicit_defines;
break; break;
case OPT_LIST_POWERLOSSES:
case OPT_LIST_POWERLOSSES:;
op = list_powerlosses; op = list_powerlosses;
break; break;
// configuration // configuration
case OPT_DEFINE: { case OPT_DEFINE:;
// allocate space // allocate space
test_override_t *override = mappend( test_override_t *override = mappend(
(void**)&test_overrides, (void**)&test_overrides,
@@ -2175,11 +2184,11 @@ int main(int argc, char **argv) {
} }
break; break;
invalid_define: invalid_define:;
fprintf(stderr, "error: invalid define: %s\n", optarg); fprintf(stderr, "error: invalid define: %s\n", optarg);
exit(-1); exit(-1);
}
case OPT_POWERLOSS: { case OPT_POWERLOSS:;
// reset our powerloss scenarios // reset our powerloss scenarios
if (test_powerloss_capacity > 0) { if (test_powerloss_capacity > 0) {
free((test_powerloss_t*)test_powerlosses); free((test_powerloss_t*)test_powerlosses);
@@ -2221,7 +2230,7 @@ invalid_define:
char *s = optarg + 1; char *s = optarg + 1;
while (true) { while (true) {
char *parsed = NULL; parsed = NULL;
*(lfs_emubd_powercycles_t*)mappend( *(lfs_emubd_powercycles_t*)mappend(
(void**)&cycles, (void**)&cycles,
sizeof(lfs_emubd_powercycles_t), sizeof(lfs_emubd_powercycles_t),
@@ -2282,7 +2291,7 @@ invalid_define:
char *s = optarg + 1; char *s = optarg + 1;
while (true) { while (true) {
char *parsed = NULL; parsed = NULL;
uintmax_t x = leb16_parse(s, &parsed); uintmax_t x = leb16_parse(s, &parsed);
if (parsed == s) { if (parsed == s) {
break; break;
@@ -2308,7 +2317,7 @@ invalid_define:
// exhaustive permutations // exhaustive permutations
{ {
char *parsed = NULL; parsed = NULL;
size_t count = strtoumax(optarg, &parsed, 0); size_t count = strtoumax(optarg, &parsed, 0);
if (parsed == optarg) { if (parsed == optarg) {
goto powerloss_unknown; goto powerloss_unknown;
@@ -2322,13 +2331,13 @@ invalid_define:
goto powerloss_next; goto powerloss_next;
} }
powerloss_unknown: powerloss_unknown:;
// unknown scenario? // unknown scenario?
fprintf(stderr, "error: unknown power-loss scenario: %s\n", fprintf(stderr, "error: unknown power-loss scenario: %s\n",
optarg); optarg);
exit(-1); exit(-1);
powerloss_next: powerloss_next:;
optarg += strspn(optarg, " "); optarg += strspn(optarg, " ");
if (*optarg == ',') { if (*optarg == ',') {
optarg += 1; optarg += 1;
@@ -2339,9 +2348,9 @@ powerloss_next:
} }
} }
break; break;
}
case OPT_STEP: { case OPT_STEP:;
char *parsed = NULL; parsed = NULL;
test_step_start = strtoumax(optarg, &parsed, 0); test_step_start = strtoumax(optarg, &parsed, 0);
test_step_stop = -1; test_step_stop = -1;
test_step_step = 1; test_step_step = 1;
@@ -2386,23 +2395,26 @@ powerloss_next:
test_step_stop = test_step_start; test_step_stop = test_step_start;
test_step_start = 0; test_step_start = 0;
} }
break; break;
step_unknown:
step_unknown:;
fprintf(stderr, "error: invalid step: %s\n", optarg); fprintf(stderr, "error: invalid step: %s\n", optarg);
exit(-1); exit(-1);
}
case OPT_DISK: case OPT_DISK:;
test_disk_path = optarg; test_disk_path = optarg;
break; break;
case OPT_TRACE:
case OPT_TRACE:;
test_trace_path = optarg; test_trace_path = optarg;
break; break;
case OPT_TRACE_BACKTRACE:
case OPT_TRACE_BACKTRACE:;
test_trace_backtrace = true; test_trace_backtrace = true;
break; break;
case OPT_TRACE_PERIOD: {
char *parsed = NULL; case OPT_TRACE_PERIOD:;
parsed = NULL;
test_trace_period = strtoumax(optarg, &parsed, 0); test_trace_period = strtoumax(optarg, &parsed, 0);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid trace-period: %s\n", fprintf(stderr, "error: invalid trace-period: %s\n",
@@ -2410,18 +2422,18 @@ step_unknown:
exit(-1); exit(-1);
} }
break; break;
}
case OPT_TRACE_FREQ: { case OPT_TRACE_FREQ:;
char *parsed = NULL; parsed = NULL;
test_trace_freq = strtoumax(optarg, &parsed, 0); test_trace_freq = strtoumax(optarg, &parsed, 0);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid trace-freq: %s\n", optarg); fprintf(stderr, "error: invalid trace-freq: %s\n", optarg);
exit(-1); exit(-1);
} }
break; break;
}
case OPT_READ_SLEEP: { case OPT_READ_SLEEP:;
char *parsed = NULL; parsed = NULL;
double read_sleep = strtod(optarg, &parsed); double read_sleep = strtod(optarg, &parsed);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid read-sleep: %s\n", optarg); fprintf(stderr, "error: invalid read-sleep: %s\n", optarg);
@@ -2429,9 +2441,9 @@ step_unknown:
} }
test_read_sleep = read_sleep*1.0e9; test_read_sleep = read_sleep*1.0e9;
break; break;
}
case OPT_PROG_SLEEP: { case OPT_PROG_SLEEP:;
char *parsed = NULL; parsed = NULL;
double prog_sleep = strtod(optarg, &parsed); double prog_sleep = strtod(optarg, &parsed);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid prog-sleep: %s\n", optarg); fprintf(stderr, "error: invalid prog-sleep: %s\n", optarg);
@@ -2439,9 +2451,9 @@ step_unknown:
} }
test_prog_sleep = prog_sleep*1.0e9; test_prog_sleep = prog_sleep*1.0e9;
break; break;
}
case OPT_ERASE_SLEEP: { case OPT_ERASE_SLEEP:;
char *parsed = NULL; parsed = NULL;
double erase_sleep = strtod(optarg, &parsed); double erase_sleep = strtod(optarg, &parsed);
if (parsed == optarg) { if (parsed == optarg) {
fprintf(stderr, "error: invalid erase-sleep: %s\n", optarg); fprintf(stderr, "error: invalid erase-sleep: %s\n", optarg);
@@ -2449,12 +2461,13 @@ step_unknown:
} }
test_erase_sleep = erase_sleep*1.0e9; test_erase_sleep = erase_sleep*1.0e9;
break; break;
}
// done parsing // done parsing
case -1: case -1:;
goto getopt_done; goto getopt_done;
// unknown arg, getopt prints a message for us // unknown arg, getopt prints a message for us
default: default:;
exit(-1); exit(-1);
} }
} }