Follow-up Comment #6, bug #68719 (group groff): [comment #5 comment #5:] >> (but warn if one is absent) > > ...but that requires rejiggering the finite state machine and that gets a > "nope" from me at this time.
Nah, it's not that hard after all, once one relabels the nodes of the FSM to make more sense. commit 1a78bd831e3ab48b63cb359a3d6befe1ee9faae6 Author: G. Branden Robinson <[email protected]> AuthorDate: Mon Nov 2 10:13:28 2026 -0600 Commit: G. Branden Robinson <[email protected]> CommitDate: Mon Nov 2 21:11:00 2026 -0600 XXX [soelim]: Trivially refactor. Relabel FSM nodes. diff --git a/src/preproc/soelim/soelim.cpp b/src/preproc/soelim/soelim.cpp index ff3fde349..7eb48c263 100644 --- a/src/preproc/soelim/soelim.cpp +++ b/src/preproc/soelim/soelim.cpp @@ -224,7 +224,14 @@ static bool do_file(const char *filename) current_filename = whole_filename.contents(); current_lineno = 1; set_location(); - enum { START, MIDDLE, HAD_DOT, HAD_s, HAD_so, HAD_l, HAD_lf } state + // finite state machine matching lines starting with ".so" and ".lf" + enum { START, + SEEN_DOT, + SEEN_DOT_s, + SEEN_DOT_so, + SEEN_DOT_l, + SEEN_DOT_lf, + OTHER } state = START; for (;;) { int c = getc(fp); @@ -233,7 +240,7 @@ static bool do_file(const char *filename) switch (state) { case START: if (c == '.') - state = HAD_DOT; + state = SEEN_DOT; else { putchar(c); if (c == '\n') { @@ -241,21 +248,21 @@ static bool do_file(const char *filename) state = START; } else - state = MIDDLE; + state = OTHER; } break; - case MIDDLE: + case OTHER: putchar(c); if (c == '\n') { current_lineno++; state = START; } break; - case HAD_DOT: + case SEEN_DOT: if (c == 's') - state = HAD_s; + state = SEEN_DOT_s; else if (c == 'l') - state = HAD_l; + state = SEEN_DOT_l; else { putchar('.'); putchar(c); @@ -264,12 +271,12 @@ static bool do_file(const char *filename) state = START; } else - state = MIDDLE; + state = OTHER; } break; - case HAD_s: + case SEEN_DOT_s: if (c == 'o') - state = HAD_so; + state = SEEN_DOT_so; else { putchar('.'); putchar('s'); @@ -279,10 +286,10 @@ static bool do_file(const char *filename) state = START; } else - state = MIDDLE; + state = OTHER; } break; - case HAD_so: + case SEEN_DOT_so: if (c == ' ' || c == '\n' || want_att_compat) { string line; for (; c != EOF && c != '\n'; c = getc(fp)) @@ -296,12 +303,12 @@ static bool do_file(const char *filename) else { fputs(".so", stdout); putchar(c); - state = MIDDLE; + state = OTHER; } break; - case HAD_l: + case SEEN_DOT_l: if (c == 'f') - state = HAD_lf; + state = SEEN_DOT_lf; else { putchar('.'); putchar('l'); @@ -311,10 +318,10 @@ static bool do_file(const char *filename) state = START; } else - state = MIDDLE; + state = OTHER; } break; - case HAD_lf: + case SEEN_DOT_lf: if (c == ' ' || c == '\n' || want_att_compat) { string line; for (; c != EOF && c != '\n'; c = getc(fp)) @@ -329,30 +336,31 @@ static bool do_file(const char *filename) else { fputs(".lf", stdout); putchar(c); - state = MIDDLE; + state = OTHER; } break; default: assert(0 == "unhandled state in file parser"); } } + // We've reached the end of input. switch (state) { - case HAD_DOT: + case SEEN_DOT: fputs(".\n", stdout); break; - case HAD_l: + case SEEN_DOT_l: fputs(".l\n", stdout); break; - case HAD_s: + case SEEN_DOT_s: fputs(".s\n", stdout); break; - case HAD_lf: + case SEEN_DOT_lf: fputs(".lf\n", stdout); break; - case HAD_so: + case SEEN_DOT_so: fputs(".so\n", stdout); break; - case MIDDLE: + case OTHER: putc('\n', stdout); break; case START: _______________________________________________________ Reply to this item at: <https://savannah.gnu.org/bugs/?68719> _______________________________________________ Message sent via Savannah https://savannah.gnu.org/
signature.asc
Description: PGP signature
