From a4949aaa548f04d5713640cc34a968abde25a1c7 Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Sat, 30 Apr 2011 13:06:26 +0200 Subject: ul.c: escape handling refactored Separate function for escape handling to make switch statement more readable. Signed-off-by: Sami Kerola --- text-utils/ul.c | 76 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 34 deletions(-) (limited to 'text-utils/ul.c') diff --git a/text-utils/ul.c b/text-utils/ul.c index 9536c18be..42a2ee279 100644 --- a/text-utils/ul.c +++ b/text-utils/ul.c @@ -70,6 +70,7 @@ static int put1wc(int c) #endif static void usage(FILE *out); +static int handle_escape(FILE * f); static void filter(FILE *f); static void flushln(void); static void overstrike(void); @@ -235,6 +236,45 @@ int main(int argc, char **argv) return EXIT_SUCCESS; } +static int handle_escape(FILE * f) +{ + wint_t c; + + switch (c = getwc(f)) { + case HREV: + if (halfpos == 0) { + mode |= SUPERSC; + halfpos--; + } else if (halfpos > 0) { + mode &= ~SUBSC; + halfpos--; + } else { + halfpos = 0; + reverse(); + } + return 0; + case HFWD: + if (halfpos == 0) { + mode |= SUBSC; + halfpos++; + } else if (halfpos < 0) { + mode &= ~SUPERSC; + halfpos++; + } else { + halfpos = 0; + fwd(); + } + return 0; + case FREV: + reverse(); + return 0; + default: + /* unknown escape */ + ungetwc(c, f); + return 1; + } +} + static void filter(FILE *f) { wint_t c; @@ -264,43 +304,11 @@ static void filter(FILE *f) continue; case IESC: - switch (c = getwc(f)) { - - case HREV: - if (halfpos == 0) { - mode |= SUPERSC; - halfpos--; - } else if (halfpos > 0) { - mode &= ~SUBSC; - halfpos--; - } else { - halfpos = 0; - reverse(); - } - continue; - - case HFWD: - if (halfpos == 0) { - mode |= SUBSC; - halfpos++; - } else if (halfpos < 0) { - mode &= ~SUPERSC; - halfpos++; - } else { - halfpos = 0; - fwd(); - } - continue; - - case FREV: - reverse(); - continue; - - default: + if(handle_escape(f)) { + c = getwc(f); errx(EXIT_FAILURE, _("unknown escape sequence in input: %o, %o"), IESC, c); - break; } continue; -- cgit v1.2.3-55-g7522