aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2016-01-22 21:35:48 -0600
committerRob Landley <rob@landley.net>2016-01-22 21:35:48 -0600
commitcf0f037ac861a3f4fd877e79f3e53877a446f722 (patch)
treed141c65d6c3563d271e8049f8229114797f9f86e
parent83c6d225795f94840b6acbba0955c65ef0340e7e (diff)
downloadtoybox-cf0f037ac861a3f4fd877e79f3e53877a446f722.tar.gz
Factor out insanitize() from seq.c to next_printf() in lib.
-rw-r--r--lib/lib.c18
-rw-r--r--lib/lib.h1
-rw-r--r--toys/lsb/seq.c19
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)