From cf0f037ac861a3f4fd877e79f3e53877a446f722 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Fri, 22 Jan 2016 21:35:48 -0600 Subject: Factor out insanitize() from seq.c to next_printf() in lib. --- lib/lib.c | 18 ++++++++++++++++++ lib/lib.h | 1 + toys/lsb/seq.c | 19 +++++-------------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/lib.c b/lib/lib.c index b0ac4715..6559030c 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -1015,3 +1015,21 @@ char *show_uuid(char *uuid) return libbuf; } + +// Returns pointer to letter at end, 0 if none. *start = initial % +char *next_printf(char *s, char **start) +{ + for (; *s; s++) { + if (*s != '%') continue; + if (*++s == '%') continue; + if (start) *start = s-1; + while (0 <= stridx("0'#-+ ", *s)) s++; + while (isdigit(*s)) s++; + if (*s == '.') s++; + while (isdigit(*s)) s++; + + return s; + } + + return 0; +} diff --git a/lib/lib.h b/lib/lib.h index f1cea22e..e3dbc462 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -196,6 +196,7 @@ int yesno(int def); int qstrcmp(const void *a, const void *b); void create_uuid(char *uuid); char *show_uuid(char *uuid); +char *next_printf(char *s, char **start); #define HR_SPACE 1 // Space between number and units #define HR_B 2 // Use "B" for single byte units diff --git a/toys/lsb/seq.c b/toys/lsb/seq.c index c6204742..3ff9ca44 100644 --- a/toys/lsb/seq.c +++ b/toys/lsb/seq.c @@ -32,22 +32,13 @@ GLOBALS( // Ensure there's one %f escape with correct attributes static void insanitize(char *f) { - char *s; - int found = 0; + char *s = next_printf(f, 0); - for (s = f; *s; s++) { - if (*s != '%') continue; - if (*++s == '%') continue; - if (found++) break; - while (0 <= stridx("0'#-+ ", *s)) s++; - while (isdigit(*s)) s++; - if (*s == '.') s++; - while (isdigit(*s)) s++; - if (-1 == stridx("aAeEfFgG", *s)) break; + if (!s) error_exit("bad -f no %%f"); + if (-1 == stridx("aAeEfFgG", *s) || (s = next_printf(s, 0))) { + // The @ is a byte offset, not utf8 chars. Waiting for somebody to complain. + error_exit("bad -f '%s'@%ld", f, s-f+1); } - - // The @ is a byte offset, not utf8 chars. Waiting for somebody to complain... - if (*s || !found) error_exit("bad -f '%s'@%ld", f, s-f+1); } void seq_main(void) -- cgit v1.2.3